惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
Vercel News
Vercel News
F
Fortinet All Blogs
量子位
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
D
Docker
WordPress大学
WordPress大学

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
用 Trilium 制作可互动时间轴 - 少数派
2021-03-24 · via 少数派
image.png

起因

看到微信群里有人说「在整合历史时间轴方面,我目前还没发现有很好的工具」,于是想到了 trilium 的自定义 render note 也许可以通过引用第三方库来实现画时间轴。经过一些缝缝补补,合成了这么一个功能。

实现

参考 trilium 默认范例里的「体重统计」,我先写了一个 render note 来收集所有打了 timeline 标签的笔记,并渲染成表格。

<p>This table shows notes with label <code>timeline</code></p> 

<table class="table stats-table" style="font-size: 90%;">
    <tr>
        <th>Event</th>
        <th nowrap>Date</th>
    </tr>
</table>
const events = await api.runOnServer(async () => {
    // 搞到有这个标签的笔记
    const notes = await api.getNotesWithLabel('timeline');
    const events = [];

    for (const note of notes) {
        // 取到标签内容(即时间线上日期)
        const date = await note.getLabelValue('timeline');
        const id = note.noteId;
        const title = note.title;
        
        if (date) {
            events.push({ id, date, title });
        }
    }
		// 排序!!!
    events.sort((a, b) => a.date > b.date ? 1 : -1);

    return events;
});

const $statsTable = api.$container.find('.stats-table'); // 找到要插入数据的表格

for (const event of events) {     
    $statsTable.append(
        $("<tr>")
            .append( // 插入笔记标题
                $("<td>").append(await api.createNoteLink(event.id, {showNotePath: false}))
            ) 
            .append($("<td nowrap>").text(event.date)) // 插入笔记日期
    );
}

顺便建立了一些测试用笔记,给这些笔记的父笔记(题外话:为什么是父不是母呢?因为我对母的理解是「幻灯片模板」那样的内容上的 parent,而父给我的感觉是在结构上的 parent)增加一个可继承 label 定义:

image.png

这样在下面建立的子笔记都会自动带上这个可填写字段。

完成这一步后,效果就是图上第一部分的表格。

接下来,我做了一些调查,看中了 visjs 的可互动时间轴。

下载它的最小分发版,作为文件导入 trilium,并取消勾选自动转为 code note 的选项,然后模仿官方范例写一些代码:

const container = document.getElementById("visualization"); // 找到要插入表格的地方
const options = {};
const visData = [];
for (const event of events) {
    visData.push({start: event.date, content: event.title}); // 把数据放进去
}
const items = new vis.DataSet(visData);
const timeline = new vis.Timeline(container, items, options); // 新建时间轴

对了,render note 的 html 模板里要加上:

<div id='visualization'></div>

这样就能在页面上显示时间轴了,时间轴可以拖动缩放,参考文档还能添加甘特图分组、起止时间等功能,总之有很多花样可以玩。

image.png
最终文件结构
时间轴缩放

参考资料