vivliostyle / vfm

⬇️ Open and extendable Markdown syntax and toolchain.
https://vivliostyle.github.io/vfm/#/vfm
Other
71 stars 12 forks source link

spec: Ruby annotation #10

Open MurakamiShinyu opened 4 years ago

MurakamiShinyu commented 4 years ago

Which ruby notation is best for VFM?

The following is copied from the current VFM draft: Ruby:


Ruby

VFM

This is [Ruby]{ルビ}

mdast

{
  "type": "ruby",
  "rubyText": "ルビ",
  "children": [
    {
      "type": "text",
      "value": "Ruby"
    }
  ]
}

HTML

This is <ruby>Ruby<rt>ルビ</rt></ruby>

Other candidates

{電子出版|でんししゅっぱん}

The notation is derived from でんでんマークダウン.

|Text《Ruby》

The notation is derived from 視覚障碍者読書支援協会 (BBA)「原文入力ルール」.

[Text]<Ruby>
akabekobeko commented 3 years ago

44 にて以下の提案があった。

{内容|ないよう}と{内容:ないよう}の両方をルビに使えるようにするとかどうでしょう。 これならruby.tsの正規表現を修正するだけのような気がします。

これは GFM 由来の仕様 (制限?) によりテーブル内で | が利用できないことを踏まえ、ルビを許可するための代替書式となる。ルビの区切りに : を追加することでテーブル内の利用を許可する。: に対してルビを振りたい状況は稀だと思われるため採用してもよさそう。

この提案について意見を募集します。

tk0miya commented 3 years ago

CommonMark の Appendix では、ブロックレベルの要素についてパースを実施した後に、各テキスト要素についてインラインレベルでのパースを行うという解説があります。 https://spec.commonmark.org/0.29/#appendix-a-parsing-strategy

GFM は CommonMark をベースとしているため、この戦略に従ってテーブルのパースを行い、その後に各セルのパースを行っていると予想されます。その際、テーブルのパースを行うときに | をセルの区切り文字として見なし、ルビ記法でセルが区切られてしまうという現象になっているのでしょう。今後、GFM の改良が行われたとしても、 | 記号は彼らのマークアップ記法の一部ではないため、特別扱いするということは考えづらいです (エスケープなどでセル内に記述できると言った程度でしょう)。

これらを踏まえると、ブロックレベルの記法で採用されている記号とバッティングしないような記号を選ぶのが良いかと思われます。

akabekobeko commented 3 years ago

@tk0miya

情報ありがとうございます。

これらを踏まえると、ブロックレベルの記法で採用されている記号とバッティングしないような記号を選ぶのが良いかと思われます。

これは本 Issue で検討しているルビのようにインラインとなる記法を追加する際の方針としたほうがよさそうですね。これを前提として

  1. インライン記法ではブロック記法の記号をなるべく避ける
  2. それでも採用する場合は制限事項としてブロック記法へ含めたいなら HTML 埋め込みで代替することを推奨する

という感じでしょうか。そして本件として 1 を優先するなら | の代わりに : ですね。| も同時にサポートする方向で考えていましたが記法に振れがあるのは好ましくないので一方にするなら安全な : がよいと思いました。

ただし当初案の「でんでんマークダウン」と記法が異なるため「他方で採用された記法 = その実績を享受できる」という利点は損なわれます。

なお : は Fenced block の ::: で使用されていますが、こちらは 3 文字なので競合を避けられるでしょう。

MurakamiShinyu commented 3 years ago

なるべく実績のある記法を活かせるようにするのがよいので、「でんでんマークダウン」のルビ記法も残すとよいと思います。

現在のvfmパーサーでのルビの問題ですが、テーブル記法と一緒に使えないほかに、[リンクテキスト](url)![画像の説明](url) の中で使えないという問題もあります。

それからでんでんマークダウンの「モノルビ風の熟語ルビ」の記法 {電子出版|でん|し|しゅっ|ぱん} が現在のvfmパーサーで使えません。また、 \ でのエスケープの扱いが、でんでんマークダウンでは「最低限「|」さえエスケープすれば、ルビの解釈ルールからは外れます」とあるのですが、今のvfmパーサーでは違うようです。

ルビ親文字ルビ文字の区切り文字を変えるだけでないパーサーの見直しが必要だと思います。

まずは今使える記法を維持しながら、よりよい記法とパーサーの改良をじっくり検討するのがよいかと思います。

| を使わない記法にするのであれば、VFMの最初の提案の [Ruby]{ルビ} という記法などを再検討してもよいかもしれません。この記法の問題は属性の記法[属性付きのスパン]{.class #ID attr="value"} と似ていることですが、 { の直後が .#名前= かどうかで区別できます。

akabekobeko commented 3 years ago

でんでんマークダウンの実装は公開されているようですね。参考にします。

なお

なるべく実績のある記法を活かせるようにするのがよいので、「でんでんマークダウン」のルビ記法も残すとよいと思います。

のように : を「追加」する場合はでんでんマークダウンの正規表現を移植するだけでなく追加も必要ですが、これはどうしましょうか?現在のルビ記法は複数の問題があります。

  1. テーブル内で使用不能 #44
  2. でんでんマークダウンの「モノルビ風の熟語ルビ」の記法に未対応

1 への対応として区切り文字に : を追加する提案があります。これに対応する場合、2 を考慮してでんでんマークダウン実装をそのまま移植では対応できません。|: の混在を許可する必要があります。

という感じでしょうか。

| を使わない記法にするのであれば、...

これも一つの手ですね。もうひとつの方法として以下もあります。

これは create-book の元になった私の akabekobeko/env-create-book で採用しています。記法としてはブロック系の delimiter を避けており、モノルビにも対応しています。

akabekobeko commented 3 years ago

メモ。現状で提案されている記法案まとめ。

  1. でんでんマークダウン互換
    • {電子出版|でんししゅっぱん}
    • {電子出版|でん|し|しゅっ|ぱん}
    • 現状の VFM 実装、ただし v1.0.0-alpha.11 時点ではモノルビと | のエスケープについて未対応
  2. でんでんマークダウン拡張 #44 @AyumuTakai
    • {電子出版|でんししゅっぱん}
    • {電子出版|でん|し|しゅっ|ぱん}
    • {電子出版:でんししゅっぱん}
    • {電子出版|でん:し|しゅっ|ぱん}
  3. 当初案
    • [電子出版]{でんししゅっぱん}
    • [電子]{でんし}[出版]{しゅっぱん} ...提案にモノルビの言及なし、未対応?
  4. remark-ruby - npm
    • {電子出版}^(でんししゅっぱん)
    • {[電子][出版]}^([でんし][しゅっぱん])
akabekobeko commented 3 years ago

モノルビについて。でんでんマークダウンは暗黙的な代わりに

親文字の文字数とルビ文字のまとまりの数が一致している必要があります。一致しない場合にはグループルビになります。

という制限あり。remark-ruby - npm は明示的で <rb><rt> が 1:1 対応している。でんでんマークダウンのほうが暗黙的な分、記述量を減らせるためユーザーには歓迎されるかもしれない。

MurakamiShinyu commented 3 years ago

モノルビではなくて熟語ルビのマークアップの問題ですね。 remark-ruby - npmをみてみると、 <ruby><rb>出</rb><rb>版</rb><rp>(</rp><rt>しゅっ</rt><rt>ぱん</rt><rp>)</rp></ruby> のようなマークアップを生成するものになってます。この熟語ルビのマークアップなのですが、WHATWG HTML仕様には rb 要素が今のところ存在せず、このマークアップは現在Firefoxでしかサポートされていません。 (See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/rb)

でんでんマークダウンの場合は <ruby>出<rt>しゅっ</rt>版<rt>ぱん</rt></ruby> というマークアップになります(「モノルビ風の熟語ルビ」と説明されているのは1文字ずつにruby要素にする形式と似ているからでしょう)。こちらはどのメジャーなブラウザでもサポートされています。

WHATWG HTML仕様でrb要素などを復活させる議論はあります: https://github.com/whatwg/html/issues/1771 しかし当面はrb要素を使った熟語ルビのマークアップは使えません。

このルビ記法からのHTML生成についてもでんでんマークダウン互換にするのがよいと思います。

| に追加して : (あるいはほかの文字?)を区切りに使えるようにすると、その文字がルビの親文字やルビ文字に使えなくなる(\ でエスケープあるいは文字参照形式 &#…; にしないかぎり)という問題があります。 :| にくらべて普通に使われる頻度が高いのでできれば避けたいです。

akabekobeko commented 3 years ago

それらの事情を考慮すると「でんでんマークダウン互換」がよさそうですね。現状の実装に対しては

を追加する方針で検討します。でんでんマークダウン実装 (正規表現など) を参考に試してみます。

MurakamiShinyu commented 3 years ago

でんでんマークダウンのルビ記法をフルサポートすることに賛成です。その上で、もうひとつのルビ記法の案:

[電子出版]((でんししゅっぱん))

親文字が漢字列の場合は [ ] を省略して、ルビを二重の丸括弧 (( )) で囲むだけでよい:

電子出版((でんししゅっぱん))

漢字列の一部や漢字以外にルビを振るときだけ [ ] を使えばよい:

一応[何時]((いつ))もの

This is [Ruby]((ルビ))

熟語の1文字ずつにルビを振るには(でんでんマークダウンの {電子出版|でん|し|しゅっ|ぱん} に相当):

電子出版((でん)(し)(しゅっ)(ぱん))

重版[出来]((しゅっ)(たい))
akabekobeko commented 3 years ago
  1. この新案はなにか先行例のある記法なのでしょうか?
  2. 「親文字が漢字列の場合は」は正規表現で対応可能なのでしたっけ?Unicode として範囲判定?
  3. CommonMark のリンク記法 [text](url "title") と競合するかもしれません
MurakamiShinyu commented 3 years ago

この新案はなにか先行例のある記法なのでしょうか?

いいえ。でんでんマークダウンのルビ記法と同等のことができて、青空文庫のルビ記法 のように漢字列に振るときはルビを括弧(青空文庫の場合は 《 》)で囲むだけですむように、というよいところを取り入れた案です。

「親文字が漢字列の場合は」は正規表現で対応可能なのでしたっけ?Unicode として範囲判定?

はい、正規表現で漢字が1文字以上を /(\p{Ideographic}\p{Variation_Selector}?)+/u で見つけられます。

CommonMark のリンク記法 text と競合するかもしれません

はい、ファイル名が "(括弧で囲まれた名前)" のファイルへのリンクと競合するのが欠点です。 しかし、そのようなファイルへのリンクというのはレアケースです。 問題はVFMではない一般のMarkdownのプレビューでみたときにリンクに見えてしまうことですね。

別案:

テーブル内で使いにくい | 区切りを使うルビ記法よりもよいものをと考えたのだけど、いまいちかな

akabekobeko commented 3 years ago

というよいところを取り入れた案です。

新案なのですね。承知しました。

はい、正規表現で漢字が1文字以上を /(\p{Ideographic}\p{Variation_Selector}?)+/u で見つけられます。

勉強になりました。ただしルビは対象が漢字だけとは限らないので、記法的には親文字の範囲指定は省略できないようにするほうがよさそうです。

問題はVFMではない一般のMarkdownのプレビューでみたときにリンクに見えてしまうことですね。

方言であっても CommonMark には準拠していることを期待されるでしょうし、ここは重要ですね。なのでこの点により

テーブル内で使いにくい | 区切りを使うルビ記法よりもよいものをと考えたのだけど、いまいちかな

いまいちかな、と思いました。

親文字列の囲みを [ ] ではなく { } にする?

は他に競合する記法がなければ検討してもよさそうですね。テーブル内でルビというのは割とありそう (専門用語の一覧表など) なので | のエスケープを避けれるというのは重視に値するかと。

MurakamiShinyu commented 3 years ago

勉強になりました。ただしルビは対象が漢字だけとは限らないので、記法的には親文字の範囲指定は省略できないようにするほうがよさそうです。

ルビは漢字が対象である割合が圧倒的に多いので、省略可能にすることで、マークダウン原稿を書きやすく、読みやすくするという意図です。青空文庫のルビ記法がヒントになっています。

青空文庫の適当なタイトルを選んで「 テキストファイル(ルビあり」のデータを見てみました: https://www.aozora.gr.jp/cards/000326/card59495.html ここから「テキストファイル(ルビあり)」のzipを解凍した hekigan.txt を見てみると、

碧眼
モーリス・ルヴェル Maurice Level
田中早苗訳

-------------------------------------------------------
【テキスト中に現れる記号について】

《》:ルビ
(例)黯《くろ》ずんだ

|:ルビの付く文字列の始まりを特定する記号
(例)二、三|日《ち》

[#]:入力者注 主に外字の説明や、傍点の位置の指定
(例)つと[#「つと」に傍点]
-------------------------------------------------------

という最初にある説明に使われているのを除いて、 ルビ は 134個あり、そのうち親文字列開始の記号 が使われているのは1箇所だけで残りの133個は省略されています。その箇所がある段落:

「飛んでもないことだ。お前さんは辛《やっ》と二、三|日《ち》前に起床《おき》られるようになったばかりじゃないか。
それに、こんな天気に外出するとまた悪くなるよ。もう少し我慢をしなさい。此院《ここ》は別段不足がない筈なんだが、
それとも誰か気に触ることでもしたかい」

これを、ルビ文字列の囲みを (( )) に、親文字列の囲み(省略可能)を { } に直すと次のような感じに

「飛んでもないことだ。お前さんは辛((やっ))と二、三{日}((ち))前に起床((おき))られるようになったばかりじゃないか。
それに、こんな天気に外出するとまた悪くなるよ。もう少し我慢をしなさい。此院((ここ))は別段不足がない筈なんだが、
それとも誰か気に触ることでもしたかい」

もうひとつ青空文庫の https://www.aozora.gr.jp/cards/000148/card773.html 『こころ』夏目漱石で、ルビ は 4568個あり、そのうち親文字列開始の記号 が使われているのは149箇所(全ルビの約3%)。


まずは、でんでんマークダウンのルビ記法(テーブル内では | をエスケープすること)が使えるようにすることが優先で、将来もしニーズがあったら、この案も含めてよりよい記法の検討をということで。

MurakamiShinyu commented 3 years ago

でんでんマークダウンのルビ記法でテーブル内でそのままで使えない | の代わりになる文字としては、全角の (‎U+FF5C FULLWIDTH VERTICAL LINE) でどうでしょう:

{電子出版|でん|し|しゅっ|ぱん}
akabekobeko commented 3 years ago

@MurakamiShinyu 現状、新案の議論で対応が止まっています。v1.0 としてはこのままリリースして、新案の検討は v2.0 送りでよいでしょうか?

akabekobeko commented 3 years ago

上記コメントに対して 👍 がついたので v1.0.0 時点の構文としては {Ruby|ルビ} で確定、新案・別案は v2.0 で継続議論とします。