Skip to content

Commit 1499618

Browse files
authored
Merge pull request #20 from xynxynxyn/master
Multi color ascii
2 parents 0b7297a + 1fc91ba commit 1499618

File tree

3 files changed

+131
-71
lines changed

3 files changed

+131
-71
lines changed

Diff for: resources/c.ascii

+22-22
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11

2-
`-/++/-`
3-
`.:++++++++++:.`
4-
.-/++++++++++++++++/-.
5-
`-:++++++++++++++++++++++++:-`
6-
.:/++++++++++++++++++++++++++++/:-.`
7-
-++++++++++++++/:--...-:/++++++/:::::::.
8-
++++++++++++/. ./+/::::::::::
9-
+++++++++++. `:::::::::::
10-
++++++++++` -/+++:` `::::::::::
11-
+++++++++. /++++++:``````-:::::::::
12-
+++++++++ `++++/:::::::::::::::::::
13-
+++++++++ `++/:::::::::::::::::::::
14-
+++++++++` ::::::::......::::::::::
15-
+++++++++/ -:::::. `::::::::::
16-
++++++++++/` `` -::::::::::
17-
++++++++++/:.` .::::::::::::
18-
-+++++++/::::::-.``````..-:::::::::::::.
19-
`-/++/:::::::::::::::::::::::::::::-.
20-
`.-::::::::::::::::::::::::-.`
21-
.-::::::::::::::::::-.
22-
`.-::::::::::-.`
23-
`-::::-`
2+
{0} `-/++/-`
3+
{0} `.:++++++++++:.`
4+
{0} .-/++++++++++++++++/-.
5+
{0} `-:++++++++++++++++++++++++:-`
6+
{0} .:/++++++++++++++++++++++++++++/:-.`
7+
{0}-++++++++++++++/:--...-:/++++++/{1}:::::::.
8+
{0}++++++++++++/. ./+/{1}::::::::::
9+
{0}+++++++++++. `{1}:::::::::::
10+
{0}++++++++++` -/+++:` {1}`::::::::::
11+
{0}+++++++++. /++++++{1}:``````-:::::::::
12+
{0}+++++++++ `++++/{1}:::::::::::::::::::
13+
{0}+++++++++ `++/{1}:::::::::::::::::::::
14+
{0}+++++++++` {1}::::::::......::::::::::
15+
{0}+++++++++/ {1} -:::::. `::::::::::
16+
{0}++++++++++/` {1} `` -::::::::::
17+
{0}++++++++++/{1}:.` .::::::::::::
18+
{0}-+++++++/{1}::::::-.``````..-:::::::::::::.
19+
{0} `-/++/{1}:::::::::::::::::::::::::::::-.
20+
{0} {1}`.-::::::::::::::::::::::::-.`
21+
{0} {1} .-::::::::::::::::::-.
22+
{0} {1} `.-::::::::::-.`
23+
{0} {1} `-::::-`

Diff for: resources/rust.ascii

+20-21
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
1-
2-
` :y.`yy`.y: `
3-
-``MNsNMMNNNNMMNsNM``-
4-
` -MMNMMMMNNm``NNNMMMMNMM- `
5-
`NNNMMMdo:` `+md/ `:odMMMNNN`
6-
-ssNMMNo. .oNMMNss-
7-
`mMMMMNmmmmmmmmmmmmmmmdy+` `sMMMm`
8-
`mMMMMMMMMMMMMMMMMMMMMMMMMMN/ hMMMMm`
9-
-oMN-:Ny:mMMMMMm oNMMMMMm oN::MMo-
10-
.yMMMhhh+ dMMMMMd:::::+mMMMMN/ odyhMMMy.
11-
-sNMMy dMMMMMMMMMMMMMMMMs` `yMMNs-
12-
-sNMMy dMMMMMNyyyydMMMMMMy .odMMNs-
13-
.yMMMm dMMMMMh +MMMMMM+ sMMMMMy.
14-
-oMMMMMMMMMMMMMMMMM+ mMMMMMMMMMMMMMo-
15-
`mMMMMMMMMMMMMMMMMM+ :NMMMMMMMMMMMMm`
16-
`mMMMm `-:o+:/mMMMm`
17-
-ssNMMMyomo smohMMMNss-
18-
`NNNMs+mN/-` `-/Nd/yMNNN`
19-
` -MMNMMMMMNmmmmNMMMMMNMM- `
20-
-``MNsNMMNMMNMMNsNM``-
21-
` :y.`yy`.y: `
1+
{0} ` :y.`yy`.y: `
2+
{0} -``MNsNMMNNNNMMNsNM``-
3+
{0} ` -MMNMMMMNNm``NNNMMMMNMM- `
4+
{0} `NNNMMMdo:` `+md/ `:odMMMNNN`
5+
{0} -ssNMMNo. .oNMMNss-
6+
{0} `mMM{1}MMNmmmmmmmmmmmmmmmdy+`{0} `sMMMm`
7+
{0} `mMMM{1}MMMMMMMMMMMMMMMMMMMMMMN/{0} hMMMMm`
8+
{0} -oMN-:Ny:{1}mMMMMMm oNMMMMMm{0} oN::MMo-
9+
{0}.yMMMhhh+ {1}dMMMMMd:::::+mMMMMN/{0} odyhMMMy.
10+
{0}-sNMMy {1}dMMMMMMMMMMMMMMMMs`{0} `yMMNs-
11+
{0}-sNMMy {1}dMMMMMNyyyydMMMMMMy{0} .odMMNs-
12+
{0}.yMMMm {1}dMMMMMh +MMMMMM+{0} sMMMMMy.
13+
{0} -oMMM{1}MMMMMMMMMMMMMM+ mMMMMMMMMMM{0}MMMo-
14+
{0} `mMMM{1}MMMMMMMMMMMMMM+ :NMMMMMMMMM{0}MMMm`
15+
{0} `mMMMm `-:o+:/mMMMm`
16+
{0} -ssNMMMyomo smohMMMNss-
17+
{0} `NNNMs+mN/-` `-/Nd/yMNNN`
18+
{0} ` -MMNMMMMMNmmmmNMMMMMNMM- `
19+
{0} -``MNsNMMNMMNMMNsNM``-
20+
{0} ` :y.`yy`.y: `

Diff for: src/main.rs

+89-28
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ struct Info {
3232
impl fmt::Display for Info {
3333
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3434
let mut buffer = String::new();
35-
let color = self.color();
35+
let color = match self.colors().get(0) {
36+
Some(&c) => c,
37+
None => Color::White,
38+
};
3639

3740
writeln!(
3841
buffer,
@@ -79,27 +82,85 @@ impl fmt::Display for Info {
7982

8083
let logo = self.get_ascii();
8184
let mut lines = buffer.lines();
82-
let left_pad = logo.lines().map(|l| l.len()).max().unwrap_or(0);
85+
let left_pad = logo.lines().map(|l| true_len(l)).max().unwrap_or(0);
8386

84-
for a in logo.lines() {
85-
let b = match lines.next() {
87+
for logo_line in logo.lines() {
88+
let info_line = match lines.next() {
8689
Some(line) => line,
8790
None => "",
8891
};
8992

90-
writeln!(
91-
f,
92-
"{:width$} {}",
93-
a.color(color).bold(),
94-
b,
95-
width = left_pad
96-
)?;
93+
let (logo_line, extra_pad) = colorize_str(logo_line, self.colors());
94+
// If the string is empty the extra padding should not be added
95+
let pad = if logo_line.is_empty() {
96+
left_pad
97+
} else {
98+
left_pad + extra_pad
99+
};
100+
writeln!(f, "{:<width$} {:^}", logo_line, info_line, width = pad,)?;
97101
}
98102

99103
Ok(())
100104
}
101105
}
102106

107+
/// Transforms a string with color format into one with proper
108+
/// escape characters for color display.
109+
///
110+
/// Colors are specified with {0}, {1}... where the number represents
111+
/// the nth element in the colors Vec provided to the function.
112+
/// If there are more colors in the ascii than in the Vec it
113+
/// defaults to white.
114+
/// The usize in the tuple refers to the extra padding needed
115+
/// which comes from the added escape characters.
116+
fn colorize_str(line: &str, colors: Vec<Color>) -> (String, usize) {
117+
// Extract colors from string coded with {n}
118+
let mut colors_in_str: Vec<Color> = line.split("{").fold(Vec::new(), |mut acc, s| {
119+
if s.len() > 2 {
120+
let i = s.chars().nth(0).unwrap_or('0').to_digit(10).unwrap_or(0);
121+
acc.push(*colors.iter().nth(i as usize).unwrap_or(&Color::White));
122+
}
123+
acc
124+
});
125+
126+
if colors_in_str.is_empty() {
127+
colors_in_str.push(match colors.get(0) {
128+
Some(&c) => c,
129+
None => Color::White,
130+
});
131+
}
132+
133+
let mut colors_iter = colors_in_str.iter();
134+
135+
let out_str = line.split("{").fold(String::new(), |mut acc, s| {
136+
if s.len() > 2 {
137+
let s: String = s.chars().skip(2).collect();
138+
let c = match colors_iter.next() {
139+
Some(&c) => c,
140+
None => Color::White,
141+
};
142+
acc.push_str(&format!("{}", s.color(c)));
143+
}
144+
acc
145+
});
146+
(out_str, colors_in_str.len() * 9)
147+
}
148+
149+
/// Returns the true length of a string after substracting the {n}
150+
/// color declarations.
151+
fn true_len(line: &str) -> usize {
152+
line.split("{")
153+
.fold(String::new(), |mut acc, s| {
154+
if s.len() > 2 {
155+
acc.push_str(&s.chars().skip(2).collect::<String>());
156+
} else {
157+
acc.push_str(s);
158+
}
159+
acc
160+
})
161+
.len()
162+
}
163+
103164
enum Language {
104165
C,
105166
Clojure,
@@ -378,24 +439,24 @@ impl Info {
378439
}
379440
}
380441

381-
fn color(&self) -> Color {
442+
fn colors(&self) -> Vec<Color> {
382443
match self.language {
383-
Language::C => Color::Cyan,
384-
Language::Clojure => Color::Cyan,
385-
Language::Cpp => Color::Yellow,
386-
Language::Csharp => Color::White,
387-
Language::Go => Color::White,
388-
Language::Haskell => Color::Cyan,
389-
Language::Java => Color::Green,
390-
Language::Lisp => Color::Yellow,
391-
Language::Lua => Color::Blue,
392-
Language::Python => Color::Magenta,
393-
Language::R => Color::Blue,
394-
Language::Ruby => Color::Magenta,
395-
Language::Rust => Color::Cyan,
396-
Language::Scala => Color::Blue,
397-
Language::Shell => Color::Green,
398-
Language::TypeScript => Color::Cyan,
444+
Language::C => vec![Color::BrightBlue, Color::Blue],
445+
Language::Clojure => vec![Color::Cyan],
446+
Language::Cpp => vec![Color::Yellow],
447+
Language::Csharp => vec![Color::White],
448+
Language::Go => vec![Color::White],
449+
Language::Haskell => vec![Color::Cyan],
450+
Language::Java => vec![Color::Green],
451+
Language::Lisp => vec![Color::Yellow],
452+
Language::Lua => vec![Color::Blue],
453+
Language::Python => vec![Color::Magenta],
454+
Language::R => vec![Color::Blue],
455+
Language::Ruby => vec![Color::Magenta],
456+
Language::Rust => vec![Color::White, Color::Red],
457+
Language::Scala => vec![Color::Blue],
458+
Language::Shell => vec![Color::Green],
459+
Language::TypeScript => vec![Color::Cyan],
399460
}
400461
}
401462
}

0 commit comments

Comments
 (0)