2026-05-10 17:20:46 +00:00
|
|
|
//! Vimwiki syntax plugin.
|
|
|
|
|
|
|
|
|
|
pub mod lexer;
|
2026-05-10 17:58:41 +00:00
|
|
|
pub mod parser;
|
2026-05-10 17:20:46 +00:00
|
|
|
|
|
|
|
|
pub use lexer::{VimwikiLexer, VimwikiToken, VimwikiTokenKind};
|
2026-05-10 17:58:41 +00:00
|
|
|
pub use parser::VimwikiParser;
|
|
|
|
|
|
|
|
|
|
use crate::ast::DocumentNode;
|
2026-05-30 23:32:07 -03:00
|
|
|
use crate::listsyms::ListSyms;
|
2026-05-10 17:58:41 +00:00
|
|
|
use crate::syntax::{Lexer, Parser, SyntaxPlugin};
|
|
|
|
|
|
|
|
|
|
/// SyntaxPlugin facade: chains `VimwikiLexer` + `VimwikiParser` so the
|
2026-05-30 18:35:40 +00:00
|
|
|
/// registry can hand out a single trait object.
|
2026-05-10 17:58:41 +00:00
|
|
|
#[derive(Debug, Default, Clone)]
|
|
|
|
|
pub struct VimwikiSyntax;
|
|
|
|
|
|
|
|
|
|
impl VimwikiSyntax {
|
|
|
|
|
pub fn new() -> Self {
|
|
|
|
|
Self
|
|
|
|
|
}
|
2026-05-30 23:32:07 -03:00
|
|
|
|
|
|
|
|
/// 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)
|
|
|
|
|
}
|
2026-05-10 17:58:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
}
|