-
今天(2024.12.30)日记模板是不是会解析成 2024 年第一周?
2024-12-30 15:17ISOWeek 定义如此:
一年中的第一周是包含该年第一个周四的那一周。这意味着第一周至少有四天在新的一年中。
这种属于特殊情况,遇到了就手动改一下吧。
-
QueryView 插件
2024-12-26 13:44自己调用 addecharts 都是支持的。
折线、柱状图、tree、graph 是我为了方便和思源的数据结构对接特别封装的。你完全可以不管这些,自己构建 echarts 的 option。
-
QueryView 插件的视图玩法——统计每月阅读量
2024-12-25 20:30let results = Query.wrapit([]); //按照 root_id 字段分组 Query.wrapit(documents).groupby('年月', (date, blocks) => { // 累加 blocks 中的时间 let sum = blocks.reduce((acc, cur) => acc + cur.时间, 0); results.push({ 年月: date, 时间: sum }); // dv.addmd(`- ${date}, 总计阅读时间:${sum}`); }); dv.addeline(results.pick('年月'), results.pick('时间'));
-
QueryView 插件的视图玩法——统计每月阅读量
2024-12-25 15:13不清楚你说的统计阅读时间是啥,我就按照我理解中的写了一下。
在没有属性标识,单纯靠关键字来查询文档还是麻烦了一点,我后面想想看能不能加一些这方面的工具函数。
//!js const contentReg = async (reg) => { return Query.sql(`select * from blocks where content REGEXP '^${reg}$'`); } const extractNumber = (blocks, prefix) => { return blocks.map(block => { const match = block.content.match(new RegExp(`${prefix}:([0-9]+(?:\\.[0-9]+)?)`)); return match ? { ...block, number: parseFloat(match[1]) } : null; }).filter(Boolean); }; const query = async () => { // 创建数据视图对象 let dv = Query.DataView(protyle, item, top); // 1. 构建 SQL 提取 content let with年月 = await contentReg('年月:[0-9]+(\.[0-9]+)?'); let with时间 = await contentReg('时间:[0-9]+(\.[0-9]+)?'); with年月 = extractNumber(with年月, '年月'); with时间 = extractNumber(with时间, '时间'); let 年月 = Query.utils.asMap(with年月, 'root_id'); let 时间 = Query.utils.asMap(with时间, 'root_id'); //按照相同的 root_id 字段将 with年月 和 with时间合并成一个大 list let documents = []; Object.keys(年月).forEach(root_id => { // 文档,年月数字,时间数字 documents.push({ root_id, 年月: 年月[root_id]?.number ?? '无法找到对应年月', 时间: 时间[root_id]?.number ?? 0 }) }); let results = []; //按照年月来分组,累加计算各个文档中的「时间」 Query.wrapit(documents).groupby('年月', (date, blocks) => { // 累加 blocks 中的时间 let sum = blocks.reduce((acc, cur) => acc + cur.时间, 0); // results.push({ // 年月: date, // 时间: sum // }); dv.addmd(`- ${date}, 总计阅读时间:${sum}`); }); dv.render(); } return query();
这个实现的效果是,累加每个「年月」的阅读「时间」字段,然后汇总显示。
具体的 js 代码看不懂可以喂给 GPT 解读一下。 -
如何理解笔记本的存在?
2024-12-16 23:52笔记本存在的最大意义是它可以被「关闭」——这意味着在运行的时候不纳入索引存储,降低内存开销。
比如你记录了 1 个 GB 的笔记,但是里面有 300MB 的内容是老黄历,只是归档放在那里,大概率也不会访问。
这种情况下,如果这 300MB 的笔记刚好都放在一个笔记本里面,那就可以把这个笔记本关掉;这样思源在运行的时候就只会索引剩下 700MB 的内容,降低运行时的存储和计算开销。
-
求助一级标题时间模版
2024-12-05 01:10.action{$week := add (mod (div ((toDate "2006-01-02" "2050-03-13").Sub now).Hours 24) 7) 1} .action{$today := last (slice (list "星期六" "星期五" "星期四" "星期三" "星期二" "星期一" "星期天") 0 $week )} .action{$datestr := now | date "2006-01-02"} .action{$datestr_sy := now | date "20060102"} ## .action{$datestr} .action{$today}
-
思源开发插件时如何保存插件数据,能保存多大的数据?
2024-09-27 00:12配置文件建议直接通过 saveData 存成 json 文件。
大的资源文件建议放到 /data/public (或者别的目录下),然后通过调用 putFile 等 API 来进行 IO 操作。
-
插件开发 | 不要在 onunload 中调用 saveData
2024-08-27 23:37你说的情况就相对复杂一些了。
我说的 「onunload 里面不要 saveData」 是表象。核心的关键其实是两点:
- 思源会先启动插件再做同步
- 同步数据完成后,思源有可能会 reload;reload 的过程中会调用
onunload
钩子
面对复杂一下的情况,就需要把握这两点进行具体分析了。
-
问一下书签 + 怎么实现随机漫步一个笔记本下的文档 / 一个文档下的子文档
2024-08-11 12:56这属于 SQL 的问题。
限制只查询文档的话,就加上
type='d'
条件。限制笔记本就用
box='笔记本ID'
做限制条件;子文档就用path like '%文档ID/%'
做限制条件。 -
[js] 代码片段实现代码块最近使用的语言置顶
2024-08-09 12:00vite-svelte 模板提供了热重载,但是这个热重载本质是检测到文件发生变动就自动 window-reload。和无需刷新的热重载可能还有点差距,但其实日常使用也能用。
你如果不想要使用 node 环境开发,可以试一下‘开发 API’或者‘Run JS’。
这两个插件都把一些前端的 API 透传到了 globalThis 下面(RunJS 还透传了一些对 kernel api 的封装),这样直接在思源里面就可以调用一些给插件用的 api 了。
-
如何评价“开源本来就是为爱发电,不应该有任何负面评价”这种思潮?
2024-08-08 11:30你们“为爱发电”开发软件的时间值钱,难道成千上万大众的筛选软件的时间成本就不值钱吗?
你这就是属于强行制造对立,混淆概念了。
「筛选软件的时间成本」和开发者开发软件没有直接关系,那是各种教程、分享、交流应该负责解决的事情。
只是说在这个案例里面,某人提出的针对「筛选软件的时间成本」的方案可能带来对开发者积极性的负面影响,这属于技术性问题,是方案设计的不够好的问题。比如某些插件被刷了低分、差评,那于作者而言是不是干脆下架插件,眼不见心不烦为好?——考虑到思源的社区规模比较小,目前不适合应用这种模式。(不过或许可以换成点赞这种只有正向反馈的模式,这个可能会好一点)。
总结一下就是:
- 「“为爱发电”开发软件的时间」和「成千上万大众的筛选软件的时间」这两者之间不存在内生性的矛盾,这个矛盾是被你人为拼接出来的。
- 你提出的核心矛盾是有问题的,所以你后面的就题发挥均没什么讨论的价值;任何字斟句酌都变成了无聊的对概念的辨析和对定义权的争夺。
- 如果你真的想要进行有意义的讨论,那也应该是技术性的,比如:如何在不影响开源作者的积极性的前提下构建一个有参考的评价、分享系统。
至于你强行把开源作者和普通用户对立,我只能这么说:
-
目前 3.x 的版本还存在丢笔记的情况吗?
2024-08-08 00:43