目的
导入内容后再次进行自定义格式化
具体需求
- 通过 api 对特定块 id 执行合并、取消超级块的操作
- 转换某个块类型为其他块
我想在思源中对已导入和即将导入的 obsidian md 文件进行二次格式化,以满足特定需要:在思源中对 obsidian 风味的 md 语法以及插件的私有语法的还原。
例如 callout,约等于指定 css 的超级块。导入思源后是引用块,我希望通过 api 转换引用块为段落块,然后合并为超级块。
导入内容后再次进行自定义格式化
我想在思源中对已导入和即将导入的 obsidian md 文件进行二次格式化,以满足特定需要:在思源中对 obsidian 风味的 md 语法以及插件的私有语法的还原。
例如 callout,约等于指定 css 的超级块。导入思源后是引用块,我希望通过 api 转换引用块为段落块,然后合并为超级块。
没有一个 api 可以实现简单的参数传递就能实现一个块转换为另一个块的,因为每种块的格式不同。
需要多个 api 去配合实现,可以通过开发者工具里的网络进行抓包,然后进行想要的操作,看看思源是通过哪些 api 去实现的,然后模仿即可。
- 通过 api 对特定块 id 执行合并、取消超级块的操作
根据网络抓包可知,合并为超级块,则是插入一个超级块,然后删除原来的块来实现的,实际上是一个插入块 api,多个删除块 api;取消超级块则是移动超级块子块,然后删除超级块实现的,实际上是移动多个块 api 和删除一个块 api 来实现的。
- 转换某个块类型为其他块
如楼上所说是通过 updateBlock
来实现的,但要自己组装不同类型的块 dom 数据或者用 Markdown 调用 lute 转换为块 dom。建议先手动输入一个目标块,然后复制目标块 dom,然后填入相应的数据后调用更新块 api 更新即可。
总之,没有简单的实现方式,需要多个 api 组合实现。
感谢解惑,但是现在主要是如何找到这些块让我烦恼了,我去看了下 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"
}
怎样实现要看你具体需求。
我这里说的是通过 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 中搜索使用示例。
QQ 已加。
看不懂没关系,既然有接口肯定得被使用,1 可以在 github 搜索使用的例子,2 可以通过控制台-> 网络抓包查看。
如下图,通过抓包可知,超级块就是一个普通的块,只不过数据类型是 NodeSuperBlock 而已。
去掉参数类型,把常量 Constants.ZWSP 换成 \u200b
即可。
提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。
为成为自由职业者在家办公而努力吧!
我来 wolai:不仅仅是未来的云端笔记!
H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。
链滴是一个记录生活的地方。
记录生活,连接点滴
哪里都缺人,哪里都不缺人。
WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。
Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。
各种网址链接、内容导航。
OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
一些有用的避坑指南。
你比 99% 的人都优秀么?
你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!
Thank God It's Friday! 感谢老天,总算到星期五啦!
FlowUs.息流 个人及团队的新一代生产力工具。
让复杂的信息管理更轻松、自由、充满创意。
正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。
i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。
Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。
Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。
Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。
Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。
Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。
上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)