给自己的 DailyNote 更新了「最近笔记」模块,分享一下。
注意:我自己单独维护了创建时间和修改时间的元数据,所以使用的是
row["create_date"]
属性。如果你想用默认的创建时间/修改时间,把元数据属性替换成ctime
和mtime
即可。
旧版
原先的版本,使用了三个 Dataview 块:
Source:
### Created
```dataview
TABLE WITHOUT ID
link(file.name, title) as "笔记",
dateformat(row["create_date"], "HH:mm") as 创建时间
FROM -"PeriodicNote/Daily" AND -"_global" AND -"网络摘录"
WHERE dateformat(row["create_date"], "yyyy-MM-dd") = this.file.name
SORT row["create_date"] asc
LIMIT 20
```
### Modified
```dataview
TABLE WITHOUT ID
link(file.name, title) as "笔记",
dateformat(row["modified_date"], "HH:mm") as 修改于
FROM -"PeriodicNote/Daily" AND -"_global"
WHERE dateformat(row["modified_date"], "yyyy-MM-dd") = this.file.name AND dateformat(row["create_date"], "yyyy-MM-dd") != this.file.name
SORT row["modified_date"] asc
LIMIT 30
```
### Collected
```dataview
TABLE WITHOUT ID
link(file.name, title) as "笔记",
dateformat(row["create_date"], "HH:mm") as 创建时间
FROM "网络摘录"
WHERE dateformat(row["create_date"], "yyyy-MM-dd") = this.file.name
SORT row["create_date"] asc
LIMIT 20
```
新版
新版,用一个 JS 文件直接搞定,三个内容都显示在一起:
Source:
```dataviewjs
dv.view('recentNotesInDaily')
```
Markdown 文件里只需要加载对应的 JS 视图即可。
对应的 JS 文件:
// ========================================
// 作者:Moy
// 日期:2024.08.05
// 版本:1.0.0
// ========================================
// 注意:该脚本只在文件名为 yyyy-MM-dd 日期格式(如 2024-08-05)的笔记内有效
// 如果你的 DailyNote 有别的命名格式,自行下方的 yyyy-MM-dd
const curNoteName = dv.current().file.name;
const dateFormat = "yyyy-MM-dd"
// 配置搜索的范围,如果有需要排除的文件夹就加在这儿
const pages = dv.pages('-"PeriodicNote/Daily" AND -"_global" AND -"网络摘录"');
// 显示的笔记数量限制
const displayNoteLimit = 20;
const createdToday = pages.filter(p => p.create_date && dv.date(p.create_date).toFormat(dateFormat) == curNoteName);
const modifiedToday = pages.filter(p => p.modified_date && dv.date(p.modified_date).toFormat(dateFormat) == curNoteName && dv.date(p.create_date).toFormat(dateFormat) != curNoteName);
if (createdToday.length + modifiedToday.length == 0) {
dv.paragraph(`今天(${curNoteName})暂时没有创建或修改过任何笔记 ⏰`)
return;
}
// 创建的笔记
if (createdToday.length > 0) {
dv.header(2, "Created")
dv.table(["笔记", "创建时间"],
createdToday
.sort(p => p.create_date)
.slice(0, displayNoteLimit)
.map(p => [
// dv.fileLink(p.file.name, p.title),
p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
dv.date(p.create_date).toFormat("HH:mm")
])
)
}
// 修改的笔记(会排除掉今天创建的笔记)
if (modifiedToday.length > 0) {
dv.header(2, "Modified")
dv.table(["笔记", "修改时间"],
modifiedToday
.sort(p => p.modified_date)
.slice(0, displayNoteLimit)
.map(p => [
// dv.fileLink(p.file.name, p.title),
p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
dv.date(p.modified_date).toFormat("HH:mm")
])
)
}
// 我自己用的特殊目录,如果用不到的话可以不管这部分(删掉也行)
const collectedPages = dv.pages('"网络摘录"').filter(p => p.create_date && dv.date(p.create_date).toFormat(dateFormat) == curNoteName);
if (collectedPages.length > 0) {
console.log(collectedPages)
dv.header(2, "Collected")
dv.table(["笔记", "采集时间"],
collectedPages
.sort(p => p.create_date)
.slice(0, displayNoteLimit)
.map(p => [
// dv.fileLink(p.file.name, p.title),
p.title?`[[${p.file.name}|${p.title}]]`:p.file.link,
dv.date(p.create_date).toFormat("HH:mm")
])
)
}
Gist 页面: recentNotesInDaily.js (github.com)
改进点
- 在缺少显示内容时,占用页面更小,更美观
在缺少笔记显示的情况下,差别也很明显:
-
加载更快,体感老版每次都会让页面卡顿一下,新版的比较丝滑。
-
新版的脚本能保持「一致性」——使用的都是同一个 js 文件,如果做了修改或者更新,所有页面的内容都能同步更新。
老版的是用模板写死的,就一直固定是那个效果了。