Coverage for archdocs/page.py: 100%

15 statements  

« prev     ^ index     » next       coverage.py v7.17.2, created at 2026-11-09 14:41 +0000

1import html 

2import typing 

3 

4from archdocs import mermaid_syntax, settings 

5from archdocs.main import ArchitectureParserAndRenderer 

6 

7 

8def render_mermaid_text(arch_engine: ArchitectureParserAndRenderer, /) -> str: 

9 return f"{mermaid_syntax.DIAGRAM_HEADER}\n{arch_engine.render_architecture_diagram()}\n" 

10 

11 

12def render_markdown_text(arch_engine: ArchitectureParserAndRenderer, /) -> str: 

13 return f"```mermaid\n{render_mermaid_text(arch_engine)}```\n" 

14 

15 

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) 

27 

28 

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("&", "&amp;").replace("<", "&lt;") 

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 )