# html
URL: /api/renderers/html/
Section: renderers
--------------------------------------------------------------------------------
html - 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 ReferenceRenderers ᗢ 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 renderers.html HTML renderer using StringBuilder pattern. Renders typed AST to HTML with O(n) performance using StringBuilder. Thread Safety: All state is local to each render() call. Multiple threads can render concurrently without synchronization. Single-Pass Heading Decoration: Heading IDs are generated during the AST walk, eliminating the need for regex-based post-processing. TOC data is collected during rendering. 2Classes2Functions Classes HeadingInfo 3 ▼ Heading metadata collected during rendering. Used to build TOC without post-render regex scanning.… Heading metadata collected during rendering. Used to build TOC without post-render regex scanning. Collected by HtmlRenderer during the AST walk. Attributes Name Type Description level int — text str — slug str — HtmlRenderer 21 ▼ Render AST to HTML using StringBuilder pattern. O(n) rendering using StringBuilder for string accu… Render AST to HTML using StringBuilder pattern. O(n) rendering using StringBuilder for string accumulation. All state is local to each render() call. Usage: >>> from patitas.parser import Parser >>> parser = Parser() >>> doc = parser.parse("# Hello **World**") >>> renderer = HtmlRenderer() >>> html = renderer.render(doc) '<h1>Hello <strong>World</strong></h1>\n' Thread Safety: Multiple threads can render concurrently without synchronization. Each call creates independent StringBuilder. Methods render 1 str ▼ Render document AST to HTML string. **Thread Safety:** Creates independent Str… def render(self, node: Document) -> str Render document AST to HTML string. Thread Safety: Creates independent StringBuilder per call. Safe for concurrent execution. Parameters Name Type Description node — Document AST root Returns str HTML string get_headings 0 list[HeadingInfo] ▼ Get heading info collected during last render. def get_headings(self) -> list[HeadingInfo] Returns list[HeadingInfo] List of HeadingInfo from the last render() call. Empty if render() hasn't been called. Internal Methods 19 ▼ __init__ 1 ▼ Initialize renderer. def __init__(self, source: str = '') -> None Parameters Name Type Description source — Original source buffer for zero-copy extraction Default: '' _render_block 2 ▼ Render a block node. def _render_block(self, block: Block, sb: StringBuilder) -> None Parameters Name Type Description block — sb — _render_heading 2 ▼ Render heading with ID for anchoring. def _render_heading(self, heading: Heading, sb: StringBuilder) -> None Parameters Name Type Description heading — sb — _render_paragraph 2 ▼ Render paragraph. def _render_paragraph(self, para: Paragraph, sb: StringBuilder) -> None Parameters Name Type Description para — sb — _render_fenced_code 2 ▼ Render fenced code block. def _render_fenced_code(self, code: FencedCode, sb: StringBuilder) -> None Parameters Name Type Description code — sb — _render_indented_code 2 ▼ Render indented code block. def _render_indented_code(self, code: IndentedCode, sb: StringBuilder) -> None Parameters Name Type Description code — sb — _render_blockquote 2 ▼ Render block quote. def _render_blockquote(self, quote: BlockQuote, sb: StringBuilder) -> None Parameters Name Type Description quote — sb — _render_list 2 ▼ Render ordered or unordered list. def _render_list(self, lst: List, sb: StringBuilder) -> None Parameters Name Type Description lst — sb — _render_list_item 3 ▼ Render list item. CommonMark: - Tight lists: Single paragraph items render as … def _render_list_item(self, item: ListItem, sb: StringBuilder, tight: bool) -> None Render list item. CommonMark: Tight lists: Single paragraph items render as text (no tags) Loose lists: All paragraphs wrapped in tags Parameters Name Type Description item — sb — tight — _render_table 2 ▼ Render GFM-style table. def _render_table(self, table: Table, sb: StringBuilder) -> None Parameters Name Type Description table — sb — _render_table_row 4 ▼ Render table row. def _render_table_row(self, row: TableRow, sb: StringBuilder, is_header: bool, alignments: tuple[str | None, ...]) -> None Parameters Name Type Description row — sb — is_header — alignments — _render_math_block 2 ▼ Render block math. def _render_math_block(self, math: MathBlock, sb: StringBuilder) -> None Parameters Name Type Description math — sb — _render_directive 2 ▼ Render directive block. If a directive registry is configured and has a handle… def _render_directive(self, directive: Directive[Any], sb: StringBuilder) -> None Render directive block. If a directive registry is configured and has a handler for this directive, use it. Otherwise, render as a generic container. Parameters Name Type Description directive — sb — _render_inlines 2 ▼ Render a sequence of inline nodes. def _render_inlines(self, inlines: tuple[Inline, ...], sb: StringBuilder) -> None Parameters Name Type Description inlines — sb — _render_inline 2 ▼ Render an inline node. def _render_inline(self, inline: Inline, sb: StringBuilder) -> None Parameters Name Type Description inline — sb — _render_role 2 ▼ Render inline role. def _render_role(self, role: Role, sb: StringBuilder) -> None Parameters Name Type Description role — sb — _extract_text 1 str ▼ Extract plain text from inline nodes. def _extract_text(self, inlines: tuple[Inline, ...]) -> str Parameters Name Type Description inlines — Returns str _collect_footnotes 1 ▼ Collect footnote definitions from document. def _collect_footnotes(self, doc: Document) -> None Parameters Name Type Description doc — _render_footnotes_section 1 ▼ Render footnotes section at end of document. def _render_footnotes_section(self, sb: StringBuilder) -> None Parameters Name Type Description sb — Functions html_escape 1 str ▼ Escape HTML special characters. CommonMark-compliant: escapes , &, " but NOT s… def html_escape(s: str) -> str Escape HTML special characters. CommonMark-compliant: escapes <, >, &, " but NOT single quotes. Python's html.escape() escapes ' to ' which CommonMark doesn't require. Parameters Name Type Description s str Returns str _encode_url 1 str ▼ Encode URL for CommonMark compliance. CommonMark requires: 1. Decode HTML enti… def _encode_url(url: str) -> str Encode URL for CommonMark compliance. CommonMark requires: Decode HTML entities (e.g., ä → ä) Percent-encode special characters (spaces, backslashes, non-ASCII) Returns URL safe for href attribute (still needs html_escape for quotes). Parameters Name Type Description url str Returns str Next → renderers 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: 1438
- Reading Time: 7 minutes