TiddlyWiki Filter Expression:釋放 TiddlyWiki 十倍威力的工具


個人學習 TiddlyWiki 時,一個比較花時間去學習的是 Filter Expression。一旦學會了即使一點也好,也能為 TiddlyWiki 解封了十倍以上的威力。在這篇裡將會介紹什麼是 Filter Expression、Filter Expression 能做什麼、以及基本的語法和例子。

> 什麼是 Filter Expression,以及Filter Expression 能做什麼?

Filter Expression 的的一個常見用途是用作找出符合條件的 tiddler 們,並在 tiddler 上展示。

Filter Expression 本身只是一個字串。例如是 [tag[Today]field:caption[hello]] 這樣。我們可以利用 Filter Expression 來找出符合條件的 tiddler 們(List of tiddler)。

例如最基本的例子是找出所有有某個 Tag 的 tiddler [tag[Today]]、找出所有標題含有某個字的 tiddler [regexp:title[Journal]] 、或者複雜一點是找出所有有某個 Tag 的 tiddler 並且標題含有某個字的 tiddler 等[tag[journal_2020]regexp:title[Journal]]

那麼我們找出這些符會條件的 tiddler 來做什麼?例如我們可以在一個 tiddler 裡加入一個 list widget,而當我們把這句 Filter expression 放入這個 list widget 後,這個 tiddler 便會把所有符合這個條件的 tiddler 都展示出來,這對於我們管理和處理 tiddler 時十分有用。

一個常見例子就是用作 TODO List。我們可以把所有 tag 上 task 的 tiddler 展示出來,並在旁邊加上一個 check box。我們可以設定一旦該 check box 被打勾,這個 tiddler 的 tag 便會由 task 變成了 done,所以再也不會在這個 TODO List 上出現了。關於這個用途官網有一個 詳細的例子

當然,實際上 Filter Expression 能做到的東西可以遠比剛才的例子強大得多。例如假設你把tiddler 們tag 上日子,而這個日子的格式例如是 20200716 Journal (Week 29 Thu),我們甚至能找出所有Week 29 的 tiddler。

也因此,Filter Expression 的語法相對上比較複雜。以下會稍微介紹一下基本語法。

> 基本的語法

我們以以下的這句 filter expression 作為例子來介紹:

[tag[task]regexp:title[Blog]] -[regexp:title[omni]] +[tagging[]] ="Additional Tiddler" 

首先,一句 Filter Expression 裡是由一個或多於一個的 run 所組成(由 “ “ 所分隔)。例如這個例子裡有 4 個 run,分別是:

  1. [tag[task]regexp:title[Blog]] 
  2. -[regexp:title[omni]]
  3. +[tagging[]] 以及
  4. ="Additional Tiddler" 

至於那些 -+= 是一個連接每個 run 的方式,稍後再談(留意這些 -+= 並不是 run 的一部分)。

而每一個 run 是由一個或多於一個的 step 所組成(都是由 operator:suffix[parameter] 的方式來表現)、或是直接以 "<text>" 的方式來代表。operator 指的是一些官方提供的操作,例如上面出現的 tag 等等。這裡有詳細的清單。

以以上的例子來說:

  • [tag[task]regexp:title[Blog]]  這個 run 裡有兩個 step。
    • 第一個是 tag[task] ,operator (名稱)是 tag、parameter 是task。
    • 第二個是 regexp:title[Blog],operator 是 regexp、suffix 是 title、parameter 是 Blog
    • 這個 run 的意思是找出所有有 tag 為 task 、並且標題包含 Blog 的 tiddler(以 regular expression 來表達)。
  • -[regexp:title[omni]]這個 run 裡有一個 step。
    • operator 是 regexp、suffix 是 title、parameter 是 omni
    • 這個 run 的意思是找出所有標題包含 omni 的 tiddler(以 regular expression 來表達)。
    • 而每一個 run 是和前面的 run 有關係的。由於這個 run 的前面有 - 的關係變成了剔除這些 tiddler 的意思,這變成了這個加上前一個 run 加起來的意思是 “找出所有有 tag 為 task 、並且標題包含 Blog 的 tiddler,並且剔除標題包含 omni 的 tiddler。”
  • +[tagging[]] 這個 run 裡有一個 step, 而這個 run 的 operator 是 tagging
    • 假設之前兩個 run 得出來的結果只有兩個 tiddler ,分別是 “Blog : Post: aaa” 和 “Blog : Post: bbb” ,那麼這三個 run 得出的結果是所有有 tag 上”Blog : Post: aaa” 或 “Blog : Post: bbb” 的 tiddler們。
  • 最後,="Additional Tiddler" 指的只是一個名為 “Additional Tiddler” 的 tiddler。而 = 的意思是在前面 3 個 run 的結果上直接加上這個 run 的結果,也就是”Additional Tiddler 這個 tiddler。

例子有點複雜。但我相信有了概念後,看這幾篇應該不是問題了。

> 進階應用:Filter Expression 不只是為了找出 tiddler 們而存在喔

隨著時間的發展,Filter Expression 裡的 operator 也不只是為了 tiddler 而服務,例如加上了很多的關放文字操作的 operator(String operators) 和數學操作的 operator(Mathematics Operators)。

例如以下的 Filter Expression,你猜會出現了什麼的結果?

=1 =2 =3 =4 +[multiply[4]multiply[3]] -12

相信看到這裡,也知道這個 Filter Expression 有6個 run 了。以下來說每個 run 得出的結果吧。

  Run 每個 run 得出的結果(以逗號分隔的列表)
1 =1 1
2 =2 1, 2
3 =3 1, 2, 3
4 =4 1, 2, 3, 4
5 +[multiply[4]multiply[3]] 12, 24, 36, 48
6 -12 24, 36, 48

我們可以只在 TiddlyWiki 裡不用寫程式便能進行這些數學運算,不要忘記這只是一個 Wiki 軟件而已!

> 進階應用:把 variable 和 transclusion 和 Filter Expression 結合

另外,我們還可以在 step 裡放入 variable(以 <variable_name> 的方式表達) 、或是 transclusion 的表達式(以 {transclusion_value} 的方式表達)。因為 Variable 和 Transclusion 不是這篇的課題,在這裡不多談了,有興趣可以看 這裡

此外,我們可以把 Filter Expression 的結果以 transclusion 的方式展示出來(這叫做 Filtered transclusions)。方法是使用 {{{ Filter Expression }}} 。詳細看此。但如果以這個方式以 set widget 的方式放在 variable 裡,這個 variable 只包含該 Filter Expression 的第一個結果。

事實上,還真的有人利用以上的特性製造了一個為每個 tiddler 作計時器的工具(連結按此)。由於我有把 TiddlyWiki 當作任務管理軟體的習慣,最近我還把這個工具用作為自己的每個任務計時的工具。

> 總結

Filter Expression 雖然不算容易學習,但是這是我認為和其他 wiki 應用的很大的分別,這個功能和其他的 widget 結合起來 ,就會變成了訂制度十分高的工具,功能基本上已經超越了 wiki 工具的範圍。

也因為 TiddlyWiki 有這麼彈性的功能,才能讓我們自己做出滿足自己需要的功能。



分類: 學習筆記 知識管理 TiddlyWiki
寫作日期: 2020-07-19

隨機文章: