请教有没有转换块类型的公开 API?

目的

导入内容后再次进行自定义格式化

具体需求

  1. 通过 api 对特定块 id 执行合并、取消超级块的操作
  2. 转换某个块类型为其他块

我想在思源中对已导入和即将导入的 obsidian md 文件进行二次格式化,以满足特定需要:在思源中对 obsidian 风味的 md 语法以及插件的私有语法的还原。

例如 callout,约等于指定 css 的超级块。导入思源后是引用块,我希望通过 api 转换引用块为段落块,然后合并为超级块。

  • 思源笔记

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

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

    22926 引用 • 92175 回帖 • 1 关注
  • Q&A

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

    8404 引用 • 38298 回帖 • 156 关注

相关帖子

欢迎来到这里!

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

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

    没有一个 api 可以实现简单的参数传递就能实现一个块转换为另一个块的,因为每种块的格式不同。

    需要多个 api 去配合实现,可以通过开发者工具里的网络进行抓包,然后进行想要的操作,看看思源是通过哪些 api 去实现的,然后模仿即可。

    1. 通过 api 对特定块 id 执行合并、取消超级块的操作

    根据网络抓包可知,合并为超级块,则是插入一个超级块,然后删除原来的块来实现的,实际上是一个插入块 api,多个删除块 api;取消超级块则是移动超级块子块,然后删除超级块实现的,实际上是移动多个块 api 和删除一个块 api 来实现的。

    1. 转换某个块类型为其他块

    如楼上所说是通过 updateBlock 来实现的,但要自己组装不同类型的块 dom 数据或者用 Markdown 调用 lute 转换为块 dom。建议先手动输入一个目标块,然后复制目标块 dom,然后填入相应的数据后调用更新块 api 更新即可。

    总之,没有简单的实现方式,需要多个 api 组合实现。

    1 回复
  • 感谢楼上两位大佬的热心回答,我去试试!!

  • liuyz0112

    请问有什么办法获取全文各个 h3 块及其后面的非标题块的办法吗

    1 回复
  • 我想,你是想获取 h3 及其下面可以被 h3 折叠起来的元素吧?如果这样的话,只需要向下遍历 h3 同级的兄弟结点,直到遇到 h1 或 h2 为止。

    如果你想要的是 h3 后面的非标题块的元素,那就向下遍历 h3 同级的兄弟结点,直到遇到标题块为止。

    1 回复
  • liuyz0112

    感谢解惑,但是现在主要是如何找到这些块让我烦恼了,我去看了下 api 文档,没找到如何遍历的方法,是要通过 sql 吗。

    select * from blocks
    where root_id = "{rootID}" and subtype = 'h3';
    

    查找 h3 块我知道可以用 sql 的方法,但是如何查找 h3 下面的块我就不知道了,我没有找到如何查找子块的方法。h3 查询到的信息里面,我只找到了 parent_id。

    {
      "alias": "",
      "box": "20240709122503-izci9q0",
      "content": "税收法律关系",
      "created": "20241109134252",
      "fcontent": "",
      "hash": "a9de36a",
      "hpath": "/税法/1 税法总则",
      "ial": "{: custom-riff-decks=\"20230218211946-2kw8jgx\" id=\"20241109134252-kxwej5j\" updated=\"20241110000111\"}",
      "id": "20241109134252-kxwej5j",
      "length": 6,
      "markdown": "### <<assets/税法+上册OCR-20241109141248-pd3t00z.pdf/20241109141355-lcdh8bv \"税收法律关系\">>",
      "memo": "",
      "name": "",
      "parent_id": "20241110000110-vt2vkli",
      "path": "/20241109000531-7qk5vun/20241109003338-82wzm2b.sy",
      "root_id": "20241109003338-82wzm2b",
      "sort": 5,
      "subtype": "h3",
      "tag": "",
      "type": "h",
      "updated": "20241110000111"
    }
    
    1 回复
  • 怎样实现要看你具体需求。

    我这里说的是通过 dom 遍历的方法。

    不过如果要用思源 api 可以通过/api/block/getChildBlocks 获取,请求参数:{id:'块 id'},不过获取结果是 markdown 格式,如果转换为 dom 可以使用 Lute 转换。

    如果 SQL 查询,一般获取子块通过 path like '% 块 id%',不过这里从 dom 上看 h3 下的元素和 h3,是兄弟结点,并不是 h3 的子块,所以这里用 path 不行。至于 api 为什么可以,可能是代码中做了特殊查询吧。

    root_id 是块所在文档的 id,不能用 root_id。

    更多 api 可以查看这个路由 https://github.com/siyuan-note/siyuan/blob/master/kernel/api/router.go ,怎么使用可以在 github 中搜索使用示例。

    1 回复
  • liuyz0112

    再次感谢大佬,目前我的想法是

    • 通过 sql 获取当前文档所有 H3 块的 blockID
    • 根据 h3 的 blockID 使用 getChildBlocks 获取其子项的 blockID
    • 在 h3 前插入一个超级块
    • 通过子块 ID 和 h3 的 ID,使用 moveBlock 将其全部移入到超级块内

    目前卡在了插入超级块的地方,insertBlock 看文档没有超级块的说明,api 路由看不懂(原谅我,比较小白 😭 ),请问有什么方法可以做到吗,可以加我 QQ1269367656,奶茶感谢

    1 回复
  • QQ 已加。

    看不懂没关系,既然有接口肯定得被使用,1 可以在 github 搜索使用的例子,2 可以通过控制台-> 网络抓包查看。

    如下图,通过抓包可知,超级块就是一个普通的块,只不过数据类型是 NodeSuperBlock 而已。

    创建方法可以参考:https://github.com/siyuan-note/siyuan/blob/487c48427ae8e3b840d209047cc316273c7a3931/app/src/block/util.ts#L68

    去掉参数类型,把常量 Constants.ZWSP 换成 \u200b 即可。

    image.png

请输入回帖内容 ...

推荐标签 标签

  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 282 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 3 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 53 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 652 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 685 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 537 关注
  • 资讯

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

    55 引用 • 85 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 74 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 529 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 780 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    29 引用 • 96 回帖
  • sts
    2 引用 • 2 回帖 • 196 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 102 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Q&A

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

    8404 引用 • 38297 回帖 • 156 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖
  • JavaScript

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

    728 引用 • 1273 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 611 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 251 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖