# -*- Mode:Perl; -*-
# Time-stamp: <2001/06/25 (Mon) 02:25:11 m-hase@ceres.dti.ne.jp>
################################################################
### Patch for Diary.pm
################################################################
package HNS::Diary;
use vars qw($RawMode); # added
$RawMode = 0; ### [0:Normal 1:RAW] # added
use vars qw($RTMode @RTBuf);
$RTMode = 0; ### [0:Normal 1:Push 2:Convert]
@RTBuf = ();
sub HnfPrint ($){
my $hnf_ = shift;
### RAW
if( $hnf_ =~ /^<\!--RAW START-->/ ) { $RawMode = 1;}
if( $hnf_ =~ /^<\!--RAW END-->/ ) { $RawMode = 0;}
if( $RawMode == 1 ){
$hnf_ =~ s/&/&/g;
$hnf_ =~ s/</</g;
$hnf_ =~ s/>/>/g;
}
# ### \& で & を表示
# $hnf_ =~ s/\\&/&/g;
### RT
if( $hnf_ =~ /^<\!--RT START-->/ ) { $RTMode = 1; @RTBuf=(); return; }
if( $hnf_ =~ /^<\!--RT END-->/ ) { $RTMode = 2; }
if( $RTMode == 1 ) {
push(@RTBuf, $hnf_);
return;
} elsif( $RTMode == 2 ){
if($HNS::Status->style_type =~ /NoTable/i){
$hnf_ = "<pre>\n";
$hnf_ .= join("",@RTBuf);
$hnf_ .= "</pre>\n";
} else {
$hnf_ = HNS::Hnf::Command::RT::rt2html(@RTBuf);
}
$RTMode = 0;
}
if ($HNS::System::Caching) {
print X $hnf_;
}
else {
$HNS::Diary::Hnf .= $hnf_;
}
}
################################################################
### Patch for Command.pm
################################################################
package HNS::Hnf::Command::New;;
$AllowCommands = [ $HNS::Hnf::Command::New::AllowCommands,'RT'];
package HNS::Hnf::Command::Sub;
$AllowCommands = [ $HNS::Hnf::Command::Sub::AllowCommands,'RT'];
################################################################
### RT
package HNS::Hnf::Command::RT;
use vars qw(@ISA $Template $EndTemplate $NumAttr $IsOneline $AllowCommands
$IsBeginSection $CountName $OmittableEnd);
@ISA = qw(HNS::Hnf::Command::Cite);
$AllowCommands = [''];
$Template = "<!--RT START-->\n";
$EndTemplate = "<!--RT END-->\n";
$OmittableEnd = 1;
sub rt2html(@){
my @lines = @_;
my @value_align=("left", "center", "right");
my $caption = "";
my $delimiter = ",\t"; # デリミタ
my $tbl_width = 1;
my $tbl_height = 0;
my $tbl_header = -1; # THEAD領域の行数
my $tbl_body = -1; # TBODY領域の行数
my %style_table; # <TABLE> 追加属性
my %style_thead; # <THEAD> 追加属性
my %style_tindex; # <TBODY> 追加属性(見出し部)
my %style_tbody; # <TBODY> 追加属性(本体)
my $theme = 0;
my $status = 0; # 0:config 1:head&body 2:body
my $x;
my $y;
my $line;
### default
$style_table{'border'} = 1;
### read
foreach $line (@lines){
if( $line =~ /^ next;
}
if( $status == 0 ){ # ConfigBlock
if( $line =~ /^\s*caption\s*=\s*(.*)\s*$/i ){
$caption = $1;
next;
}
if( $line =~ /^\s*delimiter\s*=\s*(.*)\s*$/i ){
$delimiter = $1;
next;
}
if( $line =~ /^\s*(table|thead|tindex|tbody)_(\w+)\s*=\s*(\w+)\s*/i ){
my $type = $1;
my $key = $2;
my $value = $3;
if( $type =~ /table/ ){ $style_table{$key} = $value;}
if( $type =~ /thead/ ){ $style_thead{$key} = $value;}
if( $type =~ /tindex/){ $style_tindex{$key}= $value;}
if( $type =~ /tbody/ ){ $style_tbody{$key} = $value;}
next;
}
if( $line =~ /^\s*theme\s*=\s*(\d+)\s*$/i ){
$theme = $1;
next;
}
}
if( $line =~ /^\s*\n/ ){
if( $status == 1 ){
$status = 2; # thead と tbody が存在する表である
$tbl_header = $tbl_height;
}
next;
}
if( $status == 0 ){ $status = 1; }
# デリミタとその前後の空白がセパレータとなる
my @items = split(/\s*[$delimiter]\s*/, $line);
my $w = @items; # 配列の個数
if( $w >= $tbl_width ){
$tbl_width = $w;
}
if( $w == $tbl_width ){
my $x = 0;
my $item;
foreach $item (@items){
my $align; # 0:left 1:center 2:right
$item =~ s/^(\s*)//g;
$item =~ s/(\s*)$//g;
if( $item =~ /^[0-9]+.?[0-9]*/ ){
$align = 2; # 数字は右詰め
} else {
$align = 0; # 他は左詰め
}
$tbl_item[$x][$tbl_height] = $item;
$tbl_align[$x][$tbl_height]= $align; # align
$tbl_col[$x][$tbl_height] = 1; # clospan
$tbl_row[$x][$tbl_height] = 1; # rowspan
$x++;
}
$tbl_height++;
}
}
###
if( $status == 1 ){
$tbl_header = 0;
$tbl_body = $tbl_height;
} elsif( $status == 2 ){
$tbl_body = $tbl_height - $tbl_header;
}
### parse
for( $y=$tbl_height-1 ; $y >= 0 ; $y-- ){
for( $x=$tbl_width-1 ; $x >= 0 ; $x-- ){
my $tmp = $tbl_item[$x][$y];
if( $tmp =~ /^\s*==\s*$/ ){
if( $x > 0 ){
$tbl_col[$x-1][$y] += $tbl_col[$x][$y]; # 左側のセルに結合(colspan 増加)
$tbl_col[$x][$y] = 0;
$tbl_row[$x][$y] = 0; # このセルは消滅するので0を入れておく
}
}
if( $tmp =~ /^\s*\|\|\s*$/ ){
if( $y > 0 ){
$tbl_row[$x][$y-1] += $tbl_row[$x][$y]; # rowspan 増加
$tbl_row[$x][$y] = 0;
$tbl_col[$x][$y] = 0; # このセルは消滅するので0を入れておく
}
}
}
}
# ### debug
# for( $y=0 ; $y < $tbl_height ; $y++ ){
# for( $x=0 ; $x < $tbl_width ; $x++ ){
# printf("(%1d,%1d,%1d) ",$tbl_col[$x][$y] ,$tbl_row[$x][$y] ,$tbl_align[$x][$y] );
# }
# print "<br>\n";
# }
# print "tbl_height=$tbl_height<br>\n";
# print "tbl_header=$tbl_header<br>\n";
# print "tbl_body=$tbl_body<br>\n";
# print "theme=$theme<br>\n";
# print "<hr>";
# while( ($key, $value) = each %style_table ){
# print "TABLE[",$key,"]=",$value,"<br>\n";
# }
# print "<hr>";
# while( ($key, $value) = each %style_thead ){
# print "THEAD[",$key,"]=",$value,"<br>\n";
# }
# print "<hr>";
# while( ($key, $value) = each %style_tbody ){
# print "TBODY[",$key,"]=",$value,"<br>\n";
# }
# print "<hr>";
### generate
my $hnf_ ="";
$hnf_ .= "<table";
while( ($key, $value) = each %style_table ){
$hnf_ .= " $key='$value'";
}
$hnf_ .= ">\n";
$hnf_ .= "<caption><strong>$caption</strong></caption>\n";
### <THEAD>
if( $tbl_header > 0 ){
$hnf_ .= "<thead";
while( ($key, $value) = each %style_thead ){
$hnf_ .= " $key='$value'";
}
$hnf_ .= ">\n";
for( $y=0 ; $y < $tbl_header ; $y++ ){
$hnf_ .= "<tr>";
for( $x=0 ; $x < $tbl_width ; $x++ ){
my $item = $tbl_item[$x][$y];
my $col = $tbl_col[$x][$y];
my $row = $tbl_row[$x][$y];
my $align= 1;
my $tag = "th";
if(($col > 0)&&($row > 0)){
$hnf_ .= sprintf("<%s",$tag);
$hnf_ .= sprintf(" align='%s'",$value_align[$align]);
$hnf_ .= sprintf(" colspan='%d'",$col) if $col > 1;
$hnf_ .= sprintf(" rowspan='%d'",$row) if $row > 1;
$hnf_ .= sprintf(">%s</%s>",$item,$tag);
}
}
$hnf_ .= "</tr>\n";
}
$hnf_ .= "</thead>\n";
}
### <TBODY>
$hnf_ .= "<tbody>";
# 見出し
$hnf_ .= "<colgroup";
while( ($key, $value) = each %style_tindex ){
$hnf_ .= " $key='$value'";
}
$hnf_ .= ">\n";
# 本体
$style_tbody{'span'} = $tbl_width unless exists( $style_tbody{'span'});
$hnf_ .= "<colgroup";
while( ($key, $value) = each %style_tbody ){
$hnf_ .= " $key='$value'";
}
$hnf_ .= ">\n";
for( $y=$tbl_header ; $y < $tbl_height ; $y++ ){
$hnf_ .= "\n";
$hnf_ .= "<tr>";
# $hnf_ .= "<tr";
# $hnf_ .= " bgcolor='$style_tbody{'bgcolor'}'" if exists( $style_tbody{'bgcolor'});
# $hnf_ .= ">";
for( $x=0 ; $x < $tbl_width ; $x++ ){
my $item = $tbl_item[$x][$y];
my $align= $tbl_align[$x][$y];
my $col = $tbl_col[$x][$y];
my $row = $tbl_row[$x][$y];
my $tag = "td";
# my $bgcolor ="";
my $x_strong = 0;
$x_strong = $style_tindex{'span'} if exists( $style_tindex{'span'});
if( $x <= ($x_strong - 1) ){
$tag = "th";
$align = 1;
}
if(($col > 0)&&($row > 0)){
$hnf_ .= sprintf("<%s",$tag);
$hnf_ .= sprintf(" align='%s'",$value_align[$align]);
# $hnf_ .= sprintf(" bgcolor='%s'",$bgcolor) if $bgcolor ne "";
$hnf_ .= sprintf(" colspan='%d'",$col) if $col > 1;
$hnf_ .= sprintf(" rowspan='%d'",$row) if $row > 1;
$hnf_ .= sprintf(">%s</%s>",$item,$tag);
}
}
$hnf_ .= "</tr>\n";
}
# $hnf_ .= "</colgroup>\n"; # <colgroup>は閉じないで良いらしい
$hnf_ .= "</tbody>\n";
$hnf_ .= "</table>\n";
return $hnf_;
}
################################################################