Coverage for archdocs/page.py: 100%
15 statements
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-09 14:41 +0000
« prev ^ index » next coverage.py v7.17.2, created at 2026-11-09 14:41 +0000
1import html
2import typing
4from archdocs import mermaid_syntax, settings
5from archdocs.main import ArchitectureParserAndRenderer
8def render_mermaid_text(arch_engine: ArchitectureParserAndRenderer, /) -> str:
9 return f"{mermaid_syntax.DIAGRAM_HEADER}\n{arch_engine.render_architecture_diagram()}\n"
12def render_markdown_text(arch_engine: ArchitectureParserAndRenderer, /) -> str:
13 return f"```mermaid\n{render_mermaid_text(arch_engine)}```\n"
16def _fill_asset_links(arch_engine: ArchitectureParserAndRenderer, /) -> str:
17 page_settings: typing.Final = arch_engine.local_settings
18 font_tag: typing.Final = (
19 settings.FONT_STYLESHEET_TAG.format(html.escape(page_settings.font_stylesheet_url))
20 if page_settings.font_stylesheet_url
21 else ""
22 )
23 return settings.UI_HTML_TEMPLATE.replace(
24 settings.MERMAID_SCRIPT_TAG.format(html.escape(settings.DEFAULT_MERMAID_SCRIPT_URL)),
25 settings.MERMAID_SCRIPT_TAG.format(html.escape(page_settings.mermaid_script_url)),
26 ).replace(settings.FONT_STYLESHEET_TAG.format(html.escape(settings.DEFAULT_FONT_STYLESHEET_URL)), font_tag)
29def render_architecture_page(arch_engine: ArchitectureParserAndRenderer, /) -> str:
30 # In `<pre>` the diagram is text, so markup characters are escaped or the browser eats the labels.
31 escaped_diagram: typing.Final = render_mermaid_text(arch_engine).replace("&", "&").replace("<", "<")
32 return settings.UI_PLACEHOLDER_PATTERN.sub(
33 lambda placeholder_match: (
34 f"{placeholder_match.group('pre_open')}{escaped_diagram}{placeholder_match.group('pre_close')}"
35 ),
36 _fill_asset_links(arch_engine),
37 count=1,
38 )