7cc@はてなブログ

JavaScriptとかとか

dlリストの簡易記法 dl,dt,ddをMarkdownで使いたいと思ったけれど

まず、Markdownでは標準でdlリストの記法は存在しない。 Markdownには派生版がいくつか存在し、dl,dt,ddがMarkdownで使えることもある(多くの場合は使えない)。

tableも元のMarkdownでは使えない。しかしこちらは多くのMarkdownで使える。
ならば、dlも使えるようにすればいいのに、実装されていないのは次のような理由が考えられる。

  • 簡易記法であるため
    • 複雑にしたくない
  • 互換性の問題
    • Markdownでは採用されていない方が多い
    • 後から変更すると、それまでのテキストが誤変換される恐れがある
    • 軽量マークアップ言語によって書き方が違う(それらとの変換の問題)

-> dl対応のMarkdownを利用するか、あきらめてhtml形式で書いた方が良いようだ。

簡易記法でdlが使える例

いずれも複数のdt, ddができる

次のようなHTMLを出力したい時

<dl>
  <!-- 複数のdd -->
  <dt>みかん</dt>
  <dd>オレンジ色。</dd>
  <dd>甘酸っぱい。</dd>
  <!-- 複数のdt -->
  <dt>りんご</dt>
  <dt>アップル</dt>
  <dd>赤くて甘い。</dd>
</dl>

Markdown派生 (PHP Markdown Extra派生)

みかん
:   オレンジ色。
:   甘酸っぱい。

りんご
アップル
:   赤くて甘い。

ddとdtの間に改行を入れても一つのdlと見なされるらしい。
他は空行を作らないようにする。

RD (Ruby Document format)

:みかん
  オレンジ色。
  甘酸っぱい。
:りんご
:アップル
  赤くて甘い。

Pukiwiki

: みかん   | オレンジ色。
:          | 甘酸っぱい。
: りんご   |
: アップル | 赤くて甘い。

はてな記法

:みかん: オレンジ
::       甘酸っぱい。
:りんご  :
:アップル:赤くて甘い。
  • Pukiwikiと違い、空のところはスペースは入れてはいけない
  • 上のようなインデントは不要

おまけ - RDの書き方からdlに変換するJS

エディタのマクロとかで…使うかな?
本題ではないけれど、replaceの第二引数と(x)(capturing parentheses)で割と簡単に出来る。

function RDstringToDList(s) {
  var temp = s.replace(/^:(.+)|^  (.+)/gm, function(a, b, c){
    b && ( b = "  " + "<dt>" + b )
    c && ( c = "    " + "<dd>" + c )
    return b || c
  })
  tmp = "<dl>\n" + temp + "\n</dl>"
  return tmp.replace(/^\n/gm, "") // 空の行削除
}