可能性を全通り試したりしない実装方法とは。

区切り文字はつなぎ文字。
つながっているなら必ず1つのリンクに。完全一致しないならメタページへ。つまりDanglingLink化。

でも始まりと終わりの位置が不明。そこは既存の自動リンク方法で探さなければならない。
どうやるか?


区切り文字から末尾一致/先頭一致/完全一致 Edit

  • 区切り文字の前から末尾一致、区切り文字の後から先頭一致でいずれかのページ名に含まれる単語に一致するかどうか
  • 区切り文字の間がいずれかのページ名に含まれる単語に一致するかどうか
    (この部分は末尾一致・先頭一致するかも調べなければならない)

…を調べるだけでも順不同パスを見つけることはできそう。

自動リンクの種類 Edit

  • 区切りを含まない自動リンク
  • 区切りを含む自動リンク
    • 区切り前に1文字以上の末尾一致と、区切り後に1文字以上の先頭一致
      区切り前後の末尾一致/先頭一致はリンクに必須。
    • 区切り間が(いずれかのページ名に含まれる単語に)完全一致
      その繰り返し…の前後が、区切り前後の末尾一致/先頭一致**なら**その区切り間を採用してリンクに含める。
      リンクできるのなら区切り間をできるだけ多く含め
      たい。
    • ドキュメントのほうで駆動
      区切り文字はリンク記法

末尾一致・先頭一致の場合は一致し続けた範囲を採用。完全一致の場合は採用するかしないかの二択。

いずれの自動リンクも左優先。解釈が複数あれば先に現れたほうをリンク化する解釈で。

文字同一視 Edit

文字の同一視があるので単純な文字列探索にはならない。→ [[]]

あらかじめ解析 Edit

区切りで切って、区間ごとに先頭/中間/末尾の判定。3通りのどれとどれになれるか(全て/いずれでもない場合もあり)を解析しておくといい。フラグ3つの構造体…の列。

先頭と末尾はリンクと無縁の文字列も含む。最長で改行文字まで。

フラグだけだと情報不足。先頭/末尾の文字数を記録するといい。先頭にできる文字数(0以上)/末尾にできる文字数(0以上)/中間になれるかのフラグ。いずれでもない区間は0/0/false.

区間情報は文字数だけで可。どうせ先頭からの順次処理なので。

テキストの始まりに近い先頭から処理。先頭から中間の続く限りの範囲(と末尾候補)までで、最も後に現れる末尾を探す。
でも、最左一致は避けたい。最長一致がいい。

字句解析と単語列解析 Edit

文字単位で単語を探すのをAC法で行うなら左優先になる。
見つかった単語をどうつなぐかは(区切り文字を目印にして)長さ優先にできる。

どちらも長さ優先にするには?
AC法でゴールしても継続、スタートに戻るまで継続。スタートに戻った時点で適合したページ名があれば長い順に全て採用。採用したページ名(に対応する部分)に重なる(部分に対応する)ページ名は不採用。ページ名を相手にするよりも、ページ名と一致するページ内容部分のほうを対象にするほうが分かりやすい。

見つかった単語と区切り文字が連続している部分をリンク化する。
でも見つかった単語はページ内容上で重複しているかも知れない。この中にある区切り文字と合わせて順不同パスに適合するもののうち、最も長いものから採用していく。採用されたものと位置が重複するものは不採用。

長さ優先なら単語数で Edit

長いページ名とは文字数ではなく単語数の多いページ名。単語とはページ名を区切り文字で分割された文字列のこと。

長さの同じリンク先候補が複数ある場合、左を優先。

ページ一覧に…

  • A/B (B/Aでもある)
  • B/C (C/Bでもある)
  • B
    …があるとき…
    A/B/C
    …はA/B部分だけリンク

ページ一覧に…

  • A/C (C/Aでもある)
  • B
    …があれば…
    A/B/C
    …はB部分だけリンクになる。