フィルター

TWのメモ

フィルターとは

条件を指定して該当するTiddlerを検索したり、単純な文字列の処理など色んなことが出来る機能
単体でも使うし、変数に入れたりウィジェットに渡したりなど組み合わせても使う
色々やるのに避けて通れないが結構ややこしく数も多くて初心者が苦しむ原因になりがち

単純に結果を見るには$:/AdvancedSearchのフィルタ(Filter)に書いたりTiddlerの本文に{{{フィルター}}}という書式で書き込む方法などがある

オペレーターとは

オペレーターとはフィルターにて使う色んな処理を行う機能で[]の中で書く
[オペレーター]のように

オペレーターは3つのブロックに別れており、!(オペレーター名):(suffix)(parameter)という書式です

!オペレーターの効果を反転させる場合だけつける
ただし、実際の効果はオペレーターの仕様によるし、効果が無いオペレーターもある
(オペレーター名)オペレーターの名前
(suffix)オペレーターによって設定されている場合がある2つ目のパラメーター
(parameter)直接渡す[値]、TextReferenceで渡す{TextReference}、変数で渡す<変数名>の3種類書き方が存在する
もちろん囲むのに使っている文字は中で使うことができない
regexp[]のように値を渡すのに困るようなら他の2つで渡すようにする
他の場所と違って括弧が1個なことに注意
(input)書式には出てこないが、左のオペレーターの結果(output)が入力(input)となる
最初のオペレーターの入力はall[tiddlers]の結果と等価(多分)
一部のオペレーターは入力(input)を完全に無視する処理を行う
公式で[regexp:op-input[ignored]]を使うと調べられる(全部出るかは分からない)

オペレーターは入力(input)をsuffixとparameterの指定に従って処理します
ただし上述したように一部に入力(input)を無視する物もあります

また、上述の形式とは少し異なる書き方もできるオペレーターも出てきました(search[])

オペレーターの組み合わせ

オペレーターはオペレーター名[]オペレーター名[]のようにつなげて書くことで左から右の順にどんどん処理していくことができる
例えば下記のように書く

[all[tiddlers]tag[TWのメモ]]

1つの塊であるFilter Run

上記[オペレーター1つないし複数]や、ただの文字列をダブルクォーテーションまたはシングルクォーテーションで囲んだ物、あるいはただの文字列(スペースや[]を含まない物)をrunと呼ぶ(公式のFilter Run)

更なる組み合わせ

上記runを組み合わせて更に複雑なフィルターを作ることができる

run1 run2run1の結果とrun2の結果のどちらかにある物/和集合(run1 or run2)
run1 +run2run1の結果とrun2の結果の両方にある物/共通部分(run1 and run2)
ただ実際にはrun1の結果をrun2に入力として渡して処理させている(多分)
なので共通部分になるかはrun2のオペレーターの仕様による
run1 -run2run1の結果にあってrun2の結果にない物/差集合(run1 and not run2)
run1 ~run2run1の結果が空のリスト(なし)だった時にrun2が結果になる。run1の結果が空のリストだったらrun2は結果に影響しない

細かい話

オペレーター名[]において、オペレーター名は一致する物がなければfieldオペレーターに渡されたsuffix(フィールド名の指定)として扱われます
オペレーター名なしで[]とかかれた場合はtitleオペレーターと解釈されます
field:title[]とtitle[]は別物であることに注意

フィールドオペレーターの方は省略せずフィールドだと明示した方が後から見ても分かりやすいです

Filter Operators

基本的に処理の対象は入力(input)のみ
[]内(parameter)と書いていますがもちろんTextReferenceも変数も使えます

all/is

all入力(input)は無視される
[]内(parameter)にtiddlersやshadows等を指定することで対象の一覧が結果として返る
たいてい後に続くTiddlerのために書く
ShadowTiddlerを対象にしたい場合に必要
tiddlersとshadowsを両方対象にしたい場合はtiddlers+shadowsまたはshadows+tiddlers
isall[]と似た機能だが、入力(input)のみを処理する点がall[]とは異なる

フィールド系

fieldsuffixに指定したフィールドが[]内(parameter)と一致する物を返す
[]内(parameter)が空だった場合、「フィールドが存在しない」または「フィールドは存在するが値が空」なTiddlerを返す
filedsTiddlerに含まれるフィールドの一覧を返す
hassuffixにfieldを指定したかどうかで挙動が変わる
suffixなしの場合
[]内(parameter)で指定したフィールドの値が空でないTiddler
!オペレーター名[]の場合はフィールドが存在しないか値が空のTiddler

suffixがfieldの場合
フィールドが存在するTiddler(値が空の場合も含む)
!オペレーター名[]の場合はフィールドが存在しないTiddler
get[]内(parameter)で指定したフィールドの取得

タグ系

tags使われているタグの一覧
tag[]内(parameter)で指定したタグのついている物を返す。suffixによって結果が変わる模様
taggingtag[]と似たような用途で、入力(input)をタグのリストとして扱い、どれかが含まれる物を返す
ShadowsTiddlerも検索対象の模様

index系(DataTiddlers関係)

indexesdata tiddlerに含まれるindexの一覧。fields[]のindex版
getindexgetのindex版

検索

searchsuffixで指定のフィールド検索
5.1.18で大幅拡張されたため、今後はこれに一本化するのかもしれない。書き方もsuffix周りでこれまでにない拡張がなされている
regexpsuffixで指定のフィールドを正規表現で検索

接辞(先頭、末尾)

prefix[]内(parameter)から始まる入力(input)を返す
suffix[]内(parameter)で終わる入力(input)を返す
addprefix入力(input)のそれぞれの先頭に[]内(parameter)を付け加えた物を返す
addsuffix入力(input)のそれぞれの末尾に[]内(parameter)を付け加えた物を返す
removeprefix入力(input)のそれぞれの先頭から[]内(parameter)を取り除いた物を返す
removesuffix入力(input)のそれぞれの末尾から[]内(parameter)を取り除いた物を返す

remove~は元々ついてなかった場合結果から省かれる模様
filterTestとwidgetが入力の時、removesuffix[Test]とするとfilterのみが結果として返される

その他

sort結果の並べ替え。
range入力(input)は無視される
1,2,3,4・・のような常に一定の差の数字のリストを返します
リストウィジェット等と組み合わせて使うと便利な場面があるかもしれません

変換系

encodehtmlHTMLでそのまま使えない文字をエスケープする
decodehtmlencodehtml[]の逆
encodeuri
decodeuri
encodeuricomponent
decodeuricomponent