思源现阶段有一个缺点,双链不是动态的,你只能生成已有的文档的双链,而不能获取在将来写的文档的双链,需要用户做一个手动的收集.(可能之后的子页面视图会改变这一状况).而个人感觉上 SQL 查询的样式,在视觉上占地儿太大了.于是尝试通过 SQL 来实现 "双链的"效果.要考虑的点有两个.
- 链接指向的文本,即 SQL 的查询结果
- SQL 嵌入块的样式
因为 SQL 块本身带有打开对应文档的功能,所以需要需要查询出的"文本".最直接,最简单的,就是显示出对应文档的一级标题. 但这版本思源笔记会默认在最顶端显示文件名, 很多情况下我不会去写一级标题,此外当查询标题块的时候,会直接显示该标题下的全部内容,并不适合作为双链来展示. 最佳的查询对象是普通的文本块.
而我自己会在每个文档头生成基础的文档信息, 这些内容全部都是普通的文本块.(在本文开头所展示的内容,我会给他们设置不同的属性),所以我直接根据需求将想要的特定文档信息通过 SQL 查询出来.
每一项的 name 我都设置为了 DocInfo
方便管理,alias 则根据不同的功能设置不同的值.
@Path: /SiYuan/动态双链.sy
我给这个本文块的 alias 设置为 @Path
,而当我想要获取一个文档的双链时,我就会通过 SQL 查询该属性.
SELECT * FROM blocks WHERE box='.action{$docBox}' and name='@Path' and content LIKE '%?%'
其次就是 SQL 嵌入块的样式.我个人不希望一个提示性的链接会侵占太多空间,同时需要我能够方便的点击打开笔记的按钮, 因此通过 CSS 将其设定为,查询语句中有 @Path
时,会直接更改 SQL 的样式 ,且将 iocn 调整为出现在左侧.
示意图
本文仅代表一种思路,并不代表一个优秀的实操方式. 是否能够有一个有实际作用,有效的 SQL 动态链接,取决于每个人的笔记组织方式和个人习惯.
更新
2021 年 8 月 4 日
将两个超级块看上去像是一个文本块. 效果参见开头的图片中的 @Assets
字段,该字段通过 SQL 嵌入块获取该笔记本中的的 Assets 文档(用于统一管理该笔记本所需要用的外部资源)
将嵌入的 SQL 块宽度设置为随内容长度变化. 并且隐藏了 DocInfo 的属性标识.
DynLink 模板专门用于插入 SQL 语句,但是该语句需要换行插入
后续有时间的话会再编写一个模板,专门用于插入动态的双链.格式即为 @Source:{{SQL语句}}
.但由于更改了 CSS 为随着内容长短变化,并且也只是一个两列的超级块, 也仅限需要在 SQL 块前加一些简短的注释的情况下使用.
代码
CSS
/****************************************DocInfo****************************************/
/***************************************************************************************/
/***************************************************************************************/
/*整体的颜色,字体*/
[data-node-id][name="@DocInfo"]{
font-size: 14px!important;
padding:0px!important;
color:#7a8892;
font-style:italic;
}
/*粗体的颜色*/
[data-node-id][name=@DocInfo] Strong{
font-size: 14px!important;
padding:0px!important;
color:#7a8892!important;
font-style:italic;
}
/*去除DocInfo部分的别名和命名的显示*/
[data-node-id][name=\@DocInfo] .protyle-attr{
display: none!important;
}
/*让超级块中的两个块,实现根据内容调整宽度*/
.protyle-wysiwyg [data-node-id][name=\@DocInfo].sb[data-sb-layout="col"]>div{
flex:none!important;
}
/*更改Assert部分的宽度*/
[data-node-id][data-type=NodeSuperBlock][name=DocInfo]+[data-type=NodeSuperBlock].sb[data-sb-layout=row]{
width:fit-content!important;
}
/*Assert和链接之间的间隔*/
[data-node-id][name=\@DocInfo][alias=\@AssetsHead]{
margin-right: 10px;
}
/*调整SQL嵌入块中的图标*/
.protyle-wysiwyg [data-content*=\@DocInfo][data-node-id].render-node[data-type="NodeBlockQueryEmbed"] .protyle-icons{
left:4px;
right:auto;
}
/*sql块的宽度和高度*/
.protyle-wysiwyg [data-content*=\@DocInfo][data-node-id].render-node[data-type="NodeBlockQueryEmbed"]{
padding : 0px!important;
width:fit-content!important;
min-height:fit-content;
}
Templates
DocInfo
.action{/*获取文档的基本信息*/}
.action{$docID:=.id}
.action{$docTitle := .title}
.action{$docBox :=" "}
.action{$docPath := " "}
.action{$docCreated := " "}
.action{$docUpdated := " "}
.action{$getDocInfo := (queryBlocks "SELECT * FROM blocks WHERE id='?' and type='d' " $docID )}
.action{range $v:= $getDocInfo}
.action{$docBox =$v.Box}
.action{$docPath = $v.Path}
.action{$docCreated = toDate "20060102150405" $v.Created | date "2006-01-02"}
.action{$docUpdated = $v.Updated}
.action{end}
.action{/*获取Assets所在的文件*/}
.action{$getAssets := (queryBlocks "SELECT * FROM blocks WHERE box = '?' and type= 'd' and path like '%Assets%' LIMIT -1" $docBox)}
.action{$assetsID:=" "}
.action{range $v:= $getAssets}
.action{$assetsID = $v.ID}
.action{end}
.action{/*DOCPART*/}
---
{: name="@DocInfoBegin" alias=""}
###### 备注:
{: name="@DocInfo" alias=""}
@CreateTime: .action{$docCreated}
{: name="@DocInfo" alias=""}
@Author: Crowds
{: name="@DocInfo" alias=""}
@Type: Assets / Doc / Schedule /Draft
{: name="@DocInfo" alias=""}
{{{col
{{{
@Assets:
{: name="@DocInfo" alias="@AssetsHead"}
}}}
{: name="" alias=""}
{{{
{{SELECT * FROM blocks WHERE box='.action{$docBox}' and name="@DocInfo" and alias='@Path' and content LIKE '%Assets%' }}
}}}
}}}
{: name="@DocInfo" alias="@Assets"}
@Path: .action{$docPath}
{: name="@DocInfo" alias="@Path" style="color:var(--b3-font-color6);!important"}
---
{: name="@DocInfoEnd" alias=""}
DynLink
.action{/*获取文档的基本信息*/}
.action{$docID:=.id}
.action{$docTitle := .title}
.action{$docBox :=" "}
.action{$docPath := " "}
.action{$docCreated := " "}
.action{$docUpdated := " "}
.action{$getDocInfo := (queryBlocks "SELECT * FROM blocks WHERE id='?' and type='d' " $docID )}
.action{range $v:= $getDocInfo}
.action{$docBox =$v.Box}
.action{$docPath = $v.Path}
.action{$docCreated = toDate "20060102150405" $v.Created | date "2006-01-02"}
.action{$docUpdated = $v.Updated}
.action{end}
{{SELECT * FROM blocks WHERE box='.action{$docBox}' and name="@DocInfo" and alias='@Path' and content LIKE '%?%' }}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于