Here's an example of it in action (using the termion
crate)
use synoptic::{Token, Highlighter};
use termion::color;
const DEMO: &str = r#"/*
Multiline comments
Work great
*/
pub fn main() -> bool {
// Demonstrate syntax highlighting in Rust!
println!("Full Unicode Support: 你好!Pretty cool");
return true;
}
"#;
fn main() {
let mut rust = Highlighter::new();
rust.join(&["fn", "return", "pub"], "keyword").unwrap();
rust.join(&["bool"], "type").unwrap();
rust.join(&["true", "false"], "boolean").unwrap();
rust.add(r"(?m)(//.*)$", "comment").unwrap();
rust.add(r"(?ms)/\*.*?\*/", "comment").unwrap();
rust.add("\".*?\"", "string").unwrap();
rust.add(r"([a-z_][A-Za-z0-9_]*)\s*\(", "identifier").unwrap();
rust.add(r"([a-z_][A-Za-z0-9_]*!)\s*", "macro").unwrap();
let highlighting = rust.run(DEMO);
for (c, row) in highlighting.iter().enumerate() {
print!("{: >3} |", c);
for tok in row {
match tok {
Token::Start(kind) => match *kind {
"comment" => print!("{}", color::Fg(color::Black)),
"string" => print!("{}", color::Fg(color::Green)),
"keyword" => print!("{}", color::Fg(color::Blue)),
"type" => print!("{}", color::Fg(color::LightMagenta)),
"boolean" => print!("{}", color::Fg(color::LightGreen)),
"identifier" => print!("{}", color::Fg(color::Yellow)),
"macro" => print!("{}", color::Fg(color::Magenta)),
_ => (),
}
Token::Text(txt) => print!("{}", txt),
Token::End(_) => print!("{}", color::Fg(color::Reset)),
}
}
println!("");
}
}