-
-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
テーブルでルビを指定するとパイプ文字がセルの区切りにパースされる #44
Comments
@ogwata |header|header|
|---|---|
|`|`|value| は <table>
<thead><tr><th>header</th><th>header</th></tr></thead>
<tbody><tr><td>`</td><td>`</td></tr></tbody>
</table> になります。期待値は 単純に文字として pipe を描画したいなら HTML の数値文字参照を利用して ただし数値文字参照なので pipe ではなく |
本件を解決するとしたら
のいずれかになるでしょう。理想としては 1 ですが実装コストは高そうです。2 はエンドユーザーの手を煩わせることにはなりますが、本件のように VFM ではなくベースとなる GFM (remark) 部分へ手を入れるリスクに比べれば安全な方法です。 |
@ogwata |
{内容|ないよう}と{内容:ないよう}の両方をルビに使えるようにするとかどうでしょう。 自分も以前、テーブル内に|を含めようとして結局実体参照に行きついたのですが、 |
@AyumuTakai
これはご指摘のとおりで私も GFM に期待していたことなのですが難しそうです。おそらく GFM で採用されていないのは |
詳しい実装は見ていませんが、こちらの問題はrubyのパースルールの優先度を高めれば解決できるように見えます。 |
試しに |
もうひとつ懸念として他のブロック書式、例えば Code block はコードそのものの例示に利用されるため、これよりも後にする必要があります。remark 部分の記法へ割り込む場合、それら全体を踏まえて優先順位を決めることになります。 |
GitHub Flavored Markdown Spec のテーブルセル内に
結果:
で、テーブル内の そうすると、でんでんマークダウンのルビ記法でもテーブル内では GFMの流儀に従い、「テーブル内では ルビの中に文字として "|" を入れることがテーブル内では不可能になるという問題がありますが、そのような場合はHTMLのrubyタグを書けばよいと言えます。 |
これは remark のバグで、そのissueが最近登録されていました: remarkjs/remark#583 (Backslashes appear in output when escaping inline code in a table cell) とりあえずremark側でこれが解決されたら、「テーブル内では |
↑そのremarkのissueにあるコメントを読むと、最新のremark-parseとremark-htmlで解決されているようです。 |
手元で試そうと npm を軒並み更新してテストを実行したら、最新の TypeScript だと判定が厳しくなるものがありエラーが結構でますね。いずれにせよ npm 更新はするべきなので対処してみます。現行のテストをすべて追加したら |
調査メモ。手元で npm を一括更新したらテストがエラーになる。 jest 26.1.0 to 26.6.3、ts-jest 26.1.1 to 26.4.4
file.data = {
...file.data,
...yaml(node.value),
};
当初 typescript を 3.9.5 から 4.1.3 へ更新したことが原因だと予想していたが jest と ts-jest を更新することで発生。 |
remark-parse 8.0.2 to 9.0.0 以下のような tokenizer の動的追加がすべてエラーになる。 const { blockTokenizers, blockMethods } = this.Parser.prototype;
blockTokenizers.fencedBlock = tokenizer; エラーは以下。
remark-parse に破壊的な変更があったのかもしれない。この npm さえ更新しなければテストは通るのだが本件対応に必須なのと npm 依存管理的になるべく最新としてゆきたいので継続調査する。 |
以下を読むと remark 周りはかなり変更されているようなので参考にしながら対応する。 |
テストを const { blockTokenizers, blockMethods } = this.Parser.prototype;
console.log(blockTokenizers);
blockTokenizers.fencedBlock = tokenizer; remark-parse 更新前
9.0.0 へ更新後。
エラーの指摘どおり |
9.0.0 へ更新後。
空のオブジェクトになっている。根本的な構造が変化しているようだ。そのため |
remark-parse は micromark へ移行したのでプラグイン実装の変更が必要。 ここにリストアップされてるものでも動作しないプラグインは作者への対応を呼びかけているようだ。対応済のプラグインについてコミット履歴を読めば VFM 修正の参考になるだろう。 |
ruby 以外の全般的な対応が必要なため新 remark-parse 関連は #45 で対応します。そちらが完了することで最新の remark-parse と独立化された remark-gfm を採用することになり、結果として村上さんの調査結果となる
が反映されるはずです。 |
前述のように本件は v2.0 へ見送ります。 |
Issue Details
Describe the bug
以下のようなMarkdownをVFMでパースします。
すると以下のようなHTMLが出力されます。
ルビの構文の {内容|ないよう} の
|
がテーブルのセルの区切りになってしまってます。create-book で出力されたPDFは下記のとおり。
The text was updated successfully, but these errors were encountered: