« 焼肉・橙苑@板橋駅東口 | メイン | 一票の格差 »
2005年08月08日(月曜日)
Perlスクリプト作品番号1 [ プログラミング ]
とりあえずなんとか動作するPerlのプログラムを作った。もう少しモジュラー化して大域変数の使用を減らす方が良いと思うが,まあ初心者の第1作としては許されるだろう。プログラム名をどうするか悩んだが,Micheal Adamsを一蹴したChess Programにあやかって(?),hydra1 という名前にした(笑)。例えば, %hydra1 hogehoge とすると,hogehoge.mdiary というファイルを読み込む,数式部分を順次画像ファイル(hogehoge_00001.gif など)に変換し,hogehoge.html というHTML文書を生成する。その際,platex, dvigif(dvipng) を順に呼び出しているから,これらのプログラムがインストールされていることが前提となっている。また Image::Size というPerl モジュールを使用しているので,これをCPANなどから入手しておく必要がある。サイトにアップするときに注意すべきは画像ファイルの場所だ。前もってアップする場所を決めておき,そこへのURLを記述するように変更しなくてはならない。
ということで,MacPerlの本を貸してくれたN氏へのレポートとして,ソースを晒しておくか(笑)。
つたないものではありますが・・・。
#!/usr/local/bin/perl -w
## shellから起動するときは,1行目を上のようなコメントにする。
## shellはこれを読んでPerlのプログラムと判断するらしい。
## あとファイルのパミッションを実行可に変更しておくこと。
use strict;
use Image::Size 'html_imgsize'; #このモジュールをCPANからインストールする。
# HTML生成のため'width="X" height="Y"'の形式で大きさを取得
# $size = html_imgsize("globe.gif");
# $size == 'width="60" height="40"'
my $html_pre = <<'EOT';
<html>
<title>mdiary文書</title>
<body>
EOT
my $html_post = <<'EOT';
</body>
</html>
EOT
my $tex_template = <<'EOT';
\documentclass[12pt]{jarticle}
\begin{document}
\pagestyle{empty}
_TeXMath_
\end{document}
EOT
my $filename; #入力ファイルの指定。例えばhogehoge
my $infile; #hogehoge.mdiary となる
my $outfile; #hogehoge.html となる
my @paragraph; # 空白行で分けられたパラグラフが入る配列
my $main_text="";
my $math_filename;
my $math_count=0;
my $math_identifier;
my $math_basename;
my $TEMPNAME="hydra1temp";
my $tex2dvi="qx|platex -interaction=batchmode $TEMPNAME.tex|";
my $dvipng="qx|dvipng -T tight $TEMPNAME.dvi -o $TEMPNAME.png|";
my $dvigif="qx|dvigif -T tight $TEMPNAME.dvi -o $TEMPNAME.gif|";
sub math2pict {
my $display="no";
my $math=$_[0];
if ($math=~m/\$/){$display="no";} else {$display="yes";}
$math =~ s/(\$|\\\[\s*|\s*\\\])//g;
my $alttext=$math;
$math='$¥displaystyle '.$math.'$';
my $textext = $tex_template;
$textext =~ s/_TeXMath_/$math/e;
open (TEMPTEX, "> $TEMPNAME.tex");
print TEMPTEX "$textext";
close(TEMPTEX);
eval $tex2dvi;
eval $dvigif; #eval $dvipng;
&rename_gif_file;
my $size=html_imgsize("$math_filename");
if ($display eq "yes"){
return qq|<br />
<img src="$math_filename" title="$alttext" alt="$alttext" $size hspace="48" vspace="10" /><br />|;
}else{
return qq|<img src="$math_filename" title="$alttext" alt="$alttext" $size align="middle" />|;
}
}
sub rename_gif_file {
$math_count++;
$math_identifier=sprintf("%05d", $math_count); # 数式の画像は5桁の数字で識別
$math_filename=$math_basename."_".$math_identifier.'.gif';
rename "$TEMPNAME.gif", "$math_filename";
}
# main routine start here
$filename=$ARGV[0];
$infile=$filename."\.mdiary";
$outfile=$filename."\.html";
$math_basename=$filename;
local $/=""; #空行を区切り記号に設定する。
open (INFILE, "<$infile") || die "File Not Found";
@paragraph=<INFILE>; #空の行を区切りとして文書をパラグラフに分割して配列に入れる。
close INFILE;
foreach (@paragraph) {
chomp;
if (m/^%%/) { # Blockの冒頭が%%の場合,文書情報のBlockと認識する
#今のところ単に読み飛ばすだけ。
} else {
s/(\$[^\$]+\$|\\\[.+\\\])/&math2pict($&)/eg; # $...$, \[...\]なる部分を数式画像に変換。(option e : 評価した後に置換)
$main_text=$main_text.'<p>'.$_.'</p>'."\n\n";
}
}
open (OUTFILE, ">$outfile");
print OUTFILE $html_pre;
print OUTFILE $main_text;
print OUTFILE $html_post;
close(OUTFILE);投稿者 sukarabe : 2005年08月08日 14:22
トラックバック
このエントリーのトラックバックURL:
http://njet.oops.jp/cgi/mt/mt-tb-alt.cgi/734
コメント
コメントしてください
comment spam対策のため,名前とメールの入力が必須になっていますが,メールアドレスは公開されません。Web SiteのURLは任意です。Type Key IDをお持ちの方はType Keyをサイン・インしてくださってもいいです。