Markdown 附件 + 预览

日常调研的时候喜欢和 GPT 对话,有些对话可能需要保存,以供后续参考。之前的做法是复制或者导出到思源笔记本地。不过这个做法感觉也有一些不爽的地方。

  • 很多对话动辄就是大几万字,偏偏很多对话的信息量其实没那么大,就是做个只读的参考草稿用。这些内容明明没有编辑的需求,放到笔记里却会占用思源的块索引空间,感觉有点浪费。
  • 我经常同时和多个模型进行对话,不同模型可能给出不同偏向的回答。但是在保存整理的时候,在如何整理上有些为难:放到不同文档有点分散,放到同一个文档又感觉有点拥挤。

所以最近我换了一个思路:这些草稿、只读性质的内容干脆就不放到本地里面了,而是丢到附件当中。在思源中创建 Markdown 附件,把一些草稿、相对低价值、或者只读的参考内容丢到附件里,不要占用思源的索引空间。

fmisc 里面之前就实现了一个创建资源文件的功能,前两天稍微整理了一下,把用户创建的文件全都丢到一个 assets/user 目录下面去。需要的时候在编辑器里面 /new​ 创建一个 markdown 文件就行。

很久以前买了吃灰 Typora 也终于能用上,点开 md 文件,把乱七八糟的内容复制进去就行。然后这些 md 文件就作为附件保存到 asset 下面去就好。

image

好消息:首先不占用思源的块索引空间了,然后不同的草稿对话也只要简单的放在一起就行。资源文件本身就是一个管理粒度,而且可以随便引用到笔记的各个地方也基本不占用额外空间。

image

存储用附件好是好,还需要解决查看问题,最好能在思源内直接预览附件 MD 文件的内容。

其实也好办,之前我用 Query View 写过一个简单的 Preview 组件,大致思路是用 fetch​ 获得文件文本内容,然后调用 dv.md​ 渲染 Markdown (实现代码参考 https://github.com/frostime/sy-query-view/discussions/7)。

为了方便预览,我们实现的 Qv 查询主要做这么几件事情:

  • 自动查询当前文档下所有的 markdown 附件
  • 创建对应的按钮
  • 点击按钮后,调用 Preview​ 组件创建 Markdown 文件的预览
//!js const useButton = (title, onclick) => { let button = document.createElement('button'); button.className = 'b3-button b3-button--text'; button.innerText = title; button.onclick = onclick; return button; } const query = async () => { let dv = Query.DataView(protyle, item, top); dv.render(); let assets = await Query.request('/api/asset/getDocAssets', { id: dv.root_id }); assets = assets.filter(a => a.endsWith('.md')); const onclick = asset => { //dv.Preview 是一个自定义组件(自定义组件请参考插件说明文档);代码见 https://github.com/frostime/sy-query-view/discussions/7 let view = dv.replaceView(main.dataset.id, dv.Preview(asset, {maxHeight: '800px'})); } const container = document.createElement('div'); container.style.fontSize = '0.9em'; assets.forEach(asset => { const button = useButton(asset.replace('assets/', ''), () => { onclick(asset); }); button.style.margin = '5px'; container.appendChild(button); }); dv.adddetail('Assets', container); dv.addmd('---'); let main = dv.addele(''); main.style.maxHeight = '800px'; main.style.overflowY = 'auto'; } return query();

效果大概这个样子:

PixPin_2025-03-18_12-11-52

🤔 小缺憾:目前发现一个问题,思源里面 assets 文件不方便重命名;如果一开始 markdown 没有创建好命名,后面想要换一个名称就会很麻烦。

附: Preview 组件的实现

image

const custom = { assetPreview: { use: (dv) => { return { render: async (container, fileUrl, options) => { try { const response = await fetch(fileUrl); const contentType = response.headers.get('content-type'); const fileContent = await response.text(); let element; // 如果是 html,那么就放入 iframe 中 if (contentType.startsWith('application/')) { const codeType = contentType.split('/')[1]; element = dv.md(`\`\`\`${codeType}\n${fileContent}\n\`\`\``); } else if (contentType.startsWith('text/html')) { element = document.createElement('iframe'); element.src = fileUrl; element.style.width = '100%'; } else if (contentType.startsWith('image/')) { element = document.createElement('img'); element.src = fileUrl; element.style.maxWidth = '100%'; } else if (contentType.startsWith('text/')) { element = dv.md(fileContent); } else { element = document.createElement('div'); element.innerText = '无法预览'; } const title = document.createElement('p'); title.innerText = `预览: ${fileUrl}`; Object.assign(title.style, { backgroundColor: 'var(--b3-theme-primary-light)', color: 'var(--b3-theme-on-primary)', borderRadius: '4px', fontWeight: 'bold', padding: '4px 8px', }); if (options?.maxHeight) { Object.assign(element.style, { maxHeight: options.maxHeight, overflowY: 'auto', }); } container.appendChild(title); container.appendChild(element); } catch (error) { console.error('Error fetching file:', error); const errorElement = document.createElement('div'); errorElement.innerText = '无法预览'; container.appendChild(errorElement); } } } }, alias: ['Preview', 'Asset'] }, }
  • 思源笔记

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

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

    25388 引用 • 104870 回帖
  • QueryView
    8 引用 • 46 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • AWS
    11 引用 • 28 回帖 • 11 关注
  • 浅吟主题

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

    1 引用 • 28 回帖
  • Outlook
    1 引用 • 5 回帖 • 5 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖
  • TensorFlow

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

    20 引用 • 19 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 649 关注
  • Word
    13 引用 • 41 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • Hadoop

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

    89 引用 • 122 回帖 • 618 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • 自由行
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    290 引用 • 4494 回帖 • 654 关注
  • LeetCode

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

    209 引用 • 72 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Node.js

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

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

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 634 关注
  • WebComponents

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

    1 引用 • 9 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 690 关注
  • PWL

    组织简介

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

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

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

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 437 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 592 关注
  • Jenkins

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

    54 引用 • 37 回帖 • 1 关注