extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use rustfmt_wrapper::rustfmt;
use synoptic::languages::rust;
use synoptic::Token;
#[proc_macro]
pub fn generate_snippet(item: TokenStream) -> TokenStream {
let code = rustfmt(item).unwrap();
let mut result = String::from(
r#"<div style="background: #181818; overflow:auto;width:auto;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%">"#,
);
let rust = rust();
let highlighting = rust.run(code.trim());
for (c, row) in highlighting.iter().enumerate() {
result.push_str(format!("{: >2} ", c).as_str());
for tok in row {
match tok {
Token::Start(kind) => {
result.push_str("<span style=\"");
match kind.as_str() {
"keyword" => result.push_str("color: #ba8baf;\">"),
"struct" => result.push_str("color: #f7ca88;\">"),
"boolean" | "number" | "global" => result.push_str("color: #dc9656;\">"),
"operator" => result.push_str("color: #d8d8d8;\">"),
"comment" | "reference" => result.push_str("color: #585858;\">"),
"string" | "character" => result.push_str("color: #a1b56c;\">"),
"function" | "macro" => result.push_str("color: #7cafc2;\">"),
"regex" | "symbol" => result.push_str("color: #86c1b9;\">"),
"namespace" => result.push_str("color: #f78c6c;\">"),
token => println!("unknow token: {}", token),
}
}
Token::Text(txt) => result.push_str(txt),
Token::End(_) => result.push_str("</span>"),
}
}
result.push('\n');
}
result.push_str("</pre></div>");
#[cfg(feature = "html")]
return quote! {
html! {
<RawHtml html={#result} />
}
}
.into();
quote! {
#result
}
.into()
}