|
| 1 | +import re |
1 | 2 | import shutil
|
2 | 3 | from pathlib import Path
|
3 | 4 |
|
4 |
| -import marko |
5 | 5 | import minify_html
|
6 |
| -from marko.block import Heading |
7 |
| -from marko.block import ListItem |
8 |
| -from marko.block import Paragraph |
9 |
| -from marko.helpers import MarkoExtension |
10 |
| -from marko.inline import Link as MarkdownLink |
11 |
| -from marko.md_renderer import MarkdownRenderer |
12 | 6 | from mkdocs import plugins
|
13 | 7 | from mkdocs.config.defaults import MkDocsConfig
|
14 | 8 | from mkdocs.structure.files import Files
|
|
18 | 12 |
|
19 | 13 | MAN_INDEXES = ["man1/index.md", "man3/index.md", "man5/index.md", "man7/index.md"]
|
20 | 14 | SKIP_FILES = ["index.md", "fips.md"]
|
| 15 | +LINKS_PATTERN = re.compile(r"\.\.\/\.\.\/man[1,3,5,7]{1}\/[a-zA-Z0-9_\-.]+") |
| 16 | +HEADINGS_PATTERN = re.compile(r" {0,3}(#{1,6})((?=\s)[^\n]*?|[^\n\S]*)(?:(?<=\s)(?<!\\)#+)?[^\n\S]*$\n?", flags=re.M) |
21 | 17 | LINKS_MAP = {}
|
22 | 18 |
|
23 | 19 |
|
24 |
| -class HackedListItem(ListItem): |
25 |
| - |
26 |
| - override = True |
27 |
| - |
28 |
| - @classmethod |
29 |
| - def parse(cls, source) -> ListItem: |
30 |
| - state = cls(source.context.list_item_info) |
31 |
| - state.children = [] |
32 |
| - with source.under_state(state): |
33 |
| - if not source.next_line().strip(): |
34 |
| - source.consume() |
35 |
| - if not source.next_line() or not source.next_line().strip(): |
36 |
| - return state |
37 |
| - state.children = source.parser.parse_source(source) |
38 |
| - return state |
39 |
| - |
40 |
| - |
41 |
| -HackExtension = MarkoExtension(elements=[HackedListItem]) |
42 |
| - |
43 |
| - |
44 | 20 | def get_names_paragraph(content: str) -> str:
|
45 | 21 | paragraph_lines = []
|
46 | 22 | append = False
|
@@ -104,40 +80,21 @@ def populate_index_content(source_md: str, page: Page, config: MkDocsConfig, fil
|
104 | 80 | return source_md + "\n".join(sorted(rows))
|
105 | 81 |
|
106 | 82 |
|
107 |
| -def fix_links(paragraph: Paragraph) -> Paragraph: |
108 |
| - stack = [paragraph] |
109 |
| - while stack: |
110 |
| - current_child = stack.pop() |
111 |
| - for child in current_child.children: |
112 |
| - if isinstance(child, Paragraph): |
113 |
| - stack.append(child) |
114 |
| - if isinstance(child, MarkdownLink): |
115 |
| - child.dest = LINKS_MAP.get(child.dest) or child.dest |
116 |
| - return paragraph |
| 83 | +def replace_link(match: re.Match) -> str: |
| 84 | + return LINKS_MAP.get(match.group()) or match.group() |
117 | 85 |
|
118 | 86 |
|
119 |
| -def fix_heading(heading: Heading, parser: marko.Markdown) -> Heading: |
120 |
| - heading_text = f"#{parser.render(heading)}" |
121 |
| - return parser.parse(heading_text) |
| 87 | +def replace_heading(match: re.Match) -> str: |
| 88 | + return f"#{match.group()}" |
122 | 89 |
|
123 | 90 |
|
124 | 91 | def fix_markdown(source_md: str, page: Page, config: MkDocsConfig, files: Files) -> str:
|
125 | 92 | if page.file.src_uri in SKIP_FILES + MAN_INDEXES:
|
126 | 93 | return source_md
|
127 |
| - parser = marko.Markdown(renderer=MarkdownRenderer, extensions=[HackExtension]) |
128 |
| - new_children = [] |
129 |
| - h1_parsed = parser.parse(f"# {page.file.name}") |
130 |
| - h1 = h1_parsed.children[0] |
131 |
| - new_children.append(h1) |
132 |
| - parsed = parser.parse(source_md) |
133 |
| - for child in parsed.children: |
134 |
| - if isinstance(child, Paragraph): |
135 |
| - child = fix_links(child) |
136 |
| - if isinstance(child, Heading): |
137 |
| - child = fix_heading(child, parser) |
138 |
| - new_children.append(child) |
139 |
| - parsed.children = new_children |
140 |
| - return parser.render(parsed) |
| 94 | + source_md = LINKS_PATTERN.sub(replace_link, source_md) |
| 95 | + source_md = HEADINGS_PATTERN.sub(replace_heading, source_md) |
| 96 | + source_md = f"# {page.file.name}\n" + source_md |
| 97 | + return source_md |
141 | 98 |
|
142 | 99 |
|
143 | 100 | def fix_img_links(source_md: str, page: Page, config: MkDocsConfig, files: Files) -> str:
|
|
0 commit comments