Crate synoptic[][src]

Expand description


A simple rust syntax highlighting crate

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() {
    // Build the rust syntax highlighter
    let mut rust = Highlighter::new();
    // Add keywords
    rust.join(&["fn", "return", "pub"], "keyword").unwrap();
    rust.join(&["bool"], "type").unwrap();
    rust.join(&["true", "false"], "boolean").unwrap();
    // Add comment definitions
    rust.add(r"(?m)(//.*)$", "comment").unwrap();
    rust.add(r"(?ms)/\*.*?\*/", "comment").unwrap();
    // Add string definition
    rust.add("\".*?\"", "string").unwrap();
    // Add identifier definition
    rust.add(r"([a-z_][A-Za-z0-9_]*)\s*\(", "identifier").unwrap();
    // Add macro definition
    rust.add(r"([a-z_][A-Za-z0-9_]*!)\s*", "macro").unwrap();

    // Run highlighter
    let highlighting =;
    // For each row
    for (c, row) in highlighting.iter().enumerate() {
        // Print line number (with padding)
        print!("{: >3} |", c);
        // For each token within each row
        for tok in row {
        // Handle the tokens
            match tok {
                // Handle the start token (start foreground colour)
                Token::Start(kind) => match kind.as_str() {
                    "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)),
                    _ => (),
                // Handle a text token (print out the contents)
                Token::Text(txt) => print!("{}", txt),
                // Handle an end token (reset foreground colour)
                Token::End(_) => print!("{}", color::Fg(color::Reset)),
        // Prevent text being cut off without a newline


pub use highlighter::Highlighter;
pub use tokens::TokOpt;
pub use tokens::Token;
pub use util::trim;