OSDN Git Service

999f589cbad9a28f0e3ae1bb0afd590a489849b8
[fswiki/fswiki.git] / lib / Wiki / HTMLParser.pm
1 ###############################################################################
2 #
3 # HTML¥Ñ¡¼¥µ
4 #
5 ###############################################################################
6 package Wiki::HTMLParser;
7 use Wiki::Parser;
8 use vars qw(@ISA);
9 use strict;
10
11 @ISA = qw(Wiki::Parser);
12 #==============================================================================
13 # ¥³¥ó¥¹¥È¥é¥¯¥¿
14 #==============================================================================
15 sub new {
16         my $class   = shift;
17         my $wiki    = shift;
18         my $mainflg = shift;
19         
20         if(!defined($mainflg) || $mainflg eq ""){ $mainflg = 0; }
21         
22         my $self = Wiki::Parser->new($wiki);
23         
24         $self->{html}  = "";
25         $self->{pre}   = "";
26         $self->{quote} = "";
27         $self->{table} = 0;
28         $self->{level} = 0;
29         $self->{list}  = 0;
30         $self->{para}  = 0;
31         $self->{p_cnt} = 0;
32         $self->{main}  = $mainflg;
33         return bless $self,$class;
34 }
35
36 #==============================================================================
37 # ¥ê¥¹¥È
38 #==============================================================================
39 sub l_list {
40         my $self  = shift;
41         my $level = shift;
42         my $obj   = shift;
43         
44         if($self->{para}==1){
45                 $self->{html} .= "</p>\n";
46                 $self->{para} = 0;
47         }
48         
49         if($self->{list} == 1 && $level <= $self->{level}){
50                 $self->end_list;
51         }
52         $self->{list} = 0;
53         
54         $self->end_verbatim;
55         $self->end_table;
56         $self->end_quote;
57         
58         my $html = join("",@$obj);
59
60         if($level > $self->{level}){
61                 while($level != $self->{level}){
62                         $self->{html} .= "<ul>\n";
63                         push(@{$self->{close_list}},"</ul>\n");
64                         $self->{level}++;
65                 }
66         } elsif($level <= $self->{level}){
67                 while($level-1 != $self->{level}){
68                         if($self->{'list_close_'.$self->{level}} == 1){
69                                 $self->{html} .= "</li>\n";
70                                 $self->{'list_close_'.$self->{level}} = 0;
71                         }
72                         if($level == $self->{level}){
73                                 last;
74                         }
75                         $self->{html} .= pop(@{$self->{close_list}});
76                         $self->{level}--;
77                 }
78         }
79         
80         $self->{html} .= "<li>".$html;
81         $self->{'list_close_'.$level} = 1;
82 }
83
84 #==============================================================================
85 # ÈÖ¹æÉÕ¤­¥ê¥¹¥È
86 #==============================================================================
87 sub l_numlist {
88         my $self  = shift;
89         my $level = shift;
90         my $obj   = shift;
91         
92         if($self->{para}==1){
93                 $self->{html} .= "</p>\n";
94                 $self->{para} = 0;
95         }
96         
97         if($self->{list} == 0 && $level <= $self->{level}){
98                 $self->end_list;
99         }
100         $self->{list} = 1;
101         
102         $self->end_verbatim;
103         $self->end_table;
104         $self->end_quote;
105         
106         my $html = join("",@$obj);
107         
108         if($level > $self->{level}){
109                 while($level != $self->{level}){
110                         $self->{html} .= "<ol>\n";
111                         push(@{$self->{close_list}},"</ol>\n");
112                         $self->{level}++;
113                 }
114         } elsif($level <= $self->{level}){
115                 while($level-1 != $self->{level}){
116                         if($self->{'list_close_'.$self->{level}} == 1){
117                                 $self->{html} .= "</li>\n";
118                                 $self->{'list_close_'.$self->{level}} = 0;
119                         }
120                         if($level == $self->{level}){
121                                 last;
122                         }
123                         $self->{html} .= pop(@{$self->{close_list}});
124                         $self->{level}--;
125                 }
126         }
127         
128         $self->{html} .= "<li>".$html;
129         $self->{'list_close_'.$level} = 1;
130 }
131
132 #==============================================================================
133 # ¥ê¥¹¥È¤Î½ªÎ»
134 #==============================================================================
135 sub end_list {
136         my $self  = shift;
137         while($self->{level} != 0){
138                 if($self->{'list_close_'.($self->{level})} == 1){
139                         $self->{html} .= "</li>\n";
140                         $self->{'list_close_'.$self->{level}} = 0;
141                 }
142                 $self->{html} .= pop(@{$self->{close_list}});
143                 $self->{level}--;
144         }
145 }
146
147 #==============================================================================
148 # ¥Ø¥Ã¥É¥é¥¤¥ó
149 #==============================================================================
150 sub l_headline {
151         my $self  = shift;
152         my $level = shift;
153         my $obj   = shift;
154         my $wiki  = $self->{wiki};
155         
156         if($self->{para}==1){
157                 $self->{html} .= "</p>\n";
158                 $self->{para} = 0;
159         }
160         
161         $self->end_list;
162         $self->end_verbatim;
163         $self->end_table;
164         $self->end_quote;
165         
166         my $html  = join("",@$obj);
167         
168         # ¥á¥¤¥ó¤Îɽ¼¨Îΰè¤Ç¤Ê¤¤¤È¤­
169         if(!$self->{main}){
170                 $self->{html} .= "<h".($level+1).">".$html."</h".($level+1).">\n";
171
172         # ¥á¥¤¥ó¤Îɽ¼¨Îΰè¤Î¾ì¹ç¤Ï¥¢¥ó¥«¤ò½ÐÎÏ
173         } else {
174                 if($level==2){
175                         $self->{html} .= "<h".($level+1)."><a name=\"p".$self->{p_cnt}."\"><span class=\"sanchor\">&nbsp;</span>".
176                                          $html."</a></h".($level+1).">\n";
177                 } else {
178                         $self->{html} .= "<h".($level+1)."><a name=\"p".$self->{p_cnt}."\">".$html."</a></h".($level+1).">\n";
179                 }
180                 # ¥Ñ¡¼¥ÈÊÔ½¸¤¬ON¤«¤ÄÊÔ½¸²Äǽ¤Ê¾ì¹ç¤ÏÊÔ½¸¥¢¥ó¥«¤ò½ÐÎÏ
181                 if($self->{no_partedit}!=1){
182                         my $page = $wiki->get_CGI()->param("page");
183                         my $part_edit = "";
184                         # ¥Ñ¡¼¥È¥ê¥ó¥¯¤¬ON¤Î¾ì¹ç¤Ï°ÜÆ°ÍѤΥ¢¥ó¥«¤ò½ÐÎÏ
185                         if ($wiki->config("partlink") == 1) {
186                                 $part_edit .= "<a class=\"partedit\" href=\"#\">TOP</a> ";
187                                 $part_edit .= "<a class=\"partedit\" href=\"#p".($self->{p_cnt} - 1)."\">¢¬</a> ";
188                                 $part_edit .= "<a class=\"partedit\" href=\"#p".($self->{p_cnt} + 1)."\">¢­</a> ";
189                         }
190                         # ¥Ñ¡¼¥ÈÊÔ½¸¤¬ON¤«¤ÄÊÔ½¸²Äǽ¤Ê¾ì¹ç¤ÏÊÔ½¸¥¢¥ó¥«¤ò½ÐÎÏ
191                         if($wiki->config("partedit")==1 && $wiki->can_modify_page($page)){
192                                 unless(defined($self->{partedit}->{$page})){
193                                         $self->{partedit}->{$page} = 0;
194                                 } else {
195                                         $self->{partedit}->{$page}++;
196                                 }
197                                 # InterWiki·Á¼°¤Î¾ì¹ç
198                                 my $full = $page;
199                                 my $path = $self->{wiki}->config('script_name');
200                                 if(index($page,":")!=-1){
201                                         ($path,$page) = split(/:/,$page);
202                                         $path = $self->{wiki}->config('script_name')."/$path";
203                                 }
204                                 $part_edit .= "<a class=\"partedit\" href=\"$path?action=EDIT".
205                                               "&amp;page=".&Util::url_encode($page).
206                                               "&amp;artno=".$self->{partedit}->{$full}."\" rel=\"nofollow\">ÊÔ½¸</a>";
207                         }
208                         if($part_edit ne ""){
209                                 $self->{html} .= "<div class=\"partedit\">$part_edit</div>\n";
210                         }
211                 }
212                 
213         }
214         $self->{p_cnt}++;
215 }
216
217 #==============================================================================
218 # ¿åÊ¿Àþ
219 #==============================================================================
220 sub l_line {
221         my $self = shift;
222         
223         if($self->{para}==1){
224                 $self->{html} .= "</p>\n";
225                 $self->{para} = 0;
226         }
227         
228         $self->end_list;
229         $self->end_verbatim;
230         $self->end_table;
231         $self->end_quote;
232         
233         $self->{html} .= "<hr>\n";
234 }
235
236 #==============================================================================
237 # ÃÊÍî¶èÀÚ¤ê
238 #==============================================================================
239 sub l_paragraph {
240         my $self = shift;
241         
242         $self->end_list;
243         $self->end_verbatim;
244         $self->end_table;
245         $self->end_quote;
246         
247         if($self->{para}==1){
248                 $self->{html} .= "</p>\n";
249                 $self->{para} = 0;
250         } elsif($self->{wiki}->config('br_mode')==1){
251                 $self->{html} .= "<br>\n";
252         }
253 }
254
255 #==============================================================================
256 # À°·ÁºÑ¥Æ¥­¥¹¥È
257 #==============================================================================
258 sub l_verbatim {
259         my $self  = shift;
260         my $text  = shift;
261         
262         if($self->{para}==1){
263                 $self->{html} .= "</p>\n";
264                 $self->{para} = 0;
265         }
266         
267         $self->end_list;
268         $self->end_table;
269         $self->end_quote;
270         
271         $text =~ s/^\s//;
272         $self->{pre} .= Util::escapeHTML($text)."\n";
273 }
274
275 sub end_verbatim {
276         my $self  = shift;
277         if($self->{pre} ne ""){
278                 $self->{html} .= "<pre>".$self->{pre}."</pre>\n";
279                 $self->{pre} = "";
280         }
281 }
282
283 #==============================================================================
284 # ¥Æ¡¼¥Ö¥ë
285 #==============================================================================
286 sub l_table {
287         my $self = shift;
288         my $row  = shift;
289         $self->end_list;
290         $self->end_verbatim;
291         $self->end_quote;
292         
293         my $tag = "td";
294         
295         if($self->{table}==0){
296                 $self->{table}=1;
297                 $self->{html} .= "<table>\n";
298                 $tag = "th";
299         } else {
300                 $self->{table}=2;
301         }
302         
303         my @columns = ();
304         foreach(@$row){
305                 my $html = join("",@$_);
306                 if($#columns != -1 && $html eq '&lt;&lt;'){
307                         @columns[$#columns]->{colspan}++;
308                 } else {
309                         push(@columns, {colspan => 1, html => $html});
310                 }
311         }
312         $self->{html} .= "<tr>\n";
313         foreach(@columns){
314                 $self->{html} .= "<$tag colspan=\"".$_->{colspan}."\">".$_->{html}."</$tag>\n";
315         }
316         $self->{html} .= "</tr>\n";
317 }
318
319 sub end_table {
320         my $self = shift;
321         if($self->{table}!=0){
322                 $self->{table} = 0;
323                 $self->{html} .= "</table>\n";
324         }
325 }
326
327 #==============================================================================
328 # ¥Ñ¡¼¥¹½ªÎ»»þ¤Î½èÍý
329 #==============================================================================
330 sub end_parse {
331         my $self = shift;
332         $self->end_list;
333         $self->end_verbatim;
334         $self->end_table;
335         $self->end_quote;
336         
337         if($self->{para}==1){
338                 $self->{html} .= "</p>\n";
339                 $self->{para} = 0;
340         }
341 }
342
343 #==============================================================================
344 # ¹Ô½ñ¼°¤Ë³ºÅö¤·¤Ê¤¤¹Ô
345 #==============================================================================
346 sub l_text {
347         my $self = shift;
348         my $obj  = shift;
349         $self->end_list;
350         $self->end_verbatim;
351         $self->end_table;
352         $self->end_quote;
353         my $html = join("",@$obj);
354         
355         if($self->{para}==0){
356                 $self->{html} .= "<p>";
357                 $self->{para} = 1;
358         }
359         $self->{html} .= $html;
360         
361         # br¥â¡¼¥É¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï<br>¤ò­¤¹
362         if($self->{wiki}->config('br_mode')==1){
363                 $self->{html} .= "<br>\n";
364         }
365 }
366
367 #==============================================================================
368 # °úÍÑ
369 #==============================================================================
370 sub l_quotation {
371         my $self = shift;
372         my $obj  = shift;
373         $self->end_list;
374         $self->end_verbatim;
375         $self->end_table;
376         my $html = join("",@$obj);
377         $self->{quote} .= "<p>".$html."</p>\n";
378 }
379
380 sub end_quote {
381         my $self = shift;
382         if($self->{quote} ne ""){
383                 $self->{html} .= "<blockquote>".$self->{quote}."</blockquote>\n";
384                 $self->{quote} = "";
385         }
386 }
387
388 #==============================================================================
389 # ÀâÌÀ
390 #==============================================================================
391 sub l_explanation {
392         my $self = shift;
393         my $obj1 = shift;
394         my $obj2 = shift;
395         
396         $self->end_list;
397         $self->end_verbatim;
398         $self->end_table;
399         $self->end_quote;
400         
401         my $html1 = join("",@$obj1);
402         my $html2 = join("",@$obj2);
403         
404         $self->{html} .= "<dl>\n<dt>".$html1."</dt>\n<dd>".$html2."</dd>\n</dl>\n";
405 }
406
407 #==============================================================================
408 # ¥Ü¡¼¥ë¥É
409 #==============================================================================
410 sub bold {
411         my $self = shift;
412         my $text = shift;
413         return "<strong>".join("",$self->parse_line($text))."</strong>";
414 }
415
416 #==============================================================================
417 # ¥¤¥¿¥ê¥Ã¥¯
418 #==============================================================================
419 sub italic {
420         my $self = shift;
421         my $text = shift;
422         return "<em>".join("",$self->parse_line($text))."</em>";
423 }
424
425 #==============================================================================
426 # ²¼Àþ
427 #==============================================================================
428 sub underline {
429         my $self = shift;
430         my $text = shift;
431         return "<ins>".join("",$self->parse_line($text))."</ins>";
432 }
433
434 #==============================================================================
435 # ÂǤÁ¾Ã¤·Àþ
436 #==============================================================================
437 sub denialline {
438         my $self = shift;
439         my $text = shift;
440         return "<del>".join("",$self->parse_line($text))."</del>";
441 }
442
443 #==============================================================================
444 # URL¥¢¥ó¥«
445 #==============================================================================
446 sub url_anchor {
447         my $self = shift;
448         my $url  = shift;
449         my $name = shift;
450         
451         if($name eq ""){
452                 $name = $url;
453         }
454         
455         if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i && $self->{'wiki'}->config('display_image')==1){
456                 return "<img src=\"".$url."\">";
457         } else {
458                 if($self->{wiki}->config('open_new_window')==1 &&
459                         ($self->{wiki}->config('inside_same_window')==0 ||
460                         ($self->{wiki}->config('inside_same_window')==1 && index($url,'://') > 0))){
461                         return "<a href=\"$url\" target=\"_blank\">".Util::escapeHTML($name)."</a>";
462                 } else {
463                         return "<a href=\"$url\">".Util::escapeHTML($name)."</a>";
464                 }
465         }
466 }
467
468 #==============================================================================
469 # Wiki¥Ú¡¼¥¸¤Ø¤Î¥¢¥ó¥«
470 #==============================================================================
471 sub wiki_anchor {
472         my $self = shift;
473         my $page = shift;
474         my $name = shift;
475         
476         if(!defined($name) || $name eq ""){
477                 $name = $page;
478         }
479         if($self->{wiki}->page_exists($page)){
480                 return "<a href=\"".$self->{wiki}->create_page_url($page)."\" class=\"wikipage\">".
481                        &Util::escapeHTML($name)."</a>";
482         } else {
483                 return "<span class=\"nopage\">".&Util::escapeHTML($name)."</span>".
484                        "<a href=\"".$self->{wiki}->create_page_url($page)."\">?</a>";
485         }
486 }
487
488 #==============================================================================
489 # ¤¿¤À¤Î¥Æ¥­¥¹¥È
490 #==============================================================================
491 sub text {
492         my $self = shift;
493         my $text = shift;
494         return &Util::escapeHTML($text);
495 }
496
497 #==============================================================================
498 # ¥×¥é¥°¥¤¥ó
499 #==============================================================================
500 sub plugin {
501         my $self   = shift;
502         my $plugin = shift;
503         
504         my @result = $self->{wiki}->process_plugin($plugin,$self);
505         return @result;
506 }
507
508 #==============================================================================
509 # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó
510 #==============================================================================
511 sub l_plugin {
512         my $self   = shift;
513         my $plugin = shift;
514         
515         if($self->{para}==1){
516                 $self->{html} .= "</p>\n";
517                 $self->{para} = 0;
518         }
519         
520         $self->end_list;
521         $self->end_verbatim;
522         $self->end_table;
523         $self->end_quote;
524         
525         my $result = $self->{wiki}->process_plugin($plugin,$self);
526         if(defined($result) && $result ne ""){
527                 $self->{html} .= $result;
528         }
529 }
530
531 #==============================================================================
532 # ¥¤¥á¡¼¥¸
533 #==============================================================================
534 sub l_image {
535         my $self   = shift;
536         my $page   = shift;
537         my $file   = shift;
538         my $width  = shift;
539         my $height = shift;
540         my $wiki = $self->{wiki};
541         
542         if($self->{para}==1){
543                 $self->{html} .= "</p>\n";
544                 $self->{para} = 0;
545         }
546         
547         $self->end_list;
548         $self->end_verbatim;
549         $self->end_table;
550         $self->end_quote;
551         
552         $self->{html} .= "<div class=\"image\">";
553         $self->{html} .= "<img src=\"".$wiki->create_url({action=>"ATTACH",page=>$page,file=>$file})."\"";
554         $self->{html} .= " width=\"$width\"" if ($width ne "");
555         $self->{html} .= " height=\"$height\"" if ($height ne "");
556         $self->{html} .= "/>";
557         $self->{html} .= "</div>\n";
558 }
559
560 #==============================================================================
561 # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
562 #==============================================================================
563 sub error {
564         my $self  = shift;
565         my $label = shift;
566         
567         return "<span class=\"error\">".Util::escapeHTML($label)."</span>";
568 }
569
570 1;