# sanitize URL: /api/sanitize/ Section: api -------------------------------------------------------------------------------- sanitize - 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.736b857e.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.96c8880c.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.96620bcf.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 StartedCodeSyntaxDirectivesStarburstExtendingBookmarkReferenceInfoAboutWarningTroubleshootingReleasesDevGitHubPatitas API ReferenceForum 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 Warning Troubleshooting Releases Dev Caret Down GitHub Patitas API Reference Forum 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 fast_path indent item_blocks marker mixin nested trace types core directive footnote quote_fast_path quote_token_reuse table Caret Right Inline core emphasis links match_registry special tokens charsets compiled_dispatch containers dispatch pattern_parsers protocols shared_tokens token_nav ultra_fast Caret Right Plugins autolinks footnotes math strikethrough table task_lists Caret Right Renderers html llm protocol Caret Right Roles Caret Right Builtins formatting icons math reference protocol registry Caret Right Utils hashing logger text cache config context differ errors excerpt frontmatter highlighting icons incremental location nodes notebook parser patitas profiling protocols sanitize serialization stringbuilder text tokens visitor 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 sanitize Composable sanitization policies for Patitas AST. Provides immutable transform policies for stripping unsafe content before LLM consumption or web rendering. Policies compose via the | operator. Example: >>> from patitas import parse, sanitize >>> from patitas.sanitize import strip_html, strip_dangerous_urls, llm_safe >>> doc = parse("# Hello\n\n<script>alert(1)</script>") >>> clean = sanitize(doc, policy=llm_safe) 1Class11Functions Classes Policy 3 ▼ Wrapper for Document -> Document transform, supports composition via |. Wrapper for Document -> Document transform, supports composition via |. Methods Internal Methods 3 ▼ __init__ 1 ▼ def __init__(self, fn: Callable[[Document], Document]) -> None Parameters Name Type Description fn — __call__ 1 Document ▼ def __call__(self, doc: Document) -> Document Parameters Name Type Description doc — Returns Document __or__ 1 Policy ▼ Chain policies: (self | other)(doc) applies self then other. def __or__(self, other: Policy) -> Policy Parameters Name Type Description other — Returns Policy Functions _is_dangerous_url 1 bool ▼ Check if URL uses a dangerous scheme. def _is_dangerous_url(url: str) -> bool Parameters Name Type Description url str Returns bool _scheme_allowed 2 bool ▼ Check if URL scheme is in allowed set. def _scheme_allowed(url: str, allowed: frozenset[str]) -> bool Parameters Name Type Description url str allowed frozenset[str] Returns bool _strip_html 1 Document ▼ Remove all HtmlBlock and HtmlInline nodes. def _strip_html(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document _strip_html_comments 1 Document ▼ Remove HtmlInline nodes where .html starts with <!--. def _strip_html_comments(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document _strip_dangerous_urls 1 Document ▼ Remove Link and Image nodes with javascript:, data:, vbscript: URLs. def _strip_dangerous_urls(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document _normalize_unicode 1 Document ▼ Strip zero-width characters and bidi overrides from Text nodes. def _normalize_unicode(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document _strip_images 1 Document ▼ Replace Image nodes with Text nodes containing alt text. def _strip_images(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document _strip_raw_code 1 Document ▼ Remove FencedCode and IndentedCode blocks. def _strip_raw_code(doc: Document) -> Document Parameters Name Type Description doc Document Returns Document allow_url_schemes 1 Policy ▼ Keep only Link/Image nodes with allowed URL schemes. Default schemes: https, h… def allow_url_schemes(*schemes: str) -> Policy Keep only Link/Image nodes with allowed URL schemes. Default schemes: https, http, mailto. Parameters Name Type Description *schemes str Returns Policy limit_depth 1 Policy ▼ Placeholder for depth limiting (prevent adversarial nesting). Intended to remo… def limit_depth(max_depth: int = 10) -> Policy Placeholder for depth limiting (prevent adversarial nesting). Intended to remove blocks exceeding max_depth levels. Currently a pass-through; full implementation would track depth in transform. Parameters Name Type Description max_depth int Default: 10 Returns Policy sanitize 2 Document ▼ Apply a sanitization policy to a document. def sanitize(doc: Document, *, policy: Policy | Callable[[Document], Document]) -> Document Parameters Name Type Description doc Document Document to sanitize. policy Policy | Callable[[Document], Document] Policy or callable Document -> Document. Returns Document ← Previous protocols Next → serialization 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, "showDeadLinks": true } } 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: 1053 - Reading Time: 5 minutes