OSDN Git Service

BugTrack-wiki/352 : ブロック書式のエスケープ処理を修正
[fswiki/fswiki.git] / lib / Wiki / Parser.pm
1 ################################################################################
2 # <p>
3 #   Wiki¥Õ¥©¡¼¥Þ¥Ã¥È¤Îʸ»úÎó¤ò¥Ñ¡¼¥¹¤·¡¢½ñ¼°¤ËÂбþ¤·¤¿¥Õ¥Ã¥¯¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·¤ò¹Ô¤¤¤Þ¤¹¡£
4 #   Wiki::Parser¤ò·Ñ¾µ¤·¡¢¤³¤ì¤é¤Î¥Õ¥Ã¥¯¥á¥½¥Ã¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë¤³¤È¤ÇǤ°Õ¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ø¤ÎÊÑ´¹¤¬²Äǽ¤Ç¤¹¡£
5 # </p>
6 ################################################################################
7 package Wiki::Parser;
8 use strict;
9 use Wiki::Keyword;
10 use Wiki::InterWiki;
11
12 $Wiki::Parser::keyword   = undef;
13 $Wiki::Parser::interwiki = undef;
14
15 #===============================================================================
16 # <p>
17 # ¥³¥ó¥¹¥È¥é¥¯¥¿¡£
18 # </p>
19 # <pre>
20 # my $parser = Wiki::HTMLParser-&gt;new($wiki);
21 # </pre>
22 #===============================================================================
23 sub new {
24         my $class = shift;
25         my $wiki  = shift;
26         
27         my $self = {};
28         $self->{wiki} = $wiki;
29         
30         # Keyword¤ÈInterWiki¤Ï¹â®²½¤Î¤¿¤á¥â¥¸¥å¡¼¥ëÊÑ¿ô¤È¤·¤ÆÊÝ»ý¤¹¤ë
31         #¡Ê¤¿¤À¤·mod_perl+Farm¤Î¾ì¹ç¤Ï¥À¥á¤Ê¤Î¤ÇËè²ónew¤¹¤ë¡Ë
32         if(exists $ENV{MOD_PERL}){
33                 $self->{interwiki} = Wiki::InterWiki->new($wiki);
34                 $self->{keyword}   = Wiki::Keyword->new($wiki,$self->{interwiki});
35         } else {
36                 unless(defined($Wiki::Parser::keyword)){
37                         $Wiki::Parser::interwiki = Wiki::InterWiki->new($wiki);
38                         $Wiki::Parser::keyword   = Wiki::Keyword->new($wiki,$Wiki::Parser::interwiki);
39                 }
40                 $self->{interwiki} = $Wiki::Parser::interwiki;
41                 $self->{keyword}   = $Wiki::Parser::keyword;
42         }
43         
44         $self->{dl_flag} = 0;
45         $self->{dt} = "";
46         $self->{dd} = "";
47         
48         return bless $self,$class;
49 }
50
51 #===============================================================================
52 # <p>
53 # ¥Ñ¡¼¥¹½èÍý¤ò³«»Ï¤·¤Þ¤¹¡£
54 # </p>
55 # <pre>
56 # $parser-&gt;parse($source);
57 # </pre>
58 #===============================================================================
59 sub parse {
60         my $self   = shift;
61         my $source = shift;
62         
63         $self->start_parse;
64         $source =~ s/\r//g;
65         
66         my @lines = split(/\n/,$source);
67         
68         foreach my $line (@lines){
69                 chomp $line;
70                 
71                 # Ê£¿ô¹Ô¤ÎÀâÌÀ
72                 $self->multi_explanation($line);
73                 
74                 my $word1 = substr($line,0,1);
75                 my $word2 = substr($line,0,2);
76                 my $word3 = substr($line,0,3);
77                 
78                 # ¶õ¹Ô
79                 if($line eq "" && !$self->{block}){
80                         $self->l_paragraph();
81                         next;
82                 }
83                 
84                 # ¥Ö¥í¥Ã¥¯½ñ¼°¤Î¥¨¥¹¥±¡¼¥×
85                 if(!$self->{block} && ($word2 eq "\\\\" || $word1 eq "\\")){
86                         my @obj = $self->parse_line(substr($line, 1));
87                         $self->l_text(\@obj);
88                         next;
89                 }
90                 
91                 # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó
92                 if($line =~ /^\{\{(.+\}\})$/){
93                         if(!$self->{block}){
94                                 my $plugin = $self->{wiki}->parse_inline_plugin($1);
95                                 my $info   = $self->{wiki}->get_plugin_info($plugin->{command});
96                                 if($info->{TYPE} eq "paragraph"){
97                                         $self->l_plugin($plugin);
98                                 } else {
99                                         my @obj = $self->parse_line($line);
100                                         $self->l_text(\@obj);
101                                 }
102                                 next;
103                         }
104                 } elsif($line =~ /^\{\{(.+)$/){
105                         if ($self->{block}) {
106                                 my $plugin = $self->{wiki}->parse_inline_plugin($1);
107                                 my $info   = $self->{wiki}->get_plugin_info($plugin->{command});
108                                 $self->{block}->{level}++ if($info->{TYPE} eq "block");
109                                 $self->{block}->{args}->[0] .= $line."\n";
110                                 next;
111                         }
112                         my $plugin = $self->{wiki}->parse_inline_plugin($1);
113                         my $info   = $self->{wiki}->get_plugin_info($plugin->{command});
114                         if($info->{TYPE} eq "block"){
115                                 unshift(@{$plugin->{args}}, "");
116                                 $self->{block} = $plugin;
117                                 $self->{block}->{level} = 0;
118                         } else {
119                                 my @obj = $self->parse_line($line);
120                                 $self->l_text(\@obj);
121                         }
122                         next;
123                 }
124                 if($self->{block}){
125                         if($line eq "}}"){
126                                 if ($self->{block}->{level} > 0) {
127                                         $self->{block}->{level}--;
128                                         $self->{block}->{args}->[0] .= $line."\n";
129                                         next;
130                                 }
131                                 my $plugin = $self->{block};
132                                 delete($self->{block});
133                                 $self->l_plugin($plugin);
134                         } else {
135                                 $self->{block}->{args}->[0] .= $line."\n";
136                         }
137                         next;
138                 }
139                 
140                 # PRE
141                 if($word1 eq " " || $word1 eq "\t"){
142                         $self->l_verbatim($line);
143                         
144                 # ¸«½Ð¤·
145                 } elsif($word3 eq "!!!"){
146                         my @obj = $self->parse_line(substr($line,3));
147                         $self->l_headline(1,\@obj);
148                         
149                 } elsif($word2 eq "!!"){
150                         my @obj = $self->parse_line(substr($line,2));
151                         $self->l_headline(2,\@obj);
152                         
153                 } elsif($word1 eq "!"){
154                         my @obj = $self->parse_line(substr($line,1));
155                         $self->l_headline(3,\@obj);
156
157                 # ¹àÌÜ
158                 } elsif($word3 eq "***"){
159                         my @obj = $self->parse_line(substr($line,3));
160                         $self->l_list(3,\@obj);
161                         
162                 } elsif($word2 eq "**"){
163                         my @obj = $self->parse_line(substr($line,2));
164                         $self->l_list(2,\@obj);
165                         
166                 } elsif($word1 eq "*"){
167                         my @obj = $self->parse_line(substr($line,1));
168                         $self->l_list(1,\@obj);
169                         
170                 # ÈÖ¹æÉÕ¤­¹àÌÜ
171                 } elsif($word3 eq "+++"){
172                         my @obj = $self->parse_line(substr($line,3));
173                         $self->l_numlist(3,\@obj);
174                         
175                 } elsif($word2 eq "++"){
176                         my @obj = $self->parse_line(substr($line,2));
177                         $self->l_numlist(2,\@obj);
178                         
179                 } elsif($word1 eq "+"){
180                         my @obj = $self->parse_line(substr($line,1));
181                         $self->l_numlist(1,\@obj);
182                         
183                 # ¿åÊ¿Àþ
184                 } elsif($line eq "----"){
185                         $self->l_line();
186                 
187                 # °úÍÑ
188                 } elsif($word2 eq '""'){
189                         my @obj = $self->parse_line(substr($line,2));
190                         $self->l_quotation(\@obj);
191                         
192                 # ÀâÌÀ
193                 } elsif(index($line,":")==0 && index($line,":",1)!=-1){
194                         if(index($line,":::")==0){
195                                 $self->{dd} .= substr($line,3);
196                                 next;
197                         }
198                         if($self->{dt} ne "" || $self->{dd} ne ""){
199                                 $self->multi_explanation;
200                         }
201                         if(index($line,"::")==0){
202                                 $self->{dt} = substr($line,2);
203                                 $self->{dl_flag} = 1;
204                                 next;
205                         }
206                         my $dt = substr($line,1,index($line,":",1)-1);
207                         my $dd = substr($line,index($line,":",1)+1);
208                         my @obj1 = $self->parse_line($dt);
209                         my @obj2 = $self->parse_line($dd);
210                         $self->l_explanation(\@obj1,\@obj2);
211                         
212                 # ¥Æ¡¼¥Ö¥ë
213                 } elsif($word1 eq ","){
214                         if($line =~ /,$/){
215                                 $line .= " ";
216                         }
217                         my @spl = map {/^"(.*)"$/ ? scalar($_ = $1, s/\"\"/\"/g, $_) : $_}
218                                                   ($line =~ /,\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*)/g);
219                         my @array;
220                         foreach my $value (@spl){
221                                 my @cell = $self->parse_line($value);
222                                 push @array,\@cell;
223                         }
224                         $self->l_table(\@array);
225                         
226                 # ¥³¥á¥ó¥È
227                 } elsif($word2 eq "//"){
228                 
229                 # ²¿¤â¤Ê¤¤¹Ô
230                 } else {
231                         my @obj = $self->parse_line($line);
232                         $self->l_text(\@obj);
233                 }
234         }
235         
236         # Ê£¿ô¹Ô¤ÎÀâÌÀ
237         $self->multi_explanation;
238         
239         # ¥Ñ¡¼¥¹Ãæ¤Î¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤¬¤¢¤Ã¤¿¾ì¹ç¡¢¤È¤ê¤¢¤¨¤ºÉ¾²Á¤·¤Æ¤ª¤¯¡©
240         if($self->{block}){
241                 my $plugin = $self->{block};
242                 delete($self->{block});
243                 $self->l_plugin($plugin);
244         }
245         
246         $self->end_parse;
247 }
248
249 #===============================================================================
250 # <p>
251 # Ê£¿ô¹Ô¤ÎÀâÌÀʸ¤ò½èÍý¤·¤Þ¤¹¡£
252 # </p>
253 #===============================================================================
254 sub multi_explanation {
255         my $self = shift;
256         my $line = shift;
257         if($self->{dl_flag}==1 && (index($line,":")!=0 || !defined($line))){
258                 my @obj1 = $self->parse_line($self->{dt});
259                 my @obj2 = $self->parse_line($self->{dd});
260                 $self->l_explanation(\@obj1,\@obj2);
261                 $self->{dl_flag} = 0;
262                 $self->{dt} = "";
263                 $self->{dd} = "";
264         }
265 }
266
267 #===============================================================================
268 # <p>
269 # £±¹Ôʬ¤ò¥Ñ¡¼¥¹¤·¤Þ¤¹¡£parse¥á¥½¥Ã¥É¤ÎÃ椫¤éɬÍפ˱þ¤¸¤Æ¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
270 # </p>
271 #===============================================================================
272 sub parse_line {
273         my ($self, $source) = @_;
274
275         return () if (not defined $source);
276
277         my @array = ();
278         my $pre   = q{};
279         my @parsed = ();
280
281         # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
282         SOURCE:
283         while ($source ne q{}) {
284
285                 # ¤É¤Î¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°¤ÎÀèƬ¤Ë¤â match ¤·¤Ê¤¤¾ì¹ç
286                 if (!($source =~ /^(.*?)((?:\{\{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/)) {
287                         # ¥­¡¼¥ï¡¼¥É¸¡º÷¡¦ÃÖ´¹½èÍý¤Î¤ß¼Â»Ü¤·¤Æ½ªÎ»¤¹¤ë
288                         push @array, $self->_parse_line_keyword($pre . $source);
289                         return @array;
290                 }
291
292                 $pre   .= $1;   # match ¤·¤Ê¤«¤Ã¤¿ÀèƬÉôʬ¤Ïί¤á¤Æ¤ª¤¤¤Æ¸å¤Ç½èÍý¤¹¤ë
293                 $source = $2;   # match Éôʬ¤Ï¸å³½èÍý¤Ë¤Æ¾ÜºÙ¥Á¥§¥Ã¥¯¤ò¹Ô¤¦
294                 @parsed = ();
295
296                 # ¥×¥é¥°¥¤¥ó
297                 if ($source =~ /^\{\{/) {
298                         $source = $';
299                         my $plugin = $self->{wiki}->parse_inline_plugin($source);
300                         unless($plugin){
301                                 push @parsed, '{{';
302                                 push @parsed, $self->parse_line($source);
303                         } else {
304                                 my $info = $self->{wiki}->get_plugin_info($plugin->{command});
305                                 if($info->{TYPE} eq "inline"){
306                                         push @parsed, $self->plugin($plugin);
307                                 } else {
308                                         push @parsed, $self->parse_line("<<".$plugin->{command}."¥×¥é¥°¥¤¥ó¤Ï¸ºß¤·¤Þ¤»¤ó¡£>>");
309                                 }
310                                 if ($source ne "") {
311                                         $source = $plugin->{post};
312                                 }
313                         }
314                 }
315
316                 # InterWikiName
317                 elsif ($self->{interwiki}->exists_interwiki($source)) {
318                         my $label = $self->{interwiki}->{g_label};
319                         my $url   = $self->{interwiki}->{g_url};
320                         $source = $self->{interwiki}->{g_post};
321                         push @parsed, $self->url_anchor($url, $label);
322                 }
323
324                 # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
325                 elsif ($source =~ /^\[\[([^\[]+?)\|([^\|\[]+?)\]\]/) {
326                         my $label = $1;
327                         my $page  = $2;
328                         $source = $';
329                         push @parsed, $self->wiki_anchor($page, $label);
330                 }
331
332                 # URLÊÌ̾¥ê¥ó¥¯
333                 elsif ($source
334                         =~ /^\[([^\[]+?)\|((?:http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
335                         || $source =~ /^\[([^\[]+?)\|(file:[^\[\]]*)\]/
336                         || $source
337                         =~ /^\[([^\[]+?)\|((?:\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
338                         )
339                 {
340                         my $label = $1;
341                         my $url   = $2;
342                         $source = $';
343                         if (   index($url, q{"}) >= 0
344                                 || index($url, '><') >= 0
345                                 || index($url, 'javascript:') >= 0)
346                         {
347                                 push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
348                         }
349                         else {
350                                 push @parsed, $self->url_anchor($url, $label);
351                         }
352                 }
353
354                 # URL¥ê¥ó¥¯
355                 elsif ($source
356                         =~ /^(?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*/
357                         || $source =~ /^file:[^\[\]]*/)
358                 {
359                         my $url = $&;
360                         $source = $';
361                         if (   index($url, q{"}) >= 0
362                                 || index($url, '><') >= 0
363                                 || index($url, 'javascript:') >= 0)
364                         {
365                                 push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
366                         }
367                         else {
368                                 push @parsed, $self->url_anchor($url);
369                         }
370                 }
371
372                 # ¥Ú¡¼¥¸¥ê¥ó¥¯
373                 elsif ($source =~ /^\[\[([^\|]+?)\]\]/) {
374                         my $page = $1;
375                         $source = $';
376                         push @parsed, $self->wiki_anchor($page);
377                 }
378
379                 # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
380                 elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
381                         my $label = $1;
382                         my $url   = $2;
383                         $source = $';
384                         if (   index($url, q{"}) >= 0
385                                 || index($url, '><') >= 0
386                                 || index($url, 'javascript:') >= 0)
387                         {
388                                 push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
389                         }
390                         else {
391
392                                 # URI¤òºîÀ®
393                                 my $wiki = $self->{wiki};
394                                 my $uri  = $wiki->config('server_host');
395                                 if ($uri eq q{}) {
396                                         $uri = $wiki->get_CGI()->url(-path_info => 1);
397                                 }
398                                 else {
399                                         $uri
400                                                 = $uri
401                                                 . $wiki->get_CGI->url(-absolute => 1)
402                                                 . $wiki->get_CGI()->path_info();
403                                 }
404                                 push @parsed, $self->url_anchor($uri . '/../' . $url, $label);
405                         }
406                 }
407
408                 # ¥Ü¡¼¥ë¥É¡¢¥¤¥¿¥ê¥Ã¥¯¡¢¼è¤ê¾Ã¤·Àþ¡¢²¼Àþ
409                 elsif ($source =~ /^('''?|==|__)(.+?)\1/) {
410                         my $type  = $1;
411                         my $label = $2;
412                         $source = $';
413                         if ($type eq q{'''}) {
414                                 push @parsed, $self->bold($label);
415                         }
416                         elsif ($type eq q{__}) {
417                                 push @parsed, $self->underline($label);
418                         }
419                         elsif ($type eq q{''}) {
420                                 push @parsed, $self->italic($label);
421                         }
422                         else {                                                     ## elsif ($type eq q{==}) {
423                                 push @parsed, $self->denialline($label);
424                         }
425                 }
426
427                 # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
428                 elsif ($source =~ /^<<(.+?)>>/) {
429                         my $label = $1;
430                         $source = $';
431                         push @parsed, $self->error($label);
432                 }
433
434                 # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˤϠmacth ¤·¤Ê¤«¤Ã¤¿¤È¤­
435                 else {
436                         # 1 Ê¸»ú¿Ê¤à¡£
437                         if ($source =~ /^(.)/) {
438                                 $pre .= $1;
439                                 $source = $';
440                         }
441                         
442                         # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¤òÈô¤Ð¤·¤Æ·«¤êÊÖ¤·¡£
443                         next SOURCE;
444                 }
445
446                 # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˠmacth ¤·¤¿¸å¤Î
447                 # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¡£
448
449                 # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
450                 if ($pre ne q{}) {
451                         push @array, $self->_parse_line_keyword($pre);
452                         $pre = q{};
453                 }
454
455                 push @array, @parsed;
456         }
457
458         # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
459         if ($pre ne q{}) {
460                 push @array, $self->_parse_line_keyword($pre);
461         }
462
463         return @array;
464 }
465
466 #========================================================================
467 # <p>
468 # parse_line() ¤«¤é¸Æ¤Ó½Ð¤µ¤ì¡¢¥­¡¼¥ï¡¼¥É¤Î¸¡º÷¡¦ÃÖ´¹½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
469 # </p>
470 #========================================================================
471 sub _parse_line_keyword {
472         my $self   = shift;
473         my $source = shift;
474
475         return () if (not defined $source);
476
477         my @array = ();
478
479         # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
480         while ($source ne q{}) {
481
482                 # ¥­¡¼¥ï¡¼¥É
483                 if ($self->{keyword}->exists_keyword($source)) {
484                         my $pre   = $self->{keyword}->{g_pre};
485                         my $label = $self->{keyword}->{g_label};
486                         my $url   = $self->{keyword}->{g_url};
487                         my $page  = $self->{keyword}->{g_page};
488                         $source = $self->{keyword}->{g_post};
489                         if ($pre ne q{}) {
490                                 push @array, $self->_parse_line_keyword($pre);
491                         }
492                         if (defined($url) && $url ne q{}) {
493                                 push @array, $self->url_anchor($url, $label);
494                         } else {
495                                 push @array, $self->wiki_anchor($page, $label);
496                         }
497
498                 }
499
500                 # WikiName
501                 elsif ($self->{wiki}->config('wikiname') == 1 && $source =~ /[A-Z]+?[a-z]+?(?:[A-Z]+?[a-z]+)+/) {
502                         my $pre  = $`;
503                         my $page = $&;
504                         $source  = $';
505                         if ($pre ne q{}) {
506                                 push @array, $self->_parse_line_keyword($pre);
507                         }
508                         push @array, $self->wiki_anchor($page);
509                 }
510
511                 # ¥­¡¼¥ï¡¼¥É¤â WikiName ¤â¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È¤­
512                 else {
513                         push @array, $self->text($source);
514                         return @array;
515                 }
516         }
517         return @array;
518 }
519
520 #===============================================================================
521 # <p>
522 # ¥Ñ¡¼¥¹¤ò³«»ÏÁ°¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
523 # ¥µ¥Ö¥¯¥é¥¹¤ÇɬÍפʽèÍý¤¬¤¢¤ë¾ì¹ç¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¯¤À¤µ¤¤¡£
524 # </p>
525 #===============================================================================
526 sub start_parse {}
527
528 #===============================================================================
529 # <p>
530 # ¥Ñ¡¼¥¹½ªÎ»¸å¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
531 # ¥µ¥Ö¥¯¥é¥¹¤ÇɬÍפʽèÍý¤¬¤¢¤ë¾ì¹ç¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¯¤À¤µ¤¤¡£
532 # </p>
533 #===============================================================================
534 sub end_parse {}
535
536 #===============================================================================
537 # <p>
538 # URL¥¢¥ó¥«¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
539 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
540 # </p>
541 #===============================================================================
542 sub url_anchor {}
543
544 #===============================================================================
545 # <p>
546 # ¥Ú¡¼¥¸Ì¾¥¢¥ó¥«¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
547 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
548 # </p>
549 #===============================================================================
550 sub wiki_anchor {}
551
552 #===============================================================================
553 # <p>
554 # ¥¤¥¿¥ê¥Ã¥¯¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
555 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
556 # </p>
557 #===============================================================================
558 sub italic {}
559
560 #===============================================================================
561 # <p>
562 # ¥Ü¡¼¥ë¥É¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
563 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
564 # </p>
565 #===============================================================================
566 sub bold {}
567
568 #===============================================================================
569 # <p>
570 # ²¼Àþ¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
571 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
572 # </p>
573 #===============================================================================
574 sub underline {}
575
576 #===============================================================================
577 # <p>
578 # ÂǤÁ¾Ã¤·Àþ¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
579 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
580 # </p>
581 #===============================================================================
582 sub denialline {}
583
584 #===============================================================================
585 # <p>
586 # ¥×¥é¥°¥¤¥ó¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
587 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
588 # </p>
589 #===============================================================================
590 sub plugin {}
591
592 #===============================================================================
593 # <p>
594 # ¥Æ¥­¥¹¥È¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
595 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
596 # </p>
597 #===============================================================================
598 sub text{}
599
600 #===============================================================================
601 # <p>
602 # ¹àÌܤ˥ޥåÁ¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
603 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
604 # </p>
605 #===============================================================================
606 sub l_list {}
607
608 #===============================================================================
609 # <p>
610 # ÈÖ¹æÉÕ¤­¹àÌܤ˥ޥåÁ¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
611 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
612 # </p>
613 #===============================================================================
614 sub l_numlist {}
615
616 #===============================================================================
617 # <p>
618 # ¸«½Ð¤·¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
619 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
620 # </p>
621 #===============================================================================
622 sub l_headline {}
623
624 #===============================================================================
625 # <p>
626 # PRE¥¿¥°¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
627 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
628 # </p>
629 #===============================================================================
630 sub l_verbatim {}
631
632 #===============================================================================
633 # <p>
634 # ¿åÊ¿Àþ¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
635 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
636 # </p>
637 #===============================================================================
638 sub l_line {}
639
640 #===============================================================================
641 # <p>
642 # Æäˤʤˤâ¤Ê¤¤¹Ô¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
643 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
644 # </p>
645 #===============================================================================
646 sub l_text {}
647
648 #===============================================================================
649 # <p>
650 # ÀâÌÀ¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
651 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
652 # </p>
653 #===============================================================================
654 sub l_explanation {}
655
656 #===============================================================================
657 # <p>
658 # °úÍѤ˥ޥåÁ¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
659 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
660 # </p>
661 #===============================================================================
662 sub l_quotation {}
663
664 #===============================================================================
665 # <p>
666 # ¥Ñ¥é¥°¥é¥Õ¤Î¶èÀÚ¤ê¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
667 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
668 # </p>
669 #===============================================================================
670 sub l_paragraph {}
671
672 #===============================================================================
673 # <p>
674 # ¥Æ¡¼¥Ö¥ë¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
675 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
676 # </p>
677 #===============================================================================
678 sub l_table {}
679
680 #===============================================================================
681 # <p>
682 # ¥Ñ¥é¥°¥é¥Õ¥×¥é¥°¥¤¥ó¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
683 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
684 # </p>
685 #===============================================================================
686 sub l_plugin {}
687
688 #===============================================================================
689 # <p>
690 # ²èÁü¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
691 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
692 # </p>
693 #===============================================================================
694 sub l_image {}
695
696 #===============================================================================
697 # <p>
698 # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ë¥Þ¥Ã¥Á¤·¤¿¾ì¹ç¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
699 # ¥µ¥Ö¥¯¥é¥¹¤Ë¤Æ½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£
700 # </p>
701 #===============================================================================
702 sub error {}
703
704 1;