関数型WIKIを作る

投稿日:2019年04月14日 17時05分46秒

関数型WIKIと書いてしまったが、正直なんと書いていいのか分からない。
bootstrapに対応したWIKIを作成しようと考え付いて、どのような表現がいいのか思案していた。WIKIとは煎じ詰めればテンプレート置換である。あるWIKI文法、たとえば
[[表現]]などを表現の様に正規表現でマッチングさせているに過ぎない。従って表現には1行で表現できるような簡単なものしか出来ないしカスタマイズにもおのずから表現力の限界がある。一方bootstrapは普通のhtmlであるが、classに1つ以上の予め定まったCSSで作成したプログラムの名称を指定することで表現を広げている。ここで注目したのは”1つ以上の”というところだ。これは考え方を変えればオブジェクト指向型言語の多重継承である。しかしながら記述する順番が一意でなくてもよかったり厳密ではない。これはどちらかというと集合からのマッチングに見える。
そのようなある集合からマッチングするという処理といえば、Prologが思い出される。Prologでは複数の候補がある選択の中から全体が真理であるようにマッチングし、誤謬が起きればいままでの処理を元に戻す。まあ厳密に考えると突っ込みどころは多いが、ここでPrologの記述方法を見てみる。
表記1:(述語 リテラル リテラル…).
表記2:(述語名 リテラル リテラル…) :- (述語 リテラル リテラル…)
images

このように先頭部分は単一の関数などを指し示すのではなくある表現全体の部分集合を示している。この表現方法を借りてWIKIを作ってみたい。例えばbootstrapにおいてtableだとclass指定は,NONE,”table”,”table-bordered”,”table-striped”,”table-condensed”の組み合わせとなっている。つまりHTMLタグ全体集合のうちのtable集合においていくつかの多様性(ポリモフィズム
)があるわけだ。この他に列数とデータ、ヘッダ行の有無が決まれば表現は可能だ。仮に以下の様に表現してみる。
(table [table|table-bordered|table-striped|table-condensed|header有無])(列数 [データ…])
住所録を例にとれば以下の様に表現できるだろう(ちなみにオーガスタ・エイダはバイロンの娘にしてチャールズバベッジの弟子で世界最初のプログラマだ。最近簡単な事も危険なくらい度忘れするのに、こんなことは忘れない:)
(table table-bordered table-striped header)
(4 氏名 郵便番号 住所 電話番号
"scott tiger" 003-0006 札幌市中央区南8条西4丁目 011-123-4567
"augasta ada" 064-0808 札幌中央区南9条西5丁目 011-345-6789)
しかもこれらは1つのリテラルとして入れ子にできる。bootstrapのグリッドレイアウトの中にテーブルを表現するなどという事も可能だ。
さてここまでは話でしかない。そのまま実装するとWIKIを構文解析しなければならない。実際のWIKIでは正規表現でここを実装している。プログラム側では通常使われないような文字パターンを用意しておけばいいわけだ。毎回httpアクセスの度に構文解析では、あまり実用的ではない。
が、しかしここでブレークスルーがある。なんと正規表現は再帰表現が可能なのだ。
一例だがJSONを再帰的正規表現で表現するという記事もある。
表現方法によってはこれで十分いけそうじゃないか!
ということで、これはいけそうと思ったけどPHPのベースクラス作ったところで飽きたのでまた次回。

[<< BITCASAは使えません]

[BITCASAは準備不足 >>]