基于 Dataview 构建 Obsidian Memos 的监控大盘
6 min read

基于 Dataview 构建 Obsidian Memos 的监控大盘

obsidian memos 是我的日常 capture、fleeting idea 集散地,总结回顾以来 memos 的状态,这就需要一个好的监控大盘。这篇文章就是记录如何利用 dataview sql-like 的可编程能力搭建自己的 memos 监控大盘的。
基于 Dataview 构建 Obsidian Memos 的监控大盘
Photo by Axel Vazquez / Unsplash

先展示一下最终的效果图,后面会一步一步展开是如何完成下面这样一个监控大盘的。

Obsidian Memos Monitor

背景

Obsidian Memos 是我日常做 fleeting 记录的地方,工作流中还涉及到回顾、下一步工作,如深度思考总结、发表到 newsletter 等。所以这里就需要一个 Obsidian Memos 状态监控的地方,完成这件事情,总体的思路就是:

  • 通过配置使得 Memos 成为基于 markdown task 的文本
  • 利用 dataview 的 query 能力以及 javascript query 的能力对 Memos 进行状态统计
  • 自定义 Memos 的自动监控大盘

Memos 配置

主要是针对 Obsidian Memos 插件的配置,目标是为了能够将 memos 作为 Obsidian task 进行解析。在配置之前需要确认 Obsidian Memos 插件已经安装并且使能,关于 Memos 主要的配置有:

1. memo 分隔符配置

我自定义了一段字符:$$\textcolor[RGB]{155,0,0}{------\varkappa------}$$ 作为 memo 的分隔符。这个分隔符字符串的作用是用来告诉 Obsidian Memos 在这一串字符串之后才是记录 memo 的地方。

配置选项如下图所示:

Obsidian Memos Separator Config

这个分隔符采用的是 LaTex 语法,显示效果如下图所示:

Obsidian Memos Separator Preview

2. memo prefix 配置

prefix 就是 memo 的前缀,有两个选项:list、task,这里我们需要选择配置为 task,如下图所示。

Obsidian Memos Prefix Config

3. memo daily 插件配置

memo 结合 daily 插件使用,这样可以让 memo 跟日程关联起来,有两个选项:daily、periodic,这两个选项代表插件,daily 是 Obsidian 的内置插件,就是用这个配合 templater 可以实现模版化生成文件,具体可以参考之前的总结:Obsidian 自动添加元数据

memo daily 的配置如下图所示。

Obsidian Memos Daily Plugin Config

4. memo comment 配置

这个配置是一个可选项,用于打开 Obsidian Memos 的评论功能,如下所示。

Obsidian Memos Comments Config

配置完成之后的效果图:

My Obsidian Memos

Dataview 监控 Memos

Memos 的配置完成之后就可以通过 SQL-like 的方式进行监控状态的查询、统计了,这里主要借助的是 Dataview 插件,这里需要打开 javascript query 的配置,如下图所示。

Obsidian Dataview Plugin Config

Dataview 监控发布状态

有一部分 memo 在记录和思考的时候如果需要发布到 Ghost blog,那么会打上标签 #tweet,可以根据自己的需要扩展这个标签。根据标签以及 task 的状态(是否完成等)进行统计查询。查询的实力代码如下所示:

// 注意:
// 这里需要复制到 dataview 代码 block 中
//
TABLE WITHOUT ID
  choice(length(filter(file.tasks, (t) => regexmatch(".*#tweet.*", t.text) and !t.completed)) > 0, "✅", "❌") as "Need to Post",
  length(filter(file.tasks, (t) => regexmatch(".*#tweet.*", t.text))) as "Ghost Tasks",
  length(filter(file.tasks.completed, (t) => t)) as "Done Tasks",
  length(file.tasks) as "Total Tasks",
  striptime(date(today)) - striptime(file.ctime) as "Duration",
  dateformat(date(file.mtime), "yyyy-MM-dd") as "Last Modified",
  file.link as "Source"
FROM "4.permanent/permanent-2022"
SORT date desc
LIMIT 7

监控效果如下所示:

Obsidian Memos to Post Tasks Monitor

Dataviewjs 监控 task 状态

监控最近 7 天内的 memos 的状态,包括 taks 总数和已经完成的 task对比,这里需要使用 dataview 的 javascript query,查询代码如下所示:

// 注意:
// 这里需要复制到 dataviewjs 代码 block 中
//-
const data = dv.pages('"4.permanent/permanent-2022"').file
				.where(f => !f.name.includes("2022计划"))
				.where(f => (dv.date(f.ctime) >= (dv.date('today') - dv.duration('7 days'))));

let data_len = [];
let data_done_len = [];
for (let p of data) {
	data_len.push(dv.array(p.tasks).length);
	data_done_len.push(dv.array(p.tasks.where(t => t.completed)).length);
}

可视化

可视化监控

图表化可以提高效率,帮助更加直观的了解当前 memos 的状态,经过一番查找目前看来比较成熟的方法是采用 Obsidian Charts 插件作为可视化监控的解决方案。Obsidian Charts 的语法、配置、数据格式了解的还比较浅显(Obsidian Charts 主要是采用 Chart.js),目前只是做了一个简单的图标展示,后面在学习之后再做丰富。

可视化配置

这里采用 dataview inline 的方式进行 obsidian charts 的配置,配置代码如下所示:

const data = dv.pages('"4.permanent/permanent-2022"').file
				.where(f => !f.name.includes("2022计划"))
				.where(f => (dv.date(f.ctime) >= (dv.date('today') - dv.duration('7 days'))));

let data_len = [];
let data_done_len = [];
for (let p of data) {
	data_len.push(dv.array(p.tasks).length);
	data_done_len.push(dv.array(p.tasks.where(t => t.completed)).length);
}

const chartData = {
type: 'bar',
data: {
	borderColor: 'Grey',
	labels: data.name,
	datasets: [
	{
	    label: "memos",
	    data: data_len,
	    backgroundColor: [
	    'Blue',
	    'rgb(255, 99, 132, 0.5)',
	    'rgb(75, 192, 192, 0.5)',
	    'rgb(255, 205, 86, 0.5)',
	    'rgb(201, 203, 207, 0.5)',
	    'rgb(54, 162, 235, 0.5)'
	    ],
	    borderColor: [
        'Blue'
        ],
        borderWidth: 2,
        fill: false
	},
	{
		label: "memos done",
		data: data_done_len,
		backgroundColor: [
		'Green',
		'rgb(255, 99, 132, 0.9)',
	    'rgb(75, 192, 192, 0.9)',
	    'rgb(255, 205, 86, 0.9)',
	    'rgb(201, 203, 207, 0.9)',
	    'rgb(54, 162, 235, 0.9)'
	    ],
	    borderColor: [
        'Green',
        ],
        borderWidth: 2
	}
	],
}
}
window.renderChart(chartData, this.container);

References

  1. Obsidian-Memos: A quick capture plugin for Obsidian, all data from your notes.
  2. Chart.js | Chart.js
  3. Getting started | Obsidian Charts

Public discussion