# metadata URL: /api/analysis/metadata/ Section: analysis -------------------------------------------------------------------------------- metadata - Kida window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/kida/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/kida/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/kida/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/kida/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/kida/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/kida/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/kida/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/kida/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/kida/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/kida/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/kida/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/kida/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/kida/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 )彡 DocumentationInfoAboutArrow ClockwiseGet StartedCodeSyntaxTerminalUsageNoteTutorialsStarburstExtendingBookmarkReferenceTroubleshootingReleasesDevGitHubKida 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 Info About Arrow Clockwise Get Started Code Syntax Terminal Usage Note Tutorials Starburst Extending Bookmark Reference Troubleshooting Releases Dev Caret Down GitHub Kida API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Kida API Reference Caret Right Analysis analyzer cache config dependencies landmarks metadata purity roles Caret Right Compiler Caret Right Statements basic control_flow functions special_blocks template_structure variables _protocols coalescing core expressions utils Caret Right Environment core exceptions filters loaders protocols registry tests Caret Right Parser Caret Right Blocks control_flow core functions special_blocks template_structure variables _protocols core errors expressions statements tokens Caret Right Utils html lru_cache workers _types bytecode_cache kida lexer nodes template tstring Kida API ReferenceAnalysis ᗢ 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 analysis.metadata Metadata dataclasses for template introspection. Immutable, frozen dataclasses representing analysis results. All fields are conservative estimates — may over-approximate but never under. 2Classes Classes BlockMetadata 11 ▼ Metadata about a template block, inferred from static analysis. **All fields are conservative esti… Metadata about a template block, inferred from static analysis. All fields are conservative estimates: depends_on may include unused paths (over-approximation) is_pure defaults to "unknown" when uncertain inferred_role is heuristic, not semantic truth Thread-safe: Immutable after creation. Attributes Name Type Description name str Block identifier (e.g., "nav", "content", "sidebar") emits_html bool True if block produces any output. Used to detect empty blocks. emits_landmarks frozenset[str] HTML5 landmark elements emitted (nav, main, header, etc.). Detected from static HTML in Data nodes. inferred_role Literal['navigation', 'content', 'sidebar', 'header', 'footer', 'unknown'] Heuristic classification based on name and landmarks. One of: "navigation", "content", "sidebar", "header", "footer", "unknown" depends_on frozenset[str] Context paths this block may access (conservative superset). is_pure Literal['pure', 'impure', 'unknown'] Whether block output is deterministic for same inputs. - "pure": Deterministic, safe to cache - "impure": Uses random/shuffle/etc, must re-render - "unknown": Cannot determine, treat as potentially impure cache_scope Literal['none', 'page', 'site', 'unknown'] Recommended caching granularity. - "site": Cache once per site build (no page-specific deps) - "page": Cache per page (has page-specific deps) - "none": Cannot cache (impure) - "unknown": Cannot determine Example — frozenset({"page.title", "site.pages", "config.theme"}) Methods is_cacheable 0 bool ▼ Check if this block can be safely cached. **Returns True if:** - Block is pure… def is_cacheable(self) -> bool Check if this block can be safely cached. Returns True if: Block is pure (deterministic) Cache scope is not "none" Returns bool True if block can be cached, False otherwise. depends_on_page 0 bool ▼ Check if block depends on page-specific context. def depends_on_page(self) -> bool Returns bool True if any dependency starts with common page prefixes. depends_on_site 0 bool ▼ Check if block depends on site-wide context. def depends_on_site(self) -> bool Returns bool True if any dependency starts with common site prefixes. TemplateMetadata 9 ▼ Metadata about a complete template. Aggregates block metadata and tracks template-level informatio… Metadata about a complete template. Aggregates block metadata and tracks template-level information like inheritance and top-level dependencies. Attributes Name Type Description name str | None Template identifier (e.g., "page.html") extends str | None Parent template name from {% extends %}, or None. blocks dict[str, BlockMetadata] Mapping of block name → BlockMetadata. All blocks defined in this template. top_level_depends_on frozenset[str] Context paths used outside blocks. Captures dependencies from: - Code before/after blocks - Dynamic extends expressions - Template-level set/let statements Example — "base.html" Methods all_dependencies 0 frozenset[str] ▼ Return all context paths used anywhere in template. Combines top-level depende… def all_dependencies(self) -> frozenset[str] Return all context paths used anywhere in template. Combines top-level dependencies with all block dependencies. Returns frozenset[str] Frozen set of all context paths. get_block 1 BlockMetadata | None ▼ Get metadata for a specific block. def get_block(self, name: str) -> BlockMetadata | None Parameters Name Type Description name — Block name to look up. Returns BlockMetadata | None BlockMetadata if found, None otherwise. cacheable_blocks 0 list[BlockMetadata] ▼ Return all blocks that can be safely cached. def cacheable_blocks(self) -> list[BlockMetadata] Returns list[BlockMetadata] List of BlockMetadata where is_cacheable() is True. site_cacheable_blocks 0 list[BlockMetadata] ▼ Return blocks that can be cached site-wide. def site_cacheable_blocks(self) -> list[BlockMetadata] Returns list[BlockMetadata] List of BlockMetadata where cache_scope is "site". ← Previous landmarks Next → purity List © 2026 Kida 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: '/kida/assets/js/tabulator.min.js', dataTable: '/kida/assets/js/data-table.js', mermaidToolbar: '/kida/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/kida/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/kida/assets/js/graph-minimap.ff04e939.js', graphContextual: '/kida/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/kida/assets/icons/close.911d4fe1.svg', enlarge: '/kida/assets/icons/enlarge.652035e5.svg', copy: '/kida/assets/icons/copy.3d56e945.svg', 'download-svg': '/kida/assets/icons/download.04f07e1b.svg', 'download-png': '/kida/assets/icons/image.c34dfd40.svg', 'zoom-in': '/kida/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/kida/assets/icons/zoom-out.38857c77.svg', reset: '/kida/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 1057 - Reading Time: 5 minutes