telomereを維持して別projectにページをexportするUserScript
移した
用途
仕様
実行すると、そのページに含まれている全てのリンク先のページデータを一つのJSON fileにまとめ、downloadする
更新履歴
直接json dataをdownloadできるようにした
コピペ→ファイル作成の手間を省く
実装
使ってない
空リンクを除くようにした
ページ中の全てのリンクを抽出するようにした
追加したい機能
行ごとにリンクを一つ書くのではなく、文中のすべてのリンクを抽出するようにする
/\[([^\[!"#%&'()\*\+,\-\.\/\{\|\}<>_~][^\[\]]*)\]/g
そっちにした
直接json dataをdownloadできるようにしたい
bookmarklet.jsjavascript:(()=>{let s=document.createElement("script");s.src='https://scrapbox.io/api/code/takker/telomereを維持して別projectにページをimportするUserScript/script.js';document.body.appendChild(s);})()
script.jsjavascript:(async() => {
if(document.domain !== 'scrapbox.io') return;
const importSource = `/api/pages/${scrapbox.Project.name}/${scrapbox.Page.title}`;
let exportPages = {pages: []};
const promises = await fetch(importSource)
.then(response => response.json())
.then(json => json.links)
// 空リンクを除外
.then(links => links.filter(link =>
scrapbox.Project.pages.find(page => page.title == link || page.titleLc == link)
?.exists))
.then(names => {console.log(names); return names;})// debug用
// import用page dataを作成
.then(names => names.map(pageName =>
fetch(`/api/pages/${scrapbox.Project.name}/${encodeURIComponent(pageName)}`)
.then(response => response.json())
.then(json => exportPages.pages.push({
title: json.title,
created: json.created,
updated: json.updated,
lines: json.lines
})))
);
Promise.all(promises).then(_ => {
script.js const blob = new Blob([JSON.stringify(exportPages,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);
});
})();
開いているページそのものをexportするversion
bookmarklet2.jsjavascript:(()=>{let s=document.createElement("script");s.src='https://scrapbox.io/api/code/takker/telomereを維持して別projectにページをexportするUserScript/script2.js';document.body.appendChild(s);})()
script2.jsjavascript:(async() => {
if(document.domain !== 'scrapbox.io') return;
const targetPage = `/api/pages/${scrapbox.Project.name}/${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);
})();
Reference
実装メモ
存在しないページの検知は組み込んでいない
開いたタブのsource codeからコピーしないとうまく行かないときがある
タグをhtmlとして認識してしまうとき
対策:タグをescapesする
cf.
コメント欄が参考になる
2020-09-03 04:39:07 できた
2020-09-03 04:39:17 実装した
05:20:06 この方法もダメっぽい
別にhighlightする必要はないからいいや。