Skip to content

Commit e2af656

Browse files
表示崩れを事前修正するMarkdown拡張を追加 (#8)
1 parent e1f7fc7 commit e2af656

File tree

8 files changed

+84
-14
lines changed

8 files changed

+84
-14
lines changed

commit.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,16 @@ def extendMarkdown(self, md, md_globals):
3939
pre = CommitPreprocessor(md)
4040

4141
md.registerExtension(self)
42-
md.preprocessors.add('commit', pre, ">normalize_whitespace")
42+
md.preprocessors.register(pre, 'commit', 25)
4343

4444

4545
class CommitPreprocessor(Preprocessor):
4646

4747
def __init__(self, md):
4848
Preprocessor.__init__(self, md)
49-
self._markdown = md
5049

5150
def run(self, lines):
5251
new_lines = []
53-
self._markdown._meta_result = {}
5452

5553
for line in lines:
5654
new_line = replace_commit_line(line)

fix_display_error.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
表示崩れを事前修正
4+
=========================================
5+
6+
Markdownライブラリの以下の制限を回避:
7+
8+
- 箇条書きの前に空行が必要な制限を回避して、自動で空行を挟む
9+
"""
10+
11+
import re
12+
import datetime
13+
14+
from markdown.extensions import Extension
15+
from markdown.preprocessors import Preprocessor
16+
17+
def is_item_line(line: str) -> bool:
18+
stripped_line = line.strip()
19+
m = re.match(r'^([0-9]+\.\s)', stripped_line)
20+
if m:
21+
return True
22+
23+
m = re.match(r'^([*+-]\s)', stripped_line)
24+
if m:
25+
return True
26+
return False
27+
28+
def is_item_end_line(line: str) -> bool:
29+
if len(line) == 0:
30+
return True
31+
if re.match(r'^#+ ', line):
32+
return True
33+
return False
34+
35+
class FixDisplayErrorExtension(Extension):
36+
37+
def extendMarkdown(self, md, md_globals):
38+
pre = FixDisplayErrorPreprocessor(md)
39+
40+
md.registerExtension(self)
41+
md.preprocessors.register(pre, 'fix_display_error', 28)
42+
43+
44+
class FixDisplayErrorPreprocessor(Preprocessor):
45+
46+
def __init__(self, md):
47+
Preprocessor.__init__(self, md)
48+
49+
def run(self, lines):
50+
new_lines = []
51+
52+
prev_line: str | None = None
53+
in_item: bool = False
54+
for line in lines:
55+
if prev_line == None:
56+
prev_line = line
57+
new_lines.append(line)
58+
continue
59+
60+
if not is_item_line(prev_line) and not in_item and is_item_line(line):
61+
new_lines.append("")
62+
63+
if not in_item and is_item_line(line):
64+
in_item = True
65+
if in_item and is_item_end_line(line):
66+
in_item = False
67+
68+
prev_line = line
69+
new_lines.append(line)
70+
71+
return new_lines
72+
73+
74+
def makeExtension(**kwargs):
75+
return FixDisplayErrorExtension(**kwargs)

footer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def extendMarkdown(self, md, md_globals):
2020
footer = FooterTreeprocessor()
2121
footer.config = self.getConfigs()
2222
md.registerExtension(self)
23-
md.treeprocessors.add('footer', footer, '_begin')
23+
#md.treeprocessors.add('footer', footer, '_begin')
24+
md.treeprocessors.register(footer, 'footer', 50) # top priority (begin)
2425

2526

2627
class FooterTreeprocessor(markdown.treeprocessors.Treeprocessor):

mark.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,16 @@ def extendMarkdown(self, md, md_globals):
3131
markpre = MarkPreprocessor(md)
3232

3333
md.registerExtension(self)
34-
md.preprocessors.add('mark', markpre, ">normalize_whitespace")
34+
md.preprocessors.register(markpre, 'mark', 25)
3535

3636

3737
class MarkPreprocessor(Preprocessor):
3838

3939
def __init__(self, md):
4040
Preprocessor.__init__(self, md)
41-
self._markdown = md
4241

4342
def run(self, lines):
4443
new_lines = []
45-
self._markdown._meta_result = {}
4644
pattern = re.compile("|".join(map(re.escape, MARK_DICT.keys())))
4745

4846
for line in lines:

mathjax.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def extendMarkdown(self, md, md_globals):
2828
mathjaxpre = MathJaxPreprocessor(md)
2929

3030
md.registerExtension(self)
31-
md.preprocessors.add('mathjax', mathjaxpre, ">normalize_whitespace")
31+
md.preprocessors.register(mathjaxpre, 'mathjax', 25)
3232

3333

3434
class MathJaxPreprocessor(Preprocessor):

meta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def extendMarkdown(self, md, md_globals):
4040
metapost = MetaPostprocessor(md)
4141

4242
md.registerExtension(self)
43-
md.preprocessors.add('meta', metapre, ">normalize_whitespace")
44-
md.postprocessors.add('meta', metapost, '_end')
43+
md.preprocessors.register(metapre, 'meta', 25)
44+
md.postprocessors.register(metapost, 'meta', 0) # bottom priority (end)
4545

4646

4747
class MetaPreprocessor(Preprocessor):

qualified_fenced_code.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def extendMarkdown(self, md, md_globals):
6565
fenced_block = QualifiedFencedBlockPreprocessor(md, self.global_qualify_list)
6666
md.registerExtension(self)
6767

68-
md.preprocessors.add('qualified_fenced_code', fenced_block, ">normalize_whitespace")
68+
md.preprocessors.register(fenced_block, 'qualified_fenced_code', 29)
6969

7070

7171
def _make_random_string():

sponsor.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,16 @@ def extendMarkdown(self, md, md_globals):
8080
pre = SponsorPreprocessor(md)
8181

8282
md.registerExtension(self)
83-
md.preprocessors.add('sponsor', pre, ">normalize_whitespace")
83+
md.preprocessors.register(pre, 'sponsor', 25)
8484

8585

8686
class SponsorPreprocessor(Preprocessor):
8787

8888
def __init__(self, md):
8989
Preprocessor.__init__(self, md)
90-
self._markdown = md
9190

9291
def run(self, lines):
9392
new_lines = []
94-
self._markdown._meta_result = {}
9593

9694
jst = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
9795
now = datetime.datetime.now(jst)

0 commit comments

Comments
 (0)