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'] }, }
  • 思源笔记

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

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

    26089 引用 • 108321 回帖
  • QueryView
    13 引用 • 66 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 350 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 537 关注
  • OneDrive
    2 引用 • 4 关注
  • JavaScript

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

    730 引用 • 1282 回帖 • 1 关注
  • AWS
    11 引用 • 28 回帖 • 8 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • TGIF

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

    291 引用 • 4495 回帖 • 661 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Chrome

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

    63 引用 • 289 回帖
  • Node.js

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

    139 引用 • 269 回帖 • 2 关注
  • 以太坊

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

    34 引用 • 367 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖 • 5 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 33 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 7 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 4 关注
  • Elasticsearch

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

    117 引用 • 99 回帖 • 196 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 662 关注
  • LaTeX

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

    12 引用 • 59 回帖 • 3 关注
  • uTools

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

    7 引用 • 28 回帖 • 1 关注
  • 正则表达式

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

    31 引用 • 94 回帖 • 1 关注
  • 学习

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

    172 引用 • 534 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 182 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖 • 1 关注
  • OnlyOffice
    4 引用 • 15 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖 • 1 关注