完全实现TiddlyWiki保存路径自动化处理
-
要运行和测试下面内容,请确保对你的TiddlyWiki进行了多重备份工作。我不承担任何因文章造成了任何后果的责任。请一定一定一定要备份。
使用node.js的TiddlyWiki,里面有一个可以进行配置的条目。
$:/config/FileSystemPaths
,可以根据筛选器表达式,把不同的内容存放在不同的硬盘路径中。详细可查看自定义条目文件命名,但这个条目是一个配置条目,里面只能写筛选器表达式,不能写wikitext。如果只是简单的分类还好,但如果有上千个条目,或上万个条目,当我们想要在硬盘路径上有一个分类时,就需要采取其它方案了。为什么会进行分类呢?因为当windows系统面临一个文件夹里的上万个文件,很容易出现卡顿的情况。所以后期分类也许是有必要的。当然,如果超出了TiddlyWiki的承受极限和性能极限,那么更好的方式是采用多个TiddlyWiki来进行管理。接下来进入正题,如何进行分类。这里我以一个最简单的示例来进行说明。首先你需要准备一些带有
test
字段的条目,并且这些条目有不同的字段值,且可以多准备一些条目,以看到更清楚的情况。另外,对于一些markdown文件也同样适用。接着你需要新建一个条目,名称随意,这里我选择
Filter Expression Generation
,意思是用来产生筛选器表达式,里面的代码如下。<$list filter="[has[test]get[test]unique[]enlist-input[]]" variable="testField"> <$set name="fieldValue" value=<<testField>> > <$let filterExpresision=`[test[$(fieldValue)$]addprefix[\]addprefix[$(fieldValue)$]]` > <$text text=<<filterExpresision>> /> </$let> </$set> </$list>
保存后你可以看到一些跟下面很相似的筛选器表达式的内容。
[test[123]addprefix[\]addprefix[123]] [test[0023]addprefix[\]addprefix[0023]] [test[1111]addprefix[\]addprefix[1111]] [test[22]addprefix[\]addprefix[22]]
但这个内容没有维基化处理,并不能直接拿来使用。所以我们需要用到第二个条目,条目名同样随意,我这里使用
Filter Expression Button
,意思是通过按钮把上面筛选器表达式的内容存储下来。里面的代码如下。<$wikify name="filterExpressionStorage" text={{Filter Expression Generation}} > <$button> <$let filterExpressionStorageValue={{{ [<filterExpressionStorage>search-replace:g:regexp[\n],[ ]search-replace:g:regexp[\s+],[ ]trim[]] }}} > <$action-setfield $tiddler="Filter Expression Storage" $field="text" $value=<<filterExpressionStorageValue>> /> <$action-navigate $to="Filter Expression Storage"/> Create or Update </$let> </$button> </$wikify>
这里我稍微解释一下,里面用到了正则表达式进行筛选替换。但不用担心,这里并没有替换什么特别的内容,只是把多余的空行和空格删除了,并去除了开头和末尾的空格,让它看起来更美观。
ok,按下按钮,就会生成一个
Filter Expression Storage
条目,并把上面筛选器表达式的内容保存进去。接下来才需要对$:/config/FileSystemPaths
进行处理,处理起来也非常简单,新建这个条目,如果有的话就编辑它。再把下面的内容保存进去,当然你可以有自己的其它内容。[subfilter{Filter Expression Storage}addprefix[test/]]
这时你应该能明白了吧,
subfilter
会自动读取里面的值,运行里面每一个筛选器表达式,而里面的筛选器表达式又由按钮Filter Expression Button
创建和保持更新。你不需要自己手动填写。而筛选器表达式的构建又来自于Filter Expression Generation
。如果你是TiddlyWiki专业用户,那肯定可以举一反三,创造更多不同的用法。这里最关注的一点在于,上面的条目名不是绝对的,但你需要保持一致。你可以使用系统前缀,也可以使用自己自定义的,但一定要保持前缀。但还没完。那些已经存在了的条目,并不会自动更新,除非你编辑他们。但你肯定不想手动去一个个编辑里面上千个条目。因而你可以使用插件
$:/plugins/kookma/commander
,打开$:/Commander
条目,并输入一个合适的筛选器表达式。勾选Selective operation?
,再点击Select all
的按钮,然后取消勾选就可以了。这会导致筛选出来的条目被修改,但只是修改时间被修改了,内容并没有被修改。这是可以接受的。这个时候,你再检查你的文件,你会发现他们被整齐地归类在不同的文件夹里了。
我知道,你还有疑问。但我也想到了。如果这个筛选器很复杂怎么办,很多怎么办,难道也要一个个输入吗?那太麻烦了。所以我们可以根据上面内容实现同样的筛选器表达式构建。
创建一个条目,名称任意,这里我使用
Filter Expression Generation No Prefix
,表示不加前缀,而不加前缀就可以获得正常的筛选器表达式了。<$list filter="[has[test]get[test]unique[]enlist-input[]]" variable="testField"> <$set name="fieldValue" value=<<testField>> > <$let filterExpresision=`[test[$(fieldValue)$]]` > <$text text=<<filterExpresision>> /> </$let> </$set> </$list>
接着,我们同样创建一个按钮条目,名称随意,这里我选择
Filter Expression Button No Prefix
,内容如下。<$wikify name="filterExpressionStorage" text={{Filter Expression Generation No Prefix}} > <$button> <$let filterExpressionStorageValue={{{ [<filterExpressionStorage>search-replace:g:regexp[\n],[ ]search-replace:g:regexp[\s+],[ ]trim[]] }}} > <$action-setfield $tiddler="Filter Expression Storage No Prefix" $field="text" $value=<<filterExpressionStorageValue>> /> Create or Update </$let> </$button> </$wikify>
然后你就可以使用下面的筛选器表达式了。
[subfilter{Filter Expression Storage No Prefix}]
是不是非常简单。我在强调一下,在TiddlyWiki中,条目名并没有固定的方式,任何人都可以按他的喜好来进行不同的命名,但一定要保持名称一致。因为不一致是无法实现的。
最后,我必须再强调,一定一定一定要进行备份。在做任何测试之前,一定要进行备份。如果你没有git备份的话,很有可能造成无法挽回后果。我不承担上述内容所造成的后果的责任。请一定要确保进行了足够多的测试和足够多的备份工作,再进行操作。对于TiddlyWiki经验不足的用户,可以考虑发贴请求其它人的帮助。
-
https://talk.tiddlywiki.org/t/fully-automating-tiddlywiki-save-path-management/
英文论坛那边我补充了一个,把日志条目放到相应的文件夹中的方法。我就不转过来了。