読者です 読者をやめる 読者になる 読者になる

WikiForme 0.7の計画

あけましておめでとうございます。本年もよろしくお願い申し上げます。


今は12/25にリリースしたWikiForme 0.6に続くWikiForme 0.7を開発中です。
現在実装されている主要な機能には構造化親要素補完継承文法カスタマイズがありますが、さらに文脈依存文法正規表現マッチを加えたいと思っています。まだまだWiki記法の常識をブチ破っていきます。


文脈依存シンタックスは、文脈に応じてWiki記法の文法が変化していく機能です。
たとえばFlotでグラフを書く記法は、今は↓このような文法ですが、

#flot 400x300
#flotX 1, 2, 3, 4
#flotY 4, 2, 8, 7
^flotLabel 系列1
// ↑記号が多い

文脈依存シンタックスを導入すると、↓こんな風にかけるようになります(という計画)

#flot 400x300
系列1:
1, 2, 3, 4
4, 2, 8, 7
// ↑スッキリ

つまり、#flotと書いた時点でFlot用の文法が使えるようになります。#flot要素を抜けた後は通常の文法に戻ります。

他にも、たとえば「===」要素の中で「S6文法」が有効になるようにしておけば、今は↓このように書いているWiki記法が、

===
*タイトル
^s6style fontSize: 80%
?s6page separator: fade

↓このように書けるようになるはず。

===
*タイトル
^fontSize: 80%
?separator: fade

Wiki記法は多機能になるほど記号が増えてしまって「暗号」になりがちですが、文脈依存シンタックスがあれば記号の種類を減らせて、より自然に文章を書けると思います。



正規表現マッチは、今まで行頭のマークでしかマッチできなかった文法を、あらゆる正規表現でマッチできるようにしようという計画です。これで「はてな記法互換文法」なども作れるようになります。
これだけでは普通と言えば普通ですが、あらゆる正規表現というのがポイントです。たとえば正規表現に//mオプションを付けて「.」が改行にもマッチするようにしてやれば、ヒアドキュメントが書けます(ただ、名前付き捕獲式(→Ruby 1.9/鬼車)が必須かも…)

// 正規表現は /^script <<(?<here>.*)$\n(.*?)^\k<here>$/m
script <<END
ここに
何か
書く
END

機能追加の影響でパーサ部分が大幅に書き換えになるので、ついでに記法バンドルのフォーマットも改良します。
現状↓

f = Format.block :chapter
f.default_syntax '*'
f.contain :@contents, :@blank

# 省略記法
f.process_html {|text, children|
  XML[:h2, @children]
}

# フル記法
f.module_eval {
  def process_html
    XML[:h2, @children]
  end
}


計画↓

Format.block :chapter do
  syntax '*'
  contain :@contents, :@blank

  # 省略記法
  process_html {|text, children|
    XML[:h2, @children]
  }

  # フル記法
  def process_html
    XML[:h2, @children]
  end
end

ぱっと見たときに後者の方が分かりやすいと思います。do 〜 end はクラス定義のスコープで実行されるので、module_evalと書かなくてもそのままメソッドを定義できます。