« flex / bisonの導入 | メイン | COM内でのメモリ割り当て »
September 01, 2004
perl2html
このページにperlに関する備忘録を作ろうと思っていたのだが、perlをHTML化するのが面倒だった。
当然、ツールを作ることを考えていたのだが、flexを使おうと思っていた。
しかし、すでに似たようなツールがあるのではないかと探したところ、やはりあった。
ここだ。
perlで書かれている。
スタイルシートが使われないことや、少し気に入らない部分を書き直した。
書き直したソースはこんな感じだ。
#!/usr/bin/perl
#
# perl2html.pl
# キーワードのリスト
# ハイライトしたいキーワードをここに追加できる
@keyword = qw (abs accept alarm and atan2 bind binmode bless caller chdir
chmod chomp chop chown chr chroot close closedir connect continue cos
crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent
endhostent endnetent endprotoent endpwent endservent eof eq eval exec exists
exit exp fcntl fileno flock foreach fork format formline getc getgrent getgrgid
getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname
getnetent getpeername getpgrp getppid getpriority getprotobyname getprotobynumber
getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent
getsockname getsockopt glob gmtime goto grep hex if import index int ioctl
join keys kill last lc lcfirst length link listen local localtime log lstat
map map mkdir msgctl msgget msgrcv msgsnd my next no oct open opendir or
ord our pack package pipe pop pos print printf prototype push quotemeta
qw qx rand read readdir readline readlink readpipe recv redo ref rename
require reset return reverse rewinddir rindex rmdir scalar seek seekdir
select semctl semget semop send setgrent sethostent setnetent setpgrp
setpriority setprotoent setpwent setservent setsockopt shift shmctl
shmget shmread shmwrite shutdown sin sleep socket socketpair sort
splice split sprintf sqrt srand stat study sub substr symlink syscall
sysopen sysread sysseek system syswrite tell telldir tie tied time
times truncate uc ucfirst umask undef unlink unpack unshift untie
use utime values vec wait waitpid wantarray warn while write);
# ファイル名が入力されたかどうか
$input = $ARGV[0];
if ($input eq ""){
print "Input PERL script name.\n";
exit(0);
}
# ファイルのオープン
open INP, "$input.pl";
print "<p class =\"csource\"><br />\n";
foreach $line (<INP>){
chomp $line;
# タグの変換
$line =~ s/&/&/g;
$line =~ s/"/"/g;
$line =~ s/</</g;
$line =~ s/>/>/g;
# タブをスペースに変換
$line =~ s/\t/ /g;
# スペースをスペースに変換
$line =~ s/\s/ /g;
# コメント行
$line =~ s/#.*/\<span class=\"ccomment\"\>$&\<\/span\>/;
# 引用
$line =~ s|("[ -~]*")|<span class=\"cdoublequotation\">$1</span>|g;
# サブルーチン
$line =~ s|(&[\w]+)|<span class=\"ckeyword\">$1</span>|g;
$line =~ s|^(sub [\w]+)|<span class=\"ckeyword\">$1</span>|;
# キーワード
foreach $keyword (@keyword){
$line =~ s|\b$keyword\b|<span class=\"ckeyword\">$keyword</span>|g;
}
print "$line<br />\n";
}
# 終了メッセージ
print "</p><br />\n";
exit (0);
単純な置換なんで、うまくいかないこともあると思うが、あんまり気にしないことにした。
と言うか、すでにいろいろとおかしいかも。キーワードリストの中のキーワードを強調してしまっていたりするし、&をすべてサブルーチンコールにしてしまっているし、エスケープしてるのに文字列と見なしてるし、置換の中の#をコメントの開始と見ているし。
やはり、ある程度構文を解析しないと完全にはいかないかな。flexでスタート条件などを使えばうまくいきそうな部分も多いけど。
でも、だいたいの場合はうまくいくからいいでしょ。
投稿者 Takenori : September 1, 2004 05:49 PM
Trackback Pings
このエントリーのトラックバックURL:
http://blog.kaede-software.com/mt-tb.cgi/128