API 获取并处理块的一些疑问

因为突然想要写一个插件来帮我格式化一下普通的内容块,所以今天研究了一个晚上的插件开发和 api,现在发现内容块 API 有点问题不好理解,希望各位能帮我解答一二。

  1. 在更新块 API 里支持两种模式:markdownDOM。不过这两种元素我感觉都不是很好获取。
    1. 使用 api 能获取的是 kramdown,这个会带有 {: updated id} 属性,要是用 markdown 再发回去就会当成普通的文字放进去。
    2. DOM 也不算好获取,从块标里面的插件按钮获取到的结果是不带 HTML 的,没法获取当前元素的 html。这样难道只能用 ts 去页面里获取吗?
  2. 获取了 kramdown 之后,如果要更新块一定要去掉 {: updated id} 这个属性吗,有没有可能不处理这个属性也不影响文本显示的办法?
  3. 有可能通过 api 获取到当前块的 dom?或者获取到当前块的类型?
  4. 还在继续思考中...感谢各位的帮助。如果想要先行了解代码可以先在这里了解最新的进度。目前通过 ai 暂时解决了 {: updated id} 属性,不过这个方法不算好,也希望各位能帮我提出一些建议。
  • 思源笔记

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

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

    22906 引用 • 92073 回帖 • 1 关注
  • Q&A

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

    8391 引用 • 38236 回帖 • 155 关注

相关帖子

被采纳的回答
  • player 2

    "/api/block/insertBlock" "/api/block/updateBlock" 可以传入 kramdown。 内容与属性需要用 '\n' 来隔开。

    id updated 可以不用去掉。 如果你要插入新的块,需要生成新的 id 避免重复。

    "/api/block/getBlockDOM" 可以按块 id 读取 dom.

    "/api/transactions" 可以按 dom 来更新或者插入等。

    另外, dom 与 markdown 的转换可以用:
    export const NewLute: () => Lute = (globalThis as any).Lute.New;

    lute = NewLute();

    const md = lute.BlockDOM2Md(div.outerHTML);

    export class Lute {
        public static WalkStop: number;
        public static WalkSkipChildren: number;
        public static WalkContinue: number;
        public static Version: string;
        public static Caret: string;
    
        public static New(): Lute;
    
        public static EChartsMindmapStr(text: string): string;
    
        public static NewNodeID(): string;
    
        public static Sanitize(html: string): string;
    
        public static EscapeHTMLStr(str: string): string;
    
        public static UnEscapeHTMLStr(str: string): string;
    
        public static GetHeadingID(node: ILuteNode): string;
    
        public static BlockDOM2Content(html: string): string;
    
        private constructor();
    
        public BlockDOM2Content(text: string): string;
    
        public BlockDOM2EscapeMarkerContent(text: string): string;
    
        public SetSpin(enable: boolean): void;
    
        public SetTextMark(enable: boolean): void;
    
        public SetHTMLTag2TextMark(enable: boolean): void;
    
        public SetHeadingID(enable: boolean): void;
    
        public SetProtyleMarkNetImg(enable: boolean): void;
    
        public SetSpellcheck(enable: boolean): void;
    
        public SetFileAnnotationRef(enable: boolean): void;
    
        public SetSetext(enable: boolean): void;
    
        public SetYamlFrontMatter(enable: boolean): void;
    
        public SetChineseParagraphBeginningSpace(enable: boolean): void;
    
        public SetRenderListStyle(enable: boolean): void;
    
        public SetImgPathAllowSpace(enable: boolean): void;
    
        public SetKramdownIAL(enable: boolean): void;
    
        public BlockDOM2Md(html: string): string;
    
        public BlockDOM2StdMd(html: string): string;
    
        public SetSuperBlock(enable: boolean): void;
    
        public SetTag(enable: boolean): void;
    
        public SetInlineMath(enable: boolean): void;
    
        public SetGFMStrikethrough(enable: boolean): void;
    
        public SetGFMStrikethrough1(enable: boolean): void;
    
        public SetMark(enable: boolean): void;
    
        public SetSub(enable: boolean): void;
    
        public SetSup(enable: boolean): void;
    
        public SetInlineAsterisk(enable: boolean): void;
    
        public SetInlineUnderscore(enable: boolean): void;
    
        public SetBlockRef(enable: boolean): void;
    
        public SetSanitize(enable: boolean): void;
    
        public SetHeadingAnchor(enable: boolean): void;
    
        public SetImageLazyLoading(imagePath: string): void;
    
        public SetInlineMathAllowDigitAfterOpenMarker(enable: boolean): void;
    
        public SetToC(enable: boolean): void;
    
        public SetIndentCodeBlock(enable: boolean): void;
    
        public SetParagraphBeginningSpace(enable: boolean): void;
    
        public SetFootnotes(enable: boolean): void;
    
        public SetLinkRef(enable: boolean): void;
    
        public SetEmojiSite(emojiSite: string): void;
    
        public PutEmojis(emojis: IObject): void;
    
        public SpinBlockDOM(html: string): string;
    
        public Md2BlockDOM(html: string): string;
    
        public SetProtyleWYSIWYG(wysiwyg: boolean): void;
    
        public MarkdownStr(name: string, md: string): string;
    
        public GetLinkDest(text: string): string;
    
        public BlockDOM2InlineBlockDOM(html: string): string;
    
        public BlockDOM2HTML(html: string): string;
    
        public HTML2Md(html: string): string;
    
        public HTML2BlockDOM(html: string): string;
    }
    

欢迎来到这里!

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

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

    "/api/block/insertBlock" "/api/block/updateBlock" 可以传入 kramdown。 内容与属性需要用 '\n' 来隔开。

    id updated 可以不用去掉。 如果你要插入新的块,需要生成新的 id 避免重复。

    "/api/block/getBlockDOM" 可以按块 id 读取 dom.

    "/api/transactions" 可以按 dom 来更新或者插入等。

    另外, dom 与 markdown 的转换可以用:
    export const NewLute: () => Lute = (globalThis as any).Lute.New;

    lute = NewLute();

    const md = lute.BlockDOM2Md(div.outerHTML);

    export class Lute {
        public static WalkStop: number;
        public static WalkSkipChildren: number;
        public static WalkContinue: number;
        public static Version: string;
        public static Caret: string;
    
        public static New(): Lute;
    
        public static EChartsMindmapStr(text: string): string;
    
        public static NewNodeID(): string;
    
        public static Sanitize(html: string): string;
    
        public static EscapeHTMLStr(str: string): string;
    
        public static UnEscapeHTMLStr(str: string): string;
    
        public static GetHeadingID(node: ILuteNode): string;
    
        public static BlockDOM2Content(html: string): string;
    
        private constructor();
    
        public BlockDOM2Content(text: string): string;
    
        public BlockDOM2EscapeMarkerContent(text: string): string;
    
        public SetSpin(enable: boolean): void;
    
        public SetTextMark(enable: boolean): void;
    
        public SetHTMLTag2TextMark(enable: boolean): void;
    
        public SetHeadingID(enable: boolean): void;
    
        public SetProtyleMarkNetImg(enable: boolean): void;
    
        public SetSpellcheck(enable: boolean): void;
    
        public SetFileAnnotationRef(enable: boolean): void;
    
        public SetSetext(enable: boolean): void;
    
        public SetYamlFrontMatter(enable: boolean): void;
    
        public SetChineseParagraphBeginningSpace(enable: boolean): void;
    
        public SetRenderListStyle(enable: boolean): void;
    
        public SetImgPathAllowSpace(enable: boolean): void;
    
        public SetKramdownIAL(enable: boolean): void;
    
        public BlockDOM2Md(html: string): string;
    
        public BlockDOM2StdMd(html: string): string;
    
        public SetSuperBlock(enable: boolean): void;
    
        public SetTag(enable: boolean): void;
    
        public SetInlineMath(enable: boolean): void;
    
        public SetGFMStrikethrough(enable: boolean): void;
    
        public SetGFMStrikethrough1(enable: boolean): void;
    
        public SetMark(enable: boolean): void;
    
        public SetSub(enable: boolean): void;
    
        public SetSup(enable: boolean): void;
    
        public SetInlineAsterisk(enable: boolean): void;
    
        public SetInlineUnderscore(enable: boolean): void;
    
        public SetBlockRef(enable: boolean): void;
    
        public SetSanitize(enable: boolean): void;
    
        public SetHeadingAnchor(enable: boolean): void;
    
        public SetImageLazyLoading(imagePath: string): void;
    
        public SetInlineMathAllowDigitAfterOpenMarker(enable: boolean): void;
    
        public SetToC(enable: boolean): void;
    
        public SetIndentCodeBlock(enable: boolean): void;
    
        public SetParagraphBeginningSpace(enable: boolean): void;
    
        public SetFootnotes(enable: boolean): void;
    
        public SetLinkRef(enable: boolean): void;
    
        public SetEmojiSite(emojiSite: string): void;
    
        public PutEmojis(emojis: IObject): void;
    
        public SpinBlockDOM(html: string): string;
    
        public Md2BlockDOM(html: string): string;
    
        public SetProtyleWYSIWYG(wysiwyg: boolean): void;
    
        public MarkdownStr(name: string, md: string): string;
    
        public GetLinkDest(text: string): string;
    
        public BlockDOM2InlineBlockDOM(html: string): string;
    
        public BlockDOM2HTML(html: string): string;
    
        public HTML2Md(html: string): string;
    
        public HTML2BlockDOM(html: string): string;
    }
    
    2 回复
  • EmptyLight

    感谢!我去研究一下!

  • 想问问大佬,/api/transactions 的传入值有没有示例呢,data 值是传入 id 和操作 update 就可以了吗


    摸索了下,这样就能把 html 修改的内容保存了

    // 1. 获取目标元素
    const targetElement = document.querySelector('div[data-node-id="20241205223647-qaxnubd"]');
    
    // 2. 获取 HTML 内容 (并进行一些基本的错误处理)
    let originalHtmlContent = ""; // 用于保存原始 HTML 内容
    let originalNowTime; // 用于保存原始时间
    
    if (targetElement) {
        originalHtmlContent = targetElement.outerHTML;
    } else {
        console.error("未找到指定 data-node-id 的元素!");
        // 可以选择在这里返回或者执行其他错误处理逻辑
        // return; 
    }
    
    // 修改HTML
    newHtmlContent = targetElement.outerHTML;
    
    // 3. 更新
    let nowTime = new Date().getTime(); // 更新后的时间
    const res = await fetchSyncPost("/api/transactions", {
        session: siyuan.ws.app.appId,
        app: siyuan.ws.app.appId,
        reqId: nowTime,
        transactions: [{
            "doOperations": [{
                action: "update",
                id: '20241205223647-qaxnubd',
                data: newHtmlContent, // 更新后的 HTML 内容 (如果需要更新)
            }],
            "undoOperations": [{
                action: "update",
                id: '20241205223647-qaxnubd',
                data: originalHtmlContent, // 使用原始 HTML 内容
            }]
        }]
    });
    console.log(res);
    
    
    1 操作
    Achuan-2 在 2024-12-18 07:22:50 更新了该回帖

推荐标签 标签

  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 623 关注
  • Elasticsearch

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

    117 引用 • 99 回帖 • 210 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 169 关注
  • RYMCU

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

    4 引用 • 6 回帖 • 53 关注
  • Android

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

    334 引用 • 323 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖 • 1 关注
  • LaTeX

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

    12 引用 • 54 回帖 • 48 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 422 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 3 关注
  • ngrok

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

    7 引用 • 63 回帖 • 625 关注
  • danl
    144 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 437 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 251 关注
  • 学习

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

    171 引用 • 512 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 174 关注
  • TensorFlow

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

    20 引用 • 19 回帖 • 3 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 2 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    544 引用 • 672 回帖
  • Docker

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

    492 引用 • 926 回帖 • 1 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 76 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 17 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖 • 1 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 363 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 5 关注