use crate::plugin::{DocumentPlugin, PluginContext, PluginMeta};
use lazy_static::lazy_static;
use regex::Regex;
lazy_static! {
static ref CODE_BLOCK_RE: Regex = Regex::new(r"```([a-zA-Z0-9_]*)\s*\n([\s\S]*?)\n```").unwrap();
}
pub struct PrismPlugin {
meta: PluginMeta,
}
impl PrismPlugin {
pub fn new() -> Self {
Self { meta: PluginMeta::new("nargo-document-plugin-prism".to_string(), "0.1.0".to_string(), "Prism 代码高亮插件,提供代码块语法高亮功能".to_string()) }
}
fn process_code_blocks(&self, content: &str) -> String {
CODE_BLOCK_RE
.replace_all(content, |caps: ®ex::Captures| {
let lang = caps.get(1).map_or("", |m| m.as_str());
let code = &caps[2];
if lang.is_empty() {
format!("<pre><code>{}</code></pre>", code.trim())
}
else {
format!("<pre class=\"language-{}\"><code class=\"language-{}\">{}</code></pre>", lang, lang, code.trim())
}
})
.to_string()
}
}
impl Default for PrismPlugin {
fn default() -> Self {
Self::new()
}
}
impl DocumentPlugin for PrismPlugin {
fn meta(&self) -> &PluginMeta {
&self.meta
}
fn before_render(&self, context: PluginContext) -> PluginContext {
let content = self.process_code_blocks(&context.content);
PluginContext { content, frontmatter: context.frontmatter, path: context.path }
}
}