| # 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 |