参加しているprojectの同名ページを検索するUserScript
コピーする際に相互にリンクしておけばいらないかも?
code:import.js
(async () => {
const {execute} = await import('/api/code/yosider-scripts/参加しているprojectの同名ページを検索するUserScript/script.js');
execute([
"yosider-private",
"AGI",
"programming-notes",
"villagepump",
]);
//execute([
// "villagepump",
// "shokai",
// "nishio",
// "rashitamemo",
//]);
})();
code:script.js
const id = "OtherProjects";
export async function execute(extraProjects = []) {
//const response = await fetch('/api/projects'); // 参加しているprojects
//const json = await response.json();
const projects = [...new Set([
...extraProjects,
//...json.projects.map(({name}) => name),
])
].filter(project => project !== scrapbox.Project.name); // 現在のprojectは除く
scrapbox.PageMenu.addMenu({
title: id,
onClick: async () => {
const menu = scrapbox.PageMenu(id);
menu.removeAllItems();
menu.emitChange();
const isFound = await Promise.all(projects.map(project => addItem(project, menu)));
if (isFound.some(i => i)) return;
menu.addItem({ title: 'No page found.', onClick: () => {} });
},
});
}
async function addItem(project, menu) {
const response = await fetch(/api/pages/${project}/${scrapbox.Page.title}); // 同名ページを取得
if (!response.ok) return false;
// pageが無いとき、参加していないprojectでは404だが、参加しているprojectでは空ページが返ってくる
// タイトルを除いて1行以内かつ1行目が空のとき、空ページだと判断する
const {lines} = await response.json();
if (lines.length < 3 && !lines1?.text) return false; menu.addItem({
title: /${project}/${scrapbox.Page.title},
onClick: () =>
window.open(
https://scrapbox.io/${project}/${scrapbox.Page.title}
),
});
return true;
}
ヒットするページでクリックした後、ヒットしないページでクリックすると、前のページでの結果が残ったままになる
removeAllItem()する前にポップアップが表示されていて、removeAllItem()しても表示は更新されない?
同じページの中でポップアップを開き直しても表示は更新されない
addItem()すると表示が更新されるので前のページでの結果は消える
ページを再び遷移すると表示が更新され、removeAllItemが反映される