WikiFormeでattribute

またしても仕様改革の気配。

問題は、syntax.yamlの引数付きsyntax。

block:
  table_cell:        "|"
  table_cell header: "*"

の、headerとか。


WikiFormeの今後の目論見として、syntax.yamlを自由に変換できるようにしたい。つまり、table_cellのマークを最初は「|」にしていたのを、後から「,」に変更するとか。出来て当たり前の機能のように思えて、これが難しい。


これをやるためには、Wiki記法をなんらかの中間表現に変換できるようにしないといけない。syntax A → 中間表現 → syntax Bと。ちなみにこれができると、複数の人が一つのソース(文章)を、自分の好きなsyntaxで編集できるようにもなる。ソースはいつも中間表現で保存しておいて、編集するときにその人用のsyntaxに変換する。これはおいしい。


で、引数付きsyntaxが無い頃は、syntaxをすべて外した書式を中間表現にすればいいと思っていた。要素にはすべて名前が付いているので、それを使えばいい。(要素に名前を付けないといけないのはそのため)


が、引数付きsyntaxは、今のところ中間表現に変換できない。引数付きsyntaxは↓こんな風に使う。

|table|table|table
,table,table,table

区切りを「|」にするのか「,」にするのか。要素自体は中間表現に変換できる。↓

\table table|table|table


他にも↓こんな。

\link{text>url}の「>」
|*head|table|
|*head|table|の「*」
|[-2-]2列ブチ抜きセル|の[-2-]

こういうものを、中間表現に変換したい。



で、ここでふと思うに、引数付きsyntaxを使いたい場面というのは、だいたい限られている。

  • 区切る(tableのセルを区切るとか)
  • 2つに別ける(リンクのtext>urlとか)
  • 3つに別ける(2つに別けるがあれば3つに別けるもあるだろう!)
  • 属性を与える(*を付けるとヘッダとか、セルを2行結合させるとか)

せいぜいこのくらい?



で、中間表現としてXMLを採用するなら、↓こんな風に中間表現にすることができる。(メンドーなので閉じタグ省略)

<table_split><item>A</><item>B</><item>C</></>
<link><text>text</><url>url</></>
<table_cell header="true" align="center">hoge cell</>

というわけで、structure.yamlの書式が変わる。

block:
  table_cell:
    parent: table_row
    syntax:
      - attribute: header
      - attribute: align
      - attribute: valign
      - attribute: char

  table_split:
    parent: table_body
    syntax:
      - split: cells

inline:
  link:
    syntax:
      - div2: [text, url]

syntax:以下を追加。attribute, split, div2が、「属性を与える」「区切る」「2つに別ける」で、headerやらcellsやらtext,urlやらは、変数名(またはHashのkey名)。process時に自分で区切ったり2つに別けたりする処理を書かなくても、既に変数に入っている。(この方が便利というか、自分で区切られると中間表現に変換できなくなるわけで)


それに対してsyntax.yamlの側は以下。

block:
  table_cell:         "|"
  table_cell header:  "*"

  table_split:        ","
  table_split cells:  ","

inline:
  link:               ["[[", "]]"]
  link text_url:      ">"


ここにきて、このsyntax指定だけモジューラブルじゃないというのは、不完全燃焼な気がする。というわけで、block, inlineに続いて、syntax要素が登場。syntax要素という名前はおかしいか。記述できるわけじゃない。同じファイルに書くのもおかしいかな。

syntax:
  split:
  attribute:
  div2:


細かい仕様は未定。



また仕様が肥大化していく。コード量も増えていく。そして時間は減っていく。目標はまた遠のく。なんてこった。