†:i/ページに型を与えるときページ/要素/クラス名を指定するので、現在のTokenize対象をNotationTextクラスだけにする。
NotationTextのFactoryメソッドにstringを1つ与えるとNotationText.Tokenize実行。Elementsを返すように。
他のElements系クラスにもstringを1つ受けるFactoryメソッドを用意。それぞれでページ/型として使われたときの対応をする。
Notations系クラスの解析手順 †
Notation(parent:Element, source:NotationText)
最上位parentは特定Element.(Document?)
sourceはNotationText(フォームからの入力)
呼び出し元ページのページ/属性から記法定義を取得して、自身以降を処理。記法定義は記法→クラス名で、クラス名は重複していていいので…自身が何番目の記法から呼ばれたかを教えてもらわないと。
→要素クラスで記法を探索。要素クラスにはStringを与える。これでページ/型として使われたときに対応。
NotationTextはstring.
Notation.記法定義を読む(parent:Element, source:NotationText) Notation.記法定義を読んで要素生成(parent:Element, source:NotationText, notations:List<Tuple<notationPattern:String.Regex, className:String.ClassName>>)
呼び出し順は…
- PageかDocument
- 記法定義を読む(parent, source)
対象ページのページ/属性 → 設定ページ名 → 設定ページのページ/内容 → 記法定義(記法・要素クラス名の対)のリスト ⇔ 全記法定義 - 記法定義を読んで要素生成(parent, source, 全記法定義)
先頭の記法定義だけ切り出して、 - 要素クラス.記法検出(parent, source, String.Regex, 残りの記法定義)→NotationText上の記法を自身のインスタンス記法に置き換えた後のsource:NotationText
…Regexをラッピングするメソッド。自身のコンストラクターに渡すパラメーターをsourceから取得。同じクラスなのでパラメーターの型は自由。- 要素クラス.コンストラクター(parent, 用意したパラメーター)
- 記法定義を読んで要素生成(parent:自身, source:置き換えた後のNotationText, 残りの記法定義)
変更可能な記法の後にビルトインのデフォルト記法を解析 †
デフォルト記法(WikiCreole)の優先順位は設定された記法定義のあと。デフォルト間の優先順位は決まっていて変更不可能。記法が決まっているので優先順位も決めていい。