Expand description

Synoptic

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 = rust.run(DEMO);
     
    // 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
        println!("");
    }
}

Re-exports

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

Modules

This provides the main Highlighter class you will need to make your own syntax rules, or if you wish to modify the existing rules from the set of provided highlighters

This provides a set of prebuilt highlighters for various languages You can always build on top of them, as they just return highlighter classes These highlighters will return the following tokens names:

This provides the types of tokens which you can use to apply your syntax highlighting into whichever format you please

This provides utilities to help with formatting tokens on the screen

Macros