2 |
use strict; |
use strict; |
3 |
|
|
4 |
package main; |
package main; |
5 |
|
our $VERSION = '2.'.do{my @r=(q$Revision$=~/\d+/g);sprintf "%d."."%02d" x $#r,@r}; |
6 |
binmode STDOUT; binmode STDIN; |
binmode STDOUT; binmode STDIN; |
|
require Yuki::YukiWikiCache; |
|
7 |
use Fcntl; |
use Fcntl; |
8 |
|
require Yuki::YukiWikiCache; |
9 |
|
require SuikaWiki::Name::Space; |
10 |
|
require SuikaWiki::View; |
11 |
require SuikaWiki::Plugin; |
require SuikaWiki::Plugin; |
12 |
our %fmt; ## formatter objects |
our %fmt; ## formatter objects |
13 |
our %embed_command = ( |
our %embed_command = ( |
14 |
searched => '^\[\[#searched:([^\]]+)\]\]$', |
searched => '^\[\[#searched:([^\]]+)\]\]$', ## Deprecated |
15 |
form => qr/\[\[\#form(?:\(([A-Za-z0-9-]+)\))?:'((?:[^'\\]|\\.)*)':'((?:[^'\\]|\\.)*)'(?::'((?:[^'\\]|\\.)*)')?\]\]/, |
form => qr/\[\[\#form(?:\(([A-Za-z0-9-]+)\))?:'((?:[^'\\]|\\.)*)':'((?:[^'\\]|\\.)*)'(?::'((?:[^'\\]|\\.)*)')?\]\]/, |
16 |
); |
); |
17 |
our ($modifier_dbtype,$url_cgi,%uri,%PathTo); |
our ($modifier_dbtype,$url_cgi,%uri,%PathTo); |
18 |
our (%PageName,$kanjicode,$lang,%ViewDefinition); |
our (%PageName,$kanjicode,$lang); |
19 |
|
|
20 |
my %form; |
my %form; |
21 |
our %database; |
our %database; |
70 |
my $o = bless {param => \%form, page => $form{mypage}, toc => [], |
my $o = bless {param => \%form, page => $form{mypage}, toc => [], |
71 |
magic => $magic, content => $content, |
magic => $magic, content => $content, |
72 |
formatter => $fmt{view}, &_compatible_options ()}, 'SuikaWiki::Plugin'; |
formatter => $fmt{view}, &_compatible_options ()}, 'SuikaWiki::Plugin'; |
73 |
if (!ref $ViewDefinition{$view} || !&{$ViewDefinition{$view}->{check}} ($o)) { |
my $view_def = SuikaWiki::View->definition ($view); |
74 |
|
if (!$view_def->check ($o)) { |
75 |
print "Status: 406 Unsupported Media Type\n"; |
print "Status: 406 Unsupported Media Type\n"; |
76 |
$view = '-UnsupportedMediaType'; |
$view = '-UnsupportedMediaType'; |
77 |
|
$view_def = SuikaWiki::View->definition ($view); |
78 |
} |
} |
79 |
my $media = $ViewDefinition{$view}->{media}; |
my $media = $view_def->properties->{media}; |
80 |
if ($ViewDefinition{$view}->{xmedia} && $UA =~ /Gecko/) { |
if ($view_def->properties->{xmedia} && $UA =~ /Gecko/) { |
81 |
$media = $ViewDefinition{$view}->{xmedia}; |
$media = $view_def->properties->{xmedia}; |
82 |
$o->{media} = $media; |
$o->{media} = $media; |
83 |
} elsif ($UA =~ m#Mozilla/0\..+Windows#) { |
} elsif ($UA =~ m#Mozilla/0\..+Windows#) { |
84 |
$kanjicode = 'shift_jis'; |
$kanjicode = 'shift_jis'; |
92 |
-magic => $magic, -last_modified => $lm, o => $o); |
-magic => $magic, -last_modified => $lm, o => $o); |
93 |
} |
} |
94 |
if ($kanjicode ne 'euc') { |
if ($kanjicode ne 'euc') { |
95 |
my $s = $fmt{view}->replace ($ViewDefinition{$view}->{template} => $o); |
my $s = $fmt{view}->replace ($view_def->as_string => $o, {formatter => $fmt{view}}); |
96 |
print &code_convert (\$s => $kanjicode); |
print &code_convert (\$s => $kanjicode); |
97 |
} else { |
} else { |
98 |
print $fmt{view}->replace ($ViewDefinition{$view}->{template} => $o); |
print $fmt{view}->replace ($view_def->as_string => $o, {formatter => $fmt{view}}); |
99 |
} |
} |
100 |
} |
} |
101 |
|
|
104 |
&load_formatter ('view'); |
&load_formatter ('view'); |
105 |
my $o = bless {param => \%form, page => $option{-page}, toc => [], condition => \%option, |
my $o = bless {param => \%form, page => $option{-page}, toc => [], condition => \%option, |
106 |
formatter => $fmt{view}, &_compatible_options ()}, 'SuikaWiki::Plugin'; |
formatter => $fmt{view}, &_compatible_options ()}, 'SuikaWiki::Plugin'; |
107 |
unless (&{$ViewDefinition{$option{-view}}->{check}} ($o)) { |
my $view_def = SuikaWiki::View->definition ($option{-view}); |
108 |
|
unless ($view_def->check ($o)) { |
109 |
print "Status: 406 Unsupported Media Type\n"; |
print "Status: 406 Unsupported Media Type\n"; |
110 |
$option{-view} = '-UnsupportedMediaType'; |
$option{-view} = '-UnsupportedMediaType'; |
111 |
|
$view_def = SuikaWiki::View->definition ($option{-view}); |
112 |
} |
} |
113 |
my $media = $ViewDefinition{$option{-view}}->{media}; |
my $media = $view_def->properties->{media}; |
114 |
if ($ViewDefinition{$option{-view}}->{xmedia} && $UA =~ /Gecko/) { |
if ($view_def->properties->{xmedia} && $UA =~ /Gecko/) { |
115 |
$media = $ViewDefinition{$option{-view}}->{xmedia}; |
$media = $view_def->properties->{xmedia}; |
116 |
$o->{media} = $media; |
$o->{media} = $media; |
117 |
} |
} |
118 |
&print_header($option{-page}, -media => $media, o => $o, -goto => $option{-goto}); |
&print_header($option{-page}, -media => $media, o => $o, -goto => $option{-goto}); |
119 |
print $fmt{view}->replace ($ViewDefinition{$option{-view}}->{template} => $o); |
print $fmt{view}->replace ($view_def->as_string => $o, {formatter => $fmt{view}}); |
120 |
} |
} |
121 |
|
|
122 |
sub id_and_name ($) { |
sub id_and_name ($) { |
504 |
$option{latest} = $option{latest} ? qq(mycmd=default;x-param=@{[time.[0..9]->[rand 10]]};mypage=) : ''; |
$option{latest} = $option{latest} ? qq(mycmd=default;x-param=@{[time.[0..9]->[rand 10]]};mypage=) : ''; |
505 |
|
|
506 |
## Namespace |
## Namespace |
507 |
if ($wiki::page::ns::delimiter && ($name =~ m#\Q$wiki::page::ns::delimiter\E# |
#if ($SuikaWiki::Name::Space::VERSION) { |
508 |
|| $name eq $wiki::page::ns::parent |
$name = SuikaWiki::Name::Space::normalize_name ( ## Foo// + .//Bar -> Foo////Bar |
509 |
|| $name eq $wiki::page::ns::self)) { |
SuikaWiki::Name::Space::resolve_relative_name ( |
510 |
my @name = split m#\Q$wiki::page::ns::delimiter\E#, $name; |
SuikaWiki::Name::Space::normalize_name ($option{base}, -might_be_ns_path => 1) |
511 |
my @base = split m#\Q$wiki::page::ns::delimiter\E#, $option{base}; |
=> |
512 |
if ($name[0] eq $wiki::page::ns::self) { ## .//Foo//Bar |
SuikaWiki::Name::Space::normalize_name ($name))); |
513 |
@name = (@base, @name[1..$#name]); |
#} |
|
} elsif ($name[0] eq $wiki::page::ns::parent) { ## ..//Foo//Bar |
|
|
@base = grep {$_} @base; $#base--; |
|
|
@name = (@base, @name[1..$#name]); |
|
|
} |
|
|
$name = join $wiki::page::ns::delimiter, grep {$_} @name; |
|
|
} |
|
514 |
$name ||= $PageName{FrontPage}; |
$name ||= $PageName{FrontPage}; |
515 |
|
|
516 |
if ($database{$name}) { |
if ($database{$name}) { |
633 |
} |
} |
634 |
$form{mypage} ||= $PageName{FrontPage}; |
$form{mypage} ||= $PageName{FrontPage}; |
635 |
$form{mypage} =~ tr/\x00-\x1F\x7F//d; |
$form{mypage} =~ tr/\x00-\x1F\x7F//d; |
636 |
|
$form{mypage} = SuikaWiki::Name::Space::normalize_name ($form{mypage}); |
637 |
$form{mycmd} ||= 'default'; |
$form{mycmd} ||= 'default'; |
638 |
|
|
639 |
# mypreview_edit -> do_edit, with preview. |
# mypreview_edit -> do_edit, with preview. |
650 |
# $form{mycmd} is frozen here. |
# $form{mycmd} is frozen here. |
651 |
# |
# |
652 |
|
|
653 |
for (grep /^wikiform__/, keys %form) { |
for (grep /^(?:wikiform__|pi_)/, keys %form) { |
654 |
$form{$_} = &code_convert (\$form{$_}, $kanjicode); |
$form{$_} = &code_convert (\$form{$_}, $kanjicode); |
655 |
} |
} |
656 |
$form{mymsg} = &code_convert(\$form{mymsg}, $kanjicode); |
$form{mymsg} = &code_convert(\$form{mymsg}, $kanjicode); |
758 |
|
|
759 |
sub is_editable { |
sub is_editable { |
760 |
my ($page) = @_; |
my ($page) = @_; |
761 |
if ($page =~ /[\x00-\x20\x7F]/) { |
if ($page =~ /[\x00-\x20\[\]\x7F]/) { |
762 |
return 0; |
return 0; |
763 |
} elsif ($wiki::page::ns::delimiter) { ## Use namespace |
} elsif ($wiki::page::ns::delimiter) { ## Use namespace |
764 |
if ($page eq $wiki::page::ns::delimiter |
if ($page eq $wiki::page::ns::delimiter |
1169 |
sub resource ($$;%) { shift; &main::Resource (@_) } |
sub resource ($$;%) { shift; &main::Resource (@_) } |
1170 |
sub uri ($$) { $main::uri{$_[1]} } |
sub uri ($$) { $main::uri{$_[1]} } |
1171 |
sub user_agent_names ($) { $main::UA } |
sub user_agent_names ($) { $main::UA } |
1172 |
|
|
1173 |
sub formatter ($$) { |
sub formatter ($$) { |
1174 |
&main::load_formatter ($_[1]); |
&main::load_formatter ($_[1]); |
1175 |
$main::fmt{$_[1]}; |
$main::fmt{$_[1]}; |
1179 |
$main::fmt{format}->{($_[1]=~/([A-Za-z0-9]\S+)/?$1:'SuikaWiki/0.9').'_to_'.$_[2]} |
$main::fmt{format}->{($_[1]=~/([A-Za-z0-9]\S+)/?$1:'SuikaWiki/0.9').'_to_'.$_[2]} |
1180 |
|| $main::fmt{format}->{($_[1]=~/([A-Za-z0-9](?:(?!\/)\S)+)/?$1:'SuikaWiki').'_to_'.$_[2]}; |
|| $main::fmt{format}->{($_[1]=~/([A-Za-z0-9](?:(?!\/)\S)+)/?$1:'SuikaWiki').'_to_'.$_[2]}; |
1181 |
} |
} |
1182 |
|
sub formatter_replace_if_not_parsed_yet ($$$$) { |
1183 |
|
my ($o, $context, $p, $attr_name) = @_; |
1184 |
|
&main::load_formatter ($context); |
1185 |
|
index ($p->{-option}->{$attr_name}, 'p') > -1 ? |
1186 |
|
$p->{$attr_name} ## Already parsed |
1187 |
|
: |
1188 |
|
$main::fmt{$context}->replace ($p->{$attr_name}, $o, {formatter => $main::fmt{$context}}) |
1189 |
|
; |
1190 |
|
} |
1191 |
|
|
1192 |
sub cache ($$) { |
sub cache ($$) { |
1193 |
our %Cache; |
our %Cache; |
1194 |
my (undef, $name, %option) = @_; |
my (undef, $name, %option) = @_; |
1251 |
for my $lang (sort {$option->{accept_language}->{$b} <=> $option->{accept_language}->{$a}} grep {$option->{accept_language}->{$_}!=0} keys %{$option->{accept_language}}) { |
for my $lang (sort {$option->{accept_language}->{$b} <=> $option->{accept_language}->{$a}} grep {$option->{accept_language}->{$_}!=0} keys %{$option->{accept_language}}) { |
1252 |
while (length $lang) { |
while (length $lang) { |
1253 |
unless ($option->{accept_language}->{defined $option->{accept_language}->{$lang} ? $lang : '*'} == 0) { |
unless ($option->{accept_language}->{defined $option->{accept_language}->{$lang} ? $lang : '*'} == 0) { |
1254 |
$option->{resource}->{$lang} ||= &wiki::suikawikiconst::to_hash ($main::database{'WikiResource:'.$lang}); |
$option->{resource}->{$lang} ||= &wiki::suikawikiconst::to_hash ($main::database{$main::PageName{ResourceNS}.$lang}); |
1255 |
$v = $option->{resource}->{$lang}->{$resname}; |
$v = $option->{resource}->{$lang}->{$resname}; |
1256 |
last if defined $v; |
last if defined $v; |
1257 |
} |
} |