generated at
外部リンクをscrapbox形式に変換するScriptいろいろ
改良ver.を作りました
改善点
ほぼすべての文字コードに対応
変換が高速になった
URLごとに変換方法を変えられるようになった
hr

使い方
下にあるコードを自分のページにコピペして下さい

dev版
こっちのほうが早くバグ修正されています

dependencies

Ctrl+Vに介入するver.
URL以外のものが混じっていたら何もしない
ctrlV.js
import {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.js
import {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}]`; }