OSDN Git Service

397e212259a64f3aa887774ebd4e29dac00a1dd1
[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         if($self->{table}==0){
282                 $self->{table}=1;
283                 $self->{html} .= "<table>\n";
284                 $self->{html} .= "<tr>\n";
285                 foreach(@$row){
286                         my $html = join("",@$_);
287                         $self->{html} .= "<th>".$html."</th>\n";
288                 }
289                 $self->{html} .= "</tr>\n";
290         } else {
291                 $self->{table}=2;
292                 $self->{html} .= "<tr>\n";
293                 foreach(@$row){
294                         my $html = join("",@$_);
295                         $self->{html} .= "<td>".$html."</td>\n";
296                 }
297                 $self->{html} .= "</tr>\n";
298         }
299 }
300
301 sub end_table {
302         my $self = shift;
303         if($self->{table}!=0){
304                 $self->{table} = 0;
305                 $self->{html} .= "</table>\n";
306         }
307 }
308
309 #==============================================================================
310 # ¥Ñ¡¼¥¹½ªÎ»»þ¤Î½èÍý
311 #==============================================================================
312 sub end_parse {
313         my $self = shift;
314         $self->end_list;
315         $self->end_verbatim;
316         $self->end_table;
317         $self->end_quote;
318         
319         if($self->{para}==1){
320                 $self->{html} .= "</p>\n";
321                 $self->{para} = 0;
322         }
323 }
324
325 #==============================================================================
326 # ¹Ô½ñ¼°¤Ë³ºÅö¤·¤Ê¤¤¹Ô
327 #==============================================================================
328 sub l_text {
329         my $self = shift;
330         my $obj  = shift;
331         $self->end_list;
332         $self->end_verbatim;
333         $self->end_table;
334         $self->end_quote;
335         my $html = join("",@$obj);
336         
337         if($self->{para}==0){
338                 $self->{html} .= "<p>";
339                 $self->{para} = 1;
340         }
341         $self->{html} .= $html;
342         
343         # br¥â¡¼¥É¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï<br>¤ò­¤¹
344         if($self->{wiki}->config('br_mode')==1){
345                 $self->{html} .= "<br>\n";
346         }
347 }
348
349 #==============================================================================
350 # °úÍÑ
351 #==============================================================================
352 sub l_quotation {
353         my $self = shift;
354         my $obj  = shift;
355         $self->end_list;
356         $self->end_verbatim;
357         $self->end_table;
358         my $html = join("",@$obj);
359         $self->{quote} .= "<p>".$html."</p>\n";
360 }
361
362 sub end_quote {
363         my $self = shift;
364         if($self->{quote} ne ""){
365                 $self->{html} .= "<blockquote>".$self->{quote}."</blockquote>\n";
366                 $self->{quote} = "";
367         }
368 }
369
370 #==============================================================================
371 # ÀâÌÀ
372 #==============================================================================
373 sub l_explanation {
374         my $self = shift;
375         my $obj1 = shift;
376         my $obj2 = shift;
377         
378         $self->end_list;
379         $self->end_verbatim;
380         $self->end_table;
381         $self->end_quote;
382         
383         my $html1 = join("",@$obj1);
384         my $html2 = join("",@$obj2);
385         
386         $self->{html} .= "<dl>\n<dt>".$html1."</dt>\n<dd>".$html2."</dd>\n</dl>\n";
387 }
388
389 #==============================================================================
390 # ¥Ü¡¼¥ë¥É
391 #==============================================================================
392 sub bold {
393         my $self = shift;
394         my $text = shift;
395         return "<strong>".join("",$self->parse_line($text))."</strong>";
396 }
397
398 #==============================================================================
399 # ¥¤¥¿¥ê¥Ã¥¯
400 #==============================================================================
401 sub italic {
402         my $self = shift;
403         my $text = shift;
404         return "<em>".join("",$self->parse_line($text))."</em>";
405 }
406
407 #==============================================================================
408 # ²¼Àþ
409 #==============================================================================
410 sub underline {
411         my $self = shift;
412         my $text = shift;
413         return "<ins>".join("",$self->parse_line($text))."</ins>";
414 }
415
416 #==============================================================================
417 # ÂǤÁ¾Ã¤·Àþ
418 #==============================================================================
419 sub denialline {
420         my $self = shift;
421         my $text = shift;
422         return "<del>".join("",$self->parse_line($text))."</del>";
423 }
424
425 #==============================================================================
426 # URL¥¢¥ó¥«
427 #==============================================================================
428 sub url_anchor {
429         my $self = shift;
430         my $url  = shift;
431         my $name = shift;
432         
433         if($name eq ""){
434                 $name = $url;
435         }
436         
437         if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i && $self->{'wiki'}->config('display_image')==1){
438                 return "<img src=\"".$url."\">";
439         } else {
440                 if($self->{wiki}->config('open_new_window')==1 &&
441                         ($self->{wiki}->config('inside_same_window')==0 ||
442                         ($self->{wiki}->config('inside_same_window')==1 && index($url,'://') > 0))){
443                         return "<a href=\"$url\" target=\"_blank\">".Util::escapeHTML($name)."</a>";
444                 } else {
445                         return "<a href=\"$url\">".Util::escapeHTML($name)."</a>";
446                 }
447         }
448 }
449
450 #==============================================================================
451 # Wiki¥Ú¡¼¥¸¤Ø¤Î¥¢¥ó¥«
452 #==============================================================================
453 sub wiki_anchor {
454         my $self = shift;
455         my $page = shift;
456         my $name = shift;
457         
458         if(!defined($name) || $name eq ""){
459                 $name = $page;
460         }
461         if($self->{wiki}->page_exists($page)){
462                 return "<a href=\"".$self->{wiki}->create_page_url($page)."\" class=\"wikipage\">".
463                        &Util::escapeHTML($name)."</a>";
464         } else {
465                 return "<span class=\"nopage\">".&Util::escapeHTML($name)."</span>".
466                        "<a href=\"".$self->{wiki}->create_page_url($page)."\">?</a>";
467         }
468 }
469
470 #==============================================================================
471 # ¤¿¤À¤Î¥Æ¥­¥¹¥È
472 #==============================================================================
473 sub text {
474         my $self = shift;
475         my $text = shift;
476         return &Util::escapeHTML($text);
477 }
478
479 #==============================================================================
480 # ¥×¥é¥°¥¤¥ó
481 #==============================================================================
482 sub plugin {
483         my $self   = shift;
484         my $plugin = shift;
485         
486         my @result = $self->{wiki}->process_plugin($plugin,$self);
487         return @result;
488 }
489
490 #==============================================================================
491 # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó
492 #==============================================================================
493 sub l_plugin {
494         my $self   = shift;
495         my $plugin = shift;
496         
497         if($self->{para}==1){
498                 $self->{html} .= "</p>\n";
499                 $self->{para} = 0;
500         }
501         
502         $self->end_list;
503         $self->end_verbatim;
504         $self->end_table;
505         $self->end_quote;
506         
507         my $result = $self->{wiki}->process_plugin($plugin,$self);
508         if(defined($result) && $result ne ""){
509                 $self->{html} .= $result;
510         }
511 }
512
513 #==============================================================================
514 # ¥¤¥á¡¼¥¸
515 #==============================================================================
516 sub l_image {
517         my $self   = shift;
518         my $page   = shift;
519         my $file   = shift;
520         my $width  = shift;
521         my $height = shift;
522         my $wiki = $self->{wiki};
523         
524         if($self->{para}==1){
525                 $self->{html} .= "</p>\n";
526                 $self->{para} = 0;
527         }
528         
529         $self->end_list;
530         $self->end_verbatim;
531         $self->end_table;
532         $self->end_quote;
533         
534         $self->{html} .= "<div class=\"image\">";
535         $self->{html} .= "<img src=\"".$wiki->create_url({action=>"ATTACH",page=>$page,file=>$file})."\"";
536         $self->{html} .= " width=\"$width\"" if ($width ne "");
537         $self->{html} .= " height=\"$height\"" if ($height ne "");
538         $self->{html} .= "/>";
539         $self->{html} .= "</div>\n";
540 }
541
542 #==============================================================================
543 # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
544 #==============================================================================
545 sub error {
546         my $self  = shift;
547         my $label = shift;
548         
549         return "<span class=\"error\">".Util::escapeHTML($label)."</span>";
550 }
551
552 1;