ブログ用のメタデータを追加するCusomJSスクリプト
作成日
更新日
001_Config/src/addBlogMetadata.js
に配置
ホットキーの設定
cmd + shift + b
で追加
コード
class BlogMetadata {
async invoke() {
try {
let file = app.workspace.getActiveFile();
if (!file) {
new Notice("開いているファイルがありません。", 5000);
return;
}
const filePath = file.path;
const fileName = file.basename;
let content = await app.vault.read(file);
const now = new Date();
const formattedNow = new Intl.DateTimeFormat("ja-JP", {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
timeZone: "Asia/Tokyo",
calendar: "gregory",
}).format(now).replace(/\//g, "-").replace(",", "");
const metadata = this.checkMetadata(filePath, content);
let createdDate = metadata.createdDate || formattedNow;
// YAML フロントマターが存在するかチェック
const hasFrontmatter = /^---\n/.test(content);
let metadataBlock = hasFrontmatter
? content.match(/^---\n([\s\S]*?)\n---/)?.[1] || ""
: "";
const metadataLines = metadataBlock.split("\n").filter(line => line.trim().length > 0);
const existingKeys = metadataLines.map(line => line.split(":")[0].trim());
// 必要なメタデータを追加(存在しない場合のみ)
const requiredFields = {
updatedDate: formattedNow,
createdDate: createdDate,
private: true,
title: "",
slug: "",
coverImage: "",
outdated: false,
archived: false,
};
for (const [key, value] of Object.entries(requiredFields)) {
if (!existingKeys.includes(key)) {
metadataLines.unshift(`${key}: ${value}`);
} else if (key === "updatedDate") {
// updatedDate は上書き
const index = metadataLines.findIndex(line => line.startsWith("updatedDate:"));
metadataLines[index] = `updatedDate: ${formattedNow}`;
}
}
const newFrontmatter = `---\n${metadataLines.join("\n")}\n---\n`;
// フロントマターの再構築
if (hasFrontmatter) {
content = content.replace(/^---\n([\s\S]*?)\n---\n/, newFrontmatter);
} else {
content = newFrontmatter + content;
}
await app.vault.modify(file, content);
new Notice(`「${fileName}」のメタデータを更新しました。`);
} catch (error) {
new Notice("Error occurred: " + error.message, 5000);
console.error(error);
}
}
checkMetadata(filePath, content) {
const hasUpdatedDate = /^updatedDate: .*/m.test(content);
const hasCreatedDate = /^createdDate: .*/m.test(content);
const hasPrivate = /^private: .*/m.test(content);
const metadata = app.vault.getAbstractFileByPath(filePath);
let createdDate = null;
if (metadata && metadata.stat) {
const createdDateRaw = new Date(metadata.stat.ctime);
createdDate = new Intl.DateTimeFormat("ja-JP", {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
timeZone: "Asia/Tokyo",
calendar: "gregory",
}).format(createdDateRaw).replace(/\//g, "-").replace(",", "");
}
return { hasUpdatedDate, hasCreatedDate, hasPrivate, createdDate };
}
}

公開日
更新日