You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
4 months ago
|
import re
|
||
|
import tomllib
|
||
|
|
||
|
def load_glossary(file_path="docs/glossary.toml"):
|
||
|
with open(file_path, "rb") as f:
|
||
|
glossary_data = tomllib.load(f)
|
||
|
return glossary_data.get("glossary", {})
|
||
|
|
||
|
def generate_anchor_id(name):
|
||
|
return name.replace(" ", "-").replace("_", "-").lower()
|
||
|
|
||
|
def format_markdown_term(name, definition):
|
||
|
anchor_id = generate_anchor_id(name)
|
||
|
markdown = f"* [**{name.replace('_', ' ').title()}**](#{anchor_id})"
|
||
|
if definition.get("abbreviation"):
|
||
|
markdown += f" *({definition['abbreviation']})*"
|
||
|
if definition.get("description"):
|
||
|
markdown += f": {definition['description']}\n"
|
||
|
return markdown
|
||
|
|
||
|
def glossary_markdown(vocabulary):
|
||
|
markdown = ""
|
||
|
for category, terms in vocabulary.items():
|
||
|
markdown += f"## {category.replace('_', ' ').title()}\n\n"
|
||
|
for name, definition in terms.items():
|
||
|
markdown += format_markdown_term(name, definition)
|
||
|
return markdown
|
||
|
|
||
|
def format_tooltip_html(term_key, definition, html):
|
||
|
display_term = term_key.replace("_", " ").title()
|
||
|
clean_description = re.sub(r"\[(.+)]\(.+\)", r"\1", definition["description"])
|
||
|
glossary_link = (
|
||
|
f"<a href='/concepts/glossary#{term_key}' class='tooltip-glossary-link' title='View in glossary'>Glossary🔗</a>"
|
||
|
)
|
||
|
return re.sub(
|
||
|
re.escape(display_term),
|
||
|
lambda
|
||
|
match: f"<span data-tooltip>{match.group(0)}<span class='tooltip-content'>{clean_description} {glossary_link}</span></span>",
|
||
|
html,
|
||
|
flags=re.IGNORECASE,
|
||
|
)
|
||
|
|
||
|
def apply_tooltip(_term_key, _definition, pattern, html):
|
||
|
return re.sub(
|
||
|
pattern,
|
||
|
lambda match: format_tooltip_html(_term_key, _definition, match.group(0)),
|
||
|
html,
|
||
|
flags=re.IGNORECASE,
|
||
|
)
|
||
|
|
||
|
def tooltip_html(vocabulary, html):
|
||
|
for _category, terms in vocabulary.items():
|
||
|
for term_key, definition in terms.items():
|
||
|
if definition.get("description"):
|
||
|
pattern = rf"(?<!\w){re.escape(term_key.replace('_', ' ').title())}(?![^<]*<\/a>)(?!\([^)]*\))"
|
||
|
html = apply_tooltip(term_key, definition, pattern, html)
|
||
|
return html
|
||
|
|
||
|
# Page Hooks
|
||
|
def on_page_markdown(markdown, **kwargs):
|
||
|
glossary = load_glossary()
|
||
|
return markdown.replace("{{GLOSSARY_DEFINITIONS}}", glossary_markdown(glossary))
|
||
|
|
||
|
def on_page_content(html, **kwargs):
|
||
|
if kwargs.get("page").title == "Glossary":
|
||
|
return html
|
||
|
glossary = load_glossary()
|
||
|
return tooltip_html(glossary, html)
|