【模板分享】如何汇总文档中所有包含加粗 | 高亮 | 颜色文字的内容块

本贴最后更新于 1171 天前,其中的信息可能已经水流花落

搜索本文档加粗、高亮以及有颜色,对我来说,还是一个高频的需求,看了下目前的模板集市里,并没有这方面的分享,于是厚着脸皮又来分享了,哈哈哈。欢迎各位大佬觉得模板有待优化的,提出宝贵建议

开门见山

又修改了下模板,后面的啰嗦部分就不改了,有需要的同学可以看看借鉴下吧

下面直接开门见山

查找加粗

.action{$keywords := "**%**"}

.action{.title}文档内加粗汇总
包含加粗文字的段落汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%.action{$keywords}%' AND  (type = 'p' AND parent_id not in (SELECT id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type = 'i') )  OR (type = 'i' AND id in (SELECT parent_id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type ='p' AND markdown LIKE '%.action{$keywords}%' )) ORDER BY created}}

单独以块引展示包含加粗文字的的标题
.action{$block:= (queryBlocks "SELECT * FROM blocks WHERE type= 'h' AND path LIKE '%/?.sy' AND markdown LIKE '%?%' ORDER BY created " .id $keywords)}

.action{range $v:=$block} 
- ((.action{$v.ID} ".action{$v.Content}")) 
.action{end}

📎contain_bold_font.md

查找高亮

.action{$keywords := "==%=="}

.action{.title}文档内高亮文字汇总
包含高亮文字的段落汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%.action{$keywords}%' AND  (type = 'p' AND parent_id not in (SELECT id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type = 'i') )  OR (type = 'i' AND id in (SELECT parent_id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type ='p' AND markdown LIKE '%.action{$keywords}%' )) ORDER BY created}}

单独以块引展示包含高亮文字的的标题
.action{$block:= (queryBlocks "SELECT * FROM blocks WHERE type= 'h' AND path LIKE '%/?.sy' AND markdown LIKE '%?%' ORDER BY created " .id $keywords)}

.action{range $v:=$block} 
- ((.action{$v.ID} ".action{$v.Content}")) 
.action{end}

📎contain_highlight__font.md

查找绿色文字

.action{$keywords := "var(--b3-font-color4);"}

.action{.title}文档内绿色文字汇总
包含绿色文字的段落汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%.action{$keywords}%' AND  (type = 'p' AND parent_id not in (SELECT id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type = 'i') )  OR (type = 'i' AND id in (SELECT parent_id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type ='p' AND markdown LIKE '%.action{$keywords}%' )) ORDER BY created}}

单独以块引展示包含绿色文字的的标题
.action{$block:= (queryBlocks "SELECT * FROM blocks WHERE type= 'h' AND path LIKE '%/?.sy' AND markdown LIKE '%?%' ORDER BY created " .id $keywords)}

.action{range $v:=$block} 
- ((.action{$v.ID} ".action{$v.Content}")) 
.action{end}

📎contain_green_font.md

以纯文本形式展示绿色文字

.action{$keywords := "var(--b3-font-color4)"}


.action{.title}文档内以纯文本形式展示包含绿色文字的段落
.action{$block:= (queryBlocks "SELECT * FROM blocks WHERE path LIKE '%/?.sy' AND markdown LIKE '%?%' AND (type='p' OR type='h') " .id $keywords)}

.action{range $v:=$block} 
.action{$v.Markdown} 
.action{end}

📎display_green_font.md


接下来首先以文档加粗为例,介绍一下我探索的过程,最后会以蓝奏云分享链接的形式分享自己做的模板。

示例文档

1. 列表 1
2. 列表 2
3. **列表 3**

> **引述 1**
>
> 引述 2
>
> 引述 3

段落 1

**段落 2**

段落 3

即查看模板对列表、引用、正文加粗文字的搜索效果

重要的参考资料:0 数据库表1 类型过滤(其路径为思源笔记用户指南/0 请从这里开始/搜索进阶)

先理一下思路,

  1. 查找范围为本文档。我们的需求是查找范围为本文档可不能把其他文档的加粗段落也包含了,让查询固定在本文档内使用 path 字段就可以做到:path LIKE '%/.action{.id}.sy',LIKE 就是 sql 语法里的模糊匹配了,一个 % 代表若干个字,即把文档所在路径前面的字全部匹配,.action{.id} 是思源内置的本文档的 id 变量,这样就不用每次调用文档还要自己手动改 id 了。这样就能只查找本文档的所有内容块了(注意,1.2.5 以后 path 路径为 id 格式路径,hpath 是以文字路径格式。
  2. 查找加粗。加粗的 markdown 语法是 **foo**, 所以我需要得到数据表中包含 markdown 语法的一列,查阅数据库表,可以知道 content 字段是纯文本,而 markdown 则是我们需要的一列,包含完整 Markdown 标记符的文本,还包括 { : style = ...} 这样的 kramdown 内联样式语法(思源里用来给文字加颜色、调整块宽度等样式的语法)。所以选 markdown 字段可以完全符合我们汇总文档中加粗、高亮以及有颜色的文字锻落。使用 markdown LIKE '%**%**%' 便可以查找包含加粗字的内容块了。第一个 % 和最后一个 %,相当于是匹配加粗部分前后的内容,中间的 % 则是匹配加粗的内容。
  3. 汇总的内容不能重复。思源笔记 sql 搜索其实一直有一个不方便的问题,假如搜索内容是列表项的文字的话,则会出现一炮三响的情况,即 p、i、l 三种内容块都会出现一次。所以一开始我的思路是,直接用 type='p'

好,那我们现在先来看看效果吧

代码:

{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%**%**%' AND type ='p'}}

结果:

image.png

emm,好像也还可以,毕竟确实都找出来,其实写到这里我们的需求大致已经得到了解决。

但这种写法最大的问题是丢失了样式信息。列表和引述块里的加粗和普通段落里的加粗在嵌入块里没有任何区别。虽然一般情况下,这种效果也够用,我们能区别开每个查询结果所在的位置,但我还是觉得有点不够。还是希望列表样式能够体现出来。(引述块里的单个段落块要以引述的方式要展示出来好像办不到)

这还能不能改进下呢?

好,再理一下如果要改进的思路

  • 我要体现列表的样式
  • 列表项块也包含普通的 p 内容块,展现 type='i' , 无疑会和我们之前的汇总(只找 p 内容块的)重复
  • 要体现列表和引述块的样式,就得剔除掉我们前面代码查询结果里是位于列表里的有加粗内容的 p 内容块,然后再单独展现所剔除的 p 内容块的父块,即列表项块

下面展示我的解决方法

查找包含加粗内容的段落块并且其父块不为列表项块

  • 父块不为列表项块的解决思路就是先查找文档中列表项块的所有 id,查找段落块的时候保证其 parent_id 不为列表项块的 id。
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%**%**%' AND  (type = 'p' AND parent_id not in (select id from blocks where path LIKE '%/.action{.id}.sy' and type = 'i' ) ) }}

结果:

image.png

查找包含加粗内容的列表项并且不展示其子块

  • 解决思路是先查找所有包含加粗内容的段落块中的父块 id,筛选其中为列表项块的内容块
{{SELECT * FROM blocks WHERE type = 'i' AND id in (select parent_id from blocks where path LIKE '%/.action{.id}.sy' and type ='p' AND markdown LIKE '%**%**%') }}

结果:

image.png

将两者合并就是

contain_bold_font.md

.action{.title}文档内加粗文字汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%**%**%' AND  (type = 'p' AND parent_id not in (SELECT id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type = 'i' ) )  OR (type = 'i' AND id in (SELECT parent_id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type ='p' AND markdown LIKE '%**%**%' )) ORDER BY created}}

ORDER BY created 表示按内容块创建时间排序

结果:

image.png

汇总本文档所有高亮内容块

把代码里的 %**%**% 改为 %==%==% 就好了

contain_highlight__font.md

.action{.title}文档内高亮文字汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%==%==%' AND  (type = 'p' AND parent_id not in (select id from blocks where path LIKE '%/.action{.id}.sy' and type = 'i' ) )  OR (type = 'i' AND id in (select parent_id from blocks where path LIKE '%/.action{.id}.sy' and type ='p' AND markdown LIKE '%==%==%')) ORDER BY created}}

汇总本文档某个颜色内容块

我喜欢把文字改为绿色,绿色代表的样式是 (--b3-font-color4),所以把代码里的 %**%**% 改为 %var(--b3-font-color4);% 就好了

于是代码就为

contain_green_font.md

.action{.title}文档内绿色文字汇总
{{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%var(--b3-font-color4);%' AND  (type = 'p' AND parent_id not in (select id from blocks where path LIKE '%/.action{.id}.sy' and type = 'i' ) )  OR (type = 'i' AND id in (select parent_id from blocks where path LIKE '%/.action{.id}.sy' and type ='p' AND markdown LIKE '%var(--b3-font-color4);%')) ORDER BY created}}

对于其他颜色,在思源笔记里,各字体颜色的样式变量都是 --b3-font-color+ 序号,其序号就是编辑器字体样式中颜色的位置序号,例如蓝色是 (--b3-font-color3),或者打开 <kbd> Ctrk+Shit+I </kbd> 开发者工具,也能确认。
image.png

背景色同理,各字体颜色的样式变量都是 --b3-font- background+ 序号,例如红色背景色则是改为 %var(--b3-font-background1);%

以文字方式展示所有绿色字体段落块

最后,我还有一个需求,习惯用绿色标记所有生词,我希望把这些生词全部以文本而不是块查询方式展示出来,好让我直接注释

这时候,可能包含列表样式就没必要了。所以还是用前面介绍的最简单的方式展示吧。

display_green_font.md

.action{$docid:=.id}
.action{$block:= (queryBlocks "SELECT * FROM blocks WHERE path LIKE '%/?.sy' AND markdown LIKE '%var(--b3-font-color4);%' AND type='p'" $docid )}

.action{range $v:=$block} 
.action{$v.Markdown} 
.action{end}

本文涉及的模板文件地址

汇总文档加粗、高亮、颜色文字.zip

密码:siyuan

😋 我写的思源的介绍软文:https://zhuanlan.zhihu.com/p/399935581
🐎 思源笔记订阅推荐码:B3XX0Y8,在买会员时使用订阅推荐码可增加 500 MB 云端空间和 7 天使用期。送给有需要的朋友,谢谢。
📎 订阅地址直达 :https://ld246.com/subscribe/siyuan

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22379 引用 • 89579 回帖
2 操作
Achuan-2 在 2021-09-09 11:12:53 更新了该帖
Achuan-2 在 2021-09-09 09:38:42 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Achuan-2

    可以试试这个模板,只需要改第一行的 keywords 变量内的“关键词”,就可以查找了,对于标题是用块引方式展现

    .action{$keywords := "关键词"}
    
    .action{.title}文档内包含关键词(.action{$keywords})的段落文字汇总
    {{SELECT * FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND markdown LIKE '%.action{$keywords}%' AND  (type = 'p' AND parent_id not in (SELECT id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type = 'i') )  OR (type = 'i' AND id in (SELECT parent_id FROM blocks WHERE path LIKE '%/.action{.id}.sy' AND type ='p' AND markdown LIKE '%.action{$keywords}%' )) ORDER BY created}}
    
    单独以块引展示包含关键词(.action{$keywords})的标题
    .action{$block:= (queryBlocks "SELECT * FROM blocks WHERE type= 'h' AND path LIKE '%/?.sy' AND markdown LIKE '%?%' ORDER BY created " .id $keywords)}
    
    .action{range $v:=$block} 
    - ((.action{$v.ID} ".action{$v.Content}")) 
    .action{end}
    
    
  • 其他回帖
  • Achuan-2

    Clip20240502230526.png

    1 回复
  • someone69864 2 评论

    试了一下,真的可以呀~感谢!不过有个问题,好像如果这个块不是段落,而是标题的话,就检索不到这个关键词了貌似

    1 回复
    突然意识到我没有汇总标题块,等会改改
    Achuan-2
    不行,思源里在嵌入块里用标题会把标题下的内容块全部展示出来的
    Achuan-2
  • Achuan-2 1

    Clip20240503005456.png

  • 查看全部回帖