Closed akabekobeko closed 3 years ago
@MurakamiShinyu
<li>
内に <p>
を入れない、remark-footnotes がこうしているのは <li>
だけで十分だと判断してのことだと思われるため VFM でもそのまま踏襲という対応をおこないました。レビューをお願いします。
基本的な動作はこれでOKだと思います。
テストしてひとつ気になったのは、見出しにインライン脚注がある場合です。
例:
# Hello World^[Footnote in a headng]
↓ vfmでの変換結果
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Hello WorldFootnote in a headng</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<section id="hello-worldfootnote-in-a-headng" class="level1">
<h1>Hello World<a id="fnref1" href="#fn1" class="footnote-ref" role="doc-noteref"><sup>1</sup></a></h1>
</section>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn1" role="doc-endnote">Footnote in a headng<a href="#fnref1" class="footnote-back" role="doc-backlink">↩</a></li>
</ol>
</section>
</body>
</html>
このHTMLの title 要素 <title>Hello WorldFootnote in a headng</title>
にインライン脚注の内容が含まれてしまうのは望ましくありません。
また、section の id 属性 id="hello-worldfootnote-in-a-headng"
もインライン脚注の内容が含まれてしまいます。
(インラインではない脚注の場合をテストしてみると、脚注参照番号は title や id に含まれません。インライン脚注の場合だけこの問題があります。)
Pandoc での出力をテストしてみると、
$ pandoc --section-divs
# Hello World^[Footnote in a headng]
<section id="hello-world" class="level1">
<h1>Hello World<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a></h1>
</section>
<section class="footnotes" role="doc-endnotes">
<hr />
<ol>
<li id="fn1" role="doc-endnote"><p>Footnote in a headng<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
Pandocには見出し内容を title 要素にコピーする機能が無いようなので、id についてだけの比較ですが、
id="hello-world"
のようにインライン脚注の内容は含まれていません。
調査メモ。
<h1>
からの <title>
生成
src/plugins/metadata.ts
headeing
の内容を mdast-util-to-string で文字列化<section>
の id
生成
heading
の内容から id
が生成される、この時点でインライン脚注の考慮なしsrc/pluguins/section.ts
で heading
の id
が section
に移動されるid
に引用されるremark-slug の実装を見ると id
用の文字列は mdast-util-to-string と github-slugger を組み合わせて生成している。
よって Footnotes の HAST 処理時点で連番化をする際にこれらを利用して <title>
と <section id="...">
にインライン脚注が引用された痕跡を判定、検出したら削除するようにすれば対策できるかもしれない。
単に slug 処理などで判定された文字列を消すだけではダメで、例えば # Test^[Test]
のように見出しとインライン脚注が同一になることも考慮する必要あり。
<title>
については MDAST で heading.children
から一時的に type: 'footnote'
を削除した状態でタイトルを生成、この後に children
を復元することでインライン脚注とタイトルからの除外を両立させることができた。
remark-slag はサードパーティ製なので処理に介入できない。処理後の文字列から判定だと位置判定もしないと事故る可能性あり。ただし
ことから移植して Footnotes 避けを実装してみる。ライセンスは MIT。TSDoc として移植版にはこれを記載する予定。
@MurakamiShinyu
見出しにインライン脚注が定義されていると、それを元にした <title>
と <section id="...">
に内容がコピーされる問題を修正してみました。確認をお願いします。
見出しにインライン脚注が定義されていると、それを元にした
<title>
と<section id="...">
に内容がコピーされる問題を修正してみました。確認をお願いします。
はい、確認しました。OKだと思います。
@MurakamiShinyu 村上さんのチェックとコミットを受けてテスト コード側もテキストと脚注リンク間に入れていたスペースを削除しました。 ここまでの内容で問題なければ approve をお願いします。
33 対応。
既に
remark-footnotes
は組み込まれて処理もされていた。しかしドキュメント未掲載でテスト コードがないため機能としてカウントされていないかった。これらを踏まえ改めて以下の対応を実施。docs/vfm.md
記載tests/footnotes.test.ts
追加rehive-parse.ts
で直にimport
せずfootnotes.ts
に切り出しsrc/
とtests/
の対応付けがわかりやすくなるrehive-parse
から隠蔽できるhandler
とhast
を処理したくなった場合の備え@MurakamiShinyu
docs/vfm.md
についてレビューをお願いします。なお既存実装のinlineNotes: true
をそのまま維持しているためインライン記法も対応されます。