如何在思源中实现 diff 与合并?

智能画布插件 0.2.0 发布:更加稳定和可用的版本(借着版本发布谈谈当前的开发困境)

我正在开发 Canvas 插件,目前的版本很尴尬,它对文档的编辑操作太不稳定了,原因就是 AI 和思源之间隔了一层块操作。

想来想去,如果要实现 GPT Canvas 和 Cursor 那样的丝滑编辑,就不能让 AI 看到块和操作块的工具,而只是看到文档。

这样就必须准备一个用来 diff 的中间层:

  1. 准备当前文档的全文 md
  2. AI 返回修改内容
  3. 将 AI 返回的内容合并到当前文档的 md 中,得到修改后的全文 md
  4. 将修改后的全文 md 通过某种方式应用到当前文档

前 3 步简单,第 4 步我奋战了 30 小时,我能想到的方法都用遍了,可以说宣告失败了。

于是想请教各位大佬,有没有什么可行的方法能够指点一二?或者有没有什么我不知道的现成的方案?

  • 思源笔记

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

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

    25295 引用 • 104416 回帖
  • Q&A

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

    9662 引用 • 43956 回帖 • 90 关注

相关帖子

被采纳的回答
  • 3000 悬赏啊,那不得不回答一下了。doge

    用纯 MD 做对比,用 kramdown 做修改。(左边 Kdown,右边 MD)。

    基本上属于 MD 一行等于 Kdown 两行(内容行 + 属性行)。逐行对比决定要不要保留就行,只不过具体的 diff 逻辑会有点麻烦,不过可以考虑让 AI 修改时提供具体的修改操作,比如在操作过的行的行首增加[C]、[U]、[D]等标记。

    逐行对比的过程中,遇到 C 就在 kdown 里对应位置插入行,U 替换,D 删除。

    不过对于列表、列表项、超级块等格式倒是需要额外进行处理一下。大思路这样基本上没问题,小思路就得增对

    image.png

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • B3000Kcn 2 评论

    现在又遇到一个问题:

    直接对文档 id updateblock 全文之后,文章即时响应更改。

    但是我发现在这时候,无论在什么地方创建块,在没有刷新前看起来都是正确的位置,但是刷新后就都跑到整个文章的最上面去了。

    在没有刷新的时候,打开集成编辑环境,里面就显示输入的内容已经跑到文章上面去了。

    这个问题是真没辙了,查遍了文档,没找到指定标签页触发刷新的办法 😭

    这算是 bug 吗?要不要提 issue 呢?

    image.png

    image.png

    image.png

    1 回复
    @88250 请问 D 大,这算是 bug 吗 🤣
    B3000Kcn
    能稳定重现就提 issue 录屏演示
    JeffreyChen 1 赞同
  • 其他回帖
  • Wetoria 1 2 评论 via macOS

    kdown:/api/block/getBlockKramdown

    md:/api/export/exportMdContent

    下次自己翻思源的 router.go 文件就好,支持的 api 都在里面了。

    感谢解答 🙏 我看到这个 api 了,但我没想到 getBlockKramdown 填文档 id 就是获取全文 kramdown🤣
    B3000Kcn
    @B3000Kcn 实践出真知。准备个 apiFox,自己试一下就知道了。我也就是这么弄的。
    Wetoria 1
  • update 全文内容,data 里怎么填呢?

    data 里填 markdown 或 kramdown 数据都行或二者的混合,比如你获取的全文是 kramdown,然后让 ai 修改后把结果直接填到 data 里即可。

    新来的 markdown 内容,混杂在 kramdown 里面,能够被接受吗?

    可以,二者可以混合。有 kramdown 扩展属性的会生效,没有的按普通 Markdown 解析。

    1 回复
  • Wetoria 1 2 评论 via macOS

    3000 悬赏啊,那不得不回答一下了。doge

    用纯 MD 做对比,用 kramdown 做修改。(左边 Kdown,右边 MD)。

    基本上属于 MD 一行等于 Kdown 两行(内容行 + 属性行)。逐行对比决定要不要保留就行,只不过具体的 diff 逻辑会有点麻烦,不过可以考虑让 AI 修改时提供具体的修改操作,比如在操作过的行的行首增加[C]、[U]、[D]等标记。

    逐行对比的过程中,遇到 C 就在 kdown 里对应位置插入行,U 替换,D 删除。

    不过对于列表、列表项、超级块等格式倒是需要额外进行处理一下。大思路这样基本上没问题,小思路就得增对

    image.png

    1 回复
    多谢指教 🙏 我去试试
    B3000Kcn
    有钱能使鬼推磨,典型案例 ,哈哈
    EmberSky 1 赞同
  • 查看全部回帖

推荐标签 标签

  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 487 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 1 关注
  • C

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

    86 引用 • 165 回帖 • 3 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注
  • Docker

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

    495 引用 • 930 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 502 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 4 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 3 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 7 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 66 关注
  • Access
    1 引用 • 3 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 616 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 4 关注
  • 小薇

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

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

    35 引用 • 468 回帖 • 761 关注
  • Elasticsearch

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

    117 引用 • 99 回帖 • 205 关注
  • Android

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

    335 引用 • 324 回帖 • 1 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 192 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 111 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1441 引用 • 10069 回帖 • 495 关注
  • 印象笔记
    3 引用 • 16 回帖 • 5 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 8 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • Redis

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

    286 引用 • 248 回帖
  • Electron

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

    15 引用 • 136 回帖 • 2 关注