読者です 読者をやめる 読者になる 読者になる

kanetaiの二次記憶装置

プログラミングに関するやってみた、調べた系のものをQitaに移して、それ以外をはてブでやる運用にしようと思います。http://qiita.com/kanetai

はてなブログ用の数式エスケープスクリプト作った

ここでも指摘されているように、はてなブログの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)でこれをつけると.で改行を含む全ての文字がマッチするようになる。

ここでも指摘されている通り、名前が少しややこしい。