OSDN Git Service

修正::インラインWiki書式の入れ子をできるようにしました。
authorkgsoft <kgsoft@871d6764-1e22-0410-b313-a55050885396>
Thu, 16 Jul 2009 02:54:15 +0000 (02:54 +0000)
committerkgsoft <kgsoft@871d6764-1e22-0410-b313-a55050885396>
Thu, 16 Jul 2009 02:54:15 +0000 (02:54 +0000)
BugTrack-plugin/391

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

index b368278..d2734ce 100644 (file)
@@ -89,32 +89,32 @@ sub _parse_line {
        my $self   = shift;
        my $source = shift;
        # ÊÌ̾¥ê¥ó¥¯
-       if($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/
-               ||  $source =~ /\[([^\[]+?)\|((file:[^\[\]]*))\]\s*([\w\-]+)/
-               ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/){
+       if ($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/
+        || $source =~ /\[([^\[]+?)\|((file:[^\[\]]*))\]\s*([\w\-]+)/
+        || $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[\w\.,%~^+\-%\/\?\(\)!\$&=:;\*#\@']*)\]\s*([\w\-]+)/) {
                my $label = $1;
                my $url   = $2;
                my $enc   = $4;
                $self->add_inter_wiki($url,$label,$enc);
-
+       }
        # Ê¸»ú¥³¡¼¥É¤Î»ØÄê¤Ê¤·
-       } elsif($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
-               ||  $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
-               ||  $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/){
+       elsif ($source =~ /\[([^\[]+?)\|((http|https|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/
+           || $source =~ /\[([^\[]+?)\|(file:[^\[\]]*)\]/
+           || $source =~ /\[([^\[]+?)\|((\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!\$&=:;\*#\@']*)\]/) {
                my $label = $1;
                my $url   = $2;
                my $enc   = "";
                $self->add_inter_wiki($url,$label,$enc);
-
+       }
        # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
-       } elsif($source =~ /\[([^\[]+?)\|(.+?)\]\s*([\w\-]+)/){
+       elsif ($source =~ /\[([^\[]+?)\|(.+?)\]\s*([\w\-]+)/) {
                my $label = $1;
                my $url   = $2;
                my $enc   = $3;
                $self->add_inter_wiki($url,$label,$enc);
-
+       }
        # Ç¤°Õ¤ÎURL¥ê¥ó¥¯(ʸ»ú¥³¡¼¥É¤Î»ØÄê¤Ê¤·)
-       } elsif($source =~ /\[([^\[]+?)\|(.+?)\]/){
+       elsif ($source =~ /\[([^\[]+?)\|(.+?)\]/) {
                my $label = $1;
                my $url   = $2;
                my $enc   = "";
@@ -139,7 +139,8 @@ sub add_inter_wiki {
 # InterWikiName¤¬´Þ¤Þ¤ì¤ë¤«¤É¤¦¤«¥Á¥§¥Ã¥¯
 #==============================================================================
 sub exists_interwiki {
-       my ($self, $str) = @_;
+       my $self = shift;
+       my $str  = shift;
 
        return 0 if (not defined $str);
 
@@ -150,32 +151,31 @@ sub exists_interwiki {
 
        # ÄêµÁ¤µ¤ì¤¿Á´¤Æ¤Î InterWikiName ¤Ë¤Ä¤¤¤Æ·«¤êÊÖ¤¹¡£
        foreach my $keyword (@keywords) {
-
                my $label = $keyword->{quote};
 
                # ÊÌ̾¤Ê¤·¤Î InterWikiName
                if ($str =~ /^\[\[$label:(.+?)\]\]/) {
-                       $self->{g_post} = substr($str, $+[0]);  # as $'
+                       $self->{g_post} = $';
                        my $enc   = $keyword->{enc};
                        my $param = $1;
-                       $self->{g_label} = $keyword->{label} . ':' . $param;
+                       $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;
                }
 
                # ÊÌ̾¤¢¤ê¤Î InterWikiName
                elsif ($str =~ /^\[\[([^\[]+?)\|$label:(.+?)\]\]/) {
-                       $self->{g_post} = substr($str, $+[0]);  # as $'
+                       $self->{g_post} = $';
                        $self->{g_label} = $1;
                        my $enc   = $keyword->{enc};
                        my $param = $2;
                        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 0f3d7a9..c465592 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,7 +157,8 @@ sub parse {
 }
 
 sub parse_line {
-       my ($self, $source) = @_;
+       my $self   = shift;
+       my $source = shift;
 
        return if (not defined $source);
 
@@ -170,16 +171,12 @@ sub parse_line {
                $source = $1;
 
                # ÊÌ̾¥ê¥ó¥¯
-               if ($source
-                       =~ /^\[([^\[]+?)\|((?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
-                       || $source =~ /^\[([^\[]+?)\|(file:[^\[\]]*)\]/
-                       || $source
-                       =~ /^\[([^\[]+?)\|((?:\/|\.\/|\.\.\/)+[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*)\]/
-                       )
-               {
+               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 $'
+                       $source = $';
                        $self->url_anchor($url, $label);
                }
 
@@ -195,7 +192,7 @@ sub parse_line {
                elsif ($source =~ /^\[\[([^\[]+?)\|(.+?)\]\]/) {
                        my $label = $1;
                        my $page  = $2;
-                       $source = substr($source, $+[0]);       # as $'
+                       $source = $';
                        $self->wiki_anchor($page, $label);
                }
 
@@ -203,13 +200,13 @@ sub parse_line {
                elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
                        my $label = $1;
                        my $url   = $2;
-                       $source = substr($source, $+[0]);       # as $'
+                       $source = $';
                        $self->url_anchor($url, $label);
                }
 
                # °Ê¾å¤Ë macth ¤·¤Ê¤«¤Ã¤¿¤Ê¤é¡¢1 Ê¸»ú¿Ê¤á¤ë¡£
                else {
-                       $source = substr($source, 1);
+                       $source =~ s/^.//;
                }
        }
 }
index 961bca9..a623077 100644 (file)
@@ -266,39 +266,41 @@ sub parse_line {
 
        my @array = ();
        my $pre   = q{};
-       my $parsed;
+       my @parsed = ();
 
        # $source ¤¬¶õ¤Ë¤Ê¤ë¤Þ¤Ç·«¤êÊÖ¤¹¡£
        SOURCE:
        while ($source ne q{}) {
 
-               # ¤É¤Î¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°¤ÎÀèƬ¤Ë¤â match ¤·¤Ê¤¤¤Ê¤é¡¢
-               if (not $source
-                       =~ /^(.*?)((?:{{|\[\[?|https?:|mailto:|f(?:tp:|ile:)|'''?|==|__|<<).*)$/
-                       )
-               {
-
-                       # ¥­¡¼¥ï¡¼¥É¸¡º÷¡¦ÃÖ´¹½èÍý¤Î¤ß¼Â»Ü¤·¤Æ½ªÎ»¡£
+               # ¤É¤Î¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°¤ÎÀèƬ¤Ë¤â match ¤·¤Ê¤¤¾ì¹ç
+               if (!($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{};
+               $pre   .= $1;   # match ¤·¤Ê¤«¤Ã¤¿ÀèƬÉôʬ¤Ïί¤á¤Æ¤ª¤¤¤Æ¸å¤Ç½èÍý¤¹¤ë
+               $source = $2;   # match Éôʬ¤Ï¸å³½èÍý¤Ë¤Æ¾ÜºÙ¥Á¥§¥Ã¥¯¤ò¹Ô¤¦
+               @parsed = ();
 
                # ¥×¥é¥°¥¤¥ó
                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;
+                       $source = $';
+                       my $plugin = $self->{wiki}->parse_inline_plugin($source);
+                       unless($plugin){
+                               push @parsed, '{{';
+                               push @parsed, $self->parse_line($source);
+                       } else {
+                               my $info = $self->{wiki}->get_plugin_info($plugin->{command});
+                               if($info->{TYPE} eq "inline"){
+                                       push @parsed, $self->plugin($plugin);
+                               } else {
+                                       push @parsed, $self->parse_line("<<".$plugin->{command}."¥×¥é¥°¥¤¥ó¤Ï¸ºß¤·¤Þ¤»¤ó¡£>>");
+                               }
+                               if ($source ne "") {
+                                       $source = $plugin->{post};
+                               }
+                       }
                }
 
                # InterWikiName
@@ -306,15 +308,15 @@ sub parse_line {
                        my $label = $self->{interwiki}->{g_label};
                        my $url   = $self->{interwiki}->{g_url};
                        $source = $self->{interwiki}->{g_post};
-                       $parsed = $self->url_anchor($url, $label);
+                       push @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);
+                       $source = $';
+                       push @parsed, $self->wiki_anchor($page, $label);
                }
 
                # URLÊÌ̾¥ê¥ó¥¯
@@ -327,15 +329,15 @@ sub parse_line {
                {
                        my $label = $1;
                        my $url   = $2;
-                       $source = substr($source, $+[0]);       # as $'
+                       $source = $';
                        if (   index($url, q{"}) >= 0
                                || index($url, '><') >= 0
                                || index($url, 'javascript:') >= 0)
                        {
-                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
                        }
                        else {
-                               $parsed = $self->url_anchor($url, $label);
+                               push @parsed, $self->url_anchor($url, $label);
                        }
                }
 
@@ -344,36 +346,36 @@ sub parse_line {
                        =~ /^(?:https?|ftp|mailto):[a-zA-Z0-9\.,%~^_+\-%\/\?\(\)!&=:;\*#\@'\$]*/
                        || $source =~ /^file:[^\[\]]*/)
                {
-                       my $url = substr($source, $-[0], $+[0] - $-[0]);        # as $&
-                       $source = substr($source, $+[0]);                                  # as $'
+                       my $url = $&;
+                       $source = $';
                        if (   index($url, q{"}) >= 0
                                || index($url, '><') >= 0
                                || index($url, 'javascript:') >= 0)
                        {
-                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
                        }
                        else {
-                               $parsed = $self->url_anchor($url);
+                               push @parsed, $self->url_anchor($url);
                        }
                }
 
                # ¥Ú¡¼¥¸¥ê¥ó¥¯
                elsif ($source =~ /^\[\[([^\|]+?)\]\]/) {
                        my $page = $1;
-                       $source = substr($source, $+[0]);         # as $'
-                       $parsed = $self->wiki_anchor($page);
+                       $source = $';
+                       push @parsed, $self->wiki_anchor($page);
                }
 
                # Ç¤°Õ¤ÎURL¥ê¥ó¥¯
                elsif ($source =~ /^\[([^\[]+?)\|(.+?)\]/) {
                        my $label = $1;
                        my $url   = $2;
-                       $source = substr($source, $+[0]);         # as $'
+                       $source = $';
                        if (   index($url, q{"}) >= 0
                                || index($url, '><') >= 0
                                || index($url, 'javascript:') >= 0)
                        {
-                               $parsed = $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
+                               push @parsed, $self->parse_line('<<ÉÔÀµ¤Ê¥ê¥ó¥¯¤Ç¤¹¡£>>');
                        }
                        else {
 
@@ -389,7 +391,7 @@ sub parse_line {
                                                . $wiki->get_CGI->url(-absolute => 1)
                                                . $wiki->get_CGI()->path_info();
                                }
-                               $parsed = $self->url_anchor($uri . '/../' . $url, $label);
+                               push @parsed, $self->url_anchor($uri . '/../' . $url, $label);
                        }
                }
 
@@ -397,35 +399,36 @@ sub parse_line {
                elsif ($source =~ /^('''?|==|__)(.+?)\1/) {
                        my $type  = $1;
                        my $label = $2;
-                       $source = substr($source, $+[0]);       # as $'
+                       $source = $';
                        if ($type eq q{'''}) {
-                               $parsed = $self->bold($label);
+                               push @parsed, $self->bold($label);
                        }
                        elsif ($type eq q{__}) {
-                               $parsed = $self->underline($label);
+                               push @parsed, $self->underline($label);
                        }
                        elsif ($type eq q{''}) {
-                               $parsed = $self->italic($label);
+                               push @parsed, $self->italic($label);
                        }
                        else {                                                     ## elsif ($type eq q{==}) {
-                               $parsed = $self->denialline($label);
+                               push @parsed, $self->denialline($label);
                        }
                }
 
                # ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
                elsif ($source =~ /^<<(.+?)>>/) {
                        my $label = $1;
-                       $source = substr($source, $+[0]);       # as $'
-                       $parsed = $self->error($label);
+                       $source = $';
+                       push @parsed, $self->error($label);
                }
 
                # ¥¤¥ó¥é¥¤¥ó Wiki ½ñ¼°Á´ÂΤˤϠmacth ¤·¤Ê¤«¤Ã¤¿¤È¤­
                else {
-
                        # 1 Ê¸»ú¿Ê¤à¡£
-                       $pre .= substr($source, 0, 1);
-                       $source = substr($source, 1);
-
+                       if ($source =~ /^(.)/) {
+                               $pre .= $1;
+                               $source = $';
+                       }
+                       
                        # parse ·ë²Ì¤ò @array ¤ËÊݸ¤¹¤ë½èÍý¤òÈô¤Ð¤·¤Æ·«¤êÊÖ¤·¡£
                        next SOURCE;
                }
@@ -439,11 +442,13 @@ sub parse_line {
                        $pre = q{};
                }
 
-               push @array, $parsed;
+               push @array, @parsed;
        }
 
        # ¤â¤· $pre ¤¬Î¯¤Þ¤Ã¤Æ¤¤¤ë¤Ê¤é¡¢¥­¡¼¥ï¡¼¥É¤Î½èÍý¤ò¼Â»Ü¡£
-       push @array, $self->_parse_line_keyword($pre) if ($pre ne q{});
+       if ($pre ne q{}) {
+               push @array, $self->_parse_line_keyword($pre);
+       }
 
        return @array;
 }
@@ -454,55 +459,52 @@ sub 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;
+       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  = $`;
+                       my $page = $&;
+                       $source  = $';
+                       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;
 }
 
 #===============================================================================