generated at
日記を自動作成するUserScript
2024/5/6 13:44
日付がYYYY/MM/DDに完全一致する場合のみ、作成ダイアログを表示するように変更しました
hr


日記を自動作成するUserScript

翌日の記事を検索し、もし存在しなければ、自動で日記を作成します
作成する記事では、以下のテンプレートを読み込んで内容にセットします
{lastWeek} , {yesterday} , {tomorrow} , {nextWeek} を日付に置換します

導入手順
以下の update.js をあなたのユーザーページからimportします
日記テンプレート というタイトルの記事をあなたのプロジェクトに作ってください

コピペ用
script.js
import "/api/code/public-minaph/日記を自動作成するUserScript/update.js";

以下を利用しています

update.js
/** * @author Yuki Minoh <script.yuki.minoh@gmail.com> * @license MIT */ import { informedJump } from "/api/code/public-minaph/ユーザーに予告してから優しくジャンプするUserScript_V2/informedJump.js"; (async () => { /** * @typedef {Object} ScriptLoc * @property {string} PROJ - Project name * @property {string} PAGE - Page name * @property {string} FILE - File name */ /** * @typedef {Object} ScriptMetaInfo * @property {ScriptLoc} src - Where the script is written * @property {ScriptLoc} tgt - Where the script is imported */ /** * @type {ScriptMetaInfo} */ const __meta = (() => { // [str, str, str] let [PROJ, PAGE, FILE] = new URL(import.meta.url).pathname.split("/").slice(3); return { src: {PROJ, PAGE, FILE}, tgt: { get PROJ() {return scrapbox.Project.name}, // str get PAGE() {return scrapbox.Page.title}, // str | null FILE: null } } })(); var d = new Date(); const created = await makeDatePage(d); scrapbox.on("page:changed", async () => { const isDatePageTitle = /^\d{4}\/\d{2}\/\d{2}$/.test(__meta.tgt.PAGE); if (!created && isDatePageTitle){ const pageDate = new Date(__meta.tgt.PAGE); const pageExists = await datePageExists(pageDate); if(!pageExists){ const prev = new Date( pageDate.getFullYear(), pageDate.getMonth(), pageDate.getDate() - 1 ) if(confirm("This page doesn't exist. Create new one ?")){ makeDatePage(prev); } } } }); async function datePageExists(date){ if (date instanceof Date){ date = toYYYYMMDD(date) } var url = `/api/pages/${__meta.tgt.PROJ}/${encodeURIComponent(date)}`; var check = await fetch(url + "/text").catch(); return check.status !== 404 } function toYYYYMMDD (d) { return d .toLocaleDateString("ja-JP") .split("/") .map(x=>x.padStart(2,0)) .join("/"); } async function makeDatePage(d) { var date = toYYYYMMDD(new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1)); var nextDate = toYYYYMMDD(new Date(d.getFullYear(), d.getMonth(), d.getDate() + 2)); var lastWeek = toYYYYMMDD(new Date(d.getFullYear(), d.getMonth(), d.getDate() - 6)); var nextWeek = toYYYYMMDD(new Date(d.getFullYear(), d.getMonth(), d.getDate() + 8)); if(await datePageExists(date)){ return false } var template = await ( await fetch(`/api/pages/${__meta.tgt.PROJ}/日記テンプレート/text`) ).text(); var body = encodeURIComponent( template .replaceAll("{yesterday}", toYYYYMMDD(d)) .replaceAll("{tomorrow}", nextDate) .replaceAll("{lastWeek}", lastWeek) .replaceAll("{nextWeek}", nextWeek) .replaceAll("日記テンプレート\n", "") ); informedJump(`/${__meta.tgt.PROJ}/${encodeURIComponent(date)}?body=${body}`); return true } })();