# plugins URL: /api/plugins/ Section: plugins -------------------------------------------------------------------------------- plugins - 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 Patitas API Reference ᗢ 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 plugins Plugin system for Patitas Markdown parser. Plugins extend Patitas with additional syntax support: table: GFM-style pipe tables strikethrough: deleted syntax task_lists: - [ ] checkboxes (built into core, enabled by default) footnotes: [^1] references math: $inline$ and $$block$$ math autolinks: Automatic URL and email detection Usage: >>> from patitas import Markdown >>> >>> # Enable specific plugins >>> md = Markdown(plugins=["table", "strikethrough", "math"]) >>> html = md("| A | B | |---|---| | 1 | 2 |") >>> >>> # Enable all plugins >>> md = Markdown(plugins=["all"]) Plugin Architecture: Unlike mistune's regex-based plugins, Patitas uses a state-machine lexer. Plugins hook into specific extension points: Inline plugins (strikethrough, math inline): Registered with the inline parser Called when special characters are encountered Block plugins (table, math block, footnote definitions): Registered with the block scanner Called at line start when block patterns match Post-processing plugins (footnotes, autolinks): Transform AST or rendered output Called after main parsing/rendering Thread Safety: All plugins are stateless. State is stored in AST nodes or passed as arguments. Multiple threads can use the same plugin instances concurrently. 1Class3Functions Classes PatitasPlugin 4 ▼ Protocol for Patitas plugins. Plugins can hook into multiple extension points: - extend_lexer: Add… Protocol for Patitas plugins. Plugins can hook into multiple extension points: extend_lexer: Add token types and scanning logic extend_parser: Add parsing rules for new tokens extend_renderer: Add rendering methods for new nodes Thread Safety: Plugins must be stateless. All state should be in AST nodes. Methods name 0 str ▼ Plugin identifier. property def name(self) -> str Returns str extend_lexer 1 ▼ Extend lexer with additional token scanning. Called once at parser configurati… def extend_lexer(self, lexer_class: type[Lexer]) -> None Extend lexer with additional token scanning. Called once at parser configuration time. Should add methods or modify class behavior. Parameters Name Type Description lexer_class — extend_parser 1 ▼ Extend parser with additional parsing rules. Called once at parser configurati… def extend_parser(self, parser_class: type[Parser]) -> None Extend parser with additional parsing rules. Called once at parser configuration time. Should add methods or modify class behavior. Parameters Name Type Description parser_class — extend_renderer 1 ▼ Extend renderer with additional render methods. Called once at parser configur… def extend_renderer(self, renderer_class: type[HtmlRenderer]) -> None Extend renderer with additional render methods. Called once at parser configuration time. Should add methods for new node types. Parameters Name Type Description renderer_class — Functions register_plugin 1 type[PatitasPlugin] ▼ Decorator to register a plugin. **Usage:** @register_plugin("table") class… def register_plugin(name: str) -> type[PatitasPlugin] Decorator to register a plugin. Usage: @register_plugin("table") class TablePlugin: ... Parameters Name Type Description name str Plugin name for lookup Returns type[PatitasPlugin] get_plugin 1 PatitasPlugin ▼ Get a plugin instance by name. def get_plugin(name: str) -> PatitasPlugin Parameters Name Type Description name str Plugin name (e.g., "table", "strikethrough") Returns PatitasPlugin apply_plugins 4 None ▼ Apply plugins to parser components. def apply_plugins(plugins: list[str], lexer_class: type[Lexer], parser_class: type[Parser], renderer_class: type[HtmlRenderer]) -> None Parameters Name Type Description plugins list[str] List of plugin names to apply lexer_class type[Lexer] Lexer class to extend parser_class type[Parser] Parser class to extend renderer_class type[HtmlRenderer] Renderer class to extend ← Previous math Next → strikethrough 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: 1049 - Reading Time: 5 minutes