###############################################################################
#
# HTMLパーサ
#
###############################################################################
package Wiki::HTMLParser;
use Wiki::Parser;
use vars qw(@ISA);
use strict;
@ISA = qw(Wiki::Parser);
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
my $class = shift;
my $wiki = shift;
my $mainflg = shift;
if(!defined($mainflg) || $mainflg eq ""){ $mainflg = 0; }
my $self = Wiki::Parser->new($wiki);
$self->{html} = "";
$self->{pre} = "";
$self->{quote} = "";
$self->{table} = 0;
$self->{level} = 0;
$self->{para} = 0;
$self->{p_cnt} = 0;
$self->{main} = $mainflg;
return bless $self,$class;
}
#==============================================================================
# リスト
#==============================================================================
sub l_list {
my $self = shift;
my $level = shift;
my $obj = shift;
if($self->{para}==1){
$self->{html} .= "
\n";
$self->{para} = 0;
}
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $html = join("",@$obj);
my $plus = 1;
if($level < $self->{level}){ $plus = -1; }
if($level==$self->{level}){
$self->{html} .= "\n";
}
while($level != $self->{level}){
if($plus==1){
$self->{html} .= "\n";
push(@{$self->{close_list}},"
\n");
} else {
$self->{html} .= "\n";
$self->{html} .= pop(@{$self->{close_list}});
}
$self->{level} += $plus;
}
$self->{html} .= "".$html;
}
#==============================================================================
# 番号付きリスト
#==============================================================================
sub l_numlist {
my $self = shift;
my $level = shift;
my $obj = shift;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $html = join("",@$obj);
my $plus = 1;
if($level < $self->{level}){ $plus = -1; }
if($level==$self->{level}){
$self->{html} .= "\n";
}
while($level != $self->{level}){
if($plus==1){
$self->{html} .= "\n";
push(@{$self->{close_list}},"
\n");
} else {
$self->{html} .= "\n";
$self->{html} .= pop(@{$self->{close_list}});
}
$self->{level} += $plus;
}
$self->{html} .= "".$html;
}
#==============================================================================
# リストの終了
#==============================================================================
sub end_list {
my $self = shift;
if ($self->{level}!=0) {
$self->{html} .= "\n";
while($self->{level}!=0){
$self->{html} .= pop(@{$self->{close_list}});
$self->{level} += -1;
}
}
}
#==============================================================================
# ヘッドライン
#==============================================================================
sub l_headline {
my $self = shift;
my $level = shift;
my $obj = shift;
my $wiki = $self->{wiki};
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $html = join("",@$obj);
# メインの表示領域でないとき
if(!$self->{main}){
$self->{html} .= "".$html."\n";
# メインの表示領域の場合はアンカを出力
} else {
$self->{html} .= "{p_cnt}."\">".$html."\n";
# パート編集がONかつ編集可能な場合は編集アンカを出力
if($self->{no_partedit}!=1){
my $page = $wiki->get_CGI()->param("page");
my $part_edit = "";
# パートリンクがONの場合は移動用のアンカを出力
if ($wiki->config("partlink") == 1) {
$part_edit .= "TOP ";
$part_edit .= "{p_cnt} - 1)."\">↑ ";
$part_edit .= "{p_cnt} + 1)."\">↓ ";
}
# パート編集がONかつ編集可能な場合は編集アンカを出力
if($wiki->config("partedit")==1 && $wiki->can_modify_page($page)){
unless(defined($self->{partedit}->{$page})){
$self->{partedit}->{$page} = 0;
} else {
$self->{partedit}->{$page}++;
}
# InterWiki形式の場合
my $full = $page;
my $path = $self->{wiki}->config('script_name');
if(index($page,":")!=-1){
($path,$page) = split(/:/,$page);
$path = $self->{wiki}->config('script_name')."/$path";
}
$part_edit .= "{partedit}->{$full}."\" rel=\"nofollow\">編集";
}
if($part_edit ne ""){
$self->{html} .= "$part_edit
\n";
}
}
}
$self->{p_cnt}++;
}
#==============================================================================
# 水平線
#==============================================================================
sub l_line {
my $self = shift;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
$self->{html} .= "
\n";
}
#==============================================================================
# 段落区切り
#==============================================================================
sub l_paragraph {
my $self = shift;
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
}
#==============================================================================
# 整形済テキスト
#==============================================================================
sub l_verbatim {
my $self = shift;
my $text = shift;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_list;
$self->end_table;
$self->end_quote;
$text =~ s/^\s//;
$self->{pre} .= Util::escapeHTML($text)."\n";
}
sub end_verbatim {
my $self = shift;
if($self->{pre} ne ""){
$self->{html} .= "".$self->{pre}."\n";
$self->{pre} = "";
}
}
#==============================================================================
# テーブル
#==============================================================================
sub l_table {
my $self = shift;
my $row = shift;
$self->end_list;
$self->end_verbatim;
$self->end_quote;
if($self->{table}==0){
$self->{table}=1;
$self->{html} .= "\n";
$self->{html} .= "\n";
foreach(@$row){
my $html = join("",@$_);
$self->{html} .= "| ".$html." | \n";
}
$self->{html} .= "
\n";
} else {
$self->{table}=2;
$self->{html} .= "\n";
foreach(@$row){
my $html = join("",@$_);
$self->{html} .= "| ".$html." | \n";
}
$self->{html} .= "
\n";
}
}
sub end_table {
my $self = shift;
if($self->{table}!=0){
$self->{table} = 0;
$self->{html} .= "
\n";
}
}
#==============================================================================
# パース終了時の処理
#==============================================================================
sub end_parse {
my $self = shift;
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
}
#==============================================================================
# 行書式に該当しない行
#==============================================================================
sub l_text {
my $self = shift;
my $obj = shift;
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $html = join("",@$obj);
if($self->{para}==0){
$self->{html} .= "";
$self->{para} = 1;
}
$self->{html} .= $html;
# brモードに設定されている場合は
を足す
if($self->{wiki}->config('br_mode')==1){
$self->{html} .= "
\n";
}
}
#==============================================================================
# 引用
#==============================================================================
sub l_quotation {
my $self = shift;
my $obj = shift;
$self->end_list;
$self->end_verbatim;
$self->end_table;
my $html = join("",@$obj);
$self->{quote} .= "
".$html."
\n";
}
sub end_quote {
my $self = shift;
if($self->{quote} ne ""){
$self->{html} .= "".$self->{quote}."
\n";
$self->{quote} = "";
}
}
#==============================================================================
# 説明
#==============================================================================
sub l_explanation {
my $self = shift;
my $obj1 = shift;
my $obj2 = shift;
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $html1 = join("",@$obj1);
my $html2 = join("",@$obj2);
$self->{html} .= "\n- ".$html1."
\n- ".$html2."
\n
\n";
}
#==============================================================================
# ボールド
#==============================================================================
sub bold {
my $self = shift;
my $text = shift;
return "".join("",$self->parse_line($text))."";
}
#==============================================================================
# イタリック
#==============================================================================
sub italic {
my $self = shift;
my $text = shift;
return "".join("",$self->parse_line($text))."";
}
#==============================================================================
# 下線
#==============================================================================
sub underline {
my $self = shift;
my $text = shift;
return "".join("",$self->parse_line($text))."";
}
#==============================================================================
# 打ち消し線
#==============================================================================
sub denialline {
my $self = shift;
my $text = shift;
return "".join("",$self->parse_line($text))."";
}
#==============================================================================
# URLアンカ
#==============================================================================
sub url_anchor {
my $self = shift;
my $url = shift;
my $name = shift;
if($name eq ""){
$name = $url;
}
if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i){
return "
";
} else {
if($self->{wiki}->config('open_new_window')==1 &&
($self->{wiki}->config('inside_same_window')==0 ||
($self->{wiki}->config('inside_same_window')==1 && index($url,'://') > 0))){
return "".Util::escapeHTML($name)."";
} else {
return "".Util::escapeHTML($name)."";
}
}
}
#==============================================================================
# Wikiページへのアンカ
#==============================================================================
sub wiki_anchor {
my $self = shift;
my $page = shift;
my $name = shift;
if(!defined($name) || $name eq ""){
$name = $page;
}
if($self->{wiki}->page_exists($page)){
return "{wiki}->config('script_name')."?page=".&Util::url_encode($page)."\" class=\"wikipage\">".
&Util::escapeHTML($name)."";
} else {
return "".&Util::escapeHTML($name)."".
"{wiki}->config('script_name')."?page=".&Util::url_encode($page)."\">?";
}
}
#==============================================================================
# ただのテキスト
#==============================================================================
sub text {
my $self = shift;
my $text = shift;
return &Util::escapeHTML($text);
}
#==============================================================================
# プラグイン
#==============================================================================
sub plugin {
my $self = shift;
my $plugin = shift;
my @result = $self->{wiki}->process_plugin($plugin,$self);
return @result;
}
#==============================================================================
# パラグラフプラグイン
#==============================================================================
sub l_plugin {
my $self = shift;
my $plugin = shift;
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
my $result = $self->{wiki}->process_plugin($plugin,$self);
if(defined($result) && $result ne ""){
$self->{html} .= $result;
}
}
#==============================================================================
# イメージ
#==============================================================================
sub l_image {
my $self = shift;
my $page = shift;
my $file = shift;
my $wiki = $self->{wiki};
if($self->{para}==1){
$self->{html} .= "\n";
$self->{para} = 0;
}
$self->end_list;
$self->end_verbatim;
$self->end_table;
$self->end_quote;
$self->{html} .= "
config('script_name')."?action=ATTACH&".
"page=".&Util::url_encode($page)."&file=".&Util::url_encode($file)."\">
\n";
}
#==============================================================================
# エラーメッセージ
#==============================================================================
sub error {
my $self = shift;
my $label = shift;
return "".Util::escapeHTML($label)."";
}
1;