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

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

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

    26725 引用 • 111337 回帖 • 1 关注
  • QueryView
    16 引用 • 76 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 3 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 367 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 259 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 9 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • 反馈

    Communication channel for makers and users.

    120 引用 • 906 回帖 • 279 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 253 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    27 引用 • 276 回帖 • 1 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 223 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    378 引用 • 1866 回帖 • 2 关注
  • ReactiveX

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

    1 引用 • 2 回帖 • 183 关注
  • AWS
    11 引用 • 28 回帖 • 3 关注
  • 生活

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

    230 引用 • 1432 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 1 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • 运维

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

    151 引用 • 257 回帖
  • WordPress

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

    46 引用 • 114 回帖 • 160 关注
  • Python

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

    554 引用 • 675 回帖
  • 安全

    安全永远都不是一个小问题。

    200 引用 • 818 回帖 • 2 关注
  • golang

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

    500 引用 • 1396 回帖 • 254 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    593 引用 • 3533 回帖 • 2 关注
  • Access
    1 引用 • 3 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 82 关注