UserScripts
code: script.js
import("https://scrapbox.io/api/code/nldlii/UserScripts/template.js");
import("https://scrapbox.io/api/code/nldlii/UserScripts/alt-formats.js");
import("https://scrapbox.io/api/code/nldlii/UserScripts/amazon.js");
/yozba/yozbaUserScripts
code: template.js
/* https://scrapbox.io/ci7lus-diary/ci7lus */
/* MIT License Copyright (c) 2020 ci7lus */
export const importExternalJs = async (url) =>
new Promise((res, rej) => {
if (document.querySelector(script[src="${url}"])) res()
const script = document.createElement("script")
script.src = url
script.addEventListener("load", res)
script.addEventListener("error", rej)
document.body.appendChild(script)
})
importExternalJs("https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.8.36/dayjs.min.js");
export function insertText({text}) {
const cursor = document.getElementById('text-input');
cursor.focus();
const start = cursor.selectionStart; // in this case maybe 0
cursor.setRangeText(text);
cursor.selectionStart = cursor.selectionEnd = start + text.length;
const uiEvent = document.createEvent('UIEvent');
uiEvent.initEvent('input', true, false);
cursor.dispatchEvent(uiEvent);
}
scrapbox.PageMenu.addMenu({
title: DailyReport,
image: "https://cdnjs.cloudflare.com/ajax/libs/twemoji/12.0.4/svg/1f4dd.svg",
onClick: () => {
if (!scrapbox.Page.lines || !scrapbox.Page.lines.length == 1) return
const input = prompt(
"日報テンプレートを展開したい日付を相対(d+)または絶対(2020-1-1)で(入力なしで今日)"
)
if (input === null) return
const diff = parseInt(input.trim() || 0)
const abs = input.split("-").length === 3 && dayjs(input)
if ((Number.isNaN(diff) && !abs) || (abs && !abs.isValid())) return
const today = abs
? abs.startOf("days")
: dayjs().startOf("days").add(diff, "days")
const yesterday = today.clone().subtract(1, "days")
const tomorrow = today.clone().add(1, "days")
console.log(today.format(), yesterday.format(), tomorrow.format())
const conf = confirm(対象の日付は ${today.format("YYYY.MM.DD")} ですか?)
if (!conf) return
insertText({
text:
`${today.format("YYYY.MM.DD")}
<- ${tomorrow.format("YYYY.MM.DD")} / ${today.format("YYYY.MM")} / ${yesterday.format("YYYY.MM.DD")} ->
<- ${tomorrow.format("YYYY.MM.DD")} / ${today.format("YYYY.MM")} / ${yesterday.format("YYYY.MM.DD")} ->
#_big`
,})
},
})
code: alt-formats.js
scrapbox.TimeStamp.removeAllFormats()
scrapbox.TimeStamp.addFormat("YYYY.MM.DD")
code:amazon.js
scrapbox.PopupMenu.addButton({
title: '📚BookInfo',
onClick: text => {
// AmazonのURLからASIN(ISBN)を抽出する正規表現
// dp/XXXXXXXXXX または gp/product/XXXXXXXXXX などを想定
const asinMatch = text.match(/(?:\/dp\/|\/gp\/product\/|\/ASIN\/)(\w{10})/);
if (!asinMatch) {
// ASINが見つからない場合は何もしない
return text;
}
const isbn = asinMatch1;
// OpenBD APIを叩いて情報を取得する
// 戻り値はPromiseを返すことで Scrapboxが解決を待ってくれる
return fetch(https://api.openbd.jp/v1/get?isbn=${isbn})
.then(res => res.json())
.then(json => {
if (json && json0) {
const data = json0;
const summary = data.summary;
// 書影がない場合は空文字
const coverUrl = summary.cover ? [${summary.cover}] : '(書影なし)';
const title = summary.title || '';
const author = summary.author || '';
const publisher = summary.publisher || '';
// ここで出力フォーマットをいじる
// 例: 画像 『タイトル』 著者 (出版社)
return ${coverUrl} \n『${title}』 ${author} (${publisher})\n${text};
} else {
// OpenBDにデータがなかった場合のフォールバック
// Amazonの画像URLルールを使って無理やり画像だけ出すことも可能だが
// 一旦エラーメッセージを返すか 元のテキストを返す
return (情報が見つかりませんでした: ${isbn}) ${text};
}
})
.catch(e => {
console.error(e);
return text;
});
}
});