日記を自動作成するUserScript
2024/5/6 13:44
日付がYYYY/MM/DDに完全一致する場合のみ、作成ダイアログを表示するように変更しました
翌日の記事を検索し、もし存在しなければ、自動で日記を作成します
作成する記事では、以下のテンプレートを読み込んで内容にセットします
{lastWeek}
, {yesterday}
, {tomorrow}
, {nextWeek}
を日付に置換します
導入手順
以下の update.js
をあなたのユーザーページからimportします
日記テンプレート
というタイトルの記事をあなたのプロジェクトに作ってください
コピペ用
script.jsimport "/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
}
})();