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
			| 
											11 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)
 |