# match_registry URL: /api/parsing/inline/match_registry/ Section: inline -------------------------------------------------------------------------------- match_registry - Patitas window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/patitas/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/patitas/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/patitas/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/patitas/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/patitas/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/patitas/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/patitas/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/patitas/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/patitas/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/patitas/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/patitas/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/patitas/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/patitas/assets/js/enhancements/link-previews.8d906535.js' }; (function () { try { var defaults = window.BENGAL_THEME_DEFAULTS || { appearance: 'system', palette: '' }; var defaultAppearance = defaults.appearance; if (defaultAppearance === 'system') { defaultAppearance = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } var storedTheme = localStorage.getItem('bengal-theme'); var storedPalette = localStorage.getItem('bengal-palette'); var theme = storedTheme ? (storedTheme === 'system' ? defaultAppearance : storedTheme) : defaultAppearance; var palette = storedPalette ?? defaults.palette; document.documentElement.setAttribute('data-theme', theme); if (palette) { document.documentElement.setAttribute('data-palette', palette); } } catch (e) { document.documentElement.setAttribute('data-theme', 'light'); } })(); { "prerender": [ { "where": { "and": [ { "href_matches": "/docs/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ], "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ] } Skip to main content Magnifying Glass ESC Recent Clear Magnifying Glass No results for "" Start typing to search... ↑↓ Navigate ↵ Open ESC Close Powered by Lunr ฅᨐฅ DocumentationArrow ClockwiseGet StartedCodeSyntaxDirectivesStarburstExtendingBookmarkReferenceInfoAboutTroubleshootingReleasesDevGitHubPatitas API Reference Magnifying Glass Search ⌘K Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal List ฅᨐฅ Magnifying Glass Search X Close Documentation Caret Down Arrow Clockwise Get Started Code Syntax Directives Starburst Extending Bookmark Reference Info About Troubleshooting Releases Dev Caret Down GitHub Patitas API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Patitas API Reference Caret Right Directives Caret Right Builtins admonition container dropdown tabs contracts decorator options protocol registry Caret Right Lexer Caret Right Classifiers directive fence footnote heading html link_ref list quote thematic Caret Right Scanners block directive fence html core modes Caret Right Parsing Caret Right Blocks Caret Right List blank_line indent item_blocks marker mixin nested trace types core directive footnote table Caret Right Inline core emphasis links match_registry special tokens charsets containers token_nav Caret Right Plugins autolinks footnotes math strikethrough table task_lists Caret Right Renderers html Caret Right Roles Caret Right Builtins formatting icons math reference protocol registry Caret Right Utils hashing logger text errors highlighting icons location nodes parser patitas protocols stringbuilder tokens ParsingInline ᗢ Caret Down Link Copy URL External Open LLM text Copy Copy LLM text Share with AI Ask Claude Ask ChatGPT Ask Gemini Ask Copilot Module parsing.inline.match_registry Match registry for emphasis delimiter tracking. Decouples match state from token objects, enabling immutable tokens. This is a prerequisite for using NamedTuples as inline tokens. Thread Safety: MatchRegistry instances are single-use per _parse_inline() call. All state is instance-local; no shared mutable state. 2Classes Classes DelimiterMatch 3 ▼ Record of a matched opener-closer pair. Record of a matched opener-closer pair. Attributes Name Type Description opener_idx int Index of the opener token in the token list. closer_idx int Index of the closer token in the token list. match_count int Number of delimiters matched (1 for emphasis, 2 for strong). MatchRegistry 10 ▼ External tracking for delimiter matches. Decouples match state from token objects, enabling immuta… External tracking for delimiter matches. Decouples match state from token objects, enabling immutable tokens. All delimiter matching state is tracked here instead of mutating tokens. Usage: registry = MatchRegistry() registry.record_match(opener_idx=0, closer_idx=5, count=2) if registry.is_active(3): ... Complexity: record_match(): O(1) is_active(): O(1) deactivate(): O(1) remaining_count(): O(1) get_matches_for_opener(): O(1) amortized Attributes Name Type Description matches list[DelimiterMatch] — consumed dict[int, int] — deactivated set[int] — _opener_matches_cache dict[int, list[DelimiterMatch]] — Methods record_match 3 ▼ Record a delimiter match. def record_match(self, opener_idx: int, closer_idx: int, count: int) -> None Parameters Name Type Description opener_idx — Index of the opening delimiter token. closer_idx — Index of the closing delimiter token. count — Number of delimiters matched (1 or 2). is_active 1 bool ▼ Check if delimiter at idx is still active. def is_active(self, idx: int) -> bool Parameters Name Type Description idx — Token index to check. Returns bool True if the delimiter is still active (not deactivated). deactivate 1 ▼ Mark delimiter as inactive. def deactivate(self, idx: int) -> None Parameters Name Type Description idx — Token index to deactivate. remaining_count 2 int ▼ Get remaining delimiter count after matches. def remaining_count(self, idx: int, original_count: int) -> int Parameters Name Type Description idx — Token index to check. original_count — Original delimiter count for this token. Returns int Number of remaining unused delimiters. get_match_for_opener 1 DelimiterMatch | None ▼ Get first match record where idx is the opener. For nested emphasis (***text**… def get_match_for_opener(self, idx: int) -> DelimiterMatch | None Get first match record where idx is the opener. For nested emphasis (text), use get_matches_for_opener() instead. Parameters Name Type Description idx — Token index to check. Returns DelimiterMatch | None First DelimiterMatch if this token is an opener, None otherwise. get_matches_for_opener 1 list[DelimiterMatch] ▼ Get all match records where idx is the opener. Used for nested emphasis (e.g.,… def get_matches_for_opener(self, idx: int) -> list[DelimiterMatch] Get all match records where idx is the opener. Used for nested emphasis (e.g., text has 2 matches: strong and emphasis). Parameters Name Type Description idx — Token index to check. Returns list[DelimiterMatch] List of DelimiterMatch records, empty if not an opener. ← Previous links Next → special List © 2026 Patitas built in ᓚᘏᗢ { "linkPreviews": { "enabled": true, "hoverDelay": 200, "hideDelay": 150, "showSection": true, "showReadingTime": true, "showWordCount": true, "showDate": true, "showTags": true, "maxTags": 3, "includeSelectors": [".prose"], "excludeSelectors": ["nav", ".toc", ".breadcrumb", ".pagination", ".card", "[class*='-card']", ".tab-nav", "[class*='-widget']", ".child-items", ".content-tiles"], "allowedHosts": [], "allowedSchemes": ["https"], "hostFailureThreshold": 3 } } window.BENGAL_LAZY_ASSETS = { tabulator: '/patitas/assets/js/tabulator.min.js', dataTable: '/patitas/assets/js/data-table.js', mermaidToolbar: '/patitas/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/patitas/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/patitas/assets/js/graph-minimap.ff04e939.js', graphContextual: '/patitas/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/patitas/assets/icons/close.911d4fe1.svg', enlarge: '/patitas/assets/icons/enlarge.652035e5.svg', copy: '/patitas/assets/icons/copy.3d56e945.svg', 'download-svg': '/patitas/assets/icons/download.04f07e1b.svg', 'download-png': '/patitas/assets/icons/image.c34dfd40.svg', 'zoom-in': '/patitas/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/patitas/assets/icons/zoom-out.38857c77.svg', reset: '/patitas/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 1001 - Reading Time: 5 minutes