はてなブログ用の数式エスケープスクリプト作った
ここでも指摘されているように、はてなブログのmarkdownモードで数式を使おうとすると、エスケープとかではまることが多いので、簡易スクリプト(Perl)書いた。
最初に\\( ...\\)
,\\[...\\]
で囲まれた数式をはてな記法[tex:{...}]
にして、括弧内をエスケープする。[tex{...}]
を書いていればそれ以降は, \\(...\\)
, \\[...\\]
が使えるみたいなのでカッコはそのままにしました。
_
→\_
^
→\^
\{
→\\{
\}
→\\}
[
→\\[
]
→\\]
バッククオートで囲まれたところに\\( ...\\)
,\\[...\\]
が含まれているとその中も誤ってエスケープしてしまうけど、
面倒になってきたのでもういいや。
必要になったら、そのうち修正すると思います。
#!/usr/bin/perl use strict; use warnings; use utf8; local $| = 1; my $markdown = ""; while (my $line = <STDIN>) { $markdown .= $line; } my $output = ""; while ($markdown =~ /((\\\\\(.*?\\\\\))|(\\\\\[.*?\\\\\]))/s) { # \\(......\\) or \\[ ......\\] my $left = $`; my $openingBracket = substr($&, 0, 3); my $mid = substr($&, 3, -3); #\\(, \\), \\[, \\] を削除 my $right = $'; $mid =~ s/\\\\/\\\\\\\\/g; #\\->\\\\ $mid =~ s/\^/\\\^/g; $mid =~ s/_/\\_/g; $mid =~ s/\\\{/\\\\\{/g; $mid =~ s/\\\}/\\\\\}/g; $mid =~ s/\[/\\\\\[/g; $mid =~ s/\]/\\\\\]/g; #$output .= ($left. "[tex:{" . $mid . "}]"); if ($openingBracket eq "\\\\(") { $output .= ($left. "\\\\(" . $mid . "\\\\)"); } else { $output .= ($left. "\\\\[" . $mid . "\\\\]"); } $markdown = $right; } print "$output$markdown\n";
perlメモ
Perlではマッチングの位置情報は@+
,@-
に格納される。
$-[0]
: マッチング(全体)の開始位置$+[0]
: マッチング(全体)の終了位置$`
:substr($str, 0, $-[0])
$&
:substr($str, $-[0], $+[0] - $-[0])
$'
:substr($str, $+[0])
*?
:*
(前のパターンの0回以上の繰り返し)の最小マッチング.量指定子の後に?
をつけると最小マッチングになる。
通常Perlでは正規表現のワイルドカード.
は改行を除き全ての文字にマッチする(これもたまに忘れていてはまる)。
//s
は1行モード指定(super dot mode)でこれをつけると.
で改行を含む全ての文字がマッチするようになる。
ここでも指摘されている通り、名前が少しややこしい。