//! AST types for nuwiki documents. //! //! Types here are syntax-agnostic — both vimwiki and (eventually) markdown //! produce the same node shapes. pub mod block; pub mod inline; pub mod link; pub mod span; pub mod visit; pub use block::{ BlockNode, BlockquoteNode, CheckboxState, CommentNode, DefinitionItemNode, DefinitionListNode, ErrorNode, HeadingNode, HorizontalRuleNode, ListItemNode, ListNode, ListSymbol, MathBlockNode, ParagraphNode, PreformattedNode, TableAlign, TableCellNode, TableNode, TableRowNode, TagNode, TagScope, }; pub use inline::{ inline_text, BoldItalicNode, BoldNode, CodeNode, ColorNode, InlineNode, ItalicNode, Keyword, KeywordNode, MathInlineNode, SoftBreakNode, StrikethroughNode, SubscriptNode, SuperscriptNode, TextNode, }; pub use link::{ ExternalLinkNode, LinkKind, LinkTarget, RawUrlNode, TransclusionNode, WikiLinkNode, }; pub use span::{Position, Span}; pub use visit::{ walk_block, walk_definition_item, walk_document, walk_inline, walk_list, walk_list_item, walk_table, walk_table_row, Visitor, }; /// Root of an AST. #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct DocumentNode { pub span: Span, pub children: Vec, pub metadata: PageMetadata, } /// Document-level placeholders parsed from `%title` / `%nohtml` / `%template` /// / `%date` directives, plus the file-level tag accumulator. /// /// New fields are added at the bottom; consumers should construct with /// `..Default::default()` to stay forward-compatible. #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct PageMetadata { pub title: Option, pub nohtml: bool, pub template: Option, pub date: Option, /// File-scope tags parsed by the tag lexer. Convenience /// projection of the `BlockNode::Tag` nodes whose scope is `File`. pub tags: Vec, }