メタマークアップ（仮）

現状のTATEditorでは以下の表示をマークアップで指定できます。

- ルビ
- 傍点
- 上付き
- 下付き
- 縦中横
- 割注
- ブロックインデント

これを指定するマークアップ方式そのものはプログラムには含まれていません。
ルビなどのマークアップを指定するマークアップを指定するためのマークアップを組み込んでおき、それを通してマークアップ方式を生成しています。
このマークアップをここでは「メタマークアップ」としています。

# メタマークアップ
今のメタマークアップはかなり冗長で、厳密性の低いものになっています。

- `2/#1/#2/`
    - 先頭の2は後ろに続く引数の数
        - 今は2しか使ってない
    - `\`はエスケープ文字
    - `#1`はマッチする文字列
        - 正規表現っぽい何か
    - `#2`はマッチした文字列をどう扱うか
        - エスケープ
        - コメント
        - 親文字/ルビ文字
        - 縦中横
        - 割注
        - タブ文字
        - ブロックインデント（文の先頭でのみ有効）
    - この記述を並べてマークアップを全て指定する
        - いずれかの`#1`に一致したらその文字列にはその`#2`のマークアップが適用される
        - 同時に複数のマークアップに一致した場合は前方のマークアップが優先される
        - いずれにも一致しなかった文字列は通常のテキストとして扱われる

## 1番目の引数

`.`は任意の文字、`[a-z]`はaからzの文字集合、`[^a-z]`はaからz以外集合を意味する。
`*`は0文字以上、`+`は1文字以上続く、`{n,}`はn文字以上、`{n,m}`はn文字以上m文字以下前の文字（または文字集合）が続くことを意味する。
`(`と`)`で囲まれた部分はマークあっぷの範囲指定に使える。

## 2番目の引数
`$i`はi番目の()の中の文字列です。

- `text=$1`
    - `$1`を表示する（折り返しはされない気がする）
- `ruby=$2{base=$1}`
    - `$1`に`$2`をルビとしてつける
    - `base=kanji`とすれば`#1`の前方の漢字が親文字になる
    - `base=search(word=$1,mode=backward)`とすれば`#1`の前方の`$1`に一致する部分が親文字になる
        - これはほとんど青空文庫形式専用
- `superscript=$1`
    - `$1`を上付き文字とする
- `subscript=$1`
    - `$1`を下付き文字とする
- `emphasis=$1{mark=﹅}`
    - `$1`に傍点をつける
    - 本当はmarkで指定した文字にしたいけど実装されてない
- `tate=$1`
    - `$1`を縦中横にする
    - 横書きでも横注たてのような何かになる
- `wari=$1`
    - `$1`を割注にする
    - 適宜折り返しされる
- `indentwidth=$indent_width`
    - `#1`で始まる行を字下げする（折り返し行も字下げする）
    - `#1`が連続するとその文字下げが増える
    - `$indent_width`の代わりに数字も使えたかもしれない（記憶が朧げ）
- `tab=1`
    - `#1`をタブ文字とする
    - 文字サイズ×数値の幅のタブとして扱う
- `space=1`
    - `#1`を空白文字とする
    - 文字サイズ×数値の幅の空白として扱う
    - 実装してた気がする

ちなみに`.cpp`ファイルには以下の定義があります。

```cpp
const wchar_t TextMarkupTagList::default_markup[] = L"2/｜(｜)/text=$1/2/｜(《)/text=$1/2/＾(＾)/text=$1/2/＿(＿)/text=$1/2/＊(＊)/text=$1/2/＾《(.+)》/superscript=$1/2/＿《(.+)》/subscript=$1/2/｜(.+)《(.+)》/ruby=$2{base=$1}/2/《(.+)》/ruby=$1/2/＿(.+)＿/tate=$1/2/＾(.+)＾/wari=$1/2/＊(.+)＊《(.)》/emphasis=$1{mark=$2}/2/＊(.+)＊/emphasis=$1{mark=﹅}/2/^\\t/indentwidth=$indent_width/2/\\t/tab=1/";
const wchar_t TextMarkupTagList::aozora_markup[] = L"2/｜(｜)/text=$1/2/｜(《)/text=$1/2/｜(［)/text=$1/2/｜(.+)《(.+)》/ruby=$2{base=$1}/2/《(.+)》/ruby=$1/2/［＃「(.+)」に「(.+)」の注記］/ruby=$2{base=search(word=$1,mode=backward)}/2/［＃注記付き］(.+)［＃「(.+)」の注記付き終わり］/ruby=$2{base=$1}/2/［＃「(.+)」は縦中横］/tate=search(word=$1,mode=backward)/2/［＃縦中横］(.+)［＃縦中横終わり］/tate=$1/2/［＃割り注］(.+)［＃割り注終わり］/wari=$1/2/［＃「(.+)」は行左小書き］/subscript=search(word=$1,mode=backward)/2/［＃行左小書き］(.+)［＃行左小書き終わり］/subscript=$1/2/［＃下付き小文字］(.+)［＃下付き小文字終わり］/subscript=$1/2/［＃「(.+)」は行右小書き］/superscript=search(word=$1,mode=backward)/2/［＃行右小書き］(.+)［＃行右小書き終わり］/superscript=$1/2/［＃上付き小文字］(.+)［＃上付き小文字終わり］/superscript=$1/2/［＃「(.+)」に傍点］/emphasis=search(word=$1,mode=backward){mark=﹅}/2/［＃「(.+)」に白ゴマ傍点］/emphasis=search(word=$1,mode=backward){mark=﹆}/2/［＃「(.+)」に丸傍点］/emphasis=search(word=$1,mode=backward){mark=●}/2/［＃「(.+)」に白丸傍点］/emphasis=search(word=$1,mode=backward){mark=○}/2/［＃「(.+)」に黒三角傍点］/emphasis=search(word=$1,mode=backward){mark=▲}/2/［＃「(.+)」に白三角傍点］/emphasis=search(word=$1,mode=backward){mark=△}/2/［＃「(.+)」に二重丸傍点］/emphasis=search(word=$1,mode=backward){mark=◎}/2/［＃「(.+)」に蛇の目傍点］/emphasis=search(word=$1,mode=backward){mark=◉}/2/［＃「(.+)」にばつ傍点］/emphasis=search(word=$1,mode=backward){mark=×}/2/［＃傍点］(.+)［＃傍点終わり］/emphasis=$1{mark=﹅}/2/［＃白ゴマ傍点］(.+)［＃白ゴマ傍点終わり］/emphasis=$1{mark=﹆}/2/［＃丸傍点］(.+)［＃丸傍点終わり］/emphasis=$1{mark=●}/2/［＃白丸傍点］(.+)［＃白丸傍点終わり］/emphasis=$1{mark=○}/2/［＃黒三角傍点］(.+)［＃黒三角傍点終わり］/emphasis=$1{mark=▲}/2/［＃白三角傍点］(.+)［＃白三角傍点終わり］/emphasis=$1{mark=△}/2/［＃二重丸傍点］(.+)［＃二重丸傍点終わり］/emphasis=$1{mark=◎}/2/［＃蛇の目傍点］(.+)［＃蛇の目傍点終わり］/emphasis=$1{mark=◉}/2/［＃ばつ傍点］(.+)［＃ばつ傍点終わり］/emphasis=$1{mark=×}/2/［＃([0-9０-９]+)字下げ］/indentwidth=$1/2/\\t/tab=1/";
const wchar_t TextMarkupTagList::denden_markup[] = L"2/\\\\(.)/text=$1/2/\\\\[(.+)\\\\]\\(.+\\)/text=$1/2/`(.+)`/text=$1/2/\\\\[%([0-9]+)\\\\]/text=$1/2/\\{(.+)\\|(.+)\\}/ruby=$2{base=$1}/2/\\^(.+)\\^/tate=$1/2/\\*(.+)\\*/emphasis=$1{mark=﹅}/2/\\*\\*(.+)\\*\\*/emphasis=$1{mark=﹆}/2/_(.+)_/emphasis=$1{mark=﹅}/2/__(.+)__/emphasis=$1{mark=﹆}/2/^> ?/indentwidth=$indent_width/2/\\t/tab=1/";
const wchar_t TextMarkupTagList::narou_markup[] = L"2/|(《)/text=$1/2/|(（)/text=$1/2/|(\\()/text=$1/2/｜(《)/text=$1/2/｜(（)/text=$1/2/｜(\\()/text=$1/2/|([^《]+)《([^》]{1,10})》/ruby=$2{base=$1}/2/|([^（]+)（([^）]{1,10})）/ruby=$2{base=$1}/2/|([^(]+)\\(([^\\)]{1,10}))/ruby=$2{base=$1}/2/｜([^《]+)《([^》]{1,10})》/ruby=$2{base=$1}/2/｜([^（]+)（([^）]{1,10})）/ruby=$2{base=$1}/2/｜([^(]+)\\(([^\\)]{1,10}))/ruby=$2{base=$1}/2/《([^》]{1,10})》/ruby=$1{base=kanji}/2/（([^）]{1,10})）/ruby=$1{base=kanji}/2/\\(([^\\)]{1,10}))/ruby=$1{base=kanji}/2/\\t/tab=2/";
const wchar_t TextMarkupTagList::pixiv_markup[] = L"2/\\\\[\\\\[rb:[ \\t]*(.+)[ \\t]*>[ \\t]*(.+)[ \\t]*]]/ruby=$2{base=$1}/2/\\\\[\\\\[jumpuri:[ \\t]*(.+)[ \\t]*>[ \\ts]*(.+)[ \\t]*]]/ruby=$2{base=$1}/2/\\t/tab=2/";
const wchar_t TextMarkupTagList::kakuyomu_markup[] = L"2/|(《)/text=$1/2/｜(《)/text=$1/2/|([^《]+)《([^》]+)》/ruby=$2{base=$1}/2/｜([^《]+)《([^》]+)》/ruby=$2{base=$1}/2/《《([^》]+)》》/emphasis=$1/2/《([^》]+)》/ruby=$1{base=kanji}/2/\\t/tab=2/";
```

それぞれ

- デフォルトマークアップ
- 青空文庫形式
    - マークアップの種類が多い
    - 範囲指定の字下げなどにもいずれ対応したい
- でんでんマークアップ
    - 対応可能な部分にのみ対応
    - 脚注や箇条書きなどにもいずれ対応したい
- なろう記法
- pixiv記法
- カクヨム記法

# おわりに
TATEditorのメタマークアップの現状に仕様について書きました。
いずれもっと美しいメタマークアップを策定して多彩な文字列描画をサポートできるようにしたいです。

FreeTypeの記事が間に合いそうになかったので一時間で書きました……。