このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Wiki構文の問題はそんなに簡単なの?

WikiCreole構文に関する僕の一連の記事に対し、id:pmintさんからブックマーク経由でご指摘とご意見をいただきました。

目的も見当たらない」、「発展する見込みなし」は余計なお世話だという気もしますが、まーそれはいいとして、Wiki構文仕様の明確化やパーザー実装の参考になるならありがたい事なので、検討したいと思います。

内容:

  1. 問題とご意見の背景
  2. 行内の'**'の数を数えてみる
    1. さて、うまくいくかな
    2. うまくいかない
    3. 何が問題なのか
  3. 改行を無視し、次行と連結してみる
  4. 引き続きご意見と情報をお待ちしています

[追記 date="2010-11-08"]
WikiCreole仕様の曖昧さで僕より苦労している人=Kuwataさんによる状況説明:

端的にあんな仕様じゃダメだと思う。仕様で記述すべき内容のことじゃなくて、記述の方法がダメなんだけどね。(正確な記述が難しいのは僕も承知しているが、それにしても、、、)
[/追記]
[追記 date="2010-11-18"]

遅ればせながらのさらに追記。より具体的な話が次にあります。

なかなかの力作です。

[/追記]

問題とご意見の背景

次の2つのご意見に注目します。

  1. [ご意見A] 行内の**数を数えればいいだけ。そもそもインライン要素の優先順位は高くするものなので何ら問題ではない。
  2. [ご意見B] 難し過ぎ。複数行〜は不要。次行と連結する単一行要素と捉えるべき。改行が無視されるので使う側視点だと要素内改行はない。

これだけだと「何のことやら?」かもしれませんが、もとの僕のエントリーと対比すれば、pmintさんのご意見の意味はハッキリとわかります。文脈と例を補足しながら検討しましょう。

[ご意見A]の背景となっている問題とは; WikiCreoleでは、強調(通常はボールドで表示)と入れ子になった箇条書きのマークアップがどちらも'**'(アスタリクス2つ)で、これは曖昧で面倒だということです。これに対して、「行内の**数を数えれば」「何ら問題ではない」ということです。

一方の[ご意見B]の背景となっているのは、僕が提示した次の分類表です。

1行ブロック要素 h1からh6, hr
複数行ブロック要素 p, ol, ul, table
1行インライン要素 br, img, a?, tt?, URL
複数行インライン要素 em, strong
特殊ブロック要素 pre

この分類は「難し過ぎ」で、複数行ブロック要素と複数行インライン要素は「不要」ということです。つまり、次のような分類で十分だということになります。

ブロック要素 h1からh6, hr, p, ol, ul, table
インライン要素 br, img, a, tt, URL, em, strong
特殊ブロック要素 pre

改行があっても処理系により「無視される」ので、「1行」とか「複数行」とかの区別は要らないというわけ。

行内の'**'の数を数えてみる

僕が「曖昧で分かりにくくて困った」と指摘しているマークアップは次のようなものです。日本語の文章/表現としては不自然ですが、そこはご了承ください。

* これは
**とても大事なこと**です。

'**'で囲んである「とても大事なこと」は強調にように思えますが、最初の'**'が行頭にあるので入れ子箇条書きの開始とも解釈できます。

さて、うまくいくかな

pmintさんの[ご意見A]に従い'**'の数を勘定すると2個です。つまり、最初の'**'を強調開始、次の'**'を強調終了と解釈できるので「これは強調だ」と判断できます。「そもそもインライン要素の優先順位は高くするものなので」強調と判断できるなら箇条書き解釈より優先させます。

一方、次の例では'**'が1個です。

* これは
**とても大事なことです。

終了がないので強調とは判断できず、箇条書きということになります。

* これは
**実は**とても大事なこと**です。

これは'**'3個ですが、先頭の1個は箇条書き開始、残り2個は重要(ボールド)の開始と終了です。

ナルホドナルホド。まとめると、行頭に'**'が出現するときに:

  1. 1行内に偶数個の'**'があるならば、強調の開始と終了のペアだと判断する。
  2. 1行内に奇数個の'**'があるならば、最初は箇条書きの開始、残りは強調の開始と終了のペアだと判断する。

「ナルホドナルホド」と勝手に合点してますが、「行内の**数を数える」、「インライン要素の優先順位は高くする」の意味はそんなことじゃねー、というなら、どんな意味か教えてくださいな。

うまくいかない

'**'の数を数える」のは一見良さそうですで、まず最初の問題はWikiCreoleの仕様も実装もそうはなってないことです。

http://www.wikicreole.org/wiki/Creole1.0#section-Creole1.0-Lists によると:

About unordered lists and bold:

a line starting with ** (including optional whitespace before and afterwards), immediately following any list element on a line above, will be treated as a nested unordered list element. Otherwise it will be treated as the beginning of bold text.

a nested unordered list element としての解釈が the beginning of bold text より優先されます。「そもそもインライン要素の優先順位は高くする」とはどこにも書いてありません。

Creoleは実装を元に作られたのでWikiの実装を知らないと理解できない」ということなので、BitbucketのWikiCreole実装で試してみました。次のとおりです。

行頭の'**'は問答無用に箇条書きとなります。2個目の'**'は無視されるようです -- 無視すべきかどうかに関する明確な記述や根拠は見当たりませんけどね。


Creoleは実装を元に作られたのでWikiの実装を知らないと理解できない」と言っているのは、「WikiCreole仕様を理解するには、既存の多くのWiki実装を知らないと無理」という意味なのでしょうか。

だとしたら、WikiCreole仕様はダメダメ仕様です。歴史的経緯、あるいは仕様策定の過程で既存Wiki実装が調査されたのは事実でしょうが、既存実装を知らないと理解できないなら、仕様としてまとめた意味がありません。仕様は、自己完結的に書かれているのが望ましいのです。

'**'の数を数える」とか「インライン要素の優先順位は高くする」とは、現状の仕様と実装は無視して、pmint流の新方式の提案なのでしょうか? 「Creoleは数ある実装のまとめなので何かを新たに決めたものではない。」ともおっしゃっているのですが …? ……??

何が問題なのか

次のようなマークアップがどのようなXHTMLに変換されるか、どのようにレンダリングされるか分かりますか?

* これは**とても
大事なこと**です。

* これは**とても
大事なことです。

* これは**とても
**大事なことです。

* これは
**とても
大事なこと**です。

* これは
**とても
大事なことです。

* これは
**とても大事なこと
**です

今の僕は、だいぶ慣れてきたので表示が予測できます。しかし、最初のうちは混乱して何がなんだかわかりませんでした。

'**'に関するWikiCreole構文仕様は、わかりにくく誤解を招きやすく、利用者を混乱させる点が問題だ、と僕は言っているのです。分かりにくさの証左のひとつは、僕自身が混乱した経験です。

もうひとつの実例は、pmintさんです。pmintさんは、「行内の**数を数えればいいだけ」と思い込んでいたいたわけです(かなり自信満々で)。実際のWikiCreole仕様や実装に触れたらビックリして混乱してしまうかもしれません。

改行を無視し、次行と連結してみる

改行が無視されるので使う側視点だと要素内改行はない。」というのは、段落などに関してはそのとおりです。先に出した強調(ボールド)内でも改行は無視されます。以下の2つのマークアップは同じように扱われます。

* これは**とても
大事なこと**です。

* これは**とても大事なこと**です。

次行と連結する単一行要素と捉えるべき」はOKですね。しかし、もし行を連結して考えるなら、先の「行内の**数を数える」行為は無意味なんです。わかりますか?

* これは
**実は**とても大事なこと**です。

* これは
**実は**
とても大事なこと**です。

* これは
**実は
**とても大事なこと
**です。

上のマークアップの「実は」の行に出現する'**'の個数はそれぞれ、3個、2個、1個ですが、行を連結すればみんな同じマークアップです。「行内の**数を数える」という言葉を発したとき既に、行にセンシティブになっているのです。

それはそうとしして、1行と複数行の区別はほんとに不要でしょうか? 次の例を見てください。

== これは長い長い長い見出しです

== これは長い長い
長い見出しです

私のブログは[[http://d.hatena.ne.jp/m-hiyama/]]です。

私のブログは[[htt
p://d.hatena.ne.jp/m-hiyama/]]です。

見出しでは、改行が要素の終了なので、「次行と連結する」わけにはいきません。URLの途中に改行を入れるのも好ましくありません。BitbuckeのCreoleWiki実装では、次のようなXHTMLに変換されます(議論に関係しない属性などは削った)。

<h2>これは長い長い長い見出しです</h2>

<h2>これは長い長い</h2>
<p>長い見出しです</p>

<p>私のブログは<a href="http://d.hatena.ne.jp/m-hiyama/">http://d.hatena.ne.jp/m-hiyama/</a>です。
</p>
<p>私のブログは[[htt
p://d.hatena.ne.jp/m-hiyama/]]です。</p>

ただし、URL内に改行を入れてもうまくいくことあります。改行がダメなケースと許されるケースの基準は、仕様からはわかりません。今挙げた例も、ひとつの実装がそうなっている、ってだけのことです。

引き続きご意見と情報をお待ちしています

せっかくのご意見なのですが、「行内の**数を数える」と「次行と連結する」は矛盾しているし、「インライン要素の優先順位は高くする」には根拠がなく、僕の悩みを解決してくれそうにありません。「一つでも役に立つ、あるいは意味のある論述が欲しい」のですが、いかがなものでしょう。

id:pmintさんに限らずどなたでも、なにか良いアイディアや信頼できる情報があれば、トラックバックでもコメントでも、あるいはブックマークでもけっこうですからご教示ください。