概念定义:若块 A 引用了块 B,且块 B 与块 A 不在同一笔记本中,则称这种引用关系为「跨笔记本引用」。
实际影响:
- 当存在跨笔记本引用时,若块 B 所在的笔记本被关闭,块 A 中的引用将无法定位目标块。
- 在归档笔记本前,建议检查是否存在此类跨笔记本引用,以避免关闭笔记本影响其他笔记的正常使用。
代码
核心的代码是那段 SQL 查询。另外这段代码展示了 Table 组件的一些复杂用法,包括:
col
字段中,如何自定义列的名称- 使用
renderer
属性来对查询结果进行预处理(查询结果 -> renderer -> 表格中展示的单元格内容)
//!js
const LIMIT = 32; //查询数量限制,可以自行调整
const CLIP_LEN = 15;
const clip = (str) => {
if (str.length > CLIP_LEN) {
return str.substring(0, CLIP_LEN) + '...';
}
return str;
}
const query = async () => {
let dv = Query.DataView(protyle, item, top);
const sql = `
select
B.id,
B.hpath,
B.root_id,
B.content as 内容,
B.box as 笔记本,
DB.box as 被引笔记本,
substr(DB.content,1,30) as 被引内容
from refs as R
inner join blocks as B on R.block_id = B.id
inner join blocks as DB on R.def_block_id = DB.id
where B.box != DB.box
order by B.updated desc limit ${LIMIT};
`;
const blocks = await Query.sql(sql);
dv.addtable(blocks, {
index: true,
cols: ['内容', '跨笔记本引用', '被引内容', {'hpath': '原始文档'}],
renderer: (b, attr) => {
if (attr === '内容') {
return `[${clip(b[attr])}](siyuan://blocks/${b.id})`;
}
if (attr === '跨笔记本引用') {
const defBox = Query.utils.boxname(b['被引笔记本']);
const refBox = Query.utils.boxname(b['笔记本']);
return `${refBox} -> ${defBox}`;
}
}
});
dv.render();
}
return query();
效果如下:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于