ScrapCalc
/masui/ScrapCalcを元にGemini 2.5 Pro.iconがエラー箇所を出すようにしたもの
code:script.js
// Scrapbox UserScript: Simple ScrapCalc
// calculates expressions in elements with class 'deco-%'. Press Ctrl+C to toggle.
const RESULT_CLASS = "scrapcalc_result";
const PROCESSED_CLASS = "scrapcalc_exp";
function scrapcalc_exec() {
scrapcalc_reset(); // 既存の結果があればクリア
document.querySelectorAll('.deco-\\%').forEach(e => {
let text = e.innerText;
let expr = '';
try {
// 式を準備 (decodeURIが必要ない場合は下の行を使用)
expr = decodeURI(text).replaceAll('[', '').replaceAll(']', '');
// expr = text.replaceAll('[', '').replaceAll(']', ''); // decodeURIしない場合
// 式が空や空白文字のみならスキップ
if (!expr || expr.trim() === '') return;
if (text.match(/=/)) {
// '=' が含まれる場合は式を実行するだけ
(0, eval)(expr);
} else {
// '=' が含まれない場合は計算して結果を表示
let result = (0, eval)(expr);
let span = document.createElement('span');
span.className = RESULT_CLASS;
span.textContent = result;
e.parentNode.insertBefore(span, e.nextSibling);
e.classList.add(PROCESSED_CLASS);
e.style.display = 'none'; // 元の要素を隠す
}
} catch (error) {
// エラー発生時はコンソールに出力し、その要素はスキップ
console.error('ScrapCalc Error:', error.message, 'Expression:', expr, 'Element:', e);
}
});
}
function scrapcalc_reset() {
// 結果表示用spanを削除
document.querySelectorAll('.' + RESULT_CLASS).forEach(span => span.remove());
// 元の要素を再表示し、クラスを削除
document.querySelectorAll('.' + PROCESSED_CLASS).forEach(e => {
e.style.display = ''; // 元のdisplayスタイルに戻す
e.classList.remove(PROCESSED_CLASS);
});
}
// --- Event Listener ---
// 既存のリスナーがあれば上書きしないように、一度削除してから追加するなどの工夫も可能だが、
// シンプルにするため、ここではそのまま追加する。
// 必要であれば、リスナーが重複しないような処理を追加してください。
document.addEventListener('keydown', e => {
// Ctrl+C (または Cmd+C on Mac)
if (e.key === 'c' && (e.ctrlKey || e.metaKey)) {
// Scrapboxの入力エリア内でCtrl+Cが効かなくなるのを防ぐため、
// イベントが発生した要素が入力要素でないことを確認する
const target = e.target;
if (target.isContentEditable || target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
// 入力エリア内なら何もしない
return;
}
e.preventDefault(); // デフォルトのコピー動作などをキャンセル
// 結果が表示されている要素が1つでもあればリセット、なければ実行
if (document.querySelector('.' + RESULT_CLASS)) {
scrapcalc_reset();
} else {
scrapcalc_exec();
}
}
});
console.log('ScrapCalc Loaded. Press Ctrl+C outside input areas to execute/reset.');