思源笔记丨写了一个插件,用块引实现脚注和备注

Github:Achuan-2/siyuan-plugin-blockref-footnote: 用块引实现脚注备注

✨ 功能

使用思源的块引实现脚注和备注功能

使用 Tsundoku 主题演示,对嵌套引述块样式进行了优化

📝 使用介绍

插件需要思源笔记版本 >3.1.12

本插件支持高度自定义化,支持的设置如下:

  • 脚注存放位置:可以设置存放在当前文档或者指定文档,默认为 当前文档

  • 选中文本的样式:可以为选中文本添加加粗、高亮、斜体、下划线样式,默认:无样式

  • 插入脚注的顺序:顺序或者倒序,默认:顺序

  • 脚注标题:设置存放脚注的标题名,默认:脚注

  • 脚注块引锚文本:设置脚注引用的锚文本,默认:

  • 脚注内容模板:设置脚注的模板,推荐使用引述块或超级块组合,保证脚注内容属于同一个块。 ${selection} 表示选中文本的内容,${content} 代表脚注内容占位

    • 嵌套引述块模板

      >> ${selection}
      >> 
      > 💡${content}
      
    • 竖向超级块组合模板

      {{{row
      > ${selection}
      
      ${content}
      }}}
      

支持同时删除脚注引用和脚注内容,可以在脚注引用右键菜单,点击【插件-删除脚注】

🙏 致谢

❤️ 用爱发电

穷苦研究生在读ing,如果喜欢我的插件,欢迎给 GitHub 仓库点 star 和捐赠,这会激励我继续完善此插件和开发新插件。

  • 思源笔记

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

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

    22378 引用 • 89573 回帖
2 操作
Achuan-2 在 2024-11-20 12:33:30 更新了该帖
Achuan-2 在 2024-11-19 12:49:35 更新了该帖

相关帖子

优质回帖
  • Achuan-2 2 1 赞同

    @participants

    v1.0.6 / 2024.11.20

    • ✨ 脚注内容模板新增 ${refID},代表选中文本所在的块 ID,现在可以通过模板插入选中文本所在的块链接了,方便在脚注内容里直接跳转到原来的块
      {{{row
      > ${selection} [[↩️]](siyuan://blocks/${refID})
      
      ${content}
      }}}
      {: style="border: 2px dashed var(--b3-border-color);"}
      

    思源笔记脚注插件支持直接跳转到原来的块.gif

  • Achuan-2 1 1 赞同

    要用思源笔记 3.1.12dev 版本

    插件添加工具栏的 api 有变动,我用了最新的 api,不适配旧版本

  • Achuan-2 1 1 赞同

    @participants

    插件更新 v1.0.5 / 2024.11.20

    • ✨ 支持设置脚注块引为块超链接
    • ✨ 支持设置脚注放在子文档

    PixPin20241120212520.png

欢迎来到这里!

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

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

    v1.1.1 / 2024.11.24 @@participants

    • ✨ 添加脚注引用的 css 样式
    • ✨ 脚注块引的自定义属性值改为脚注内容块 id custom-footnote="20241124013624-9oq7jfl",方便删除脚注内容块和为后面的脚注数字编号功能做准备
    • ✨ 选中文本的样式设置,取消加粗、高亮等原生样式,改用自定义样式。注意:所以如果有对重叠文字重复添加脚注的需求,请不要开启自定义样式,会有样式冲突问题。
  • 其他回帖
  • Achuan-2

    把有脚注的文档导出为模板(即 kramdown 格式),写了个 js 可以把这个模板内容变为脚注数字编号,不过目前由于这个原因,/api/block/getBlockKramdown 支持导出 span 元素样式 · Issue #13183 · siyuan-note/siyuan 还得之后再集成到插件功能里去

    转化前

    PixPin20241118200658.png

    转化后

    PixPin20241118200646.png

    function processkramdown(kramdownText) {
        // 使用正则表达式匹配所有的脚注块引,不考虑data-subtype和span的文本内容
        const footnoteRegex = /<span data-type="block-ref sup"[^>]*data-id="([^"]+)"[^>]*>[^<]*<\/span>{: style="--memo: 1"}/g;
        let match;
        const ids = [];
      
        // 提取所有的data-id并记录第一次出现的顺序
        while ((match = footnoteRegex.exec(kramdownText)) !== null) {
            const id = match[1];
            if (!ids.includes(id)) {
                ids.push(id);
            }
        }
    
        // 更新脚注块引中的内容为对应的序号,并修改data-subtype为"d"
        let processedkramdown = kramdownText.replace(footnoteRegex, (match, id) => {
            const index = ids.indexOf(id) + 1; // 获取序号
            return `<span data-type="block-ref sup" data-subtype="d" data-id="${id}">${index}</span>{: style="--memo: 1"}`;
        });
    
        // 更新被引用的块的命名
        ids.forEach((id, index) => {
            const blockRegex = new RegExp(`({: id="${id}"[^}]*)}`, 'g');
            processedkramdown = processedkramdown.replace(blockRegex, `$1 name="${index + 1}"}`);
        });
    
        return processedkramdown;
    }
    
    // 导出为模板的内容
    const kramdownText = `
    ...
    `;
    
    // 处理Markdown文本
    const processedkramdown = processkramdown(kramdownText);
    console.log(processedkramdown);
    
    
  • Achuan-2 1 1 赞同

    第二点已经做了,见 v1.0.6 更新,用 refID 变量结合思源块超链接放到模板里,就可以在生成的脚注内容绑定原始的块

    第一点暂时不考虑,因为初衷就是做脚注,不是做划词评论插件,用块引当划词评论会让划线的文字格式消掉(思源的块引不支持富文本),也不方便多次注释,我是不喜欢的,另外现在的脚注块引也能和常规的块引区别开。思源增强插件也做了划词评论,用反链来做,可以保留划线文字格式(虽然要付费),就暂时不考虑做这个了

    1 回复
  • syuer9528

    叠甲:以下仅作为备注相关功能设计的讨论,非 feature request。

    点击“备注”按钮后,自动指定文档名这个功能要考虑的情况太多了,我目前想到的一些情况,想想都头大哈哈:

    脚注 、备注、读后感(这个相当于一种需要区别对待的特殊引用,和一般的脚注、备注有很本质的区别),不应被它的表现形式也是“引用”(或链接)所迷惑。

    当指定文档时:指定到哪个笔记本?如果要手动了怎么办?有的自动有的手动怎么办?那么就是不是需要在文档属性中指定一个自定义字段用于:处理脚注的一些细节、用于星图过滤……如果原文档中已经有了备注怎么办?需要不需要把已有的移到指定的文档中?怎么移动?

    如果是固定的一个文档,为什么要由它来统一管理所有的备注?

    所以是不是要指定的其实是一个笔记本?

    备注是不是可以涵盖浮评(COMMENT)功能?要不要显示回复时间?要不要用递归的大纲呈现回复关系(类似“回复盖楼”功能)?(这个是不是属于协作功能方面的设计了……目前设计这个笔记软件并不多)

    然后是细节:

    原文中的锚是不是应该是被引用文本?而不是那个角标?或者两者是可选?

    然后就是原文和备注之间应该是“链接”,然后备注到原文也是一个链接。其实就是手动建立非“引用”的两个链接,两个对接的锚。相当于手动添加两个链接,一个是原文指向备注,另一个是备注指向原文。

    仅作技术层面的交流探讨,感谢楼主辛勤制作的插件。

    2 操作
    syuer9528 在 2024-11-20 14:39:32 更新了该回帖
    syuer9528 在 2024-11-20 14:39:03 更新了该回帖
  • 查看全部回帖
Achuan-2
给时间以生命而不是给生命以时间,如果你喜欢我的分享,欢迎给我买杯咖啡 https://www.yuque.com/achuan-2 上海