数式にするPopupMenu
$で始まって、$か改行で終わる部分を数式記法にする
$x$のようなテキストを[$ x ]のように置換する
文章中に出てくる数式$ f(x) や変数$ x にちまちま適用するのはめんどくさかったあんも.icon
すでに数式記法になっている部分を選択すると期待する動作にならない
ので、うまく避けて選択する
code:script.js
scrapbox.PopupMenu.addButton({
title: "$TeX$",
onClick: text => {
const result = text.split(/\n/)
.map(line => line.replace(/\$(.+?)(\$)/g, '\$ $1 ')).join('\n'); // テロメアが無駄に更新されるのを防ぐ
if(text == result) return;
return result;
}
});
テスト
$\frac{355}{113}$
文章中の数式$f(x)$と変数$x$
末尾に$がない場合
複数行の場合ははたらかない
$a
b$
$\begin{array}{|c|c|c|}
\hline
P & Q & P \veebar Q \\
\hline
0 & 0 & 0 \\
0 & 1 & 1 \\
1 & 0 & 1 \\
1 & 1 & 0 \\
\hline
\end{array}$
正規表現: /\$(.+?)(\$|$)/g
/正規表現/g
JavaScriptの正規表現リテラルはスラッシュ/で囲まれる
gフラグで全てのマッチを検出する
フラグなしの場合は最初のマッチのみ検出する
\$
\ でエスケープして$を表現する
(.+?)
1文字以上の任意の文字列を検索する
.: 任意の文字
+: 1回以上の繰り返し
?: 直前の要素の最小マッチ
貪欲ではないマッチ
(\$|$)
$または文字列の終端$を検索する
改行で分割しているので、終端が改行になっている
|: 「または」
code:js
scrapbox.PopupMenu.addButton({
title: (text) => text.includes("\n") ? "" : "$ TeX",
onClick: text =>{
text=text.split(/\n/).map(line => line.replace(/(.+)/g,'\\$ $1 \')).join('\n') return text;
}
})
TeX記法を目的にしたテキストはその他の目的に使うことはないので、違うバージョンを考える $x のようなテキストが[$ x ]のように置換されるような動作
作ったあんも.icon
が、すでにあった
Scrapboxで、$...$ でくくられた部分をすべて[$ ...] に置換するためのUserScriptを作りました。普通に書いたものをScrapboxに貼り付けて範囲指定してLaTeXというボタンをクリックすると変換。
正規表現が勉強できたからいいか