OSDN Git Service

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