cindermark 0.2.0

High-performance incremental Markdown parser with UTF-16 offsets, built for native text editors on Apple platforms
Documentation
namespace cindermark {};

[Enum]
interface FfiBlockType {
    Heading();
    Paragraph();
    CodeBlock();
    Blockquote();
    BulletList();
    OrderedList();
    Checkbox();
    Table();
    HorizontalRule();
    Empty();
    FootnoteDefinition();
    ImageMarker();
    BulletItem();
    NumberedItem();
    // Callout (`[!<kind>]` blockquote). `kind` is 0=note, 1=tip, 2=warning, 3=important,
    // 4=caution. Custom title (if any) is passed via the block's `language` field.
    Callout(u8 kind);
    // Mermaid diagram fenced block. `diagram_type` is a u8 mapping to the
    // MermaidDiagramType enum (0=Unknown, 1=Flowchart, 2=Graph, 3=SequenceDiagram,
    // 4=ClassDiagram, 5=StateDiagram, 6=ErDiagram, 7=Gantt, 8=Mindmap, 9=Pie,
    // 10=Journey, 11=Timeline, 12=GitGraph, 13=C4, 14=RequirementDiagram,
    // 15=Quadrant, 16=Sankey, 17=XYChart, 18=Block, 19=Packet, 20=Architecture,
    // 21=Kanban, 22=Radar). Source is carried in the block's `text` field.
    MermaidDiagram(u8 diagram_type);
};

[Enum]
interface FfiInlineType {
    Bold();
    Italic();
    BoldItalic();
    Strikethrough();
    UnderlineTilde();
    UnderlineHtml();
    InlineCode();
    Highlight();
    HighlightColor(u8 color_index);
    // Highlight backed by an arbitrary hex color (`=={#RRGGBB}text==`).
    HighlightHex(string hex);
    Link(string url);
    AutoLink(string url);
    WikiLink();
    FootnoteRef();
    // `%%hidden%%` drafting comment — faded in editor, stripped from preview.
    Comment();
    // Inline hex color literal. `hex` is normalized 6-digit lowercase.
    HexColor(string hex);
};

dictionary FfiInlineSpan {
    FfiInlineType inline_type;
    u32 utf16_start;
    u32 utf16_end;
    u32 content_utf16_start;
    u32 content_utf16_end;
};

dictionary FfiListItem {
    string text;
    sequence<FfiInlineSpan> inline_spans;
};

dictionary FfiBlock {
    FfiBlockType block_type;
    u32 line_start;
    u32 line_end;
    u32 utf16_start;
    u32 utf16_end;
    u32 list_indent;
    u32 marker_utf16_start;
    u32 marker_utf16_end;
    string marker_source;
    string unordered_marker;
    string ordered_delimiter;
    string ordered_raw_number;
    u8 heading_level;
    u32 number;
    boolean is_checked;
    string? language;
    string text;
    sequence<FfiInlineSpan> inline_spans;
    sequence<FfiListItem> list_items;
    sequence<string> table_headers;
    sequence<sequence<string>> table_rows;
    sequence<u8> table_alignments;
};

dictionary FfiDocumentStats {
    u32 word_count;
    u32 character_count;
    u32 character_count_no_spaces;
    u32 paragraph_count;
    u32 sentence_count;
    u32 checkbox_total;
    u32 checkbox_completed;
    u32 reading_time_seconds;
    u32 heading_count;
    u32 link_count;
    u32 code_block_count;
    u32 mermaid_diagram_count;
};

dictionary FfiHeading {
    u8 level;
    string text;
};

dictionary FfiParseResult {
    sequence<FfiBlock> blocks;
    u32 line_count;
    FfiDocumentStats stats;
    sequence<string> wiki_links;
    sequence<FfiHeading> headings;
};

dictionary FfiSaveParseResult {
    sequence<FfiBlock> blocks;
    u32 line_count;
    FfiDocumentStats stats;
    sequence<string> wiki_links;
    sequence<FfiHeading> headings;
    FfiRenderedPreview short_preview;
    FfiRenderedPreview long_preview;
};

dictionary FfiIncrementalResult {
    sequence<FfiBlock> blocks;
    u32 line_count;
    u32 dirty_start;
    u32 dirty_end;
    FfiDocumentStats stats;
};

dictionary FfiIncrementalStyleResult {
    sequence<FfiBlock> blocks;
    u32 line_count;
    u32 dirty_start;
    u32 dirty_end;
};

dictionary FfiPreviewSpan {
    FfiInlineType span_type;
    u32 start;
    u32 end;
};

dictionary FfiRenderedPreview {
    string plain_text;
    sequence<FfiPreviewSpan> spans;
};

interface CindermarkParser {
    constructor(optional string? image_marker_scheme = null);
    FfiParseResult parse(string text);
    FfiParseResult parse_editable(string text);
    FfiIncrementalResult parse_editable_incremental(string text, u32 edit_utf16_start, u32 edit_old_utf16_len, u32 edit_new_utf16_len);
    FfiIncrementalStyleResult parse_editable_incremental_style_only(string text, u32 edit_utf16_start, u32 edit_old_utf16_len, u32 edit_new_utf16_len);
    void reset_state();
    sequence<string> extract_wiki_links(string text);
    string toggle_checkbox(string text, u32 line_index);
    FfiRenderedPreview render_preview(string text, u32 max_chars);
    sequence<FfiRenderedPreview> render_previews(string text, u32 short_max, u32 long_max);
    FfiSaveParseResult parse_for_save(string text, u32 short_preview_max, u32 long_preview_max);
};