跳转至内容
  • 最新
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
  • 太微中文教程
  • 新插件投票看板
皮肤
  • 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

太微中文论坛

  1. 首页信息流
  2. 版块
  3. 讨论
  4. 复杂筛选器变量传递问题

复杂筛选器变量传递问题

已定时 已固定 已锁定 已移动 已解决 讨论
5 帖子 2 发布者 26 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 机杼机 离线
    机杼机 离线
    机杼
    编写 最后由 编辑
    #1

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

    我有一些条目是项目条目。其具有一个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
    1 条回复 最后回复
    0
    • 机杼机 离线
      机杼机 离线
      机杼
      编写 最后由 编辑
      #2
      [tmo[Project]tmo_projectState[doing]] :filter[all[tiddlers]subfilter{!!tmo_projectFilter}tmo_taskState[todo]count[]!match[0]]
      

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

      1 条回复 最后回复
      0
      • ,马萨伊尔马 马萨伊尔 将这个主题转为问答主题
      • ,马萨伊尔马 马萨伊尔 将这个主题标记为已解决
      • W 离线
        W 离线
        w6iyes
        编写 最后由 编辑
        #3

        分享一下解决思路。
        问题是一个复杂的筛选器表达式的结果是错误的。
        解决思路是一步步拆解复杂的筛选器表达式,在高级搜索的筛选页签里面测试,看看中间结果,看看是哪个环节出了问题。在这个问题中,把:filter换成:map就能看到中间结果。

        机杼机 1 条回复 最后回复
        0
        • 机杼机 离线
          机杼机 离线
          机杼
          回复了w6iyes 最后由 编辑
          #4

          @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>
          
          1 条回复 最后回复
          0
          • 机杼机 离线
            机杼机 离线
            机杼
            编写 最后由 编辑
            #5

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

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

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

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

            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

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