# delegate URL: /api/delegate/ Section: api -------------------------------------------------------------------------------- delegate - Rosettes window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/rosettes/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/rosettes/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/rosettes/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/rosettes/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/rosettes/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/rosettes/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/rosettes/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/rosettes/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/rosettes/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/rosettes/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/rosettes/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/rosettes/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/rosettes/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 StartedCodeHighlightingPaletteStylingStarburstExtendingFormattersNoteTutorialsBookmarkReferenceReleasesDevGitHubAPI 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 Highlighting Palette Styling Starburst Extending Formatters Note Tutorials Bookmark Reference Releases Dev Caret Down GitHub API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Rosettes API Reference Caret Right Formatters html null terminal Caret Right Lexers _scanners _state_machine bash_sm c_sm clojure_sm cpp_sm css_sm csv_sm cuda_sm cue_sm dart_sm diff_sm dockerfile_sm elixir_sm gleam_sm go_sm graphql_sm groovy_sm haskell_sm hcl_sm html_sm ini_sm java_sm javascript_sm jinja_sm json_sm julia_sm kida_sm kotlin_sm lua_sm makefile_sm markdown_sm mojo_sm nginx_sm nim_sm perl_sm php_sm pkl_sm plaintext_sm powershell_sm protobuf_sm python_sm r_sm ruby_sm rust_sm scala_sm sql_sm stan_sm swift_sm toml_sm tree_sm triton_sm typescript_sm v_sm xml_sm yaml_sm zig_sm Caret Right Themes _mapping _palette _roles palettes _config _escape _formatter_registry _parallel _protocol _registry _types delegate rosettes Rosettes 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 delegate LexerDelegate implementation using rosettes. Enables Zero-Copy Lexer Handoff (ZCLH) by bridging Patitas coordinate handoff to Rosettes state-machine lexers. Design Philosophy: Zero-Copy Lexer Handoff (ZCLH) is a performance pattern where: Coordinate Handoff: The markdown parser (Patitas) identifies fenced code blocks and records (start, end) positions Zero Copy: Instead of extracting substrings, we pass the entire source string with start/end indices Delegate Pattern: RosettesDelegate bridges the parser to the syntax highlighter without tight coupling This eliminates string allocation for code content: Traditional: code_block = source[start:end] → allocates new string ZCLH: tokenize(source, start=start, end=end) → no allocation Performance Impact: For a 10KB markdown file with 50 code blocks: Traditional extraction: ~5ms (50 allocations, GC pressure) ZCLH: ~3ms (0 allocations for content) Thread-Safety: RosettesDelegate is stateless — all methods use only their arguments. Safe for concurrent use from multiple threads on Python 3.14t. Integration: This delegate is used by Patitas (the markdown parser) and Bengal (the static site generator) to highlight fenced code blocks. Example: >>> delegate = RosettesDelegate() >>> source = "# Header\n```python\ndef foo(): pass\n```" >>> # Parser identifies code block at positions 19-34 >>> if delegate.supports_language("python"): ... tokens = list(delegate.tokenize_range(source, 19, 34, "python")) See Also: rosettes.get_lexer: Lexer lookup used internally rosettes.lexers._state_machine: How start/end are handled 1Class Classes RosettesDelegate 2 ▼ LexerDelegate implementation using rosettes. Thread-safe: All state is local to method calls. Desi… LexerDelegate implementation using rosettes. Thread-safe: All state is local to method calls. Designed for Python 3.14t free-threading. This class bridges markdown parsers (like Patitas) to Rosettes syntax highlighting, enabling zero-copy lexer handoff. Methods tokenize_range 4 Iterator[Token] ▼ Tokenize a range of source code using rosettes state-machine lexer. This is th… def tokenize_range(self, source: str, start: int, end: int, language: str) -> Iterator[Token] Tokenize a range of source code using rosettes state-machine lexer. This is the core ZCLH method: the source string is passed by reference, and only the (start, end) range is tokenized. No substring allocation. Performance: O(end - start) guaranteed. Zero allocations for code content. The lexer reads characters directly from source[start:end]. Parameters Name Type Description source — The complete source string (not just the code block). start — Starting index of the code block in source. end — Ending index (exclusive) of the code block. language — Language name or alias (e.g., 'python', 'js'). Returns Iterator[Token] supports_language 1 bool ▼ Check if rosettes supports the given language. Use this before calling tokeniz… def supports_language(self, language: str) -> bool Check if rosettes supports the given language. Use this before calling tokenize_range() to handle unsupported languages gracefully (e.g., fall back to plain text). Parameters Name Type Description language — Language name or alias to check. Returns bool True if the language is supported, False otherwise. ← Previous _types Next → rosettes List © 2026 Rosettes 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: '/rosettes/assets/js/tabulator.min.js', dataTable: '/rosettes/assets/js/data-table.js', mermaidToolbar: '/rosettes/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/rosettes/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/rosettes/assets/js/graph-minimap.ff04e939.js', graphContextual: '/rosettes/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/rosettes/assets/icons/close.911d4fe1.svg', enlarge: '/rosettes/assets/icons/enlarge.652035e5.svg', copy: '/rosettes/assets/icons/copy.3d56e945.svg', 'download-svg': '/rosettes/assets/icons/download.04f07e1b.svg', 'download-png': '/rosettes/assets/icons/image.c34dfd40.svg', 'zoom-in': '/rosettes/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/rosettes/assets/icons/zoom-out.38857c77.svg', reset: '/rosettes/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 956 - Reading Time: 5 minutes