« 焼肉・橙苑@板橋駅東口 | メイン | 一票の格差 »

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をサイン・インしてくださってもいいです。




保存しますか?