NasupiiのPerl書抜帳

perlソースコードを HTMLに変換するプログラムのソースコード



#####################################################################################################
# pl2html.pl  ver.2.0
#
# このプログラムは UTF-8 で記述すること。他の文字コードで記述すると文字化けする。
#
# perl ソースコード をウエブ公開用の html に変換するプログラム。
# HTMLで問題になる & < > を 文字参照(character references)に置き換え、HTMLのタグを追加する。
# 具体的には
#   "&" を "&amp;" に置き換える
#   "<" を "&lt;"  に置き換える
#   ">" を "&gt;"  に置き換える
#
# Copyright (C) Nasupii
#
# 2011/02/20 初版作成 Shift-JISのソースコード専用。出力するHTMLも Shift-JIS。(ver.1.0)
# 2024/01/05 UTF-8 と cp932 (Shift-JIS) のソースコードを自動判別し、UTF-8 で HTML を出力
#            するように変更。(Ver.2.0)

#####################################################################################################

# 動作確認環境
#   Strawberry Perl 5.36.1.1 がインストールされた Windows 10 にて動作確認した。
#   初版作成時に動作確認した Perl ver.5.10 以降なら、Encode が標準ライブラリーに加えられているので、
#   たぶん動作するでしょう。
#   Windows の他のバージョンでもたぶん動作するでしょう。

# 使用方法
#   1.変換したい perl ソースコードを、 ファイル名 "infile.pl" でファイルする。
#   2.このプログラム(pl2html.pl)を同じフォルダーにコピーし、ダブルクリックして実行する。
#   3.変換後の HTML が "outfile.html"として同じフォルダーに書き出される。
#   注1.書き出されたファイルは HTML として最低限のものしか入っていないので、
#       表題をつけたり書式を指定するなどの編集作業を行う必要があります。
#   注2.変換前の perl ソースコード が、Shift-JIS(cp932) または UTF-8であれば変換可能で、
#       変換後の HTML は UTF-8 で出力されます。

#####################################################################################################

use strict;
use warnings;
use utf8;
use Encode qw/decode encode/;
use Encode::Guess; 

binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my ($buf, $line, $enc, $encname, $i);

#####################################################################################################
# 文字コードを指定しないで、入力ファイルを読み込む
# "MS-DOS like" なプラットフォーム (Windows等) では、何も指定しないと ":unix:crlf" と指定したのと同じ
# になり、読込みでは "CRLF" が "\n" に置き換えられ、書込みでは "\n" が "CRLF" に置き換えられる。
#####################################################################################################

if(! open(IN, "<", "infile.pl")) {              # 入力ファイルを開く
  print "infile.pl が開けなかったので実行が中断されました。\n";
  exit;
}

$buf = "";

while ($line = <IN>) {
  $buf .= $line;
}

close(IN);                                      # 入力ファイルを閉じる

#####################################################################################################
# 文字コードを判定する
# guess_encoding では、判定する文字コードの候補を具体的に指定する必要があるので、ここでは
# "cp932" (Shift-JIS) と "utf8" を指定する。
# なお、何も指定しなくても ascii と utf8 は指定されているので、日本語が入っていないファイルを
# 読み込ませると ascii と判定する。
#####################################################################################################

$enc = guess_encoding($buf, qw/cp932 utf8/);    #文字コードを判定する;

if(! ref($enc) ){                               # エラートラップ
  print "文字コードが判定できなかったので実行が中断されました。\n";
  exit;
}

$encname = $enc->name;
print "文字コードを $encname と判定しました。\n";

#####################################################################################################
# 判定した文字コードを使って、読み込んだファイルをperlの内部表現に変換する
#####################################################################################################

$buf = decode($encname, $buf);

#####################################################################################################
# & < > を 文字参照(character references)に置き換える。
#####################################################################################################

$buf =~ s/&/&amp;/gm;                           # "&" を "&amp;" に置き換える
$buf =~ s/</&lt;/gm;                            # "<" を "&lt;" に置き換える
$buf =~ s/>/&gt;/gm;                            # ">" を "&gt;" に置き換える

#####################################################################################################
# 文字コード UTF-8 を指定して出力ファイルを開く。
#####################################################################################################

if(! open(OUT, ">:encoding(UTF-8)","outfile.html")) {  # outfile.htmlを UTF-8 で開く
  print "outfile.html が開けなかったので実行が中断されました。\n";
  exit;
}

###################################################################################################
# HTML の先頭部分を書き出す
###################################################################################################

print OUT <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<!-- =============== ソースコード =========================================================== -->
<div>ソースコード</div>
<pre>

END

###################################################################################################
# HTML のソースコード部分を書き出す
###################################################################################################

print OUT $buf;

###################################################################################################
# HTML の終了部分を書き出す
###################################################################################################

print OUT <<END;
</pre>
<!-- ======================================================================================== -->
<hr>
<br><br>
</body>
</html>
END

###################################################################################################
# 出力ファイルを閉じて終了
###################################################################################################
close(OUT);
print "変換が完了しました。\n";
exit;


Copyright (C) Nasupii