logo
/
Dataview クエリ結果をマークダウンに変換する
autoUpdateAndPushTemplateテンプレートを実行するとファイル書き込み&git pushをするようにした
<%*
const dv = this.app.plugins.plugins["dataview"].api;

const publishCommand = app.commands.commands["obsidian-git:push"].callback;

// Add as many filenames and queries as you'd like!
const fileAndQuery = new Map([
  [
    "観たもの",
	 `TABLE created, star
	WHERE contains(file.outlinks, link("本")) or contains(file.outlinks, link("映画")) or contains(file.outlinks, link("アニメ")) or contains(file.outlinks, link("ドラマ"))
	SORT created`
  ],
]);

await fileAndQuery.forEach(async (query, filename) => {
  if (!tp.file.find_tfile(filename)) {
    await tp.file.create_new("", filename);
    new Notice(`Created ${filename}.`);
  }
  const tFile = tp.file.find_tfile(filename);
  const queryOutput = await dv.queryMarkdown(query);
  const fileContent = `---\npublish: true\n---\n#[[autoUpdateAndPushTemplate]] \n\n${queryOutput.value}\n\n[[観たもの~2021(日付不明)]]`;
  try {
    await app.vault.modify(tFile, fileContent);
    new Notice(`Updated ${tFile.basename}.`);
  } catch (error) {
    new Notice("⚠️ ERROR updating! Check console. Skipped file: " + filename , 0);
  }
});

publishCommand()
%>
  • git pushせずにただ反映させたい場合もある?
    • 動作確認以外はなさそうなのでよし
  • QueryのTableだと作成日とかがつぶれるのでJSでCard形式で並べたい
  • あんまり凝ったの作ってもしょうがないのでこれででいいかな
const result = await dv.query(`TABLE WITHOUT ID file.link as "タイトル" , created as 作成日
	WHERE startswith(file.folder, "blog") and file.name != "ブログ"
	SORT created`)
	
if(!result.successful)throw new Error();

result.value.values.map(([name,created])=>{
	dv.el("p", created, { attr: { style: "font-size:0.8em" } });
	dv.paragraph(name)
})

  • dv.elはその場の書き込みであって、queryMarkdownのような形にはできない?
    • await dv.queryMarkdown(dv.executeJS("dv.list([1,2,3])");はダメ
    • dv.markdownTableも違う
    • そういうのじゃなくて特定ファイルをターゲットにするみたいなのが必要
    • await app.vault.modify(tFile, dv.markdownTable(["File", "Genre", "Time Read", "Rating"], dv.pages("#book")))はエラー
      • でも多分この方向だと思う
    • いや?違うな markdownで書き込めるのはmarkdownかhtmlなんだから、それを自分で組み立てなきゃいけないんだ
      • ただしhtmlにするとそれはもうmarkdownじゃないからシステム側でパースができない(正確にはできるけど特別な処理をしないといけない)
これでいいや
// @ts-check

const dv = this.app.plugins.plugins.dataview.api;

const publishCommand = app.commands.commands["obsidian-git:push"].callback;
const currentFileName = "autoUpdateAndPushTemplate";

/** @type {{ filename: string, query: {type:'query',query:string}|{type:'function',query:()=>Promise<string>}, preContent: string, afterContent: string}[]} */
const fileAndQuery = [
	{
		filename: "観たもの",
		query: {
			type: "query",
			query: `
TABLE created, star
WHERE contains(file.outlinks, link("本")) or contains(file.outlinks, link("映画")) or contains(file.outlinks, link("アニメ")) or contains(file.outlinks, link("ドラマ"))
SORT created`,
		},
		preContent: `---\npublish: true\n---\n#[[${currentFileName}]] \n\n`,
		afterContent: "\n\n[[観たもの~2021(日付不明)]]",
	},
	{
		filename: "ブログ",
		query: {
			type: "function",
			query: async () => {
				const result = await dv.query(`
TABLE WITHOUT ID file.link as "タイトル" , created as 作成日
WHERE startswith(file.folder, "blog") and file.name != "ブログ"
SORT created`);

				if (!result.successful) throw new Error();
				const list = result.value.values
					.map(([name, created]) => {
						const yyyyMMdd = `${created.year}-${created.month.toString().padStart(2, "0")}-${created.day.toString().padStart(2, "0")}`;
						return `- ${yyyyMMdd} ${name}`;
					})
					.join("\n");

				console.log(list);
				return list;
			},
		},
		preContent: "",
		afterContent: `---\npublish: true\n---\n#[[${currentFileName}]] \n\n`,
	},
	{
		filename: "作ったもの",
		query: {
			type: "query",
			query: `
LIST 
WHERE startswith(file.name,"🏆")`,
		},
		preContent: "",
		afterContent: "\n\n(作ったもの少なすぎて草...)",
	},
];

for (const { filename, query, preContent, afterContent } of fileAndQuery) {
	if (!tp.file.find_tfile(filename)) {
		await tp.file.create_new("", filename);
		new Notice(`Created ${filename}.`);
	}
	const tFile = tp.file.find_tfile(filename);
	const queryOutput =
		query.type === "query"
			? (await dv.queryMarkdown(query.query)).value


			: await query.query();
	const fileContent = `${preContent ?? ""}${queryOutput}${afterContent ?? ""}`;
	try {
		await app.vault.modify(tFile, fileContent);
		new Notice(`Updated ${tFile.basename}.`);
	} catch (error) {
		new Notice(`⚠️ ERROR updating! Check console. Skipped file: ${filename}`, 0);
	}
}

publishCommand()