| 5 |
our $VERSION = '2.'.do{my @r=(q$Revision$=~/\d+/g);sprintf "%d."."%02d" x $#r,@r}; |
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; |
| 7 |
use Fcntl; |
use Fcntl; |
|
require Yuki::YukiWikiCache; |
|
|
require SuikaWiki::Name::Space; |
|
|
require SuikaWiki::View; |
|
| 8 |
require SuikaWiki::Plugin; |
require SuikaWiki::Plugin; |
| 9 |
our %fmt; ## formatter objects |
our %fmt; ## formatter objects |
| 10 |
our %embed_command = ( |
our %embed_command = ( |
| 28 |
); |
); |
| 29 |
our $UA = ''; ## User agent name |
our $UA = ''; ## User agent name |
| 30 |
$| = 1; |
$| = 1; |
| 31 |
my $HAS_XML = SuikaWiki::Plugin->feature ('SuikaWiki::Markup::XML'); |
SuikaWiki::Plugin->feature ('SuikaWiki::View'); |
| 32 |
|
SuikaWiki::Plugin->feature ('SuikaWiki::Name::Space'); |
| 33 |
|
SuikaWiki::Plugin->feature ('SuikaWiki::Markup::XML'); |
| 34 |
|
SuikaWiki::Plugin->feature ('Yuki::YukiWikiCache'); |
| 35 |
my $NS_XHTML1 = 'http://www.w3.org/1999/xhtml'; |
my $NS_XHTML1 = 'http://www.w3.org/1999/xhtml'; |
| 36 |
|
|
| 37 |
sub main { |
sub main { |
| 50 |
} |
} |
| 51 |
|
|
| 52 |
sub do_view { |
sub do_view { |
| 53 |
my $content = $database{$form{mypage}}; |
my $content = $main::database{$main::form{mypage}}; |
| 54 |
my $lm = $database->mtime ($form{mypage}); |
my $lm = SuikaWiki::Plugin->_database->mtime ($main::form{mypage}); |
|
&load_formatter ('view'); |
|
| 55 |
my $view = $form{mycmd}; |
my $view = $form{mycmd}; |
| 56 |
if ($view eq 'edit') { |
$view = 'default' if $view =~ /[^0-9A-Za-z_]/; |
|
$view = 'adminedit' if $form{admin}; |
|
|
} elsif ($view =~ /[^0-9A-Za-z_]/) { |
|
|
$view = 'default' |
|
|
} |
|
| 57 |
if ($view eq 'default' || !$view) { |
if ($view eq 'default' || !$view) { |
| 58 |
## BUG: this code is not strict |
## BUG: this code is not strict |
| 59 |
if ($main::ENV{HTTP_COOKIE} =~ /SelectedMode=([0-9A-Za-z]+)/) { |
if ($main::ENV{HTTP_COOKIE} =~ /SelectedMode=([0-9A-Za-z]+)/) { |
| 62 |
$view = 'read'; |
$view = 'read'; |
| 63 |
} |
} |
| 64 |
} |
} |
| 65 |
my ($magic, $content) = &SuikaWiki::Plugin::magic_and_content (undef, $content); |
my ($magic, $content) = SuikaWiki::Plugin->magic_and_content ($content); |
| 66 |
$magic ||= '#?SuikaWiki/0.9'; |
$magic ||= '#?SuikaWiki/0.9'; |
| 67 |
my $o = bless {param => \%form, page => $form{mypage}, toc => [], |
my $o = bless {param => \%main::form, page => $main::form{mypage}, toc => [], |
| 68 |
magic => $magic, content => $content, |
magic => $magic, content => $content, |
| 69 |
formatter => $fmt{view}, &_compatible_options ()}, 'SuikaWiki::Plugin'; |
formatter => $fmt{view}, &main::_compatible_options ()}, 'SuikaWiki::Plugin'; |
| 70 |
my $view_def = SuikaWiki::View->definition ($view); |
my $view_def = SuikaWiki::View->definition ($view); |
| 71 |
if (!$view_def->check ($o)) { |
if (!$view_def->check ($o)) { |
| 72 |
print "Status: 406 Unsupported Media Type\n"; |
print "Status: 406 Unsupported Media Type\n"; |
| 77 |
if ($view_def->properties->{xmedia} && $UA =~ /Gecko/) { |
if ($view_def->properties->{xmedia} && $UA =~ /Gecko/) { |
| 78 |
$media = $view_def->properties->{xmedia}; |
$media = $view_def->properties->{xmedia}; |
| 79 |
$o->{media} = $media; |
$o->{media} = $media; |
| 80 |
} elsif ($UA =~ m#Mozilla/0\..+Windows#) { |
} elsif ($main::UA =~ m#Mozilla/0\..+Windows#) { |
| 81 |
$kanjicode = 'shift_jis'; |
$main::kanjicode = 'shift_jis'; |
| 82 |
} |
} |
| 83 |
if ($magic =~ m!^\#\?SuikaWiki/0.9!) { |
if ($magic =~ m!^\#\?SuikaWiki/0.9!) { |
| 84 |
&print_header ($form{mypage}, -last_modified => ($magic =~ /interactive="yes"/ ? time : $lm), |
&main::print_header ($main::form{mypage}, -last_modified => ($magic =~ /interactive="yes"/ ? time : $lm), |
| 85 |
-expires => ($magic =~ /interactive="yes"/ ? 1 : undef), o => $o, |
-expires => ($magic =~ /interactive="yes"/ ? 1 : undef), o => $o, |
| 86 |
-media => $media, -magic => $magic, content => $content); |
-media => $media, -magic => $magic, content => $content); |
| 87 |
} else { |
} else { |
| 88 |
&print_header($form{mypage}, -media => $media, |
&main::print_header($main::form{mypage}, -media => $media, |
| 89 |
-magic => $magic, -last_modified => $lm, o => $o); |
-magic => $magic, -last_modified => $lm, o => $o); |
| 90 |
} |
} |
| 91 |
if ($kanjicode ne 'euc') { |
my $fmt = SuikaWiki::Plugin->formatter ('view'); |
| 92 |
my $s = $fmt{view}->replace ($view_def->as_string => $o, {formatter => $fmt{view}}); |
if ($main::kanjicode ne 'euc') { |
| 93 |
print &code_convert (\$s => $kanjicode); |
my $s = $fmt->replace ($view_def->as_string => $o, {formatter => $fmt}); |
| 94 |
|
print &main::code_convert (\$s => $main::kanjicode); |
| 95 |
} else { |
} else { |
| 96 |
print $fmt{view}->replace ($view_def->as_string => $o, {formatter => $fmt{view}}); |
print $fmt->replace ($view_def->as_string => $o, {formatter => $fmt}); |
| 97 |
} |
} |
| 98 |
} |
} |
| 99 |
|
|
| 188 |
(use_anchor_name => ($UA =~ m#Mozilla/[12]\.|Microsoft Internet Explorer# ? 1 : 0)); |
(use_anchor_name => ($UA =~ m#Mozilla/[12]\.|Microsoft Internet Explorer# ? 1 : 0)); |
| 189 |
} |
} |
| 190 |
|
|
|
sub get_search_result ($;%) { |
|
|
my $word = lc shift; |
|
|
my $SearchResult = SuikaWiki::Plugin->cache ('search'); |
|
|
my %option = @_; |
|
|
my @r; |
|
|
unless (defined $SearchResult->{$word}) { |
|
|
for my $page (keys %database) { |
|
|
next if !$option{-match_myself} && ($page eq $word); |
|
|
my $content = lc $database{$page}; |
|
|
$content =~ s/^[^\x0A\x0D]+[\x0D\x0A]+//s; |
|
|
if (index (lc $page, $word) > -1) { |
|
|
my $c = $content =~ s/\Q$word\E//g; |
|
|
push @r, [$page, $c+20]; |
|
|
} elsif (index ($word, lc $page) > -1) { |
|
|
my $c = $content =~ s/\Q$word\E//g; |
|
|
push @r, [$page, $c+10]; |
|
|
} elsif (my $c = $content =~ s/\Q$word\E//g) { |
|
|
push @r, [$page, $c]; |
|
|
} |
|
|
} |
|
|
@r = sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]} @r; |
|
|
$SearchResult->{$word} = join "\x1E", map {$_->[0]."\x1F".$_->[1]} @r; |
|
|
} else { |
|
|
@r = map {[split /\x1F/, $_, 2]} split /\x1E/, $SearchResult->{$word}; |
|
|
} |
|
|
#my $em = sub { my $s = shift; $s =~ s#(\Q$word\E)#<em>$1</em>#gi; $s }; |
|
|
my $r = join "\n", map {qq(<li>[$_->[1]] <a href ="$url_cgi?@{[&encode($_->[0])]}" class="wiki">@{[&escape($_->[0])]}</a> <span class="wikipage-summary">@{[&escape(&get_subjectline($_->[0]))]}</span></li>)} @r; |
|
|
$r = qq|<ul class="search-result">$r</ul>| if $r; |
|
|
wantarray? ($r, scalar @r): $r; |
|
|
} |
|
|
|
|
| 191 |
sub do_random_jump { |
sub do_random_jump { |
| 192 |
my @list = keys %database; |
my @list = keys %main::database; |
| 193 |
my $name = &encode ($list[rand @list]); |
print "Location: ".SuikaWiki::Plugin->_uri_wiki_page ($list[rand @list])."\n"; |
|
print "Location: $uri{wiki}?$name\n"; |
|
| 194 |
print "\n"; |
print "\n"; |
| 195 |
} |
} |
| 196 |
|
|
| 197 |
sub print_header ($;%) { |
sub print_header ($;%) { |
| 198 |
my ($page, %option) = @_; |
my ($page, %option) = @_; |
| 199 |
my @head; |
my $UA = SuikaWiki::Plugin->user_agent_names; |
| 200 |
$option{o}->{-header}->{class} = &is_frozen($page) ? 'frozen' : ''; |
$option{o}->{-header}->{class}->{frozen} = 1 if &main::is_frozen ($page); |
| 201 |
$option{o}->{-header}->{class} .= " wiki-page-obsoleted" if $option{-magic} =~ /obsoleted="yes"/; |
$option{o}->{-header}->{class}->{'wiki-page-obsoleted'} if $option{-magic} =~ /obsoleted="yes"/; |
| 202 |
|
$option{o}->{-header}->{additional_html_element} ||= SuikaWiki::Markup::XML->new (type => '#fragment'); |
| 203 |
if ($option{-goto}) { |
if ($option{-goto}) { |
| 204 |
if ($UA =~ m#Opera|MSIE 2\.#) { |
if ($UA =~ m#Opera|MSIE 2\.#) { |
| 205 |
## WARNING: This code may output unsafe HTML document if |
## WARNING: This code may output unsafe HTML document if $option{-goto} is unclean. |
| 206 |
## $option{-goto} is not clean. |
$option{-goto} =~ tr/;/&/ if $UA =~ m#Opera#; |
| 207 |
$option{-goto} =~ tr/;/&/ if $UA =~ m#Opera#; |
print qq{Refresh: 0; url=$option{-goto}\n}; |
| 208 |
print qq{Refresh: 0; url=$option{-goto}\n}; |
for ($option{o}->{-header}->{additional_html_element}->append_new_node |
| 209 |
push @head, qq(<meta http-equiv="refresh" content="0; url=$option{-goto}">); |
(namespace_uri => $NS_XHTML1, local_name => 'meta')) { |
| 210 |
} elsif ($UA =~ /Gecko/) { |
$_->set_attribute ('http-equiv' => 'refresh'); |
| 211 |
print qq{Refresh: 0; url="$option{-goto}"\n}; |
$_->set_attribute (content => "0; url=$option{-goto}"); |
| 212 |
push @head, qq(<meta http-equiv="refresh" content="0; url="@{[&escape($option{-goto})]}"" />); |
} |
| 213 |
} else { |
} else { |
| 214 |
$option{-goto} =~ tr/;/&/ if $UA =~ m#Mozilla/[1-4]\.#; |
$option{-goto} =~ tr/;/&/ if $UA =~ m#Mozilla/[1-4]\.#; |
| 215 |
print qq{Refresh: 0; url="$option{-goto}"\n}; |
print qq{Refresh: 0; url="$option{-goto}"\n}; |
| 216 |
push @head, qq(<meta http-equiv="refresh" content="0; url="@{[&escape($option{-goto})]}"">); |
for ($option{o}->{-header}->{additional_html_element}->append_new_node |
| 217 |
|
(namespace_uri => $NS_XHTML1, local_name => 'meta')) { |
| 218 |
|
$_->set_attribute ('http-equiv' => 'refresh'); |
| 219 |
|
$_->set_attribute (content => qq(0; url="$option{-goto}")); |
| 220 |
|
} |
| 221 |
} |
} |
| 222 |
} |
} |
| 223 |
print qq{Last-Modified: @{[scalar gmtime $option{-last_modified}]}\n} if $option{-last_modified}; |
print qq{Last-Modified: @{[scalar gmtime $option{-last_modified}]}\n} |
| 224 |
|
if $option{-last_modified}; |
| 225 |
if ($option{-expires} != -1) { |
if ($option{-expires} != -1) { |
| 226 |
if (defined $option{-expires}) { ## TODO: Don't use asctime |
if (defined $option{-expires}) { ## TODO: Don't use asctime |
| 227 |
print qq{Expires: @{[scalar gmtime (time + $option{-expires})]}\n}; |
print qq{Expires: @{[scalar gmtime (time + $option{-expires})]}\n}; |
| 230 |
} |
} |
| 231 |
} |
} |
| 232 |
if ($option{-media}->{charset} && $UA =~ m#Mozilla/[12]\.#) { |
if ($option{-media}->{charset} && $UA =~ m#Mozilla/[12]\.#) { |
| 233 |
my $ct = qq{$option{-media}->{type}; charset=@{[&get_charset_name($kanjicode,compatible=>1)]}}; |
## UAs don't support official charset names but do non-official names |
| 234 |
print qq{Content-Type: $ct\n}; |
my $ct = qq{$option{-media}->{type}; charset=@{[ &main::get_charset_name ($main::kanjicode, compatible => 1) ]}}; |
| 235 |
$option{o}->{-header}->{meta_ct} = qq{<meta http-equiv="content-type" content="$ct">\n}; |
print qq{Content-Type: $ct\n}; |
| 236 |
|
for ($option{o}->{-header}->{additional_html_element}->append_new_node |
| 237 |
|
(namespace_uri => $NS_XHTML1, local_name => 'meta')) { |
| 238 |
|
$_->set_attribute ('http-equiv' => 'content-type'); |
| 239 |
|
$_->set_attribute (content => $ct); |
| 240 |
|
} |
| 241 |
} elsif (!$option{-media}->{charset} || $UA =~ m#Infomosaic|Mozilla/0\.#) { |
} elsif (!$option{-media}->{charset} || $UA =~ m#Infomosaic|Mozilla/0\.#) { |
| 242 |
print qq{Content-Type: $option{-media}->{type}\n}; |
## Media types or UAs don't support charset parameter in HTTP header |
| 243 |
$option{o}->{-header}->{meta_ct} = qq{<meta http-equiv="content-type" content="$option{-media}->{type}; charset=@{[&get_charset_name($kanjicode,compatible=>1)]}">\n}; |
print qq{Content-Type: $option{-media}->{type}\n}; |
| 244 |
|
if ($option{-media}->{charset}) { |
| 245 |
|
for ($option{o}->{-header}->{additional_html_element}->append_new_node |
| 246 |
|
(namespace_uri => $NS_XHTML1, local_name => 'meta')) { |
| 247 |
|
$_->set_attribute ('http-equiv' => 'content-type'); |
| 248 |
|
$_->set_attribute (content => qq($option{-media}->{type}; charset=).main::get_charset_name ($main::kanjicode, compatible => 1)); |
| 249 |
|
} |
| 250 |
|
} |
| 251 |
} else { |
} else { |
| 252 |
my $type = $option{-media}->{type}; |
## Modern UAs and Media types with charset parameter |
| 253 |
$type = 'application/xml' if ($type =~ m!^application/(?:rdf|rss)\+xml$!) && ($UA =~ m#Gecko#); |
my $type = $option{-media}->{type}; |
| 254 |
print qq{Content-Type: $type; charset=@{[&get_charset_name($kanjicode)]}\n}; |
$type = 'application/xml' if ($type =~ m!^application/(?:rdf|rss)\+xml$!) && ($UA =~ m#Gecko#); |
| 255 |
|
print qq{Content-Type: $type; charset=@{[&main::get_charset_name ($main::kanjicode)]}\n}; |
| 256 |
|
## meta element is not needed |
| 257 |
} |
} |
| 258 |
#if ($main::ENV{HTTP_IF_MODIFIED_SINCE}) { |
#if ($main::ENV{HTTP_IF_MODIFIED_SINCE}) { |
| 259 |
## TODO: IMS support |
## TODO: IMS support |
| 261 |
|
|
| 262 |
## TODO: more Vary: support |
## TODO: more Vary: support |
| 263 |
print <<"EOD"; |
print <<"EOD"; |
| 264 |
Vary: Negotiate,User-Agent,Accept-Language |
Vary: Negotiate,User-Agent,Accept-Language,Accept-Type |
| 265 |
Content-Style-Type: text/css |
Content-Style-Type: text/css |
| 266 |
|
|
| 267 |
EOD |
EOD |
|
$option{o}->{-header}->{links} = join "\n", (@head); |
|
| 268 |
} |
} |
| 269 |
|
|
| 270 |
sub get_charset_name ($;%) { |
sub get_charset_name ($;%) { |
| 285 |
$s =~ s|<|<|g; |
$s =~ s|<|<|g; |
| 286 |
$s =~ s|>|>|g; |
$s =~ s|>|>|g; |
| 287 |
$s =~ s|"|"|g; |
$s =~ s|"|"|g; |
| 288 |
|
$s =~ s/([\x00-\x08\x0B\x0C\x0E-\x1F])/sprintf '&#%d;', ord $1/ge; |
| 289 |
|
## XML unsafe control chars |
| 290 |
return $s; |
return $s; |
| 291 |
} |
} |
| 292 |
|
|
| 310 |
} elsif ($option{-error_no_return}) { |
} elsif ($option{-error_no_return}) { |
| 311 |
return undef; |
return undef; |
| 312 |
} elsif ($t =~ /HTML|xml/) { |
} elsif ($t =~ /HTML|xml/) { |
| 313 |
length $content ? '<pre>'.&escape($content).'</pre>' : ''; |
if (length $content) { |
| 314 |
|
my $r = SuikaWiki::Markup::XML->new (namespace_uri => $NS_XHTML1, local_name => 'pre'); |
| 315 |
|
return $r->append_text ($content); |
| 316 |
|
} else { |
| 317 |
|
return ''; |
| 318 |
|
} |
| 319 |
} else { |
} else { |
| 320 |
$content; |
$content; |
| 321 |
} |
} |
| 322 |
} |
} |
| 323 |
|
|
|
{my %FormIndex; |
|
|
sub make_custom_form ($$$$%) { |
|
|
my ($wfname, $definition, $template, $foption, $option) = @_; |
|
|
## $template is currently not used in this procedure. |
|
|
#unless ($main::_EMBEDED) { |
|
|
$FormIndex{$option->{page}}++; |
|
|
if (length $definition) { |
|
|
my $param = bless {depth=>10}, 'SuikaWiki::Plugin'; |
|
|
$param->{page} = $option->{page}; |
|
|
my $lastmodified = $database->mtime ($option->{page}); |
|
|
&load_formatter (qw/form_input form_option/); |
|
|
$definition = &unescape ($definition); |
|
|
$definition =~ s/\\(['\\])/$1/g; |
|
|
$foption = &unescape ($foption); |
|
|
$foption =~ s/\\(['\\])/$1/g; |
|
|
$fmt{form_option}->replace ($foption, $param); |
|
|
$param->{output}->{form} = 1 unless defined $param->{output}->{form}; |
|
|
$param->{output}->{form} = 0 if $main::_EMBEDED; |
|
|
$definition .= ' %submit;' if $definition !~ /%submit/ && !$param->{output}->{nosubmit} && $param->{output}->{form}; |
|
|
$param->{output}->{page} ||= $option->{page}; |
|
|
$param->{form_disabled} = 1 if $database->meta (IsFrozen => $option->{page}); |
|
|
my $target_form = $param->{output}->{id}; |
|
|
my $r = ''; |
|
|
$r = <<EOH if $param->{output}->{form}; |
|
|
<form method="post" action="$url_cgi" id="wikiform-$FormIndex{$option->{page}}" class="wikiform"> |
|
|
<input type="hidden" name="mycmd" value="@{[$param->{form_disabled}?'default':'wikiform']}" /> |
|
|
<input type="hidden" name="mypage" value="@{[&escape($param->{output}->{page})]}" /> |
|
|
<input type="hidden" name="myLastModified" value="$lastmodified" /> |
|
|
<input type="hidden" name="mytouch" value="on" /> |
|
|
<input type="hidden" name="@{[$target_form? qq(wikiform_targetform" value="@{[&escape($target_form)]}) : qq(wikiform_index" value="$FormIndex{$option->{page}})]}" /> |
|
|
EOH |
|
|
$r .= qq(<a name="wikiform-$FormIndex{$option->{page}}"></a>) if $UA =~ m#Mozilla/[12]\.#; |
|
|
$r .= $fmt{form_input}->replace ($definition, $param); |
|
|
$r .= "</form>\n" if $param->{output}->{form}; |
|
|
$r; |
|
|
} else { ## No input-interface WikiForm |
|
|
qq(<a id="wikiform-$FormIndex{$option->{page}}" name="wikiform-$FormIndex{$option->{page}}"><!-- #form --></a>); |
|
|
} |
|
|
#} else { |
|
|
# qq(<ins class="wiki-error">@{[&Resource('Error:WikiForm:EmbedIsNotSupported',escape=>1)]}</ins>); |
|
|
#} |
|
|
}} |
|
| 324 |
|
|
| 325 |
sub init_form { |
sub init_form { |
| 326 |
## TODO: Support multipart/form-data |
## TODO: Support multipart/form-data |
| 381 |
$form{myname} = &code_convert(\$form{myname}, $kanjicode); |
$form{myname} = &code_convert(\$form{myname}, $kanjicode); |
| 382 |
} |
} |
| 383 |
|
|
|
sub get_subjectline { |
|
|
my ($page, %option) = @_; |
|
|
my $SubjectLine = SuikaWiki::Plugin->cache ('headline'); |
|
|
unless (defined $SubjectLine->{$page}) { |
|
|
if (not &is_editable($page)) { |
|
|
$SubjectLine->{$page} = ""; |
|
|
} else { |
|
|
$SubjectLine->{$page} = do { |
|
|
my $s=$database{$page}; |
|
|
$s =~ tr/\x0D//d; |
|
|
$s =~ s!^\#\?[^\x0A\x0D]+[\x0A\x0D]*!!s; |
|
|
$s =~ s/\x0A\x0A.*//s; |
|
|
if (length ($s) > 500) { |
|
|
$s = substr ($s, 0, 500); |
|
|
$s =~ s/[^\x09\x0A\x20-\x7E]+$//s; |
|
|
$s .= '...'; |
|
|
} |
|
|
#if ($s =~ /^([^\x0A]*(?:\x0A+[^\x0A]+){0,9})/s) { |
|
|
# $s = $1; |
|
|
#} |
|
|
$s =~ s/[\x09\x0A\x20]+/\x20/gs; |
|
|
$s =~ s/^[-=*>,:]+//; |
|
|
$s =~ s/'''?//g; |
|
|
$s =~ s/\[\[([^]]+)\]\]/$1/g; |
|
|
$s =~ s/__&&([^&]+)&&__/$1/g; |
|
|
$s =~ s/\[[A-Z]+(?:\([^)]+\))?\[([^]]+)\](?:\s\[([^]]+)\])?\]/$1$2/g; |
|
|
$s =~ s/\([^\(\)]+\)//g; |
|
|
$s =~ s/\[[^\[\]]+\]//g; |
|
|
$s =~ s/>>[0-9]+//g; |
|
|
$s =~ s/<[^<>]+>//g; |
|
|
$s =~ s/20[0-9][0-9]-[01][0-9]-[0-3][0-9]\x20*[0-2][0-9]:[0-5][0-9]//g; |
|
|
$s =~ s/ [Aa]n? / /g; |
|
|
$s =~ s/ [Aa]t / @ /g; |
|
|
$s =~ s/ [Tt]he / /g; |
|
|
$s =~ s/,? and / & /g; |
|
|
$s =~ s!,? or ! / !g; |
|
|
$s =~ s! not !n't !g; |
|
|
$s =~ s! (?:i|ha)s !'s !g; |
|
|
$s =~ s! are !'re !g; |
|
|
$s =~ s! [Ww]ith(in|out)? !' w/'.substr ($1,0,1).' '!ge; |
|
|
$s =~ s!です。!。!g; |
|
|
$s =~ s!ました。!た。!g; |
|
|
$s =~ s!ありません!ない!g; |
|
|
$s =~ s!します!する!g; |
|
|
$s =~ s!(?:り)?ます!る!g; |
|
|
$s =~ s!いよいよ|とうとう|ようやく!!g; |
|
|
$s =~ s!とりあえず!!g; |
|
|
$s =~ s!(?:、|。|[.,])\x20?$!!g; |
|
|
$s =~ s/\x20+/\x20/g; |
|
|
if (length ($s) > 400) { |
|
|
$s = substr ($s, 0, 400); |
|
|
$s =~ s/[^\x20-\x7E]+$//s; |
|
|
$s .= '...'; |
|
|
} |
|
|
$s}; |
|
|
} |
|
|
} |
|
|
if (length $SubjectLine->{$page}) { |
|
|
$option{delimiter} = defined $option{delimiter} ? $option{delimiter} : &Resource('Title-Summary Delimiter'); |
|
|
$option{delimiter}.$SubjectLine->{$page}.$option{tail}; |
|
|
} else { |
|
|
''; |
|
|
} |
|
|
} |
|
| 384 |
|
|
| 385 |
sub open_db { |
sub open_db { |
| 386 |
if ($modifier_dbtype eq 'dbmopen') { |
if ($modifier_dbtype eq 'dbmopen') { |
| 411 |
$option{content} = $database{$option{page}} unless defined $option{content}; |
$option{content} = $database{$option{page}} unless defined $option{content}; |
| 412 |
$option{content} = $database{NewPageTemplate} unless length $option{content}; |
$option{content} = $database{NewPageTemplate} unless length $option{content}; |
| 413 |
$option{last_modified} = $database->mtime ($option{page}) unless defined $option{last_modified}; |
$option{last_modified} = $database->mtime ($option{page}) unless defined $option{last_modified}; |
|
my $f = ''; |
|
| 414 |
my $magic = ''; |
my $magic = ''; |
| 415 |
$magic = $1 if $option{content} =~ m/^([^\x0A\x0D]+)/s; |
$magic = $1 if $option{content} =~ m/^([^\x0A\x0D]+)/s; |
| 416 |
|
|
| 427 |
<option value="edit" label="@{[&Resource('Edit:SaveAndEdit',escape=>1)]}"@{[$selected eq 'edit' ? ' selected="selected"':'']}>@{[&Resource('Edit:SaveAndEdit',escape=>1)]}</option> |
<option value="edit" label="@{[&Resource('Edit:SaveAndEdit',escape=>1)]}"@{[$selected eq 'edit' ? ' selected="selected"':'']}>@{[&Resource('Edit:SaveAndEdit',escape=>1)]}</option> |
| 428 |
</select> |
</select> |
| 429 |
EOH |
EOH |
| 430 |
$f .= <<"EOD"; |
|
| 431 |
|
=pod |
| 432 |
|
|
| 433 |
|
my $f = SuikaWiki::Markup::XML->new (namespace_uri => $NS_XHTML1, local_name => 'form'); |
| 434 |
|
$f->set_attribute (action => SuikaWiki::Plugin->uri ('wiki'); |
| 435 |
|
$f->set_attribute (method => 'post'); |
| 436 |
|
if (!$option{confloct}) { |
| 437 |
|
for ($f->append_new_node (namespace_uri => $NS_XHTML1, local_name => 'label')) { |
| 438 |
|
for ($_->append_new_node (namespace_uri => $NS_XHTML1, local_name => 'input')) { |
| 439 |
|
$f->set_attribute (type => 'submit'); |
| 440 |
|
$f->set_attribute (name => 'mypreview_write'); |
| 441 |
|
$f->set_attribute (value => SuikaWiki::Plugin->resource ('Edit:Save')); |
| 442 |
|
} |
| 443 |
|
$_->append_new_node (namespace_uri => $NS_XHTML1, local_name => 'kbd', value => 'S'); |
| 444 |
|
} |
| 445 |
|
} |
| 446 |
|
|
| 447 |
|
=cut |
| 448 |
|
|
| 449 |
|
my $f = <<"EOD"; |
| 450 |
<form action="$uri{wiki}" method="post"> |
<form action="$uri{wiki}" method="post"> |
| 451 |
@{[ $option{conflict} ? '' : qq(<label><input type="submit" name="mypreview_write" value="@{[&Resource('Edit:Save',escape=>1)]}" /><kbd>S</kbd></label>) ]} |
@{[ $option{conflict} ? '' : qq(<label><input type="submit" name="mypreview_write" value="@{[&Resource('Edit:Save',escape=>1)]}" /><kbd>S</kbd></label>) ]} |
| 452 |
@{[ $option{admin} ? qq(<label>@{[&Resource('Edit:Password=',escape=>1)]}<input type="password" name="mypassword" value="" size="10" /></label>) : "" ]} [@{[&get_new_anchor_index($option{content})]}]<br /> |
@{[ $option{admin} ? qq(<label>@{[&Resource('Edit:Password=',escape=>1)]}<input type="password" name="mypassword" value="" size="10" /></label>) : "" ]} [@{[&get_new_anchor_index($option{content})]}]<br /> |
| 516 |
return 0; |
return 0; |
| 517 |
} else { |
} else { |
| 518 |
&_do_view_msg (-view => '-error', -page => $form{mypage}, |
&_do_view_msg (-view => '-error', -page => $form{mypage}, |
| 519 |
error_message => &Resource ('Error:PasswordIsIncorrect')); |
error_message => SuikaWiki::Plugin->resource ('Error:PasswordIsIncorrect')); |
| 520 |
exit; |
exit; |
| 521 |
} |
} |
| 522 |
} |
} |
| 523 |
|
|
| 524 |
sub is_frozen ($) { $database->meta (IsFrozen => $_[0]) ? 1 : 0 } |
sub is_frozen ($) { SuikaWiki::Plugin->_database->meta (IsFrozen => $_[0]) ? 1 : 0 } |
| 525 |
|
|
| 526 |
sub do_comment { |
sub do_comment { |
| 527 |
my ($content) = $database{$form{mypage}}; |
my ($content) = $database{$form{mypage}}; |
| 579 |
for (@{$SuikaWiki::Plugin::List{'wiki'.$t}||[]}) { |
for (@{$SuikaWiki::Plugin::List{'wiki'.$t}||[]}) { |
| 580 |
$_->load_formatter ($fmt{$t}, type => 'wiki'.$t); |
$_->load_formatter ($fmt{$t}, type => 'wiki'.$t); |
| 581 |
} |
} |
| 582 |
$fmt{$t}->option (return_class => 'SuikaWiki::Markup::XML') if $HAS_XML; |
$fmt{$t}->option (return_class => 'SuikaWiki::Markup::XML'); |
| 583 |
} |
} |
| 584 |
} |
} |
| 585 |
} |
} |