« 焼肉・橙苑@板橋駅東口 | メイン | 一票の格差 »
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をサイン・インしてくださってもいいです。