特定のページのみを含んだexport用dataを生成するbookmarklet
用途
仕様
実行すると、そのページに含まれている全てのリンク先のページデータを一つのJSON fileにまとめ、downloadする
空リンク・外部プロジェクトのリンク・外部リンクは除く
更新
2021-08-03
19:47:20 refactoring
19:41:07 開いているページそのものをexportするversionを追加した
2020-09-25 13:48:06 URLに用いるページタイトルを正しくescapeするようにした
bookmarklet.jsjavascript:(()=>{let s=document.createElement("script");s.src='https://scrapbox.io/api/code/customize/特定のページのみを含んだexport用dataを生成するbookmarklet/script.js';document.body.appendChild(s);})()
script.jsjavascript:(async () => {
if(document.domain !== 'scrapbox.io') return;
// ページ内の全リンクを取得
const res = await fetch(
`/api/pages/${scrapbox.Project.name}/${encodeURIComponent(scrapbox.Page.title)}`
);
const {links} = await res.json();
// 空リンクを除いて、URL用タイトルを取得する
const titles = links.flatMap(link => {
const page = scrapbox.Project.pages.find(page => page.title == link || page.titleLc == link);
return page?.exists ? [page.titleLc] : [];
});
// debug用
console.log(titles);
// export用page dataを作成
const promises = titles.map(async pageName => {
const res2 = await fetch(
`/api/pages/${scrapbox.Project.name}/${encodeURIComponent(pageName)}`
);
const {title, created, updated, lines} = await res2.json();
return {title, created, updated, lines};
});
const exportPages = {pages: await Promise.all(promises)};
script.js const blob = new Blob(
[JSON.stringify(exportPages)],
{type: 'application/json'}
); // download dataを作成
const url = window.URL.createObjectURL(blob); // download linkを生成
// 同一scrapbox pageに隠しa要素を作り、それを踏んでdownloadを実行する
const a = document.createElement('a');
a.href = url;
a.download = 'import.json';
a.style.display = 'none';
document.body.appendChild(a);
// downloadを実行
a.click();
// 後始末
window.URL.revokeObjectURL(url);
a.parentNode.removeChild(a);
})();
開いているページそのものをexportするversion
bookmarklet2.jsjavascript:(()=>{let s=document.createElement("script");s.src='https://scrapbox.io/api/code/customize/特定のページのみを含んだexport用dataを生成するbookmarklet/script2.js';document.body.appendChild(s);})()
script2.jsjavascript:(async() => {
if(document.domain !== 'scrapbox.io') return;
const targetPage = `/api/pages/${scrapbox.Project.name}/${encodeURIComponent(scrapbox.Page.title)}`;
const response = await fetch(targetPage);
const json = await response.json();
const exportData = {pages: [{
title: json.title,
created: json.created,
updated: json.updated,
lines: json.lines,
},],};
const blob = new Blob([JSON.stringify(exportData,null,' ')],
{type: 'octet/stream'}); // download dataを作成
const url = window.URL.createObjectURL(blob); // download linkを生成
// 同一scrapbox pageに隠しa要素を作り、それを踏んでdownloadを実行する
const a = document.createElement('a');
a.href = url;
a.download = 'import.json';
a.style.display = 'none';
document.body.appendChild(a);
// downloadを実行
a.click();
// 後始末
window.URL.revokeObjectURL(url);
a.parentNode.removeChild(a);
})();