Skip to content

Markdown の記述リスト内コードフェンスを CommonMark 準拠にする#245

Merged
znz merged 1 commit into
rurema:masterfrom
znz:md-dd-no-toplevel-fence
Jul 15, 2026
Merged

Markdown の記述リスト内コードフェンスを CommonMark 準拠にする#245
znz merged 1 commit into
rurema:masterfrom
znz:md-dd-no-toplevel-fence

Conversation

@znz

@znz znz commented Jul 15, 2026

Copy link
Copy Markdown
Member

これまで MDCompiler は、記述リストの説明(dd)の直後にカラム0で書かれたコードフェンスも dd に取り込んで描画していました。これは RD の //emlist が dd に取り込まれる挙動(rdcompiler.rb の dd_with_p)を踏襲したものですが、CommonMark には無い挙動で、GitHub などのプレビューではフェンスがリストの外に出てしまいます。

説明(dd)の一部として取り込むのは「項目の内容カラムにインデントされたフェンス」だけにし、カラム0のフェンスは dd の外(トップレベル)として扱うよう改めます。

  • mdcompiler.rb: dd_with_p / dd_without_p からカラム0フェンスの取り込みを削除(インデントフェンスのみ INDENTED_FENCE_RE で取り込む)。
  • rrd_to_markdown.rb: RD→MD 変換で、dd や @param 等の説明の中にある //emlist#@samplecode を、項目の内容カラム(2スペース)にインデントしたフェンスとして出力します。これまでカラム0で出力していたのが、doctree のソースにカラム0フェンスが残っていた原因でした。前処理ディレクティブ(#@since 等)は Preprocessor がカラム0でしか認識しないため、そのまま残します。
  • markdown_to_rrd.rb: 逆変換で、インデントされた dd/@param 内フェンスをカラム0の //emlist{ / #@samplecode に戻します(ラウンドトリップ維持)。
  • MARKUP_SPEC §9.5: カラム0フェンスがトップレベル扱いになることを明記。

互換性・マージ順

doctree 側で該当フェンスをすべてインデント済み(doctree #3105)のため、この変更後も生成される HTML は変わりません。doctree の manual/ 全 1257 ファイル × サポート全バージョン(3.0〜4.1)で、この bitclust の変更前後の描画がバイト単位一致することを確認済みです。

マージ順は doctree #3105 が本番反映されてからにしてください。旧 doctree(カラム0フェンスが残った状態)にこの bitclust を当てると、フェンスがリストの外に描画されてしまいます。

全テスト(17619)green・steep check 型エラーなしです。

🤖 Generated with Claude Code

これまで MDCompiler は、記述リストの説明(dd)の直後にカラム0で
書かれたコードフェンスも dd に取り込んで描画していた。これは RD の
//emlist が dd に取り込まれる挙動を踏襲したものだが、CommonMark には
無い挙動で、GitHub などのプレビューではフェンスがリストの外に出る。

説明(dd)の一部として取り込むのは「項目の内容カラムにインデントされた
フェンス」だけにし、カラム0のフェンスは dd の外(トップレベル)として
扱うよう改める。

- mdcompiler.rb: dd_with_p / dd_without_p からカラム0フェンスの取り込みを
  削除(インデントフェンスのみ INDENTED_FENCE_RE で取り込む)。
- rrd_to_markdown.rb: RD→MD 変換で、dd や @param 等の説明の中にある
  //emlist・#@SampleCode を、項目の内容カラム(2スペース)にインデント
  したフェンスとして出力する(これまでカラム0で出力していたのが、
  doctree のソースにカラム0フェンスが残っていた原因)。前処理ディレクティブ
  (#@SInCE 等)は Preprocessor の要件でカラム0のまま残す。
- markdown_to_rrd.rb: 逆変換で、インデントされた dd/@param 内フェンスを
  カラム0の //emlist{ / #@SampleCode に戻す(ラウンドトリップ維持)。

doctree 側で該当フェンスをすべてインデント済みのため、この変更後も
生成される HTML は変わらない(doctree の manual/ 全 1257 ファイル×
サポート全バージョンで、変更前後の描画がバイト単位一致することを確認済み)。
全テスト(17619)green・steep 型エラーなし。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@znz znz merged commit 3f10219 into rurema:master Jul 15, 2026
10 checks passed
@znz znz deleted the md-dd-no-toplevel-fence branch July 15, 2026 05:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant