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()