# ¥³¥ó¥¹¥È¥é¥¯¥¿
#==============================================================================
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;
$url->{$keyword->{word}} = $keyword->{url};
$page->{$keyword->{word}} = $keyword->{page};
}
- $self->{regex} = $regex;
+ $self->{regex} = $regex;
$self->{info_url} = $url;
$self->{info_page} = $page;
}
}
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);
+ }
}
}
$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);
# </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>
# ¥Ñ¡¼¥¹¤ò³«»ÏÁ°¤Ë¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£