eval
https://gyazo.com/6160b57ef1de41af0b7e75231877ea2d
使い方
evalは危ないらしいからご利用は自己責任で...
選択した所にeval()があったらeval()の中だけをevalして置換
https://gyazo.com/c40ac4894fb6b9afd5033be690c90654
1行内だけならそれをevalして置換
https://gyazo.com/9c5e188ff1256a1a76317f2b7b031f2f
複数行なら最後の行を評価して置換
https://gyazo.com/84f02da032aa4b16db303c4088a174ec
テスト用文章
今日の当番はeval( Math.floor(Math.random() * 10) ) 番の人です
割り勘 eval( (400 * 3 + eval("500 + 12")) / 8 )円
ところでフィボナッチ数10は eval( let fib = n => ( n <= 1)? 1 : fib( n -1) + fib(n - 2);fib(10) ) です
let fib = n => (n <= 1)? 1 : fib(n-1) + fib(n-2);
fib(10) + fib(3) + fib(20)
code:script.js
scrapbox.PopupMenu.addButton({
title: 'eval',
onClick: text => {
let evalTexts = text => {
if (text.indexOf('\n') !== -1) {
let lines = text.split('\n');
let foundLast = false;
text = lines.reverse().map(line => {
if (foundLast || line.match(/^\s*$/)) return line;
if (line.indexOf('return') !== -1) {
foundLast = true;
return line;
}
foundLast = true;
returnreturn ${line};
}).reverse().join('\n');
text = (()=>{\n${text}\n})();
}
return eval(text).toString()
}
if (text.indexOf('eval(') === -1) {
return evalTexts(text);
}
let getEvalableText = text => {
let splitedText = text.split('eval(', 1);
let Ltext = splitedText0; let Rtext = text.slice(Ltext.length + 5, text.length);
let nest = 1;
for (let i = 0; i < Rtext.length; i++) {
case '(':
nest++;
break;
case ')':
nest--;
break;
}
if (nest <= 0) {
let center = Rtext.slice(0, i)
let right = Rtext.slice(i + 1, Rtext.length);
return {
left: Ltext,
center,
right,
}
}
}
return {
left: Ltext,
center: Rtext,
right: "",
}
}
let result = "";
for (let c = 0; c < 100; c++) {
if (text.indexOf('eval(') === -1) {
result += text;
break;
}
let s = getEvalableText(text);
result += s.left;
result += evalTexts(s.center);
text = s.right;
}
return result;
}
})