OSDN Git Service

インラインWiki書式の入れ子をできるようにしました。
authortakezoe <takezoe@users.osdn.me>
Fri, 3 Jul 2009 09:44:34 +0000 (09:44 +0000)
committertakezoe <takezoe@users.osdn.me>
Fri, 3 Jul 2009 09:44:34 +0000 (09:44 +0000)
http://fswiki.org/wiki.pl?page=BugTrack-plugin%2F391

lib/Wiki/InterWiki.pm
lib/Wiki/Keyword.pm
lib/Wiki/Parser.pm

index 58f3a92..b368278 100644 (file)
@@ -90,8 +90,8 @@ sub _parse_line {
        my $source = shift;
        # ÊÌ̾¥ê¥ó¥¯
        if($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/
-           ||  $source =~ /\[([^\[]+?)\|((file:[^\[\]]*))\]\s*([\w\-]+)/
-           ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/){
+               ||  $source =~ /\[([^\[]+?)\|((file:[^\[\]]*))\]\s*([\w\-]+)/
+               ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/){
                my $label = $1;
                my $url   = $2;
                my $enc   = $4;
@@ -99,8 +99,8 @@ sub _parse_line {
 
        # Ê¸»ú¥³¡¼¥É¤Î»ØÄê¤Ê¤·
        } elsif($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
-           ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
-           ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
+               ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
+               ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
                my $label = $1;
                my $url   = $2;
                my $enc   = "";
@@ -139,36 +139,43 @@ sub add_inter_wiki {
 # InterWikiName¤¬´Þ¤Þ¤ì¤ë¤«¤É¤¦¤«¥Á¥§¥Ã¥¯
 #==============================================================================
 sub exists_interwiki {
-       my $self = shift;
-       my $str  = shift;
+       my ($self, $str) = @_;
+
+       return 0 if (not defined $str);
+
+       # $str ¤ÎÀèƬ¤Ë InterWikiName ¤Ë¤Ê¤ê¤¦¤ë½ñ¼°¤¬¤Ê¤±¤ì¤Ð¡¢µ¶¤òÊÖ¤·¤Æ½ªÎ»
+       return 0 if (not $str =~ /^\[\[/);
 
-       my @keywords = @{$self->{interwiki}};
+       my @keywords = @{ $self->{interwiki} };
+
+       # ÄêµÁ¤µ¤ì¤¿Á´¤Æ¤Î InterWikiName ¤Ë¤Ä¤¤¤Æ·«¤êÊÖ¤¹¡£
+       foreach my $keyword (@keywords) {
 
-       foreach my $keyword (@keywords){
                my $label = $keyword->{quote};
 
-               if($str =~ /\[\[$label:(.+?)\]\]/){
-                       $self->{g_pre}   = $`;
-                       $self->{g_post}  = $';
+               # ÊÌ̾¤Ê¤·¤Î InterWikiName
+               if ($str =~ /^\[\[$label:(.+?)\]\]/) {
+                       $self->{g_post} = substr($str, $+[0]);  # as $'
                        my $enc   = $keyword->{enc};
                        my $param = $1;
-                       $self->{g_label} = $keyword->{label}.":".$param;
-                       if($enc ne ""){
-                               &Jcode::convert(\$param,$enc);
+                       $self->{g_label} = $keyword->{label} . ':' . $param;
+                       if ($enc ne q{}) {
+                               &Jcode::convert(\$param, $enc);
                        }
-                       $self->{g_url} = $keyword->{url}.Util::url_encode($param);
+                       $self->{g_url} = $keyword->{url} . Util::url_encode($param);
                        return 1;
+               }
 
-               } elsif($str =~ /\[\[([^\[]+?)\|$label:(.+?)\]\]/){
-                       $self->{g_pre}   = $`;
-                       $self->{g_post}  = $';
+               # ÊÌ̾¤¢¤ê¤Î InterWikiName
+               elsif ($str =~ /^\[\[([^\[]+?)\|$label:(.+?)\]\]/) {
+                       $self->{g_post} = substr($str, $+[0]);  # as $'
                        $self->{g_label} = $1;
                        my $enc   = $keyword->{enc};
                        my $param = $2;
-                       if($enc ne ""){
-                               &Jcode::convert(\$param,$enc);
+                       if ($enc ne q{}) {
+                               &Jcode::convert(\$param, $enc);
                        }
-                       $self->{g_url} = $keyword->{url}.Util::url_encode($param);
+                       $self->{g_url} = $keyword->{url} . Util::url_encode($param);
                        return 1;
                }
        }
index 448baa4..0f3d7a9 100644 (file)
@@ -10,12 +10,12 @@ use strict;
 # ¥³¥ó¥¹¥È¥é¥¯¥¿
 #==============================================================================
 sub new {
-       my $class     = shift;
-       my $wiki      = shift;
+       my $class        = shift;
+       my $wiki          = shift;
        my $interwiki = shift;
-       my $self      = {};
+       my $self          = {};
        
-       $self->{wiki}      = $wiki;
+       $self->{wiki}     = $wiki;
        $self->{keywords}  = [];
        $self->{interwiki} = $interwiki;
        
@@ -90,7 +90,7 @@ sub load_keywords {
                $url->{$keyword->{word}}  = $keyword->{url};
                $page->{$keyword->{word}} = $keyword->{page};
        }
-       $self->{regex}     = $regex;
+       $self->{regex}   = $regex;
        $self->{info_url}  = $url;
        $self->{info_page} = $page;
 }
@@ -157,37 +157,60 @@ sub parse {
 }
 
 sub parse_line {
-       my $self   = shift;
-       my $source = shift;
-       
-       # ÊÌ̾¥ê¥ó¥¯
-       if($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
-       || $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
-       || $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
-       
-               my $label = $1;
-               my $url   = $2;
-               $self->url_anchor($url,$label);
-       
-       # InterWiki
-       } elsif($self->{interwiki}->exists_interwiki($source)){
-               my $pre   = $self->{interwiki}->{g_pre};
-               my $post  = $self->{interwiki}->{g_post};
-               my $label = $self->{interwiki}->{g_label};
-               my $url   = $self->{interwiki}->{g_url};
-               $self->url_anchor($url,$label);
-       # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
-       } elsif($source =~ /\[\[([^\[]+?)\|(.+?)\]\]/){
-               my $label = $1;
-               my $page  = $2;
-               $self->wiki_anchor($page,$label);
-               
-       # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|(.+?)\]/){
-               my $label = $1;
-               my $url   = $2;
-               $self->url_anchor($url,$label);
+       my ($self, $source) = @_;
+
+       return if (not defined $source);
+
+       # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
+       while ($source ne q{}) {
+
+               # ¥­¡¼¥ï¡¼¥É¤òÄêµÁ¤¹¤ë½ñ¼°¤¬¤Ê¤±¤ì¤Ð½ªÎ»¡£
+               return if (not $source =~ /^[^\[]*(\[.+)$/);
+
+               $source = $1;
+
+               # ÊÌ̾¥ê¥ó¥¯
+               if ($source
+                       =~ /^\[([^\[]+?)\|((?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       || $source =~ /^\[([^\[]+?)\|(file:[^\[\]]*)\]/
+                       || $source
+                       =~ /^\[([^\[]+?)\|((?:\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       )
+               {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       $self->url_anchor($url, $label);
+               }
+
+               # InterWiki
+               elsif ($self->{interwiki}->exists_interwiki($source)) {
+                       my $label = $self->{interwiki}->{g_label};
+                       my $url   = $self->{interwiki}->{g_url};
+                       $source = $self->{interwiki}->{g_post};
+                       $self->url_anchor($url, $label);
+               }
+
+               # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
+               elsif ($source =~ /^\[\[([^\[]+?)\|(.+?)\]\]/) {
+                       my $label = $1;
+                       my $page  = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       $self->wiki_anchor($page, $label);
+               }
+
+               # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
+               elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       $self->url_anchor($url, $label);
+               }
+
+               # °Ê¾å¤Ë macth ¤·¤Ê¤«¤Ã¤¿¤Ê¤é¡¢1 Ê¸»ú¿Ê¤á¤ë¡£
+               else {
+                       $source = substr($source, 1);
+               }
        }
 }
 
index 7586f28..961bca9 100644 (file)
@@ -206,7 +206,7 @@ sub parse {
                                $line .= " ";
                        }
                        my @spl = map {/^"(.*)"$/ ? scalar($_ = $1, s/\"\"/\"/g, $_) : $_}
-                                     ($line =~ /,\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*)/g);
+                                                 ($line =~ /,\s*(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*)/g);
                        my @array;
                        foreach my $value (@spl){
                                my @cell = $self->parse_line($value);
@@ -260,168 +260,251 @@ sub multi_explanation {
 # </p>
 #===============================================================================
 sub parse_line {
-       my $self   = shift;
-       my $source = shift;
-       my @array  = ();
-               
-       # ¥×¥é¥°¥¤¥ó
-       if($source =~ /{{/){
-               my $pre  = $`;
-               my $post = $';
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               my $plugin = $self->{wiki}->parse_inline_plugin($post);
-               unless($plugin){
-                       push @array,'{{';
-                       push @array,$self->parse_line($post);
-               } else {
-                       my $info   = $self->{wiki}->get_plugin_info($plugin->{command});
-                       if($info->{TYPE} eq "inline"){
-                               push @array,$self->plugin($plugin);
-                       } else {
-                               push @array,$self->parse_line("<<".$plugin->{command}."¥×¥é¥°¥¤¥ó¤Ï¸ºß¤·¤Þ¤»¤ó¡£>>");
+       my ($self, $source) = @_;
+
+       return () if (not defined $source);
+
+       my @array = ();
+       my $pre   = q{};
+       my $parsed;
+
+       # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
+       SOURCE:
+       while ($source ne q{}) {
+
+               # ¤É¤Î¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°¤ÎÀèƬ¤Ë¤â match ¤·¤Ê¤¤¤Ê¤é¡¢
+               if (not $source
+                       =~ /^(.*?)((?:{{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/
+                       )
+               {
+
+                       # ¥­¡¼¥ï¡¼¥É¸¡º÷¡¦ÃÖ´¹½èÍý¤Î¤ß¼Â»Ü¤·¤Æ½ªÎ»¡£
+                       push @array, $self->_parse_line_keyword($pre . $source);
+                       return @array;
+               }
+
+               $pre .= $1;     # match ¤·¤Ê¤«¤Ã¤¿ÀèƬÉôʬ¤Ïί¤á¤Æ¤ª¤¤¤Æ¸å¤Ç½èÍý
+               $source = $2;  # match Éôʬ¡£¤³¤Î¸å¡¢¾ÜºÙ match ¤ò»î¤ß¤ë¡£
+               $parsed = q{};
+
+               # ¥×¥é¥°¥¤¥ó
+               if ($source =~ /^{{/) {
+
+                       # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
+                       push @array, $self->_parse_line_keyword($pre) if ($pre ne q{});
+
+                       # ¥ª¥ê¥¸¥Ê¥ë¤Î Wiki::Parser::parse_line() ¤Ë½èÍý¤ò¤ªÇ¤¤»¡£
+                       # (¥×¥é¥°¥¤¥ó¤Î½èÍý¤Ï¡¢¥ª¥ê¥¸¥Ê¥ë¤Ç¤âºÇÍ¥Àè¤Î½èÍý¤Ê¤Î¤Ç²Äǽ)
+                       push @array, $self->SUPER::parse_line($source);
+
+                       # $self->orig_parse_line() ¤Ç $source ¤ÏÁ´¤Æ½èÍýºÑ¤Ê¤Î¤Ç½ªÎ»
+                       return @array;
+               }
+
+               # InterWikiName
+               elsif ($self->{interwiki}->exists_interwiki($source)) {
+                       my $label = $self->{interwiki}->{g_label};
+                       my $url   = $self->{interwiki}->{g_url};
+                       $source = $self->{interwiki}->{g_post};
+                       $parsed = $self->url_anchor($url, $label);
+               }
+
+               # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
+               elsif ($source =~ /^\[\[([^\[]+?)\|([^\|\[]+?)\]\]/) {
+                       my $label = $1;
+                       my $page  = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       $parsed = $self->wiki_anchor($page, $label);
+               }
+
+               # URLÊÌ̾¥ê¥ó¥¯
+               elsif ($source
+                       =~ /^\[([^\[]+?)\|((?:http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       || $source =~ /^\[([^\[]+?)\|(file:[^\[\]]*)\]/
+                       || $source
+                       =~ /^\[([^\[]+?)\|((?:\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
+                       )
+               {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+                               $parsed = $self->url_anchor($url, $label);
                        }
-                       if($post ne ""){ push(@array,$self->parse_line($plugin->{post})); }
                }
-               
-       # InterWikiName
-       } elsif($self->{interwiki}->exists_interwiki($source)){
-               my $pre   = $self->{interwiki}->{g_pre};
-               my $post  = $self->{interwiki}->{g_post};
-               my $label = $self->{interwiki}->{g_label};
-               my $url   = $self->{interwiki}->{g_url};
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->url_anchor($url,$label);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-       
-       # ¥Ú¡¼¥¸ÊÌ̾¥ê¥ó¥¯
-       } elsif($source =~ /\[\[([^\[]+?)\|([^\|\[]+?)\]\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $page  = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page,$label);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-
-       # URLÊÌ̾¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
-           ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
-           ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $url   = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,$self->parse_line("<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>");
-               } else {
-                       push @array,$self->url_anchor($url,$label);
+
+               # URL¥ê¥ó¥¯
+               elsif ($source
+                       =~ /^(?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*/
+                       || $source =~ /^file:[^\[\]]*/)
+               {
+                       my $url = substr($source, $-[0], $+[0] - $-[0]);        # as $&
+                       $source = substr($source, $+[0]);                                  # as $'
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+                               $parsed = $self->url_anchor($url);
+                       }
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # URL¥ê¥ó¥¯
-       } elsif($source =~ /(http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*/
-           ||  $source =~ /(file:[^\[\]]*)/){
-               my $pre   = $`;
-               my $post  = $';
-               my $url = $&;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,$self->parse_line("<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>");
-               } else {
-                       push @array,$self->url_anchor($url);
+
+               # ¥Ú¡¼¥¸¥ê¥ó¥¯
+               elsif ($source =~ /^\[\[([^\|]+?)\]\]/) {
+                       my $page = $1;
+                       $source = substr($source, $+[0]);         # as $'
+                       $parsed = $self->wiki_anchor($page);
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # ¥Ú¡¼¥¸¥ê¥ó¥¯
-       } elsif($source =~ /\[\[([^\|]+?)\]\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $page = $1;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-       
-       # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|(.+?)\]/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $1;
-               my $url   = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(index($url,'"') >= 0 || index($url,'><') >= 0 || index($url, 'javascript:') >= 0){
-                       push @array,$self->parse_line("<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>");
-               } else {
-                       # URI¤òºîÀ®
-                       my $wiki = $self->{wiki};
-                       my $uri = $wiki->config('server_host');
-                       if($uri eq ""){
-                               $uri = $wiki->get_CGI()->url(-path_info => 1);
-                       } else {
-                               $uri = $uri . $wiki->get_CGI->url(-absolute => 1) . $wiki->get_CGI()->path_info();
+
+               # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
+               elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
+                       my $label = $1;
+                       my $url   = $2;
+                       $source = substr($source, $+[0]);         # as $'
+                       if (   index($url, q{"}) >= 0
+                               || index($url, '><') >= 0
+                               || index($url, 'javascript:') >= 0)
+                       {
+                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                       }
+                       else {
+
+                               # URI¤òºîÀ®
+                               my $wiki = $self->{wiki};
+                               my $uri  = $wiki->config('server_host');
+                               if ($uri eq q{}) {
+                                       $uri = $wiki->get_CGI()->url(-path_info => 1);
+                               }
+                               else {
+                                       $uri
+                                               = $uri
+                                               . $wiki->get_CGI->url(-absolute => 1)
+                                               . $wiki->get_CGI()->path_info();
+                               }
+                               $parsed = $self->url_anchor($uri . '/../' . $url, $label);
                        }
-                       push @array,$self->url_anchor($uri."/../".$url, $label);
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-       
-       # ¥Ü¡¼¥ë¥É¡¢¥¤¥¿¥ê¥Ã¥¯¡¢¼è¤ê¾Ã¤·Àþ¡¢²¼Àþ
-       } elsif($source =~ /((''')|('')|(==)|(__))(.+?)(\1)/){
-               my $pre   = $`;
-               my $post  = $';
-               my $type  = $1;
-               my $label = $6;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if($type eq "'''"){
-                       push @array,$self->bold($label);
-               } elsif($type eq "__"){
-                       push @array,$self->underline($label);
-               } elsif($type eq "''"){
-                       push @array,$self->italic($label);
-               } elsif($type eq "=="){
-                       push @array,$self->denialline($label);
+
+               # ¥Ü¡¼¥ë¥É¡¢¥¤¥¿¥ê¥Ã¥¯¡¢¼è¤ê¾Ã¤·Àþ¡¢²¼Àþ
+               elsif ($source =~ /^('''?|==|__)(.+?)\1/) {
+                       my $type  = $1;
+                       my $label = $2;
+                       $source = substr($source, $+[0]);       # as $'
+                       if ($type eq q{'''}) {
+                               $parsed = $self->bold($label);
+                       }
+                       elsif ($type eq q{__}) {
+                               $parsed = $self->underline($label);
+                       }
+                       elsif ($type eq q{''}) {
+                               $parsed = $self->italic($label);
+                       }
+                       else {                                                     ## elsif ($type eq q{==}) {
+                               $parsed = $self->denialline($label);
+                       }
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-       
-       # ¥­¡¼¥ï¡¼¥É
-       } elsif($self->{keyword}->exists_keyword($source)){
-               my $pre   = $self->{keyword}->{g_pre};
-               my $post  = $self->{keyword}->{g_post};
-               my $label = $self->{keyword}->{g_label};
-               my $url   = $self->{keyword}->{g_url};
-               my $page  = $self->{keyword}->{g_page};
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               if(defined($url) && $url ne ""){
-                       push @array,$self->url_anchor($url,$label);
-               } else {
-                       push @array,$self->wiki_anchor($page,$label);
+
+               # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
+               elsif ($source =~ /^<<(.+?)>>/) {
+                       my $label = $1;
+                       $source = substr($source, $+[0]);       # as $'
+                       $parsed = $self->error($label);
                }
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # WikiName
-       } elsif($self->{wiki}->config('wikiname')==1 && $source =~ /[A-Z]+?[a-z]+?([A-Z]+?[a-z]+)+/){
-               my $pre   = $`;
-               my $post  = $';
-               my $page  = $&;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->wiki_anchor($page);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
-       } elsif($source =~ /(<<)(.+?)(>>)/){
-               my $pre   = $`;
-               my $post  = $';
-               my $label = $2;
-               if($pre ne ""){ push(@array,$self->parse_line($pre)); }
-               push @array,$self->error($label);
-               if($post ne ""){ push(@array,$self->parse_line($post)); }
-               
-       } else {
-               push @array,$self->text($source);
+
+               # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˤϠmacth ¤·¤Ê¤«¤Ã¤¿¤È¤­
+               else {
+
+                       # 1 Ê¸»ú¿Ê¤à¡£
+                       $pre .= substr($source, 0, 1);
+                       $source = substr($source, 1);
+
+                       # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¤òÈô¤Ð¤·¤Æ·«¤êÊÖ¤·¡£
+                       next SOURCE;
+               }
+
+               # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˠmacth ¤·¤¿¸å¤Î
+               # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¡£
+
+               # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
+               if ($pre ne q{}) {
+                       push @array, $self->_parse_line_keyword($pre);
+                       $pre = q{};
+               }
+
+               push @array, $parsed;
        }
-       
+
+       # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
+       push @array, $self->_parse_line_keyword($pre) if ($pre ne q{});
+
        return @array;
 }
 
+#========================================================================
+# <p>
+# parse_line() ¤«¤é¸Æ¤Ó½Ð¤µ¤ì¡¢¥­¡¼¥ï¡¼¥É¤Î¸¡º÷¡¦ÃÖ´¹½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
+# </p>
+#========================================================================
+sub _parse_line_keyword {
+    my $self   = shift;
+    my $source = shift;
+
+    return () if (not defined $source);
+
+    my @array = ();
+
+    # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
+    while ($source ne q{}) {
+
+        # ¥­¡¼¥ï¡¼¥É
+        if ($self->{keyword}->exists_keyword($source)) {
+            my $pre   = $self->{keyword}->{g_pre};
+            my $label = $self->{keyword}->{g_label};
+            my $url   = $self->{keyword}->{g_url};
+            my $page  = $self->{keyword}->{g_page};
+            $source = $self->{keyword}->{g_post};
+            if ($pre ne q{}) {
+                push @array, $self->_parse_line_keyword($pre);
+            }
+            if (defined($url) && $url ne q{}) {
+                push @array, $self->url_anchor($url, $label);
+            }
+            else {
+                push @array, $self->wiki_anchor($page, $label);
+            }
+
+        }
+
+        # WikiName
+        elsif ($self->{wiki}->config('wikiname') == 1
+            && $source =~ /[A-Z]+?[a-z]+?(?:[A-Z]+?[a-z]+)+/)
+        {
+            my $pre  = substr($source, 0,     $-[0]);            # as $`
+            my $page = substr($source, $-[0], $+[0] - $-[0]);    # as $&
+            $source = substr($source, $+[0]);                    # as $'
+            if ($pre ne q{}) {
+                push @array, $self->_parse_line_keyword($pre);
+            }
+            push @array, $self->wiki_anchor($page);
+        }
+
+        # ¥­¡¼¥ï¡¼¥É¤â WikiName ¤â¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È¤­
+        else {
+            push @array, $self->text($source);
+            return @array;
+        }
+    }
+    return @array;
+}
+
 #===============================================================================
 # <p>
 # ¥Ñ¡¼¥¹¤ò³«»ÏÁ°¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£