//! Vimwiki syntax plugin. pub mod lexer; pub mod parser; pub use lexer::{VimwikiLexer, VimwikiToken, VimwikiTokenKind}; pub use parser::VimwikiParser; use crate::ast::DocumentNode; use crate::listsyms::ListSyms; use crate::syntax::{Lexer, Parser, SyntaxPlugin}; /// SyntaxPlugin facade: chains `VimwikiLexer` + `VimwikiParser` so the /// registry can hand out a single trait object. #[derive(Debug, Default, Clone)] pub struct VimwikiSyntax; impl VimwikiSyntax { pub fn new() -> Self { Self } /// Parse with a custom checkbox palette (vimwiki's `g:vimwiki_listsyms`). /// The trait-level [`SyntaxPlugin::parse`] uses [`ListSyms::default`]. pub fn parse_with_listsyms(&self, text: &str, listsyms: &ListSyms) -> DocumentNode { let tokens = VimwikiLexer::new() .with_listsyms(listsyms.clone()) .lex(text); VimwikiParser::new().parse(tokens) } } impl SyntaxPlugin for VimwikiSyntax { fn id(&self) -> &str { "vimwiki" } fn display_name(&self) -> &str { "Vimwiki" } fn file_extensions(&self) -> &[&str] { &[".wiki"] } fn parse(&self, text: &str) -> DocumentNode { let tokens = VimwikiLexer::new().lex(text); VimwikiParser::new().parse(tokens) } }