makePageInNewTab
project名、ページのtitle、textを受け取ってPromiseを返却します
window.openを使って新規windowでページにアクセスすることでページを作ります
titleの指定がなければあたらしいページを作成します
元のページに戻ってくるのが特徴
window.openで開いたあとにページをcloseできるのを利用している
2021/12/3
limitを追加し、成功・失敗を示すPromiseを返却するようにしました
名前を変更しました
成功判定を厳格にしました
Android タブレットからうまく作動しない
特にプロジェクトをまたぐ場合
code:script.js
export function makePageInNewTab(project, title, text, limit = 0) {
const url = https://scrapbox.io/${_project}/${_title || "new"}?body=${_text};
return innerCall("popup").catch(message => new Promise((res, rej) => {
if(message === "handler not found") {
res(innerCall(null));
} else {
rej(message)
}
}));
function innerCall(mode) {
const handler = window.open(url, "", mode);
return new Promise((res, rej) => {
let id = null;
if(! handler) {
rej("handler not found");
} else if (limit) {
id = setTimeout(() => {
handler.close();
rej("limit");
}, limit);
}
//handler.addEventListener("load", () => {
handler.onload = () => {
if (!handler.scrapbox) {
rej("scrapbox not found")
handler.close();
}
handler.scrapbox.on("saved", () => {
if (id !== null) {
clearTimeout(id);
}
handler.close();
res("ok");
});
watchSavingStatus(handler.document, handler.scrapbox);
};
});
}
}
code:test.js
//import {makePageAndClose} from "script.js"
var alt = data => alert(JSON.stringify(Object.getOwnPropertyDescriptors(data), null, 4));
//(async () => alt(await ))();
import(/api/code/${scrapbox.Project.name}/${scrapbox.Page.title}/script.js).then(async ({makePageInNewTab}) => {
makePageInNewTab(scrapbox.Project.name, scrapbox.Page.title, "text").then(alert, alert);
});
//