[js] 属性引用:彻底解决引用丢失问题

简介

在论坛经常看到“未找到 ID 为 [2025xxxxxxxxxxxx-xxxxxxx] 的内容块”,这样的问题。

究其原因,是因为思源的引用通过块 id 实现,但由于剪切等操作会导致块 id 改变,很容易在用户不知情的情况下,导致块 id 丢失,从而引起引用链接失效。

有没有办法解决这个问题呢?

本人设计了一套解决方案,原理如下:

  1. 当插入引用链接时,自动给引用链接和被引用的块添加 custom-id 属性,这个属性以后都不会变。
  2. 当被引用的块 id 被改变后,通过引用链接的 custom-id 属性获取被引用的块,并修正引用链接的 id 为新块的 id。
  3. 当有多个块具有相同的 custom-id 属性时(比如复制导致),自动弹出选项对话框,让用户选择引用哪个块,用户选择后更新引用链接的 id 为用户选择块的 id。
  4. 在情况 3 时,如果你不小心选错了要引用的块,也不要紧,只需要在引用链接上 ctrl+ 点击,会再次弹出选项对话框,可以再次选择。

详情可参考 issue Issue #15236 · siyuan-note/siyuan

思源 v3.2.1 之前版本不能使用思源的右键粘贴,必须 ctrl+v 粘贴才行(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。

思源 v3.2.1 之前版本不支持手机版(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。

不知是否还有潜在问题,如果有大佬能发现敬请告知。十分感谢!

以上仅抛砖引玉,如果你有更好的方案,请不吝赐教!十分感谢!

如果你支持该方案,请前往投票 属性引用:彻底解决引用丢失问题,方案可行性探讨和投票 十分感谢!

关联帖子

未找到 id 为 xxxx 的内容块 v3.2.0

内容块连接丢失

演示

如何使用?

和之前一样,正常使用即可。

比如,右键菜单中复制为块引用,[[搜索,模板添加等。

image.png

image.png

常见问题

如何插入引用链接?

和之前一样,正常操作即可,比如,右键菜单中复制为块引用,[[搜索,模板添加等。

通过 custom-id 找到新块的 id 后,引用链接的文本会更新吗?

动态引用会更新,静态引用不会更新。

安装代码前的旧引用链接也能有效避免引用丢失问题吗?

不能,仅对新插入的引用链接有效。

如果我卸载了这个代码片段,对文档有影响吗?

没有,只是块属性中多了一个自定义属性而已。

卸载后,再次安装,对文档有影响吗?

没有影响,安装后带有自定义属性的链接,当访问时,可以自动恢复块引用(已删除的块除外)。那些在未安装期间未带有 custom-id 且失效的块无法恢复。

已删除的块,能恢复引用吗?

不能,如果已删除的块被恢复后可以。

custom-id 是如何生成的?会不会重复?

默认取出自被引用块的 id,仅第一次引用时添加,不会重复。

如果多个人链接引用同一个块,会怎样?

没有影响,这两个链接共用同一个 custom-id(即任何时候被引用块始终只有一个 custom-id,从第一次创建后就不再改变)。

有没有办法实现,未安装代码前的引用块也能支持 custom-id,从而避免引用块丢失问题

可以,只需要用下面的 SQL,筛选出所有未添加 custom-id 属性的被引用块和引用链接所在块,然后给块和引用链接分别加上 custom-id 属性即可。

筛选未添加 custom-id 的被引用块

SELECT *
FROM blocks
WHERE id IN (
    SELECT def_block_id
    FROM refs
    WHERE block_id NOT IN (
        SELECT id
        FROM blocks
        WHERE markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
           OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
    )
);

筛选未添加 custom-id 的引用链接所在块

SELECT *
FROM blocks
WHERE (
    (markdown LIKE '%((% ''%''))%' 
     OR markdown LIKE '%((% "%"))%')
)
AND id NOT IN (
    SELECT id
    FROM blocks
    WHERE markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
       OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
);

能否查看文档中所有设置了 custom-id 的块和引用链接?

可以,可以通过书签 + 插件,然后用以下 SQL 汇总即可。

-- 带有custom-id属性的块和引用链接
SELECT * 
FROM blocks 
WHERE ial LIKE '%{:%custom-id="%"%}'
   OR markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
   OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
ORDER BY created DESC 
LIMIT 500;

支持手机版吗?

思源 v3.2.1 之前版本不支持(建议升级到 v3.2.1+ 使用)。原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。

为什么思源右键粘贴的块不起作用?

思源 v3.2.1 之前版本不能使用思源的右键粘贴,必须 ctrl+v 粘贴才行(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。

打赏作者

image.png

声明

免责声明: 本方案尚处于实验阶段,仅供学习和参考,请充分测试后谨慎使用,使用过程中造成的任何问题,作者不承担任何责任。

版权声明: 如需转载、翻译、演绎或二次开发请保留作者信息及原文链接。未经许可,不得用于商业用途。

最终解释权归作者所有。

代码

👇 打赏后可见(为什么要打赏后可见?主要想通过这种方式统计使用人数及用户需求,以帮助作者分析哪些功能是用户最需要的)

打赏 30 积分后可见
30 积分 • 24 打赏
  • 思源笔记

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

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

    28446 引用 • 119783 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    285 引用 • 1986 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
wilsons
正式入驻知乎了,以后新贴主要在这里。 欢迎大家订阅关注! 你的关注对我是莫大鼓励,也能让我持续产出优质内容,我们一起成长 🙏 点这里立即关注:https://www.zhihu.com/people/wilsonses