import glob import re from dataclasses import dataclass from typing import Dict tooltip_files = glob.glob("documentation/docs/tooltips/**/*.mdx", recursive=True) def read_tooltip_file(path: str) -> str: """ Reads all lines of a text file and returns its content as a single string. Args: path (str): The path to the file to be read. Returns: str: The entire content of the file as a single string. Raises: FileNotFoundError: If the specified file is not found. IOError: If there's an error reading the file. """ with open(path) as f: return f.read() def cleanhtml(raw_html: str) -> str: """ Removes HTML tags from a string. Args: raw_html (str): The string containing HTML tags to be removed. Returns: str: The input string with all HTML tags removed. """ cleantext = re.sub(re.compile("<[^<]+?>"), "", raw_html) return cleantext def clean_docusaurus_tags(text: str) -> str: """ Removes Docusaurus tags from a string. Args: text (str): The string containing Docusaurus tags to be removed. Returns: str: The input string with Docusaurus tags removed. """ text = text.replace(":::info note", "") text = text.replace(":::info Note", "") text = text.replace(":::tip tip", "") text = text.replace(":::", "") return text.strip() def clean_md_links(text: str) -> str: """ Removes Markdown links from a string, keeping only the link text. Args: text (str): The string containing Markdown links to be cleaned. Returns: str: The input string with Markdown links replaced by their text content. """ text = re.sub(r"\[(.*?)\]\(.*?\)", r"\1", text) return text @dataclass class Tooltip: """ Represents a single tooltip with a name and associated text. Attributes: name (str): A name for the tooltip. text (str): The content of the tooltip. """ name: str text: str def __repr__(self): return f"{self.name}: {self.text}" class Tooltips: """ A collection of tooltips that can be accessed by their names. During initialization, all tooltips are read from the specified tooltip files. Attributes: tooltips (Dict[str, Tooltip]): A dictionary mapping tooltip names to Tooltip\ objects. Methods: add_tooltip(tooltip: Tooltip): Adds a new tooltip to the collection. __getitem__(name: str) -> Optional[str]: Retrieves the text of a tooltip by its\ name. __len__() -> int: Returns the number of tooltips in the collection. __repr__() -> str: Returns a string representation of the tooltips collection. get(name: str, default=None) -> Optional[str]: Retrieves the text of a tooltip\ by its name, with an optional default value. """ def __init__(self, tooltip_files: list[str] = tooltip_files): """ Initializes the Tooltips collection by reading and processing tooltip files. Args: tooltip_files (List[str]): A list of file paths to tooltip files. Raises: ValueError: If a tooltip file name does not start with an underscore. ValueError: If a duplicate tooltip name is encountered. """ self.tooltips: Dict[str, Tooltip] = {} for filename in tooltip_files: name = filename.split("/")[-1].split(".")[0] name = name.replace("-", "_") if name.startswith("_"): name = name[1:] # remove leading underscore else: raise ValueError("Tooltip file names must start with an underscore.") # documentation/docs/tooltips/SECTION/_TOOLTIPNAME.mdx section = filename.split("/")[3] tooltip_name = f"{section}_{name}" if tooltip_name in self.tooltips.keys(): raise ValueError("Tooltip names must be unique.") text = read_tooltip_file(filename) text = cleanhtml(text) text = clean_docusaurus_tags(text) text = clean_md_links(text) self.add_tooltip(Tooltip(tooltip_name, text)) def add_tooltip(self, tooltip: Tooltip): """ Adds a new tooltip to the collection. Args: tooltip (Tooltip): The tooltip object to be added. """ self.tooltips[tooltip.name] = tooltip def __getitem__(self, name: str) -> None | str: """ Retrieves the text of a tooltip by its name. Args: name (str): The name of the tooltip to retrieve. Returns: Optional[str]: The text of the tooltip if found, None otherwise. """ try: text = self.tooltips[name].text except KeyError: text = None return text def __len__(self) -> int: return len(self.tooltips) def __repr__(self): return f"{self.tooltips}" def get(self, name: str, default=None): """ Retrieves the text of a tooltip by its name, with an optional default value. Args: name (str): The name of the tooltip to retrieve. default (Optional[str]): The default value to return if the tooltip is not \ found. Returns: Optional[str]: The text of the tooltip if found, or the default value \ otherwise. """ if name in self.tooltips.keys(): return self.tooltips[name].text else: return default tooltips = Tooltips()