Obsidian 插件篇 -Dataview 脚本收集汇总
前文的 Obsidian插件篇-DataviewJS参考示例,或是经过本人使用验证或是本人改写分享,实测可用。而本篇文章主要分享一下收集汇总后的 dataviewjs 脚本,未经验证,仅作收集参考。
文件夹下日志标签文件
//相同DailyNote标题下的笔记列表
dataviewjs
const term = "日常记录"
const files = dv.pages(`"600-日常"`).filter(p=>String(p.tags).includes("日记")).sort(p=>p.file.name)
const b = files.map(async function(p){
var x = await app.vault.readRaw(p.file.path);
x = x.split("\n### ").filter(p=>p.slice(0,term.length)==term)[0];
dv.paragraph("## "+p.file.name+"\n\`\`\`ad-note\ntitle: DailyNote\n"+x.slice(term.length)+"\n\`\`\`");
}
)
任务统计
dataviewjs
//任务Table
let page = dv.pages('"Calendar"');
let task = page.file.tasks;
let all_unfinished_task_num = task.where(t => !t.completed).length;
let all_unfinished_due_task = task.where(t => !t.completed && t.due && t.due < dv.date("today"));
let all_unfinished_due_task_num = all_unfinished_due_task.length;
let all_unfinished_todue_task = task.where(t => !t.completed && t.due && t.due >= dv.date("today")).sort(t => t.due);
let all_unfinished_todue_task_num = all_unfinished_todue_task.length;
let task_in_5_day = all_unfinished_todue_task.where(t=> !t.completed && t.due && (((t.due - dv.date("today") )/(1000 * 60 * 60 * 24))<5 ) ).sort(t => t.due);
let task_in_30_day = all_unfinished_todue_task.where(t=> !t.completed && t.due && (((t.due - dv.date("today") )/(1000 * 60 * 60 * 24))<30 ) ).sort(t => t.due);
let task_beyond_30_day = all_unfinished_todue_task.where(t=> !t.completed && t.due && (((t.due - dv.date("today") )/(1000 * 60 * 60 * 24))>30 ) );
dv.table(["历史未完成任务","超期任务","待办任务"],[[all_unfinished_task_num,all_unfinished_due_task_num,all_unfinished_todue_task_num]]);
dv.header(1,"超期任务");
dv.taskList(all_unfinished_due_task);
dv.header(1,"5天内待办任务");
dv.taskList(task_in_5_day);
dv.header(1,"30天内待办任务");
dv.taskList(task_in_30_day);
dv.header(1,"超过30天内待办任务");
dv.taskList(task_beyond_30_day);
倒计时
dataviewjs
// 只要在任务后边加上时间(格式为 2020-01-01 ,就会在显示所有的任务的同时对应生成对应的倒计时之差
dv.paragraph(
dv.pages("").file.tasks.array().map(t => {
const reg = /\d{4}\-\d{2}\-\d{2}/;
var d = t.text.match(reg);
if (d != null) {
var date = Date.parse(d);
return `- ${t.text} -- ${Math.round((date - Date.now()) / 86400000)}天`
};
return `- ${t.text}`;
}).join("\n")
)
输出所有带有标签的文件名以及对应行且形成表格
dataviewjs
//输出所有带有标签的文件名以及对应行且形成表格,有问题
// 修改标签
const tag = "#status"
// 获取 Obsidian 中的所有 Markdown 文件
const files = app.vault.getMarkdownFiles()
// 将带有标签的文件筛选出来
const taggedFiles = new Set(files.reduce((acc, file) => {
const tags = app.metadataCache.getFileCache(file).tags
if (tags) {
let filtered = tags.filter(t => t.tag === tag)
if (filtered) {
return [...acc, file]
}
}
return acc
}, []))
// 创建带有标签的行数组
const arr = Array.from(taggedFiles).map(async(file) => {
const content = await app.vault.cachedRead(file)
const lines = await content.split("\n").filter(line => line.includes(tag))
return [file.name, lines]
})
// 生成表格
Promise.all(arr).then(values => {
dv.table(["file", "lines"], values)
})
dataviewjs
// 获取 Obsidian 中的所有 Markdown 文件
const files = app.vault.getMarkdownFiles()
// 将带有标签的文件以及行筛选出来
let arr = files.map(async(file) => {
const content = await app.vault.cachedRead(file)
//turn all the content into an array
let lines = await content.split("\n").filter(line => line.includes("#tag"))
return ["[["+file.name.split(".")[0]+"]]", lines]
})
// 生成表格,如果要将当前的文件排除的话,请修改其中的排除文件
Promise.all(arr).then(values => {
console.log(values)
//filter out files without "Happy" and the note with the dataview script
const exists = values.filter(value => value[1][0] && value[0] != "[[排除文件]]")
dv.table(["file", "lines"], exists)
})
输出所有带有标签 todo 以及未完成的任务
dataviewjs
// 修改其中的标签 todo
dv.taskList(
dv.pages("").file.tasks
.where(t => t.text.includes("#todo") && !t.completed),1)
dataviewjs
//输出所有带有标签 todo 以及未完成的任务,且不包含当前文件
// 修改其中的标签 todo 以及修改 LOLOLO
dv.taskList(
dv.pages("").where(t => { return t.file.name != "LOLOLO" }).file.tasks
.where(t => t.text.includes("#todo") && !t.completed),1)
文件夹下标签按指定顺序排列显示
dataviewjs
const dvPages = dv.pages('"6.Spaces/MySQL"')
let segs = []
let letters = "*abcdefghjklmnopqrstwxyz".toLocaleUpperCase().split('')
let zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split('')
var isNumber = function(temp){
let re = /[0-9]/
return re.test(temp)
}
var isChar = function(temp){
let re = /[a-zA-Z]/
return re.test(temp)
}
var isChinese = function(temp){
let re = /[^\u4E00-\u9FA5]/
return re.test(temp) ? false : true // 匹配的中文结果为false,非中文结果为true,故此处理
}
letters.forEach((e,i) => {
let key = (e == "*") ? "0~9" : e
let curr = {letter: key, data: new Array()}
dvPages.forEach(b => {
let tags = b.file.tags
tags.map(t => {
let initial = t.charAt(1)
if(i == 0 && isNumber(initial)){ // 统计数字部分
curr.data.push(t)
}else if(i != 0 && isChar(initial)
&& e == initial.toLocaleUpperCase()){// 统计字母A-Z部分
curr.data.push(t)
}else if(i != 0 && isChinese(initial)){
if(initial.localeCompare(zh[i]) == -1 && (!zh[i-1]
|| zh[i-1].localeCompare(initial) <= 0)){// 统计中文部分
curr.data.push(t)
}
}
})
})
if(curr.data.length > 0){
curr.data.sort() // 将每个字母对应的数据进行排序
segs.push(curr)
}
})
segs.forEach(e => {
dv.list([e.letter])// 输出,可采用心仪的方式
dv.list([e.data])
})