Skip to content

Commit a839f8c

Browse files
committed
use regular expressions to fix markdown
1 parent 26b7e50 commit a839f8c

File tree

1 file changed

+11
-54
lines changed

1 file changed

+11
-54
lines changed

hooks.py

Lines changed: 11 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1+
import re
12
import shutil
23
from pathlib import Path
34

4-
import marko
55
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
126
from mkdocs import plugins
137
from mkdocs.config.defaults import MkDocsConfig
148
from mkdocs.structure.files import Files
@@ -18,29 +12,11 @@
1812

1913
MAN_INDEXES = ["man1/index.md", "man3/index.md", "man5/index.md", "man7/index.md"]
2014
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)
2117
LINKS_MAP = {}
2218

2319

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-
4420
def get_names_paragraph(content: str) -> str:
4521
paragraph_lines = []
4622
append = False
@@ -104,40 +80,21 @@ def populate_index_content(source_md: str, page: Page, config: MkDocsConfig, fil
10480
return source_md + "\n".join(sorted(rows))
10581

10682

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()
11785

11886

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()}"
12289

12390

12491
def fix_markdown(source_md: str, page: Page, config: MkDocsConfig, files: Files) -> str:
12592
if page.file.src_uri in SKIP_FILES + MAN_INDEXES:
12693
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
14198

14299

143100
def fix_img_links(source_md: str, page: Page, config: MkDocsConfig, files: Files) -> str:

0 commit comments

Comments
 (0)