ブログ用のメタデータを追加する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 };
    }
}
サイトアイコン
公開日
更新日