Note: This site is currently "Under construction". I'm migrating to a new version of my site building software. Lots of things are in a state of disrepair as a result (for example, footnote links aren't working). It's all part of the process of building in public. Most things should still be readable though.

Syntax Highlighting In Rust Apps With The syntect Crate

  • Look at and combine these posts: 2ujekgik

Introduction

I looked at using `syntect`` for syntax highlighting on my site. Initiail tests were very slow so I'm not going with it. Might take a look at some caching stuff later, but that's more than I want to get into. For now I'll just use one of the javascript front ends like prism.

The notes below are for reference for usage.

(I'm also not sure if I'm doing something that is causing the slowness. I'll re-examine at some point to see if there's something to be done about it)

Inline Styles Included

This is the first approach I'm using. It adds inline styles but doesn't wrap things in a `

Code

use syntect::easy::HighlightLines;
use syntect::highlighting::ThemeSet;
use syntect::html::{styled_line_to_highlighted_html, IncludeBackground};
use syntect::parsing::SyntaxSet;

fn main() {
    let ps = SyntaxSet::load_defaults_newlines();
    let ts = ThemeSet::load_defaults();
    let syntax = ps.find_syntax_by_name("HTML").unwrap();
    let mut h = HighlightLines::new(syntax, &ts.themes["base16-ocean.dark"]);
    let regions = h.highlight_line("<h1>Alfa</h1>", &ps).unwrap();
    let html = styled_line_to_highlighted_html(&regions[..], IncludeBackground::No).unwrap();
    dbg!(html);
}

Core Usage

  • Write up details on this approach

Code

use syntect::html::{ClassStyle, ClassedHTMLGenerator};
use syntect::parsing::SyntaxSet;
use syntect::util::LinesWithEndings;

fn main() {
    let current_code = r#"<h1>Alfa</h1>
<p>Bravo</p>"#;
    let syntax_set = SyntaxSet::load_defaults_newlines();
    let syntax = syntax_set.find_syntax_by_name("HTML").unwrap();
    let mut html_generator =
        ClassedHTMLGenerator::new_with_class_style(syntax, &syntax_set, ClassStyle::Spaced);
    for line in LinesWithEndings::from(current_code) {
        html_generator.parse_html_for_line_which_includes_newline(line);
    }
    let output_html = html_generator.finalize();
    dbg!(output_html);
}
  • show how to generate the css file

Alternate Approach

The crate offers a way to style things directly inline as well. That code looks like this:

Code

use syntect::highlighting::ThemeSet;
use syntect::html::highlighted_html_for_string;
use syntect::parsing::SyntaxSet;

fn main() {
    let ss = SyntaxSet::load_defaults_newlines();
    let ts = ThemeSet::load_defaults();
    let syntax = ss.find_syntax_by_extension("rs").unwrap();
    let source_text = String::from("<h1>Alfa</h1>");
    let highlighted =
        highlighted_html_for_string(&source_text, &ss, &syntax, &ts.themes["base16-ocean.dark"])
            .unwrap();
    dbg!(highlighted);
}

References