summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Sago <ogham@bsago.me>2017-09-03 17:05:38 +0100
committerBenjamin Sago <ogham@bsago.me>2017-09-03 17:05:38 +0100
commit4507edd734df5d6906001b4cfbf0f05896b70c32 (patch)
tree88ceb9efdfbb0d4b42c5ff0929719776d6a26c78
parentbad794ab9d441e2ac60e2475ceb69d8490f6565c (diff)
256 colour support in ls_colors
This is more annoying than it should be because it has to work with Styles rather than with strings, which means parsing them, and parsing is always tricky business.
-rw-r--r--src/style/lsc.rs36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/style/lsc.rs b/src/style/lsc.rs
index 092134f..823be47 100644
--- a/src/style/lsc.rs
+++ b/src/style/lsc.rs
@@ -1,6 +1,6 @@
use std::ops::FnMut;
-use ansi_term::Style;
+use ansi_term::{Colour, Style};
use ansi_term::Colour::*;
@@ -25,11 +25,30 @@ pub struct Pair<'var> {
pub value: &'var str,
}
+use std::iter::Peekable;
+fn parse_into_high_colour<'a, I>(iter: &mut Peekable<I>) -> Option<Colour>
+where I: Iterator<Item=&'a str> {
+ match iter.peek() {
+ Some(&"5") => {
+ let _5 = iter.next();
+ if let Some(byte) = iter.next() {
+ if let Ok(num) = byte.parse() {
+ return Some(Fixed(num));
+ }
+ }
+ }
+ _ => {},
+ }
+
+ None
+}
+
impl<'var> Pair<'var> {
pub fn to_style(&self) -> Style {
let mut style = Style::default();
+ let mut iter = self.value.split(";").peekable();
- for num in self.value.split(";") {
+ while let Some(num) = iter.next() {
match num {
// Bold and italic
@@ -45,6 +64,7 @@ impl<'var> Pair<'var> {
"35" => style = style.fg(Purple),
"36" => style = style.fg(Cyan),
"37" => style = style.fg(White),
+ "38" => if let Some(c) = parse_into_high_colour(&mut iter) { style = style.fg(c) },
// Background colours
"40" => style = style.on(Black),
@@ -55,6 +75,8 @@ impl<'var> Pair<'var> {
"45" => style = style.on(Purple),
"46" => style = style.on(Cyan),
"47" => style = style.on(White),
+ "48" => if let Some(c) = parse_into_high_colour(&mut iter) { style = style.on(c) },
+
_ => {/* ignore the error and do nothing */},
}
}
@@ -93,6 +115,16 @@ mod ansi_test {
test!(semis: ";;;;;;" => Style::default());
test!(nines: "99999999" => Style::default());
test!(word: "GREEN" => Style::default());
+
+ // Higher colours
+ test!(hifg: "38;5;149" => Fixed(149).normal());
+ test!(hibg: "48;5;1" => Style::default().on(Fixed(1)));
+ test!(hibo: "48;5;1;1" => Style::default().on(Fixed(1)).bold());
+ test!(hiund: "4;48;5;1" => Style::default().on(Fixed(1)).underline());
+
+ test!(fgbg: "38;5;121;48;5;212" => Fixed(121).on(Fixed(212)));
+ test!(bgfg: "48;5;121;38;5;212" => Fixed(212).on(Fixed(121)));
+ test!(toohi: "48;5;999" => Style::default());
}