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