思源笔记折腾记录 - 标题的连续编号

本贴最后更新于 509 天前,其中的信息可能已经事过境迁

啊 做这个的原因跟思源笔记折腾记录 - 任务列表的序号 - 链滴 (ld246.com)一样,还是为了绕开动态加载时的限制。

效果就像这样

image.png

image.png

首先我们需要获取全部的打开的文档,这里用面包屑来获取:

async function 生成标题序号() {
  let 文档面包屑数组 = document.querySelectorAll(
    ".protyle-breadcrumb__bar span:first-child[data-node-id]"
  );
  文档面包屑数组.forEach((文档面包屑元素) => {
    let 文档id = 文档面包屑元素.getAttribute("data-node-id");
    生成文档内标题序号(文档id);
  });
  setTimeout(生成标题序号, 1000);
}

然后我们通过文档的实际全篇内容,绕开动态加载来计算章节号。

先获取文档内容:

  let 文档内容 = await noobApi.核心api.getDoc({ id: 文档id, size: 102400 });
  let 临时元素 = document.createElement("div");
  临时元素.innerHTML = 文档内容.content;

这里把获取到的内容弄到一个临时元素里,方便直接用 css 选择器来鼓捣。

放心不渲染出来的话好像不怎么占用资源。

然后就是生成标题序号了:

  let 标题元素数组 = 临时元素.querySelectorAll(
    '[data-type="NodeHeading"]:not( [data-type="NodeBlockQueryEmbed"] div)'
  );
  let 计数器 = [0, 0, 0, 0, 0, 0];
  let 上一个标题级别 = 1;
  for (let i = 0; i < 标题元素数组.length; ++i) {
    let 当前标题级别 = parseInt(
      标题元素数组[i].getAttribute("data-subtype").replace("h", "")
    );
    if (当前标题级别 <= 上一个标题级别) {
      for (let j = 0; j < 计数器.length; ++j) {
        if (j + 1 > 当前标题级别) {
          计数器[j] = 0;
        }
      }
    }
    计数器[当前标题级别 - 1] += 1;
    let 标题id = 标题元素数组[i].getAttribute("data-node-id");
  
    上一个标题级别 = 当前标题级别 + 0;
  }
}

最后把这些东西都弄到文档里,就是完整的计数函数了:

async function 生成文档内标题序号(文档id) {
  let 文档内容 = await noobApi.核心api.getDoc({ id: 文档id, size: 102400 });
  let 临时元素 = document.createElement("div");
  临时元素.innerHTML = 文档内容.content;
  let 标题元素数组 = 临时元素.querySelectorAll(
    '[data-type="NodeHeading"]:not( [data-type="NodeBlockQueryEmbed"] div)'
  );
  let 计数器 = [0, 0, 0, 0, 0, 0];
  let 上一个标题级别 = 1;
  for (let i = 0; i < 标题元素数组.length; ++i) {
    let 当前标题级别 = parseInt(
      标题元素数组[i].getAttribute("data-subtype").replace("h", "")
    );
    if (当前标题级别 <= 上一个标题级别) {
      for (let j = 0; j < 计数器.length; ++j) {
        if (j + 1 > 当前标题级别) {
          计数器[j] = 0;
        }
      }
    }
    计数器[当前标题级别 - 1] += 1;
    let 标题id = 标题元素数组[i].getAttribute("data-node-id");
    document
      .querySelectorAll(`.protyle-wysiwyg div[data-node-id='${标题id}']`)
      .forEach((一级标题元素) => {
        一级标题元素
          .querySelector('[contenteditable="true"]')
          .setAttribute(
            "style",
            `--custom-index:"${序号设置.默认设置[当前标题级别 - 1](
              计数器[当前标题级别 - 1]
            )} "`
          );
      });
    document
      .querySelectorAll(`.sy__outline [data-node-id="${标题id}"]`)
      .forEach((大纲项目) => {
        大纲项目.setAttribute(
          "style",
          `--custom-index:"${序号设置.默认设置[当前标题级别 - 1](
            计数器[当前标题级别 - 1]
          )} "`
        );
      });
    上一个标题级别 = 当前标题级别 + 0;
  }
}

还是一样的 不过这回我里面有一个地方因为不想文件太长用到了 noobApi,自己换成对应的接口调用应该就可以了。

  let 文档内容 = await noobApi.核心api.getDoc({ id: 文档id, size: 102400 });

相当于:

  let 响应 = await (
    await fetch("/api/filetree/getDoc", {
      method: "post",
      body: JSON.stringify({
        id: data.data[0].id,
        size: 102400,
      }),
    })
  ).json();
  let  父块内容 = 响应.data.content;

可以自己改一下嗷

其实任务列表序号可以改成用类似的方法生成,不过暂时懒得做了。

还有用属性设置序列样式,也暂时懒得做了。


链接:https://pan.baidu.com/s/12CKtZeJTBOF8vOxd4XooQA?pwd=rb3u
提取码:rb3u
--来自百度网盘超级会员 V5 的分享

整个代码片段的仓库在

leolee9086/snippets (github.com)

就是这样嗷

  • 思源笔记

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

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

    20156 引用 • 77721 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • yinyon

    请问怎样调用呢?我是小白。。。。

  • 其他回帖
  • yjmsiyuan

    先赞为敬!

    最好办法是:在顶栏设置按钮,对当前文档生效即可。

    看那位大侠去完善。

  • 对了 里面有个序号设置 每一个设置是一个数组 从第一项到第六项(我才不说 0 到 5)trollface 分别就是一到六级标题的计算方法,看得懂的话可以改成自己想要的样式。

  • 看不懂,先收藏点赞为敬 ❤️

推荐标签 标签

  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    45 引用 • 25 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7017 引用 • 31715 回帖 • 220 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 130 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 712 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 6 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖 • 123 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 250 关注
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    143 引用 • 3752 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 533 回帖 • 735 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    77 引用 • 159 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 613 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 641 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    54 引用 • 85 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 104 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    483 引用 • 906 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 509 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 3 关注