/** * A single token in the inline token stream. The `role` field * distinguishes structural markers from literal content, which * is the key insight that makes round-trip escaping correct. */ import type { Token, TagCollectionType } from "./types"; /** * Scans markdown text into a stream of typed tokens. Handles * backslash escapes, entities, flanking rules, links, * autolinks, HTML tags, and hard line breaks. * * const tokenizer = new Tokenizer([ * { delimiter: '**', htmlTag: 'strong', recursive: true, precedence: 40 }, * { delimiter: '*', htmlTag: 'em', recursive: true, precedence: 50 }, * ]); * const tokens = tokenizer.tokenize('**bold**'); */ export declare class Tokenizer { private tags; constructor(tags: TagCollectionType); /** * Tokenize a markdown string into an inline token stream. * * tokenizer.tokenize('hello **world**') * // [text "hello "] [open "**"] [text "world"] [close "**"] */ tokenize(source: string): Token[]; /** * Try to resolve an HTML entity at the start of the string. * Returns the resolved character and the length consumed, or null. */ private resolveEntity; /** * Match a code span starting at the given position. * Handles single backtick delimiters only (not multi-backtick). */ private matchCodeSpan; /** * Match a markdown link [text](url) or [text](url "title") * starting at the given position. Disallows [ in link text * to prevent nested link ambiguity. */ private matchLink; /** * Match an angle-bracket autolink at the start of the string. */ private matchAutolink; /** * Match a bare URL (https://...) at the start of the string. */ private matchBareUrl; /** * Match an HTML tag at the start of the string. */ private matchHtmlTag; /** * Try to match a delimiter at the given position. For runs of the * same character (e.g. *** = 3 asterisks), the run is split into * the longest registered delimiter that fits, then the remainder. * This handles cases like **bold***italic* where *** must split * into ** (close bold) + * (open italic). */ private matchTag; }