« flex / bisonの導入 | メイン | COM内でのメモリ割り当て »

2004年09月01日

このHPについて雑記:: 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/&/&amp;/g;
    $line =~ s/"/&quot;/g;
    $line =~ s/</&lt;/g;
    $line =~ s/>/&gt;/g;
    # タブをスペースに変換
    $line =~ s/\t/&nbsp;&nbsp;&nbsp;&nbsp;/g;
    # スペースをスペースに変換
    $line =~ s/\s/&nbsp;/g;
    # コメント行
    $line =~ s/#.*/\<span class=\"ccomment\"\>$&\<\/span\>/;
    # 引用
    $line =~ s|(&quot;[ -~]*&quot;)|<span class=\"cdoublequotation\">$1</span>|g;
    # サブルーチン
    $line =~ s|(&amp;[\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 : 2004年09月01日 05:49




comments powered by Disqus
Total : Today : Yesterday : なかのひと