模板: 通过 SQL 实现动态双链 - 链滴 - 图1

思源现阶段有一个缺点, 双链不是动态的, 你只能生成已有的文档的双链, 而不能获取在将来写的文档的双链, 需要用户做一个手动的收集.(可能之后的子页面视图会改变这一状况). 而个人感觉上 SQL 查询的样式, 在视觉上占地儿太大了. 于是尝试通过 SQL 来实现 “双链的” 效果. 要考虑的点有两个.

  • 链接指向的文本, 即 SQL 的查询结果
  • SQL 嵌入块的样式

因为 SQL 块本身带有打开对应文档的功能, 所以需要需要查询出的 “文本”. 最直接, 最简单的, 就是显示出对应文档的一级标题. 但这版本思源笔记会默认在最顶端显示文件名, 很多情况下我不会去写一级标题, 而我自己会在每个文档头生成基础的文档信息 (在本文开头所展示的内容, 我会给他们设置不同的属性), 所以我直接将想要的文档信息通过 SQL 查询出来.

@Path: /SiYuan / 动态双链. sy 我给这个本文块设置了别名为 @Path

  1. SELECT * FROM blocks WHERE box='.action{$docBox}' and name='@Path' and content LIKE '%?%'

其次就是 SQL 嵌入块的样式. 我个人不希望一个提示性的链接会侵占太多空间, 同时需要我能够方便的点击打开笔记的按钮, 因此通过 CSS 将其设定为, 查询语句中有 @Path 时, 会直接更改 SQL 的样式 , 且将 iocn 调整为出现在左侧.

示意图

模板: 通过 SQL 实现动态双链 - 链滴 - 图2

本文仅代表一种思路, 并不代表一个优秀的实操方式. 是否能够有一个有实际作用, 有效的 SQL 动态链接, 取决于每个人的笔记组织方式和个人习惯.

代码

CSS
  1. /*动态双链效果*/
  2. .protyle-wysiwyg [data-content*=\@Path][data-node-id].render-node[data-type="NodeBlockQueryEmbed"] .protyle-icons{
  3. left:4px;
  4. right:auto;
  5. }
  6. .protyle-wysiwyg [data-content*=\@Path][data-node-id].render-node[data-type="NodeBlockQueryEmbed"]{
  7. padding : 0px!important;
  8. max-width:500px!important;
  9. }
  10. /*注意@需要转义符 \@ */
  11. /*DocInfo*/
  12. [data-node-id][name="@DocInfo"]{
  13. font-size: 14px!important;
  14. padding:0px!important;
  15. color:#7a8892!important;
  16. font-style:italic;
  17. }

Templates

DocInfo
  1. .action{/*获取文档的基本信息*/}
  2. .action{$docID:=.id}
  3. .action{$docTitle := .title}
  4. .action{$docBox :=" "}
  5. .action{$docPath := " "}
  6. .action{$docCreated := " "}
  7. .action{$docUpdated := " "}
  8. .action{$getDocInfo := (queryBlocks "SELECT * FROM blocks WHERE id='?' and type='d' " $docID )}
  9. .action{range $v:= $getDocInfo}
  10. .action{$docBox =$v.Box}
  11. .action{$docPath = $v.Path}
  12. .action{$docCreated = toDate "20060102150405" $v.Created | date "2006-01-02"}
  13. .action{$docUpdated = $v.Updated}
  14. .action{end}
  15. .action{$getAssets := (queryBlocks "SELECT * FROM blocks WHERE box = '?' and type= 'd' and path like '%Assets%' LIMIT -1" $docBox)}
  16. .action{$assetsID:=" "}
  17. .action{range $v:= $getAssets}
  18. .action{$assetsID = $v.ID}
  19. .action{end}
  20. .action{/*DOCPART*/}
  21. ---
  22. {: name="@DocInfoBegin" alias=""}
  23. - @CreateTime: .action{$docCreated}
  24. - @Author: Crowds
  25. - @Type: Assets / doc / Schedule
  26. - @Assets: ((.action{$assetsID}))
  27. {: name="@DocInfo" alias=""}
  28. @Path: .action{$docPath}
  29. {: name="@DocInfo" alias="@Path"}
  30. ---
  31. {: name="@DocInfoEnd" alias=""}

DynLink
  1. .action{/*获取文档的基本信息*/}
  2. .action{$docID:=.id}
  3. .action{$docTitle := .title}
  4. .action{$docBox :=" "}
  5. .action{$docPath := " "}
  6. .action{$docCreated := " "}
  7. .action{$docUpdated := " "}
  8. .action{$getDocInfo := (queryBlocks "SELECT * FROM blocks WHERE id='?' and type='d' " $docID )}
  9. .action{range $v:= $getDocInfo}
  10. .action{$docBox =$v.Box}
  11. .action{$docPath = $v.Path}
  12. .action{$docCreated = toDate "20060102150405" $v.Created | date "2006-01-02"}
  13. .action{$docUpdated = $v.Updated}
  14. .action{end}
  15. {{SELECT * FROM blocks WHERE box='.action{$docBox}' and name="@DocInfo" and alias='@Path' and content LIKE '%?%' }}

1 操作

crowds21 在 2021-08-03 21:09:58 更新了该帖
https://ld246.com/article/1627995128443