表示崩れを事前修正するMarkdown拡張を追加#8
Conversation
|
追加で、コードブロック後に箇条書き以外がきたら空行を挟もうとしてますが、Markdown拡張の適用順の問題かうまく効いてくれない状態です |
|
Registryにpriorityを設定できるみたいです。 いま3.2.1で使ってるadd関数はなくなるみたいなので、register関数に移行する必要がありそうです。 https://github.com/Python-Markdown/markdown/blob/3.2.1/markdown/util.py |
|
コードブロック後に箇条書き以外がきたら空行を挟むよう修正し、Registry.addを使っていたコードをRegistry.registerに直しました |
|
コードブロック直後の文章消失の問題は markdown_to_html/qualified_fenced_code.py Line 44 in 78e8632 の方を修正して根治できませんか。 追記: 単に |
|
@akinomyoga さんの方で修正できますか? そうしたらこのPRでは箇条書きの前に空行を入れる修正だけ入れます |
|
OK 後でやってみますね |
Ref. [1] で発見された問題。コードブロック後に改行を挟まずに文章を続け るとその文章がコード修飾指定のセクションとして抽出されて消失する問題。 対処法として改行を挿入する [2, 3] ことで回避できるが、改行がなくても正 しく表示されるようにしたい[4]。ここでは、コード修飾の指定についてより 厳密な形式で抽出を行い、誤って関係ない物を抽出することを防ぐ。 この変更のテストの過程で、既存のコード修飾の誤りが発見されたが対処した [5]。また、他にも消失している記述 [6] が発見されたが、[6] はこの変更に より自動的に修正されるので対処はしていない。 References: [1] cpprefjp/site#1362 (comment) [2] cpprefjp/site@c747f4a [3] cpprefjp/site@5259ff6 [4] cpprefjp#8 (comment) [5] cpprefjp/site@ebf8c8f [6] https://github.com/cpprefjp/site/blob/ebf8c8fd705a194adb7b3f83786dad9c843d143b/reference/generator/generator/iterator/op_increment.md?plain=1#L27
Ref. [1] で発見された問題。コードブロック後に改行を挟まずに文章を続け るとその文章がコード修飾指定のセクションとして抽出されて消失する問題。 対処法として改行を挿入する [2, 3] ことで回避できるが、改行がなくても正 しく表示されるようにしたい。ここでは、コード修飾の指定についてより厳密 な形式で抽出を行い、誤って関係ない物を抽出することを防ぐ [4]。 この変更のテストの過程で、既存のコード修飾の誤りが発見されたが対処した [5]。また、他にも消失している記述 [6] が発見されたが、[6] はこの変更に より自動的に修正されるので対処はしていない。 References: [1] cpprefjp/site#1362 (comment) [2] cpprefjp/site@c747f4a [3] cpprefjp/site@5259ff6 [4] cpprefjp#8 (comment) [5] cpprefjp/site@ebf8c8f [6] https://github.com/cpprefjp/site/blob/ebf8c8fd705a194adb7b3f83786dad9c843d143b/reference/generator/generator/iterator/op_increment.md?plain=1#L27
|
コード修飾を処理したあと (コードブロック後の |
| is_outer_code_block = line.strip().startswith("````") | ||
| if is_outer_code_block: | ||
| in_outer_code_block = not in_outer_code_block | ||
| prev_line = line | ||
| new_lines.append(line) | ||
| continue | ||
|
|
||
| if not in_outer_code_block: | ||
| is_code_block = line.strip().startswith("```") | ||
| if is_code_block: | ||
| in_code_block = not in_code_block | ||
| if not in_code_block: | ||
| is_prev_code_block = True | ||
| prev_line = line | ||
| new_lines.append(line) | ||
| continue | ||
|
|
||
| if in_code_block: | ||
| prev_line = line | ||
| new_lines.append(line) | ||
| continue |
There was a problem hiding this comment.
コードブロックは qualified_fenced_code 29 によって変換された後で既に存在しなくなっているのでこの部分は処理しなくて良いかなと思います。実際に手元でこの部分を全部コメントアウトして全変換して結果を比べてみましたが、変換結果に違いはありませんでした。
akinomyoga
left a comment
There was a problem hiding this comment.
後、手元で変換して気づいたのは、
- リスト項目1 複数行1行目
リスト項目1 複数行2行目
- リスト項目2の形になっていた時に
- リスト項目1 複数行1行目
リスト項目1 複数行2行目
- リスト項目2に変換されて、リスト項目1の内部に新しく段落が生成されるようになっています。直近のリスト項目のインデントレベルを記録して、is_item_line の判定でインデントされた行も項目の一部という判定を加えて良いのではないかと思います。
|
なるほど、たしかにそれは考慮してなかったです |
|
先頭4スペース以上の行とタブ開始の行も、箇条書きの行とみなすよう修正しました |
|
変換結果を見てみたのですが先頭に空白2文字しかない場合もあります…というより先頭に何もない以下のような場合も結構あります。 先のコメントでインデントで判定するという様に提案しましたが、実際の Markdown の挙動を勘違いしていまして、すみません。"空白4文字" というのはリストの中に次の階層のリストを入れる場合の話であって、それが一般にリスト項目の中のインデントを規定する訳ではないみたいです。 これに関連して単に無駄に段落が生成されるだけでなくて構造が変わってしまっている箇所もあるみたいです。 これについてはどのように対処するのが良いでしょうか。Markdown ソースの方を空白4文字でインデントする様に修正するか、fix_display_error の方で Markdown の規則に合うように処理するか。 ソースの方を修正したら良いとも思ったのですが、既存の Markdown 実装にない cpprefjp 独自ルール 1 を新しく増やす事になるのではということ、実際にリスト項目の継続行をインデントしなくても動く場合と動かない場合があって振る舞いが一定せず表面的に意味不明な振る舞いに見えること、などを考えるとやはり微妙かなという気がしてきました。 追記: でも fix_diplay_error の方で適切に空行を入れるにしても、Python-Markdown のリストの正確なルールが分からないと結局また穴が残るかもしれず、それはそれで微妙な気もしてきました。 Footnotes
|
|
明日以降、現状調査からやります! |
このケースを考慮するのであれば、箇条書きがはじまったら空行がくるまで箇条書きが続く、とみなすしかないような気がしますね |
上記の方法で良さそうです。リスト項目の中に空行が含まれる場合はどうなるのだろうと思って Python-Markdown の振る舞いを色々調べてみたのですが、何か不可解な挙動をしていて、却って "箇条書きがはじまったら空行がくるまで箇条書きが続く" という判定による修正が一番正しそうです。 Details先ず、リスト項目内部に空行がない場合は、次のリスト項目は、インデントやリスト階層がどうあってもちゃんとリスト項目になるみたいです。 ところが、リスト項目の内部に空行がある場合には、次に来るリスト項目はどうあっても空行直後でしかリスト項目にならないみたいです。
|
|
そのように直しました。 |
|
こちらでも見てみましたところちゃんと綺麗に変換できています!
あと、これは以前から壊れていてこの 少なくとも Python-Markdown 3.2.1 は以下の記述に対して
という具合のリストを生成するみたいです。Python-Markdown で正しく表示させるためにはリスト項目2 の前にも空行を入れて、 としなければならないみたいです。
他に同様の間違いが発生している場所がないか検出しようとコードを少し弄ったら、ちゃんと動きそうなコードができました… akinomyoga@96132c3 ちなみに上記 |
|
確認ありがとうございます! |
影響範囲が大きいので、一旦Pull Requestにします。
どなたかレビューしてもらえると助かりますが、とくにご意見なければ一週間ほどでマージします。
site_generator側は、この拡張を使うよう1行追加するだけです。