外部リンクをscrapbox形式に変換するScriptいろいろ
改良ver.を作りました
改善点
ほぼすべての文字コードに対応
変換が高速になった
URLごとに変換方法を変えられるようになった
使い方
下にあるコードを自分のページにコピペして下さい
dev版
こっちのほうが早くバグ修正されています
dependencies
Ctrl+Vに介入するver.
URL以外のものが混じっていたら何もしない
ctrlV.jsimport {convert} from '/api/code/takker/scrapbox-url-customizer/convert.js';
import {insertText} from '/api/code/takker/scrapbox-insert-text/script.js';
const cursor = document.getElementById('text-input');
cursor.addEventListener('paste', async (event) => {
const url = (event.clipboardData ?? window.clipboardData).getData('text');
if (!/^https?:\/\/\S+$/.test(url)) return;
if (/^https:\/\/scrapbox.io/.test(url)) return;
event.preventDefault();
const link = await convert(url);
insertText({text: link, cursor: cursor});
});
PopupMenuに追加するver.
popup.jsimport {convertWholeText} from '/api/code/customize/外部リンクをscrapbox形式に変換するScriptいろいろ/convert.js';
import {insertText} from '/api/code/customize/scrapbox-insert-text/script.js';
scrapbox.PopupMenu.addButton({
title: 'URL',
onClick: text => {
if (!/https?:\/\/\S+/.test(text)) return; // URLがなければ何もしない
const cursor = document.getElementById('text-input')
convertWholeText(text).then(text => insertText({text: text, cursor: cursor}));
// 選択範囲を先に消しておく
return '';
},
});
共通で使用する関数
convert.js// 複数のURLを含んだテキストをまとめて変換する
export async function convertWholeText(text) {
const urls = text.match(/https?:\/\/\S+/g) ?? [];
if (urls.length === 0) return undefined;
const links = await Promise.all(urls.map(url => convert(url)));
let map = {};
for (const originalUrl of urls) {
const i = urls.indexOf(originalUrl);
if (!links[i]) break;
map[originalUrl]= links[i];
}
//console.log(map);
const result = text.replace(/https?:\/\/\S+/g, match => map[match] ?? match);
//console.log(result);
return result;
}
// urlを外部リンク記法に変換する
export async function convert(url) {
if (!window.getUrlInfo) {
alert('Please install "getUrlInfo from https://scrapbox.io/takker/url-info-proxy"');
return;
}
const urlInfo = await window.getUrlInfo(`https://url-info.vercel.app/api/page?url=${url}`)
.then(req => req.response);
if(!urlInfo.title) return undefined;
return `[${urlInfo.url} ${urlInfo.title}]`;
}