#!/usr/bin/perl # PSIMG ライブラリ @INC=(@INC,'/usr/local/bin'); require('psimglib.pl'); $linesep=$/; # 初期設定 $escc{'__'}='_'; $escc{'_s'}=' '; $escc{'_t'}='>'; $escc{'_q'}='"'; #" $escc{'_T'}='<'; undef $/; # ファイル一括読み込み $debuglevel=1; WriteDebug(0,"\nFormHTML HTML formatter by kumagai\n"); $psimglibdebug=$ENV{'EQNDEBUG'}; $eqnbasedir=$ENV{'EQNBASE'}; $indexfile="sectionindex.bhtml"; $indexhead=0; $indexdata=""; $options{'dsuffix'}='.html'; $options{'timeformat'}='YYYY/MM/DD hh:mm:ss'; $options{'timezone'}=9; $options{'pagerating'}=10; @includepath=('.'); if($#ARGV < 0){ # 引数なし $_=; &escape; $src=$_; &convert; exit(0); } close(STDOUT); while($arg = shift){ # argv 順番に if(substr($arg,0,1) eq '-') # オプション { if($arg=~/-indexfile=(.+)/){ $indexfile=$1; WriteDebug(0,"sectionindex is written to '$indexfile'\n"); } elsif ($arg=~/-includepath=(.+)/){ @includepath=(@includepath,$1); WriteDebug(1,"path '$1' is added to include-path.\n"); } elsif($arg=~/-debug=(.+)/){ $debuglevel=$1; } elsif($arg=~/-(.+)=(.+)/) { $options{$1}=$2; } else { $options{substr($arg,1)}=1; } next; } if(!open(SRC,$arg)) { WriteError("cannot open '$arg' \n"); next; } $_=; close(SRC); &escape; $src=$_; $sourcefile=$sourcefilefull=$arg; $sourcefile=~s/^.*\/([^\/]+)/$1/; $destfile=$arg; $destfile=~s/\.[^\.\/]*//; $destfile=$destfile.$options{'dsuffix'}; WriteDebug(0,"\nSource: ",$arg," Dest: ",$destfile,"\n\n"); unlink($destfile.'~'); rename($destfile,$destfile.'~'); open(STDOUT,"> ".$destfile); &convert; close(STDOUT); } if($indexhead) { $indexdata.=""; } open(IDX,"> ".$indexfile); print IDX $indexdata; close(IDX); #open(STDOUT,"> auau.html"); exit(0); # $src にソース # が出力 sub convert { $done=""; $header_finish="0"; $writemode="0"; ## 初期化 undef(%overwrite); undef(%substitute); $overwrite{'SECTION'}='

\TITLE\

'; $overwrite{'/SECTION'}='
'; $overwrite{'C-COMMENT'}=''; $overwrite{'C-RESERVED'}=''; $overwrite{'C-PREPROCESSOR'}=''; $substitute{'__LAST__MODIFIED'}= DateTimeString(time()-(-M $sourcefilefull)*24*60*60); $substitute{'__CURRENT__TIME'}=DateTimeString(time()); $substitute{'__SOURCE__FILE'}=$sourcefilefull; $substitute{'__SOURCE__SIZE'}=-s $sourcefilefull; $substitute{'__DESTINATION__FILE'}=$destfile; while(/(^[^<>]*)(<[^>]+>)/){ $src=$'; $tag = $2; if($writemode=="1"){ $_=$1; WriteOutUnescape(); }else{ $done=$done.$1; } %r=&tag_separate($tag); # 条件付き処理 if((($r{'IF'} ne '') && (!$options{$r{'IF'}}))|| (($r{'UNLESS'} ne '') && ($options{$r{'UNLESS'}}))) { WriteDebug(2,"skip IF($r{'IF'}) UNLESS($r{'UNLESS'}) $r{'TAGTYPE'}\n"); $_=$src; if((!$r{'ONLYTHIS'})&&(/<\/$r{'TAGTYPE'}>/i)){ $src=$'; # 閉じタグがあるなら そこまで有効 } $_=$src; next; # タグをスキップ } WriteDebug(100,$r{'TAGTYPE'},"\n"); # パース if($r{'TAGTYPE'} eq 'INCLUDE'){ # ヘッダ $src=$'; $incff=FindFile($r{'FILENAME'}); WriteDebug(1,"include ", $r{'FILENAME'},"($incff) \n"); if(!open(INC,$incff)){ WriteError("cannot find '$incff' \n"); }else{ $_=; &escape; close(INC); if($r{'PROTECT'}) { $_=''.$_.''; } $src=$_.$src; } }elsif($r{'TAGTYPE'} eq "DESTINATION"){ # 出力ファイル指定 $src=$'; $filetitle=$r{'TITLE'}; if(defined($r{'RATING'})) { # ページ重要度 $options{'pagerating'}=$r{'RATING'}; } if($r{'FILENAME'} ne ''){ if($header_finish){ WriteOut($footer); } close(STDOUT); $destfile=$r{'FILENAME'}; $substitute{'_DESTINATION_FILE'}=$destfile; WriteDebug(0,"\nSource: ",$arg," Dest: ",$destfile,"\n\n"); unlink($destfile.'~'); rename($destfile,$destfile.'~'); open(STDOUT,"> ".$destfile); $header_finish="0"; } if($indexhead==1) { $indexdata.="\n"; $indexhead=0; } }elsif($r{'TAGTYPE'} eq "HEADER"){ # ヘッダ $_=$src; if(/<\/HEADER>/i){ $_=$`; &un_escape; $header=$_; $src=$' }else{ WriteError("No "); } } elsif($r{'TAGTYPE'} eq "FOOTER") { $_=$src; if(/<\/FOOTER>/i){ $_=$`; &un_escape; $footer=$_; $src=$' }else{ WriteError("No "); } } elsif($r{'TAGTYPE'} eq "OVERWRITE") { $_=$src; #print STDERR "Overwrite: ",$r{'TYPE'},"\n"; if(/<\/OVERWRITE>/i){ $overwrite{$r{'TYPE'}}=$`; # overwrite はそのまま格納 $src=$' }else{ WriteError("No "); } } elsif($r{'TAGTYPE'} eq "SECTION") { if($header_finish == "0"){ WriteOut($header); $header_finish = "1"; } # タグジャンプ $name=$r{'NAME'}; if($name eq '') { $name=$r{'TITLE'}; } $name =~ s/[^A-Za-z0-9]//g; WriteOut('',"\n"); $_=$overwrite{'SECTION'}; &un_escape; ~s/\\TITLE\\/$r{'TITLE'}/gi; WriteOut($_); # インデックス if($r{'INDEX'} ne "noindex") { if($indexhead == 0) { $indexdata.="\n"; $indexdata.="\n"; $indexhead=1; } $_=$r{'INDEX'}; if($_ eq "") {$_=$r{'TITLE'}; } #&un_escape(); $indexdata.="\n"; } $writemode="1"; } elsif($r{'TAGTYPE'} eq "/SECTION") { $writemode="0"; $_=$overwrite{'/SECTION'}; WriteOutUnescape(); } elsif($r{'TAGTYPE'} eq "NAMEDLINK") { if($r{'HREF'} ne ''){ $_=$r{'HREF'}; WriteOut(''); # " } } elsif($r{'TAGTYPE'} eq "/NAMEDLINK") { WriteOut(""); } elsif($r{'TAGTYPE'} eq "SUBSTITUTE") { # 置換処理定義 $_=$src; if(/<\/SUBSTITUTE>/i){ $subvalue=$`; $src=$'; $_=$r{'TAG'}; escape(); $substitute{$_}=$subvalue; # overwrite はそのまま格納 }else{ WriteError("No "); } } elsif($r{'TAGTYPE'} eq '#') { # 置換処理 $_=$src; if(/<\/#>/i){ $tag=$`; $src=$'; $new=$tag; if(exists($substitute{$tag})) { $new=$substitute{$tag}; } if($new eq $tag) { # 等しい=置換失敗 $_=$tag; un_escape(); WriteDebug(0,"Could not substitute '$_'\n"); WriteOutUnescape($new); } else { $src=$new.$src; } $_=$src; next; }else{ WriteError('No '); } } elsif($r{'TAGTYPE'} eq "COMMENT") { # print STDERR "COMMENT\n"; $_=$src; if(/<\/COMMENT>/i){ $src=$' }else{ WriteError("No "); } }elsif($r{'TAGTYPE'} eq "PROTECT"){ # ヘッダ $_=$src; if(/<\/PROTECT>/i){ $_=$`; $src=$'; s//>\;/g; WriteOutUnescape(); }else{ WriteError("No "); } }elsif($r{'TAGTYPE'} eq "CPROGRAM"){ # ヘッダ $_=$src; if(/<\/CPROGRAM>/i){ $_=$`; $src=$'; &c_convert; WriteOutUnescape(); }else{ WriteError("No "); } }elsif($r{'TAGTYPE'} eq "SHELL"){ # ヘッダ $_=$src; if(/<\/SHELL>/i){ $_=$`; $src=$'; &shell_convert; WriteOutUnescape(); }else{ print STDERR "No "; } }elsif($r{'TAGTYPE'} eq 'FIG'){ $src=$'; &fig_insert(); }elsif($r{'TAGTYPE'} eq 'THUMBLINK'){ $src=$'; $r{'THUMBLINK'}=1; &fig_insert(); } elsif($r{'TAGTYPE'} eq 'EQN'){ $src=$'; &eqn_insert(); } elsif($r{'TAGTYPE'} eq 'DOWNLOAD'){ $src=$'; &download_insert(); } else { #$_=$tag; #&un_escape(); #print STDERR $_," "; $overwritten=0; $tagwriteout=0; while(($key,$val)=each %overwrite){ # オーバーライト処理 if($tag=~/<$key[>\s]/){ # print STDERR $key,"\n"; $t=$val; while(($tkey,$tval)=each %r){ # print STDERR "[$tkey] "; $_=$tval; escape(); $t=~s/\\$tkey\\/$_/gi; if($tkey eq 'WRITEOUT') { $tagwriteout=1; } } # print STDERR "$t\n"; $tag=~s/<$key[^>]*>/$t/; if($tag=~/<$key[^>]*>/) { # また出来てしまった WriteError("Loop OVERWRITE $key\n"); } else { $overwritten=1; } keys(%overwrite); last; } } if(($overwritten)&&(!$tagwriteout)) { $_=$tag.$src; next; } # print STDERR "$tag\n"; if($header_finish == "0"){ WriteOut($header); $header_finish = "1"; } WriteOutUnescape($tag); } #while(($key,$val)=each %r){ # print $key,"--",$val,"\n"; # } # print "\n"; $_=$src; } WriteOut($footer); } ###################################################################### ###################################################################### #### #### サポートサブルーチン sub WriteOut { local($wr); if($#_ < 0) { $wr=$_; }else{ $wr=join('',@_); } if($wr=~/!-.*-!/) { # 置換有り local($key,$val,$def); $def=$_; while(($key,$val)=each %substitute) { $key="!-$key-!"; if($wr=~/$key/) { $_=$val; un_escape(); $wr=~s/$key/$_/g; } } $_=$def; } print $wr; } sub WriteOutUnescape { if($#_ < 0) { }else { $_=join('',@_); } un_escape(); WriteOut(); } sub WriteDebug { if(@_[0]<$debuglevel) { shift @_; print STDERR @_; } } sub WriteError { WriteDebug(-10000,@_); } sub FindFile { local($f)=@_[0]; local($ffi); for($ffi=0;$ffi<=$#includepath;$ffi++) { if(-e $includepath[$ffi].'/'.$f) { return $includepath[$ffi].'/'.$f; } } return $f; } sub DateTimeString { local(@t)=gmtime(@_[0]+$options{'timezone'}*60*60); local($r)=$options{'timeformat'}; local($y)=$t[5]+1900; $t[5]=$t[5]%100; $t[4]+=1; local($i); for($i=0;$i<6;$i++) { $t[$i]=sprintf("%02d",$t[$i]); } $r=~s/YYYY/$y/; $r=~s/YY/$t[5]/; $r=~s/MM/$t[4]/; $r=~s/DD/$t[3]/; $r=~s/hh/$t[2]/; $r=~s/mm/$t[1]/; $r=~s/ss/$t[0]/; return $r; } sub un_escape { local($t); # エスケープ復元作業 $t=''; while(/(^[^_]*)(_[sqtT_])/){ #print STDERR ">> ",$1," ",$2," ",$escc{$2},"\n"; $t.=$1.$escc{$2}; $_=$'; } $_=$t.$_; } sub escape { # クォーテーション中のエスケープ s/_/__/g; # print "aa",$_,"\n"; while(s/(\033\044\102[^\033]*)"([^\033]*\033\050\102)/$1_q$2/){} # 漢字中の "" 置換 "; while(s/(\033\044\102[^\033]*)>([^\033]*\033\050\102)/$1_t$2/){} # 漢字中の > 置換; while(s/(\033\044\102[^\033]*)<([^\033]*\033\050\102)/$1_T$2/){} # 漢字中の > 置換; while(s/(=".*) ([^"\r\n]*"[\s>])/$1_s$2/g){} # クオート中の ' ' while(s/(=".*)>([^"\r\n]*"[\s>])/$1_t$2/g){} # クオート中の '>'" while(s/(=".*)<([^"\r\n]*"[\s>])/$1_T$2/g){} # クオート中の '>' } # タグの分離。TAGTYPE に種類、のこりは修飾語=値の連想配列 sub tag_separate { local($tag)=@_[0]; # 最初の引数 local(%r); local($t); #print $tag,"\n"; $_=$tag; # タグタイプの切出 s/<([\w\/\#]+)/ /; $t=$1; $t =~ y/a-z/A-Z/; $r{'TAGTYPE'}=$t; s/>/ /; # 分解 local(@a)=split; # タグオプション分解 foreach (@a){ &un_escape; # 復元 #print "|",$_,"|\n"; # マッチ文字列 if(/(\w+)=("*)(.*)\2/){ # =" なら " でとじる " $t=$1; $t =~ y/a-z/A-Z/; #print STDERR $1,"->",$_,"\n"; $r{$t}=$3; } else { $r{$_}='1'; } } return %r; } # デフォルト値処理 引数: <識別子> <対象値>... sub ParseDefault { $defaultupdated=0; local($i); # デフォルト設定 for($i=1;$i<=$#_;$i++){ local($key)='DEFAULT_'.$_[$i]; if(defined($r{$key})){ WriteDebug(3,"Set default value of $_[$i] in $_[0]: $r{$key}\n"); $defaultset{"$_[0]_$key"}=$r{$key}; $defaultupdated=1; } } # デフォルト読みだし for($i=1;$i<=$#_;$i++){ local($key)='DEFAULT_'.$_[$i]; if(!defined($defaultset{"$_[0]_$key"})) { next; } # no-defaults if(!defined($r{$_[$i]})){ $r{$_[$i]}=$defaultset{"$_[0]_$key"}; } } } ###################################################################### ###################################################################### #### #### 挿入処理 # 図の処理 sub fig_insert { if(defined($r{'BASECOLOR'})) { $r{'DEFAULT_BGCOLOR'}=$r{'BASECOLOR'}; } # 互換性のため ParseDefault('Fig', 'BGCOLOR','WIDTH','HEIGHT','ALT'); if($r{'SRC'} eq '') { if($defaultupdated) { return ; } WriteError(" must include 'SRC=' option\n"); return; } local(%imginfo)=imginfo($r{'SRC'}); if($imginfo{'type'} eq 'unknown'){ WriteError(" cannot understand type of '",$r{'SRC'}."'\n"); return; } if($r{'ALT'} eq ''){ WriteDebug(1," ",$r{'SRC'},": should be with ALT= option\n"); $r{'ALT'}="Fig: ".$r{'SRC'}; } local($tfile,$tw,$th); if($r{'THUMBLINK'}){ if($r{'THUMBFILE'} eq '') { $tfile=$r{'SRC'}; if($tfile=~/\//) { $tfile=~s/\/([^\/]+)$/\/thumbFH_\1/; } else { $tfile='thumbFH_'.$tfile; } }else{ $tfile=$r{'THUMBFILE'}; } $tw=$th=0; if(defined($r{'TWIDTH'})) { $tw=$r{'TWIDTH'};} if(defined($r{'THEIGHT'})) { $th=$r{'THEIGHT'};} WriteDebug(3,"THUMBLINK $r{'SRC'} ($tfile, $tw x $th)\n"); } if($imginfo{'type'} eq 'PS'){ WriteDebug(2,"EPS figure $r{'SRC'}\n"); if($r{'DEST'} eq ''){ $r{'DEST'}=$r{'SRC'}.".gif";} #$kmgiflibdebug=1; $/=$linesep; local(@ret,@tret); %ret=&ps2gif_update($r{'SRC'},$r{'DEST'}, (($r{'WIDTH'} ne '')?$r{'WIDTH'}:$r{'W'}), (($r{'HEIGHT'} ne '')?$r{'HEIGHT'}:$r{'H'}), (($r{'BGCOLOR'} ne '')?$r{'BGCOLOR'}:$r{'BG'})); if($tfile) { # THUMB if($r{'THUMBFILE'} eq '') { $tfile=$tfile.'.gif'; } %tret=&ps2gif_update($r{'SRC'},$tfile, $tw, $th, (($r{'BGCOLOR'} ne '')?$r{'BGCOLOR'}:$r{'BG'})); undef $/; WriteOut(''); WriteOut('',$r{'ALT'},''); WriteOut(''); } else { # NORMAL undef $/; WriteOut('',$r{'ALT'},''); } return; } # 直接扱える if($tfile) { # THUMB # 縮小版作成 local($scaleparam)='0.5'; local(%tiinfo)=imginfo($tfile); if($tw>0) { $scaleparam="-xsize $tw"; } if($th>0) { $scaleparam="-ysize $th"; if($tw>0) { $scaleparam=$scaleparam." -xsize $tw"; } } if((!-e $tfile)||(-M $tfile > -M $r{'SRC'})|| (($tw>0)&&($tw!=$tiinfo{'w'}))|| (($th>0)&&($th!=$tiinfo{'h'})) ) { local($cmd)=''; if($imginfo{'type'} eq 'GIF'){ $cmd="/usr/bin/giftopnm $r{'SRC'} | pnmscale $scaleparam | /usr/bin/ppmquant 256 | /usr/bin/ppmtogif > $tfile"; } elsif($imginfo{'type'} eq 'JPEG'){ $cmd="/usr/bin/djpeg $r{'SRC'} | pnmscale $scaleparam | /usr/bin/cjpeg > $tfile"; } WriteDebug(3,"$cmd\n"); system($cmd); } %tiinfo=imginfo($tfile); WriteOut(''); WriteOut('',$r{'ALT'},''); WriteOut(''); return ; } local($w)=$r{'WIDTH'}; # WIDTH= if($w eq ''){$w=$r{'W'};} # W= if($w eq ''){$w=$imginfo{'w'};} # ファイルより検出 local($h)=$r{'HEIGHT'}; # WIDTH= if($h eq ''){$h=$r{'H'};} # W= if($h eq ''){$h=$imginfo{'h'};} # ファイルより検出 if($r{'MAG'} ne ''){ $w=$w*$r{'MAG'}+0.49; $h=$h*$r{'MAG'}+0.49; $w=~s/(\d*)\.\d*/\1/; $h=~s/(\d*)\.\d*/\1/; } WriteOut('',$r{'ALT'},''); } # 数式の処理 sub eqn_insert { if(defined($r{'BASECOLOR'})) { $r{'DEFAULT_BGCOLOR'}=$r{'BASECOLOR'}; } # 互換性のため if(defined($r{'BASEMAG'})) { $r{'DEFAULT_MAG'}=$r{'BASEMAG'}; } # 互換性のため ParseDefault('Eqn', 'BGCOLOR','MAG'); if($r{'SRC'} eq '') { if($defaultupdated) { return ; } WriteError(" must include 'SRC=' option\n"); return; } if($r{'FILE'} eq '') { $eqn_ins_sec++; $r{'FILE'}=$eqnbasedir.$sourcefile.".eqn".$eqn_ins_sec.".gif"; } if($r{'ALT'} eq '') { $r{'ALT'}=$r{'SRC'}; } WriteDebug(2,"Equation file:$r{'FILE'}\n"); $/=$linesep; local(@rr); %ret=&tex2gif_update('\def\vect#1{\mbox{\boldmath$#1$}}\begin{eqnarray}'.$r{'SRC'}. '\nonumber\end{eqnarray}',$r{'FILE'}, $r{'MAG'},$r{'BGCOLOR'}); undef $/; WriteOut('',$r{'ALT'},''); return; } # ダウンロード # FILE: ファイル名 # FORMAT: フォーマット # \NAME\ ファイル名, \DATA\ 日付, \TIME\ 時間, \SIZE\ サイズ \IMG\ イメージ # IMG: \IMG\ で使うイメージ sub download_insert { ParseDefault('Download', 'FORMAT','IMG','CAPTION','ALT'); if($r{'FILE'} eq '') { if($defaultupdated) { return; } WriteError(" must include 'FILE=' option\n"); return; } local(@st)=stat($r{'FILE'}); local($size)=$st[7]; local(@lc)=localtime($st[9]); local($file)=$r{'FILE'}; if($file=~/\/([^\/]+)$/) { $file=$1; } $download_format='\CAPTION\ (\DATE\, \SIZE\)'; local($format)=$download_format; if($r{'FORMAT'} ne '') { $format=$r{'FORMAT'}; } local($imgs)=""; if($r{'IMG'} ne '') { local(%imgd)=imginfo($r{'IMG'}); local($alt)=''; if($r{'ALT'} ne '') { $alt=' ALT="'.$r{'ALT'}.'"'; } if($imgd{'w'}!=0){ $imgs=sprintf('', $r{'IMG'},$imgd{'w'},$imgd{'h'},$alt); } } $size=~s/(\d)(\d\d\d)$/\1,\2/; $size=$size." bytes"; while($size=~s/(\d)(\d\d\d,\d)/\1,\2/) { #)/ # print STDERR "$size \n"; } $date=sprintf("%04d/%02d/%02d",$lc[5]+1900,$lc[4]+1,$lc[3]); $time=sprintf("%02d:%02d:%02d",$lc[2],$lc[1],($lc[0])); $format=~s/\\NAME\\/$file/g; $format=~s/\\SIZE\\/$size/g; $format=~s/\\TIME\\/$time/g; $format=~s/\\DATE\\/$date/g; $format=~s/\\IMG\\/$imgs/g; $link=''; if($format=~//){ $format=~s//$link/; } else { $format=$link.$format; } if($format=~/<\/A>/){ } else { $format=$format.''; } while(($tkey,$tval)=each %r){ $format=~s/\\$tkey\\/$tval/gi; } WriteOut($format); return; } sub imginfo { local($file)=@_[0]; local($line); local(%r); $r{'type'}='unknown'; $r{'w'}=$r{'h'}="0"; open(IMGINFOF,"/usr/bin/file ".$file." |"); $line=; close(IMGINFOF); #print $line; if($line=~/GIF/){ $r{'type'}='GIF'; $line=~/version[^,]*, (\d+) x (\d+)/; $r{'w'}=$1; $r{'h'}=$2; } elsif($line=~/JPEG/) { $_="/usr/bin/djpeg ".$file; &dec_ppm(); /(\d+) (\d+)/; $r{'type'}='JPEG'; $r{'w'}=$1; $r{'h'}=$2; } elsif($line=~/PC bitmap data/){ $r{'type'}='BITMAP'; $line=~/format, (\d+) x (\d+)/; $r{'w'}=$1; $r{'h'}=$2; } elsif($line=~/PostScript document/){ $r{'type'}='PS'; open(IMGINFOF,"grep BoundingBox $file |"); $_=; close(IMGINFOF); /BoundingBox: (\d+) (\d+) (\d+) (\d+)/; $r{'w'}=$3-$1; $r{'h'}=$4-$2; } return %r; } sub dec_ppm { local($sep)=$/; local(%r); $/="\n"; open(DECPPMF,$_." |"); $_=; if(/^P.\s*$/){ $_=; }else{ s/^P.\s*//; } /(\d+) (\d+)/; $_=$1." ".$2; $/=$sep; close(DECPPMF); } sub c_convert { s//>\;/g; local($color); $color=$overwrite{'C-COMMENT'}; if($color ne ''){ s/(\/\/[^\r\n]*)([\r\n])/$1<\/FONT>$2/g; s/(\/\*.*\*\/)/$1<\/FONT>/g; } $color=$overwrite{'C-RESERVED'}; if($color ne ''){ s/([\s(){}])(while|for|if|else|return)([\s(){}])/$1$2<\/FONT>$3/g; s/([\s(){}])(void|int|float|double|struct|long|short|char)([\s(){}])/$1$2<\/FONT>$3/g; } $color=$overwrite{'C-PREPROCESSOR'}; if($color ne ''){ s/([$\r\n])(\#[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; s/([$\r\n])(\#[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; } } sub shell_convert{ s//>\;/g; local($color); $color=$overwrite{'SHELL-ROOT'}; if($color ne ''){ s/([$\r\n])(\#[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; s/([$\r\n])(\#[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; } $color=$overwrite{'SHELL-USER'}; if($color ne ''){ s/([$\r\n])(%[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; s/([$\r\n])(%[^\r\n]*)([\r\n])/$1$2<\/FONT>$3/g; } }