跳转至内容
  • 最新
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 太微中文教程
  • 新插件投票看板
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
太微中文论坛icon

太微中文论坛

机杼机

机杼

@机杼
关于
帖子
409
主题
78
群组
1
粉丝
1
关注
6

帖子

最新 最佳 有争议的

  • 启动时处理配色表
    机杼机 机杼

    https://talk.tiddlywiki.org/t/unexpected-problem-with-tag-pills-on-program-startup/

    另外,可参阅上面论坛的讨论,大胡子进一步优化了代码。可以从这些讨论过程中学到很多。


  • 启动时处理配色表
    机杼机 机杼

    这个启动时处理的标签很不错,还可以运用在语言转换上。比如对于中国,则界面显示中文。其它国家则显示英文。

    还可以控制侧边栏的开关 ,因为本质上是对状态条目进行设置。

    还可以做其它很多操作。比如一启动就新建一个当天条目。

    总之玩法多样,多多尝试。


  • 启动时处理配色表
    机杼机 机杼
    \procedure selectpalette(t,f)
    <<f>>:
    <$select tiddler=<<t>> index=<<f>> style.width="80%">
      <optgroup label={{{ [<f>titlecase[]] }}}>
        <$list filter="[all[tiddlers+shadows]tag[$:/tags/Palette]color-scheme<f>sort[]]">
          <option value=<<currentTiddler>>><$view field="name"/> -- <$view field="description"/></option>
        </$list>
      </optgroup>
      <optgroup label="No Color Scheme or Other Scheme">
       <$list filter="[all[tiddlers+shadows]tag[$:/tags/Palette]!has[color-scheme]sort[]]">
          <option value=<<currentTiddler>>><$view field="name"/> -- <$view field="description"/></option>
       </$list>
      </optgroup>
    </$select>
    \end
    
    \procedure setpalette()
    <$tiddler tiddler="apply-light-or-dark-mode">
    <$let apply-mode={{{ [{$:/info/darkmode}match[yes]then{light-or-dark-mode-palette##dark}else{light-or-dark-mode-palette##light}] }}}>
    <$action-setfield $tiddler="$:/palette" $value=<<apply-mode>> $timestamp="no"/>
    </$let>
    </$tiddler>
    \end
    
    <$eventcatcher $change=<<setpalette>>>
    <<selectpalette "light-or-dark-mode-palette" "light">><br>
    <<selectpalette "light-or-dark-mode-palette" "dark">>
    </$eventcatcher>
    
    <<setpalette>>
    
    * [[$:/palette]]
    ** {{$:/palette}}
    * [[light-or-dark-mode-palette]]
    ** light-mode {{light-or-dark-mode-palette##light}}
    ** dark-mode {{light-or-dark-mode-palette##dark}}
    

    新建一个条目,把上面内容放进去。然后就会有列表可以选择了。选择白天模式和黑暗模式,配置的条目在light-or-dark-mode-palette中,这会变成一个json的数据条目。条目名可以修改,但要把其它地方也修改掉,因而要么不改,要改就用批量替换修改。

    如果你想启动或者刷新wiki时根据系统判断来展示的话,可以增加一个$:/tags/StartupAction/Browser标签。通常使用TiddlyWiki搭建网站的人来说,这是比较好的。因为其它人访问你的网站时,系统可能是白天模式也可能是黑暗模式。这可以提供一个较好的阅读体验。

    以上,下面是吐槽。TiddlyWiki这一点还是不太行,像Obsidian,思源笔记,或者大多数的软件,都能支持直接获取系统的黑暗模式和白天模式,完全不用自己手动刷新。其实这个方案,我见到最早的是由sttoct提出的,他也提到了要自动化处理可能需要外部js,于是就此作罢。


    更新,增加了没有color-scheme字段的筛选器表达式,同时也增加了排序,没有排序看起来太混乱了。


  • 使用TiddlyWiki开发游戏
    机杼机 机杼

    最近玩邪恶冥刻这款卡牌游戏,忽然想到可以用TiddlyWiki开发游戏。感觉值得尝试,不需要用js,就可以处理。不过也有很多要考虑的。


  • 如何使用TiddlyWiki启动桌面应用程序
    机杼机 机杼

    有一些软件会在注册表中注册协议,像微信和steam就是。太记好像也有注册,Obsidian和思源应该都有。但不是所有软件都有。而要自己添加和修改的话,非常麻烦。所以还是算了,就用一个桌面盒子来整理吧。


  • 如何使用TiddlyWiki启动桌面应用程序
    机杼机 机杼

    目前找到了一个腾讯桌面管家,只下载里面的桌面盒子就好了。

    • https://guanjia.qq.com/product/zmzl/

    b36ac63d-5ade-47bd-b14a-b136a24ef6ff-image.png

    只下载那个独立版就够用了,不需要拖家带口的。


  • 复杂筛选器变量传递问题
    机杼机 机杼

    另外一个是,TiddlyWiki也引入了function函数和筛选器。使用此函数可以自定义筛选器并且传入变量。但这个我还是没搞明白。文档中没有太详细的说明。论坛那边也都是直接上来用,但没有什么好的解释说明。

    目前还有一个PR,可以使用let微件在单个变量中传递多个变量值。

    • https://github.com/TiddlyWiki/TiddlyWiki5/pull/8972
    • https://deploy-preview-8972--tiddlywiki-previews.netlify.app/

    TiddlyWiki其实真的非常强大,但资料也是真的少。近几年更新很快,旧的东西也保留了,新的东西在不断增加。功能也确实是越来越多了。但功能主要还是面向高级用户的,对普通人来说,还是要等封装成插件。


  • 复杂筛选器变量传递问题
    机杼机 机杼

    @w6iyes

    说来惭愧,我自以为对筛选器掌握得不错,结果在这个问题上花了三天的时间都没解决。别人在听完我的描述后,立即就给出了解决办法。我来稍微解释一下吧。

    这里有两个关键的地方,一个是filter前缀,它可以对前面筛选出来的结果进一步筛选。

    假设前面筛选出了A,B,C,D四个条目,而filter后面筛选出了A,B,C三个条目,那么返回的就只会是A,B,C三个条目,相当于进一步约束了。

    另一个地方则是subfilter,这是一个建构子函数。建构子函数可以把结果转换成完成不一样的。建构子函数是我第一次确切明白是什么意思。

    但这里最关键的在于前面的all[tiddlers],因为这个前缀有时候会是默认提供,有时候不是默认提供。比如此筛选器前面的[tmo[Project]tmo_projectState[doing]],就不需要加all[tiddlers],因为这个是默认提供的,但后面的则不是默认提供。因而在subfilter筛选器接入的只是当前条目的tmo_projectFilter字段。也就是此插件条目tmo_projectFilter字段值。但很明显插件条目没有这个字段,也就是空。

    [tmo[Project]tmo_projectState[doing]] :filter[all[tiddlers]subfilter{!!tmo_projectFilter}tmo_taskState[todo]count[]!match[0]]
    

    所以上面增加了all[tiddlers],会是进一步约束和筛选。得出想要的结果。即筛选出项目条目并且项目条目下面的tmo_projectFilter字段中的结果存在非空的任务条目。

    [tmo[Project]tmo_projectState[doing]] :filter[subfilter{!!tmo_projectFilter}tmo_taskState[todo]count[]!match[0]]
    

    不增加则只会筛选出项目条目,后面filter的内容都是空,无法起到筛选的作用。

    ——————

    上面的筛选器还可以写成另一种,也就是把后面的内容当成一个变量传递。这种方式也是可以的。

    \procedure projectFilter() [all[tiddlers]subfilter{!!tmo_projectFilter}tmo_taskState[todo]count[]!match[0]]
    
    <$list filter="[tmo[Project]tmo_projectState[doing]filter<projectFilter>]">
    
    <$link><<currentTiddler>></$link>
    
    </$list>
    

  • 如何使用TiddlyWiki启动桌面应用程序
    机杼机 机杼

    我最近用的一个桌面分组软件,转向付费了。我想到TiddlyWiki能不能实现,直接用TiddlyWiki启动桌面应用程序。不知道有没有类似的插件或尝试。


  • TaskHub:新的任务管理插件
    机杼机 机杼
    $:/plugins/mabuqian/TaskHub
    
    • code: https://github.com/dongrentianyu/timefortask
    • demo: https://dongrentianyu.github.io/timefortask/

    插件名如上,可以在CPL上安装。

    插件通过两个类型,一个是项目,一个是任务。项目与任务都是各自独立的。项目条目中有一个字段tmo_projectFilter,可以根据这个字段的值进一步扩展包含的任务。这可以允许一个项目中包含来自多个项目的任务。

    简化了任务管理的复杂度。一个任务,要么是todo,要么就不是todo。没有设置其他优先级一类的判断。不是todo的话,则有三种可能,一种是done,表示已完成。一种是closed,表示已关闭,通常是没有去做,后面不想做了。一种是breakdown,表示失败,通常是去做了,但因为各种因素没有成功,所以失败了。一般来说,closed的条目可以再打开,但breakdown的条目应该重新新建一个去完成。

    项目也是一样,但项目正在进行使用的是doing而非todo。

    本插件重度使用了$:/plugins/nico/projectify原有的内容,包括样式和代码等内容。但也做了同样多的修改,所以作为新插件发行。目前可以正常使用,但可能存在问题,欢迎反馈。后续会继续跟进和更新的。


  • 复杂筛选器变量传递问题
    机杼机 机杼
    [tmo[Project]tmo_projectState[doing]] :filter[all[tiddlers]subfilter{!!tmo_projectFilter}tmo_taskState[todo]count[]!match[0]]
    

    论坛那边给出的解决方案。


  • 复杂筛选器变量传递问题
    机杼机 机杼

    我在英文论坛那边也发了,但都没有实质性的进展。也不知道是不是他们没理解。唉。这里我也发一遍,看看有没有大佬能帮忙解决。

    我有一些条目是项目条目。其具有一个tmo_projectFilter字段,值通常是[tag<currentTiddler>],这个字段是可以让用户修改的。比如他可能希望在一个项目中包含来自两个项目的任务。然后任务条目具有一个字段tmo_taskState,值可以分成两类,一类是todo,一类不是todo。

    如果一个项目条目,tmo_projectFilter中的筛选结果里,没有tmo_taskState为todo的条目,那么这是一个空的项目。

    筛选wiki所有条目,如果全都是空的项目,那么会展示一个模板。如果有一个不是空的项目,那么展示这个项目为链接形式。

    当然这只是一简化的讨论,但问题是一样的。里面需要用到subfilter筛选器,但关键是如何对tmo_projectFilter值进行引用。这可能需要目前还在PR当中的,单个变量包含多值。下面是仓库和可以在线测试的网址。代码在src/taskhub文件夹中。

    • https://dongrentianyu.github.io/timefortask/
    • https://github.com/dongrentianyu/timefortask

  • 如何将纪元时间戳转换回 TW 默认格式
    机杼机 机杼

    @马萨伊尔 好的,原来是在1楼那里改的嘛,谢谢了。


  • 如何将纪元时间戳转换回 TW 默认格式
    机杼机 机杼

    @linonetwo

    论坛不能改标题吗?我想改成如何将纪元时间戳转换回 TW 默认格式,这样更有针对性。


  • 如何将纪元时间戳转换回 TW 默认格式
    机杼机 机杼

    如何将纪元时间戳转换回 TW 默认格式

    我去查了一下论坛,发现早就有讨论过。而当时的pr也已经包含在最新版本中了。那么转换就有可能实现。而这个实现也确实比较不那么TiddlyWiki。代码如下。

    <$let today=<<now "YYYY-0MM-0DD">> 
    	format="[UTC]YYYY-0MM-0DD"
    	oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}}
    	tmoTime={{{ [{!!test}search-replace:g[-],[]format:relativedate[]] }}}
    	nowts=<<now "TIMESTAMP">>
    	aaa={{{ [<nowts>format:timestamp[]] }}}
    	yesterday={{{ [<nowts>subtract<oneday>format:timestamp[]] }}}
    	tomorrow={{{ [<nowts>add<oneday>format:timestamp[]] }}}
    	>
    
    * 现在时间:<$text text={{{ [<aaa>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} />
    * 昨天时间:<$text text={{{ [<yesterday>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} />
    * 明天时间:<$text text={{{ [<tomorrow>format:date[YYYY-0MM-0DD 0hh: 0mm]] }}} />
    
    # <<nowts>>
    # 昨天时间 <<yesterday>>
    # 明天时间 <<tomorrow>>
    
    </$let>
    
    

    有几个关键要点

    • now宏竟然能传入TIMESTAMP,这个参数文档里没写
      • 你是怎么发现的,因为我以前也没遇到过
    • 其次转换后timestamp,不需要进行额外处理,因为额外的处理可能会导致不生效
    • 最后需要再把纪元时间戳转换成TiddlyWiki的时间格式
      • 这里可根据需要改变呈现的形式。

  • 如何将纪元时间戳转换回 TW 默认格式
    机杼机 机杼

    fea6e6a5-7b3a-4303-bb7f-6db396ca0e0c-image.png

    没有成功。

    这里的问题在于,我们用timestamp转换后的实际数据是1750443974491 ,而这个数据也确实可以转换成日期格式。可以用下面网址查看。

    EpochConverter

    但TiddlyWiki的存储时间格式是[UTC]YYYY0MM0DD0hh0mm0ss0XXX,也就是像20250621182614444这样的数据。

    目前没有提供一个函数,或者筛选器,或者宏之类的工具,可以把前者转换成后者。上面用js写的代码应该做了处理。


  • 如何将纪元时间戳转换回 TW 默认格式
    机杼机 机杼

    我最近在制作一个插件,我使用了一个字段tmo_dueDate,值为2025-06-19,格式一类的。但现在有一个问题,我想要根据这个字段值判断与当前日期的时间,如果是今天则展示为今天,如果是明天则提示成明天,如果是两个月后则显示为两个月后。

    因为TiddlyWiki是按YYYY0MM0DD0hh0mm0ss0XXX的形式处理字符串的。社区目前有两个插件,一个是Date Picker plugin,一个是根据Projectify改编而来的Pikaday。两者都是基于pikaday库。前者功能强大,但年代久远,是好几年前的插件了。后者比较新,且kookma应该会一直维护。但后者也不好调整,只能限定字段为due,且存储的值也是一长串数字,类似于created一长串的值。因而我也不想采用。

    因而大胡子搞了一个小工具可以进行转换。

    TiddlyTools/Time/ParseDate

    虽然也是两三年前的代码了,但我测试后可以在5.3.6版本中使用。

    将上面的代码导入wiki后,要刷新一下加载js文件。

    新建一个条目,名称随意,新建一个字段test,值为2025-06-19格式的。并把下面的代码放在正文中。

    <$let today=<<now "YYYY-0MM-0DD">> format="[UTC]YYYY-0MM-0DD"
         oneday={{{ [[24]multiply[60]multiply[60]multiply[1000]] }}}
      yesterday={{{ [<today>parsedate[unixtime]subtract<oneday>parsedate:unixtime<format>] }}}
       tomorrow={{{ [<today>parsedate[unixtime]add<oneday>parsedate:unixtime<format>] }}}
    	 tmoTime={{{ [{!!test}parsedate[YYYY0MM0DD0hh0mm0ss0XXX]format:relativedate[YYYY-0MM-0DD]] }}}>
    
    <<yesterday>>
    
    <<tomorrow>>
    
    <%if [{!!test}match<yesterday>] %>
      昨天
    <%elseif [{!!test}match<tomorrow>] %>
    明天
    <%elseif [{!!test}match<today>] %>
      今天
    <%else%>
      <$text text=<<tmoTime>> />
    <%endif%>
    </$let>
    

    可以看到,上面的条件判断可以分析出是今天,还是明天还是什么时候。

    这非常方便,因为我们可以做更多的样式处理。


  • 如何自学/简单理解 tiddlywiki 主要基本功能?如何用官方文档自学?
    机杼机 机杼

    想要掌握更复杂的wikitext用法,可以研究研究官方核心里的系统条目和其他插件中的条目。可以看到他们是如何用wikitext构建一个组件的。会怎么使用list微件,又如何使用定义的变量。


  • 快速编辑标签字段组件
    机杼机 机杼

    346400d8-f496-4e04-bd6f-5066cf38fbab-image.png

    517ddba2-58af-4c65-8d13-ee4065a8b6db-image.png

    组合一下就可以变成其他笔记软件中常见的编辑字段方式了。


    组合的方式有机会直播的时候说一下吧。搞懂了就也很简单,两个方向,一个是通过页面上的按钮控制展示,展示编辑方式。另一个则是对编辑字段模板进行处理。


  • 快速编辑标签字段组件
    机杼机 机杼

    新建一个条目,名称任意,加上标签$:/tags/Macro ,把下面的内容放进去。

    \whitespace trim
    
    \procedure lingo-base() $:/language/EditTemplate/
    
    \procedure tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:"tags",tid)
    <$wikify name="foregroundColor"
    	text="""<$transclude $variable="contrastcolour"
    		target=<<colour>>
    		fallbackTarget=<<fallbackTarget>>
    		colourA=<<colourA>>
    		colourB=<<colourB>>/>
    	"""
    >
    	<$let backgroundColor=<<colour>> >
    		<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
    			data-tag-title=<<currentTiddler>>
    			style.color=<<foregroundColor>>
    			style.fill=<<foregroundColor>>
    			style.background-color=<<backgroundColor>>
    		>
    			<$transclude tiddler=<<icon>>/>
    			<$view field="title" format="text"/>
    			<$button class="tc-btn-invisible tc-remove-tag-button"
    				style.fill=<<foregroundColor>>
    			>
    				<$action-listops $tiddler=<<tid>> $field=<<tagField>> $subfilter="-[{!!title}]"/>
    				{{$:/core/images/close-button}}
    			</$button>
    		</span>
    	</$let>
    </$wikify>
    \end
    
    \procedure tag-body(colour,palette,icon,tagField:"tags",tid)
    <$transclude $variable="tag-body-inner"
    	colour=`$(colour)$`
    	colourA={{{ [<palette>getindex[foreground]] }}}
    	colourB={{{ [<palette>getindex[background]] }}}
    	fallbackTarget={{{ [<palette>getindex[tag-background]] }}}
    	icon=<<icon>>
    	tagField=<<tagField>>
    	tid=<<tid>>
    />
    \end
    
    \procedure edit-tags-template-x(tagField:"tags",tagListFilter,tid)
    <div class="tc-edit-tags" >
    	<$list filter="[<tid>get<tagField>enlist-input[]sort[title]]" storyview="pop">
    		<$transclude $variable="tag-body"
    			colour={{{ [<tid>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}
    			palette={{$:/palette}}
    			icon={{{ [<tid>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}
    			tagField=<<tagField>>
    			tagListFilter=<<tagListFilter>>
    			tid=<<tid>>
    		/>
    	</$list>
    	<$let tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes">
    		<$transclude $variable="tag-picker" tagField=<<tagField>> tagListFilter=<<tagListFilter>> tiddler=<<tid>> />
    	</$let>
    </div>
    \end
    

    然后你就得到了一个可以随时调用编辑字段的组件了。使用方式如下。

    <$transclude
    $variable="edit-tags-template-x"
    tagField="123"
    tagListFilter="[has[cluster]get[cluster]unique[]enlist-input[]unique[]]"
    tid="0023"/>
    

    修改0023这个条目的123字段,列表展示出来的内容是cluster字段的相关值。如下图所示。

    28eca76a-8b1d-44b3-adb9-c62636afdcd3-image.png

    3b972a26-f361-41b0-8789-cd64063b3d30-image.png

    下面是更详细的说明。

    • 更改来自官方的$:/core/ui/EditTemplate/tags
    • 修改了名称,改为edit-tags-template-x
    • 更新了里面的宏使用方式,使用更现代的<$transclude $variable="" />
    • 增加变量tid,允许更具体控制要修改的条目
    • tagField表示要修改的字段,默认是tags标签
    • tagListFilter则是下方列表内容,可以手动设置
    • 上述是一个常见的示例,比如选择具有cluster字段的值
    • 目前存在的问题有,编辑框内容无法修改
      • 这是由底层的tag-picker宏控制的,修改起来很麻烦

    使用用途应该很广泛,只要涉及到增加和修改属性,都可以用这个组件。且更适合用于需要存储多个类别的情况。

    比如一款游戏,可能有多个类别,如果存储为标签,则很麻烦,因为可能造成标签失去控制。但存储在字段中,编辑起来又不方便,而用这个组件可以很好地解决。常用的也可以处理成编辑字段模板,如下图。

    e05c59dc-8f0c-4f45-9c9a-0736a88ffa8b-image.png

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
Powered by NodeBB Contributors
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 太微中文教程
  • 新插件投票看板