| # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 | """Common utilities used by mdbook pre-processors.""" | 
 |  | 
 | import sys | 
 | import re | 
 | from os import path | 
 | from typing import List, Any, Dict, Generator, Set | 
 | from pathlib import Path | 
 |  | 
 | LINK_PATTERN_STR = r"\[(.*?)\]\(([^#\?\)]*)(.*?)\)" | 
 | LINK_PATTERN = re.compile(LINK_PATTERN_STR) | 
 |  | 
 |  | 
 | def change_link_ext( | 
 |         file_list: Set[Path], | 
 |         content: str, | 
 |         new_suffix: str, | 
 |         book_root: Path, | 
 |         page_path: Path, | 
 | ) -> str: | 
 |     def suffix_swap(match: re.Match) -> str: | 
 |         """Swaps the extension of the file being linked to if it is a ip block config.""" | 
 |         try: | 
 |             # relative_to can fail with a value error, if it isn't a local link | 
 |             book_relative_path = (page_path / match.group(2)).resolve().relative_to(book_root) | 
 |         except ValueError: | 
 |             return match.group(0) | 
 |  | 
 |         if book_relative_path in file_list: | 
 |             return "[{}]({}{}{})".format( | 
 |                 match.group(1), | 
 |                 path.splitext(match.group(2))[0], | 
 |                 new_suffix, | 
 |                 match.group(3), | 
 |             ) | 
 |         else: | 
 |             return match.group(0) | 
 |  | 
 |     return LINK_PATTERN.sub(suffix_swap, content) | 
 |  | 
 |  | 
 | def supports_html_only() -> None: | 
 |     if len(sys.argv) > 2: | 
 |         if (sys.argv[1], sys.argv[2]) == ("supports", "html"): | 
 |             sys.exit(0) | 
 |         else: | 
 |             sys.exit(1) | 
 |  | 
 |  | 
 | def chapters(items: List[Dict[str, Any]]) -> Generator[Dict[str, Any], None, None]: | 
 |     """Recursively yields all chapters""" | 
 |     for chapter in (item.get("Chapter") for item in items): | 
 |         if not chapter: | 
 |             continue | 
 |  | 
 |         for sub_chapter in chapters(chapter["sub_items"]): | 
 |             yield sub_chapter | 
 |  | 
 |         yield chapter |