diff --git a/commit.py b/commit.py index a04aa00..0e426a7 100644 --- a/commit.py +++ b/commit.py @@ -39,18 +39,16 @@ def extendMarkdown(self, md, md_globals): pre = CommitPreprocessor(md) md.registerExtension(self) - md.preprocessors.add('commit', pre, ">normalize_whitespace") + md.preprocessors.register(pre, 'commit', 25) class CommitPreprocessor(Preprocessor): def __init__(self, md): Preprocessor.__init__(self, md) - self._markdown = md def run(self, lines): new_lines = [] - self._markdown._meta_result = {} for line in lines: new_line = replace_commit_line(line) diff --git a/fix_display_error.py b/fix_display_error.py new file mode 100644 index 0000000..5a3c04b --- /dev/null +++ b/fix_display_error.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +""" +表示崩れを事前修正 +========================================= + +Markdownライブラリの以下の制限を回避: + +- 箇条書きの前に空行が必要な制限を回避して、自動で空行を挟む +""" + +import re +import datetime + +from markdown.extensions import Extension +from markdown.preprocessors import Preprocessor + +def is_item_line(line: str) -> bool: + stripped_line = line.strip() + m = re.match(r'^([0-9]+\.\s)', stripped_line) + if m: + return True + + m = re.match(r'^([*+-]\s)', stripped_line) + if m: + return True + return False + +def is_item_end_line(line: str) -> bool: + if len(line) == 0: + return True + if re.match(r'^#+ ', line): + return True + return False + +class FixDisplayErrorExtension(Extension): + + def extendMarkdown(self, md, md_globals): + pre = FixDisplayErrorPreprocessor(md) + + md.registerExtension(self) + md.preprocessors.register(pre, 'fix_display_error', 28) + + +class FixDisplayErrorPreprocessor(Preprocessor): + + def __init__(self, md): + Preprocessor.__init__(self, md) + + def run(self, lines): + new_lines = [] + + prev_line: str | None = None + in_item: bool = False + for line in lines: + if prev_line == None: + prev_line = line + new_lines.append(line) + continue + + if not is_item_line(prev_line) and not in_item and is_item_line(line): + new_lines.append("") + + if not in_item and is_item_line(line): + in_item = True + if in_item and is_item_end_line(line): + in_item = False + + prev_line = line + new_lines.append(line) + + return new_lines + + +def makeExtension(**kwargs): + return FixDisplayErrorExtension(**kwargs) diff --git a/footer.py b/footer.py index 6920132..d3ee452 100644 --- a/footer.py +++ b/footer.py @@ -20,7 +20,8 @@ def extendMarkdown(self, md, md_globals): footer = FooterTreeprocessor() footer.config = self.getConfigs() md.registerExtension(self) - md.treeprocessors.add('footer', footer, '_begin') + #md.treeprocessors.add('footer', footer, '_begin') + md.treeprocessors.register(footer, 'footer', 50) # top priority (begin) class FooterTreeprocessor(markdown.treeprocessors.Treeprocessor): diff --git a/mark.py b/mark.py index 3d49ce9..e317a59 100644 --- a/mark.py +++ b/mark.py @@ -31,18 +31,16 @@ def extendMarkdown(self, md, md_globals): markpre = MarkPreprocessor(md) md.registerExtension(self) - md.preprocessors.add('mark', markpre, ">normalize_whitespace") + md.preprocessors.register(markpre, 'mark', 25) class MarkPreprocessor(Preprocessor): def __init__(self, md): Preprocessor.__init__(self, md) - self._markdown = md def run(self, lines): new_lines = [] - self._markdown._meta_result = {} pattern = re.compile("|".join(map(re.escape, MARK_DICT.keys()))) for line in lines: diff --git a/mathjax.py b/mathjax.py index 09af179..68b923f 100644 --- a/mathjax.py +++ b/mathjax.py @@ -28,7 +28,7 @@ def extendMarkdown(self, md, md_globals): mathjaxpre = MathJaxPreprocessor(md) md.registerExtension(self) - md.preprocessors.add('mathjax', mathjaxpre, ">normalize_whitespace") + md.preprocessors.register(mathjaxpre, 'mathjax', 25) class MathJaxPreprocessor(Preprocessor): diff --git a/meta.py b/meta.py index ecb858f..6994d92 100644 --- a/meta.py +++ b/meta.py @@ -40,8 +40,8 @@ def extendMarkdown(self, md, md_globals): metapost = MetaPostprocessor(md) md.registerExtension(self) - md.preprocessors.add('meta', metapre, ">normalize_whitespace") - md.postprocessors.add('meta', metapost, '_end') + md.preprocessors.register(metapre, 'meta', 25) + md.postprocessors.register(metapost, 'meta', 0) # bottom priority (end) class MetaPreprocessor(Preprocessor): diff --git a/qualified_fenced_code.py b/qualified_fenced_code.py index 2cde1cd..ddeb4ac 100644 --- a/qualified_fenced_code.py +++ b/qualified_fenced_code.py @@ -65,7 +65,7 @@ def extendMarkdown(self, md, md_globals): fenced_block = QualifiedFencedBlockPreprocessor(md, self.global_qualify_list) md.registerExtension(self) - md.preprocessors.add('qualified_fenced_code', fenced_block, ">normalize_whitespace") + md.preprocessors.register(fenced_block, 'qualified_fenced_code', 29) def _make_random_string(): diff --git a/sponsor.py b/sponsor.py index ef40335..64e8dd9 100644 --- a/sponsor.py +++ b/sponsor.py @@ -80,18 +80,16 @@ def extendMarkdown(self, md, md_globals): pre = SponsorPreprocessor(md) md.registerExtension(self) - md.preprocessors.add('sponsor', pre, ">normalize_whitespace") + md.preprocessors.register(pre, 'sponsor', 25) class SponsorPreprocessor(Preprocessor): def __init__(self, md): Preprocessor.__init__(self, md) - self._markdown = md def run(self, lines): new_lines = [] - self._markdown._meta_result = {} jst = datetime.timezone(datetime.timedelta(hours=+9), 'JST') now = datetime.datetime.now(jst)