DataviewJS待梳理

文件夹下日志标签文件

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])
})