リンクにつながっているページを芋づる式に探して出力するbookmarklet
/emoji/warning.iconbrowserが応答なしになるので非推奨です
計算がめちゃくちゃ重い
2 hopまでなら大した計算量ではないんですけどね……
3 hopはやりすぎでした……
大量のリンクがページに書き込まれる
用途
一気にリンクを書き出して、その中から必要なものを順次取り出す
全部を手動で貼り付けようとすると時間かかるし面倒
2020-10-22 07:24:59 実装を変える
search/titlesを用いる
ページ数が爆発的に増えても問題ない
仕様
発動すると、ページに含まれているリンクにつながっているページをすべて引き出して新しいページに書き出す
逆リンク・順リンクは問わず、つながっているページををすべて列挙する
深さを指定可能
既定では3 hop先まで取得するようにした
実装
code:bookmarklet.js
code:bookmark.js
javascript:(async() => {
if(document.domain !== 'scrapbox.io') return;
// 最初に全ページのリンクデータを取得する
const getAllLinkData = async () => {
const pages = [];
let followingId = null;
do {
const param = followingId === null ? '' : ?followingId=${followingId};
const res = await fetch(
https://scrapbox.io/api/pages/${scrapbox.Project.name}/search/titles${param}
);
followingId = res.headers.get('X-Following-Id');
pages.push(...(await res.json()));
} while (followingId);
return pages;
};
// 指定したページデータとページタイトル、リンク先ページと被リンク先ページの両方を集めたページタイトルのリストを返す
const get1hopLinks = (pages, title) => {
const links = pages.find(page => page.title === title)?.links ?? [];
const linkeds = pages.filter(page => page.links.some(link => link === title))
.map(page => page.title);
}
console.log('loading page data...');
const linkData = await getAllLinkData();
console.log('Got all page data.');
let foundLinks = [];
// リンクを再帰的に検索する
console.log(Got ${links.length} ${i}-hop links.);
targetLink = links;
}
console.log(Found ${foundLinks.size} links.);
// 空リンクを除外する
console.log('Removing empty links...');
const existedTitles = new Set(scrapbox.Project.pages
.filter(page => page.exists && !page.title.includes('🆖PIRACY'))
.map(page => page.title));
.filter((title, i) => {
if (existedTitles.has(title)) {
console.log([${i}]Found '${title}');
return true;
}
return false;
});
console.log(Output ${results.length} links);
const lines = results.map(link => [${link}]);
const e = a => encodeURIComponent(a);
window.open(https://scrapbox.io/${scrapbox.Project.name}/temporary_page_${new Date()}?body=${e(lines.join('\n'))});
})();