summaryrefslogtreecommitdiffstats
path: root/src/render/markdown.rs
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-03-07 15:37:03 +0800
committerGitHub <noreply@github.com>2023-03-07 15:37:03 +0800
commitd73be65b07c22f69539b5819f0684090c32d3b60 (patch)
tree0f8c7b11c6a046d8af253d754b8c5a98d316174d /src/render/markdown.rs
parent11dc4d104b21b75d63e10e42ea4ee767c7bd5fdf (diff)
downloadaichat-d73be65b07c22f69539b5819f0684090c32d3b60.tar.gz
refactor: support highlighting more languages (#28)
Diffstat (limited to 'src/render/markdown.rs')
-rw-r--r--src/render/markdown.rs47
1 files changed, 15 insertions, 32 deletions
diff --git a/src/render/markdown.rs b/src/render/markdown.rs
index fc0bc3e..5316653 100644
--- a/src/render/markdown.rs
+++ b/src/render/markdown.rs
@@ -3,7 +3,10 @@ use syntect::parsing::SyntaxSet;
use syntect::util::as_24_bit_terminal_escaped;
use syntect::{easy::HighlightLines, parsing::SyntaxReference};
-const THEME: &[u8] = include_bytes!("theme.yaml");
+/// Comms from https://github.com/jonschlinkert/sublime-monokai-extended/tree/0ca4e75291515c4d47e2d455e598e03e0dc53745
+const THEME: &[u8] = include_bytes!("../../assets/theme.yaml");
+/// Comes from https://github.com/sharkdp/bat/raw/5e77ca37e89c873e4490b42ff556370dc5c6ba4f/assets/syntaxes.bin
+const SYNTAXES: &[u8] = include_bytes!("../../assets/syntaxes.bin");
pub struct MarkdownRender {
syntax_set: SyntaxSet,
@@ -16,7 +19,8 @@ pub struct MarkdownRender {
impl MarkdownRender {
pub fn new() -> Self {
- let syntax_set = SyntaxSet::load_defaults_newlines();
+ let syntax_set: SyntaxSet =
+ bincode::deserialize_from(SYNTAXES).expect("invalid syntaxes.bin");
let theme: Theme = serde_yaml::from_slice(THEME).unwrap();
let md_syntax = syntax_set.find_syntax_by_extension("md").unwrap().clone();
let txt_syntax = syntax_set.find_syntax_by_extension("txt").unwrap().clone();
@@ -96,12 +100,9 @@ impl MarkdownRender {
}
fn find_syntax(&self, lang: &str) -> Option<&SyntaxReference> {
- self.syntax_set.find_syntax_by_extension(lang).or_else(|| {
- LANGEGUATE_NAME_EXTS
- .iter()
- .find(|(name, _)| *name == lang.to_lowercase())
- .and_then(|(_, ext)| self.syntax_set.find_syntax_by_extension(ext))
- })
+ self.syntax_set
+ .find_syntax_by_token(lang)
+ .or_else(|| self.syntax_set.find_syntax_by_extension(lang))
}
}
@@ -113,30 +114,6 @@ enum LineType {
CodeEnd,
}
-const LANGEGUATE_NAME_EXTS: [(&str, &str); 21] = [
- ("asp", "asa"),
- ("actionscript", "as"),
- ("c#", "cs"),
- ("clojure", "clj"),
- ("erlang", "erl"),
- ("haskell", "hs"),
- ("javascript", "js"),
- ("bibtex", "bib"),
- ("latex", "tex"),
- ("tex", "sty"),
- ("ocaml", "ml"),
- ("ocamllex", "mll"),
- ("ocamlyacc", "mly"),
- ("objective-c++", "mm"),
- ("objective-c", "m"),
- ("pascal", "pas"),
- ("perl", "pl"),
- ("python", "py"),
- ("restructuredtext", "rst"),
- ("ruby", "rb"),
- ("rust", "rs"),
-];
-
fn detect_code_block(line: &str) -> Option<String> {
if !line.starts_with("```") {
return None;
@@ -148,3 +125,9 @@ fn detect_code_block(line: &str) -> Option<String> {
.collect();
Some(lang)
}
+
+#[test]
+fn feature() {
+ let syntax_set: SyntaxSet = bincode::deserialize_from(SYNTAXES).expect("invalid syntaxes.bin");
+ assert!(syntax_set.find_syntax_by_extension("md").is_some());
+}