use carbon_dump::SYNTAX_SET;
use std::ops::Deref;
use syntect::{
easy::HighlightLines,
highlighting::Theme,
html::{
append_highlighted_html_for_styled_line, start_highlighted_html_snippet, styled_line_to_highlighted_html,
IncludeBackground,
},
parsing::SyntaxReference,
util::LinesWithEndings,
};
pub fn html_render_line(s: &str, syntax: &SyntaxReference, theme: &Theme) -> String {
let mut highlighter = HighlightLines::new(syntax, theme);
let (mut output, bg) = start_highlighted_html_snippet(theme);
for line in LinesWithEndings::from(s) {
let regions = highlighter.highlight(line, SYNTAX_SET.deref());
append_highlighted_html_for_styled_line(®ions[..], IncludeBackground::IfDifferent(bg), &mut output);
}
output.push_str("</pre>\n");
output
}
pub fn html_render_line_number(s: &str, syntax: &SyntaxReference, theme: &Theme) -> String {
let all = format!("{}", s.lines().count()).len();
let mut line_number = 1;
let mut highlighter = HighlightLines::new(syntax, theme);
let (mut output, bg) = start_highlighted_html_snippet(theme);
for line in LinesWithEndings::from(s) {
let regions = highlighter.highlight(line, SYNTAX_SET.deref());
let color = theme.settings.foreground.unwrap();
let line = format!(
r#"<span style="color:#{:02X}{:02X}{:02X};"> {:>width$} </span>{}"#,
color.r,
color.g,
color.b,
line_number,
styled_line_to_highlighted_html(®ions[..], IncludeBackground::IfDifferent(bg)),
width = all
);
line_number += 1;
output.push_str(&line)
}
output.push_str("</pre>\n");
output
}
pub fn html_fancy_box(s: &str, title: &Option<String>) -> String {
format!(
r#"<div class="carbon">
<div class="controls"><div class="circle red"></div><div class="circle yellow"></div><div class="circle green"></div>{}</div>
<div class="content">{}</div></div>"#,
match title {
Some(s) => {
format!(r#"<div class="title">{}</div>"#, s)
}
None => {
String::new()
}
},
s
)
}