Parent Directory
|
Revision Log
*** empty log message ***
| 1 | wakaba | 1.9 | #!/usr/bin/perl |
| 2 | # | ||
| 3 | wakaba | 1.16 | # wiki.cgi - This is YukiWiki, yet another Wiki clone. |
| 4 | wakaba | 1.9 | # |
| 5 | wakaba | 1.16 | # Copyright (C) 2000-2002 by Hiroshi Yuki. |
| 6 | wakaba | 1.9 | # <[email protected]> |
| 7 | # http://www.hyuki.com/yukiwiki/ | ||
| 8 | # | ||
| 9 | wakaba | 1.16 | # This program is free software; you can redistribute it and/or |
| 10 | # modify it under the same terms as Perl itself. | ||
| 11 | wakaba | 1.9 | # |
| 12 | wakaba | 1.16 | # walwiki.cgi based on yukiwiki.cgi - Yet another WikiWikiWeb clone. |
| 13 | |||
| 14 | # Walrus add (debug) start | ||
| 15 | my $walrus_log; | ||
| 16 | my $walrus_debugging = 0; | ||
| 17 | # Walrus add (debug) end | ||
| 18 | |||
| 19 | # Libraries. | ||
| 20 | use strict; | ||
| 21 | use lib qw(./WalWiki/lib); | ||
| 22 | use CGI qw(:standard); | ||
| 23 | use CGI::Carp qw(fatalsToBrowser); | ||
| 24 | use Yuki::RSS; | ||
| 25 | use Yuki::DiffText qw(difftext); | ||
| 26 | use Yuki::YukiWikiDB; | ||
| 27 | use AnyDBM_File; | ||
| 28 | require 'jcode.pl'; | ||
| 29 | wakaba | 1.32 | require Jcode; |
| 30 | wakaba | 1.16 | use Fcntl; |
| 31 | my $version = '2.0.beta1.2002-05-29'; | ||
| 32 | wakaba | 1.17 | my $walversion; |
| 33 | wakaba | 1.9 | ############################## |
| 34 | wakaba | 1.16 | # |
| 35 | # You MUST modify following '$modifier_...' variables. | ||
| 36 | # | ||
| 37 | my $modifier_mail = '[email protected]'; # Your mail address, like '[email protected]'. | ||
| 38 | my $modifier_url = 'http://suika.fam.cx/~wakaba/'; # Your web page, like 'http://digit.que.ne.jp/work/'. | ||
| 39 | my $modifier_name = '��'; # Your name, like 'Makio Tsukamoto'. | ||
| 40 | # my $modifier_dbtype = 'AnyDBM_File'; # Fast, not available on some server, page size limited. | ||
| 41 | # my $modifier_dbtype = 'dbmopen'; # Fast, not available on some server, page size limited. | ||
| 42 | my $modifier_dbtype = 'YukiWikiDB'; # Slow, available on all environment. | ||
| 43 | # my $modifier_sendmail = '/usr/sbin/sendmail -t -n'; # Your sendmail. | ||
| 44 | my $modifier_sendmail = ''; # If you don't need mail notification. | ||
| 45 | wakaba | 1.17 | my $modifier_dir_data = './wikidata'; # Your data directory. |
| 46 | wakaba | 1.27 | my $modifier_rss_title = "SuikaWiki $walversion"; |
| 47 | wakaba | 1.16 | my $modifier_rss_link = 'http://suika.fam.cx/~wakaba/-temp/wiki2/wiki'; # Blank is not allowed. |
| 48 | wakaba | 1.27 | my $modifier_rss_description = 'This is SuikaWiki'; |
| 49 | wakaba | 1.9 | ############################## |
| 50 | wakaba | 1.16 | # |
| 51 | # You MAY modify following variables. | ||
| 52 | # | ||
| 53 | wakaba | 1.35 | $SuikaWiki::Plugin::plugin_directory = q(./SuikaWiki/Plugin/); |
| 54 | wakaba | 1.16 | my $file_touch = "$modifier_dir_data/touched.txt"; |
| 55 | my $file_resource = "$modifier_dir_data/resource.txt"; | ||
| 56 | my $file_FrontPage = "$modifier_dir_data/frontpage.txt"; | ||
| 57 | my $file_conflict = "$modifier_dir_data/conflict.txt"; | ||
| 58 | my $file_format = "$modifier_dir_data/format.txt"; | ||
| 59 | wakaba | 1.28 | my $url_cgi = '/~wakaba/-temp/wiki/wiki'; ## MUST be started from '/' |
| 60 | wakaba | 1.25 | my $url_stylesheet = $url_cgi.'?mycmd=TEXT_CSS;mypage=WikiHTMLStyle'; |
| 61 | wakaba | 1.16 | my $icontag = '<img src="/icons/folder" alt="*" width="40" height="40" />'; |
| 62 | my $maxrecent = 50; | ||
| 63 | wakaba | 1.9 | my $cols = 80; |
| 64 | my $rows = 20; | ||
| 65 | ############################## | ||
| 66 | wakaba | 1.16 | # |
| 67 | # You MAY, but do NOT NEED modify following variables. | ||
| 68 | # | ||
| 69 | my $dataname = "$modifier_dir_data/wiki"; | ||
| 70 | my $infoname = "$modifier_dir_data/info"; | ||
| 71 | my $diffname = "$modifier_dir_data/diff"; | ||
| 72 | my $editchar = '?'; | ||
| 73 | my $subject_delimiter = ' - '; | ||
| 74 | my $use_autoimg = 1; # automatically convert image URL into <img> tag. | ||
| 75 | my $use_exists = 0; # If you can use 'exists' method for your DB. | ||
| 76 | ############################## | ||
| 77 | my $InterWikiName = 'InterWikiName'; | ||
| 78 | my $RecentChanges = 'RecentChanges'; | ||
| 79 | my $AdminChangePassword = 'AdminChangePassword'; | ||
| 80 | my $CompletedSuccessfully = 'CompletedSuccessfully'; | ||
| 81 | wakaba | 1.18 | my $FrontPage = 'HomePage'; |
| 82 | wakaba | 1.16 | my $IndexPage = 'IndexPage'; |
| 83 | my $SearchPage = 'SearchPage'; | ||
| 84 | my $CreatePage = 'CreatePage'; | ||
| 85 | my $ErrorPage = 'ErrorPage'; | ||
| 86 | my $RssPage = 'RssPage'; | ||
| 87 | wakaba | 1.26 | my $NAME_OF_WikiPageLicense = 'WikiPageLicense'; |
| 88 | wakaba | 1.16 | my $AdminSpecialPage = 'Admin Special Page'; # must include spaces. |
| 89 | ############################## | ||
| 90 | my $bracket_name = '\[\[(\S+?)\]\]'; | ||
| 91 | my $embedded_name = '\[\[(#\S+?)\]\]'; | ||
| 92 | wakaba | 1.31 | my %fmt; ## formatter objects |
| 93 | wakaba | 1.16 | ############################## |
| 94 | my $embed_comment = '[[#comment]]'; | ||
| 95 | my $embed_rcomment = '[[#rcomment]]'; | ||
| 96 | wakaba | 1.25 | my $embed_comment_Name_Prompt = '̾��:'; |
| 97 | my $DEFAULT_embed_comment_name = '̵̾������'; | ||
| 98 | wakaba | 1.16 | my $embed_interwiki = '^\[\[#(box|text|password):(\S+)\]\]$'; # Walrus add (5) |
| 99 | wakaba | 1.22 | my %embed_command = ( |
| 100 | searched => '^\[\[#searched:([^\]]+)\]\]$', | ||
| 101 | wakaba | 1.34 | form => qw/\[\[\#form(?:\(([A-Za-z0-9-]+)\))?:'((?:[^'\\]|\\.)*)':'((?:[^'\\]|\\.)*)'(?::'((?:[^'\\]|\\.)*)')?\]\]/, |
| 102 | wakaba | 1.22 | ); |
| 103 | wakaba | 1.16 | ############################## |
| 104 | my $info_LastModified = 'LastModified'; | ||
| 105 | my $info_IsFrozen = 'IsFrozen'; | ||
| 106 | my $info_AdminPassword = 'AdminPassword'; | ||
| 107 | ############################## | ||
| 108 | my $kanjicode = 'euc'; | ||
| 109 | my $charset = 'EUC-JP'; | ||
| 110 | my $lang = 'ja'; | ||
| 111 | my %fixedpage = ( | ||
| 112 | $IndexPage => 1, | ||
| 113 | $CreatePage => 1, | ||
| 114 | $ErrorPage => 1, | ||
| 115 | $RssPage => 1, | ||
| 116 | $RecentChanges => 1, | ||
| 117 | $SearchPage => 1, | ||
| 118 | $AdminChangePassword => 1, | ||
| 119 | $CompletedSuccessfully => 1, | ||
| 120 | wakaba | 1.18 | #$FrontPage => 1, |
| 121 | wakaba | 1.32 | WikiUserAgentList => 1, |
| 122 | wakaba | 1.35 | WikiPluginInfo => 1, |
| 123 | wakaba | 1.16 | ); |
| 124 | my %form; | ||
| 125 | my %database; | ||
| 126 | my %infobase; | ||
| 127 | my %diffbase; | ||
| 128 | my %resource; | ||
| 129 | my %interwiki; | ||
| 130 | ############################## | ||
| 131 | my %page_command = ( | ||
| 132 | $IndexPage => 'index', | ||
| 133 | $SearchPage => 'searchform', | ||
| 134 | $CreatePage => 'create', | ||
| 135 | $RssPage => 'rss', | ||
| 136 | $AdminChangePassword => 'adminchangepasswordform', | ||
| 137 | wakaba | 1.18 | #$FrontPage => 'FrontPage', |
| 138 | wakaba | 1.35 | WikiPluginInfo => 'x_WikiPluginInfo', |
| 139 | wakaba | 1.16 | ); |
| 140 | my %command_do = ( | ||
| 141 | read => \&do_read, | ||
| 142 | wakaba | 1.25 | TEXT_CSS => \&do_output_css, |
| 143 | wakaba | 1.16 | edit => \&do_edit, |
| 144 | adminedit => \&do_adminedit, | ||
| 145 | adminchangepasswordform => \&do_adminchangepasswordform, | ||
| 146 | adminchangepassword => \&do_adminchangepassword, | ||
| 147 | write => \&do_write, | ||
| 148 | index => \&do_index, | ||
| 149 | searchform => \&do_searchform, | ||
| 150 | search => \&do_search, | ||
| 151 | create => \&do_create, | ||
| 152 | createresult => \&do_createresult, | ||
| 153 | FrontPage => \&do_FrontPage, | ||
| 154 | comment => \&do_comment, | ||
| 155 | wakaba | 1.28 | RandomJump => \&do_random_jump, |
| 156 | wakaba | 1.16 | rss => \&do_rss, |
| 157 | diff => \&do_diff, | ||
| 158 | interwikibox => \&do_interwiki_box, # Walrus add (5) | ||
| 159 | wakaba | 1.33 | wikiform => \&do_wikiform, |
| 160 | wakaba | 1.35 | x_WikiPluginInfo => \&do_wikiplugininfo, |
| 161 | wakaba | 1.16 | ); |
| 162 | ############################## | ||
| 163 | my $walversion = '2.0.beta1.wal.1'; # Walrus add (1) | ||
| 164 | wakaba | 1.9 | ############################## |
| 165 | wakaba | 1.16 | # &test_convert; |
| 166 | wakaba | 1.33 | my $UA = ''; ## User agent name |
| 167 | wakaba | 1.16 | ############################## |
| 168 | wakaba | 1.9 | |
| 169 | sub main { | ||
| 170 | wakaba | 1.32 | $UA = $main::ENV{HTTP_USER_AGENT}; |
| 171 | wakaba | 1.16 | &init_resource; |
| 172 | &open_db; | ||
| 173 | &init_form; | ||
| 174 | &init_InterWikiName; | ||
| 175 | if ($command_do{$form{mycmd}}) { | ||
| 176 | &{$command_do{$form{mycmd}}}; | ||
| 177 | wakaba | 1.9 | } else { |
| 178 | wakaba | 1.16 | &do_FrontPage; |
| 179 | wakaba | 1.9 | } |
| 180 | wakaba | 1.16 | &close_db; |
| 181 | wakaba | 1.9 | } |
| 182 | |||
| 183 | sub do_read { | ||
| 184 | wakaba | 1.26 | my $content = $database{$form{mypage}}; |
| 185 | wakaba | 1.27 | my $lm = &get_info($form{mypage}, $info_LastModified); |
| 186 | wiki::referer::add ($form{mypage}, $ENV{HTTP_REFERER}); | ||
| 187 | wakaba | 1.32 | wiki::useragent::add ($ENV{HTTP_USER_AGENT}); |
| 188 | wakaba | 1.29 | my ($r, $c) = get_search_result ($form{mypage}); |
| 189 | my $rl = wiki::referer::list_html ($form{mypage}); | ||
| 190 | my @toc; | ||
| 191 | push @toc, qq(-<a href="#wikipage-see-also">See Also</a>) if $c; | ||
| 192 | push @toc, qq(-<a href="#wikipage-referer">���ȸ�</a>) if $rl; | ||
| 193 | wakaba | 1.26 | my $cf = 'SuikaWiki/0.9'; |
| 194 | wakaba | 1.27 | ## Should be support at least: |
| 195 | ## - 'SuikaWiki/0.9' CRLF | ||
| 196 | ## - 'H2H/' ("0.9" / "1.0" / "1.1") CRLF | ||
| 197 | ## - "/*" WSP* 'W3C-CSS/' ("1.0" / "2.0") "*/" CRLF | ||
| 198 | wakaba | 1.32 | $cf = $1 if $content =~ s#^(?:/\*\s*|[\#<]\?)?([A-Z][A-Za-z0-9-]+/[0-9.]+(?:[^0-9.\x0D\x0A][^\x0D\x0A]*)?)[\x0D\x0A]+##s; |
| 199 | wakaba | 1.28 | if ($cf =~ m!^(?:\#\?)?SuikaWiki/0.9(?:$|\s)!) { |
| 200 | wakaba | 1.29 | &print_header ($form{mypage}, -last_modified => $lm, |
| 201 | -content_format => $cf, -noindex => $cf =~ /obsoleted="yes"/); | ||
| 202 | &print_content ($content, content_format => $cf, last_modified => $lm, | ||
| 203 | -toc => \@toc); | ||
| 204 | wakaba | 1.32 | print &text_to_html (q([[#comment]])) if $cf !~ /obsoleted="yes"/ && !$fixedpage{$form{mypage}}; |
| 205 | wakaba | 1.26 | } else { |
| 206 | wakaba | 1.29 | &print_header($form{mypage}, -last_modified => $lm); |
| 207 | wakaba | 1.26 | print "<pre>@{[&escape($content)]}</pre>"; |
| 208 | } | ||
| 209 | wakaba | 1.22 | if ($c) { |
| 210 | wakaba | 1.32 | print qq{<h2 @{[&id_and_name('wikipage-see-also')]}>See also</h2>}; |
| 211 | wakaba | 1.22 | print $r; |
| 212 | } | ||
| 213 | wakaba | 1.29 | if ($rl) { |
| 214 | wakaba | 1.32 | print qq(<div @{[&id_and_name('wikipage-referer')]}><h2>���ȸ�</h2>\n$rl</div>\n); |
| 215 | wakaba | 1.27 | } |
| 216 | &print_footer($form{mypage}, $lm); | ||
| 217 | wakaba | 1.9 | } |
| 218 | |||
| 219 | wakaba | 1.25 | sub do_output_css { |
| 220 | wakaba | 1.37 | wiki::referer::add ($form{mypage}, $ENV{HTTP_REFERER}); |
| 221 | wiki::useragent::add ($ENV{HTTP_USER_AGENT}); | ||
| 222 | wakaba | 1.25 | my $content = $database{$form{mypage}}; |
| 223 | if ($content =~ m#^\s*/\*\s*W3C-CSS#) { | ||
| 224 | wakaba | 1.29 | my $lm = &get_info($form{mypage}, $info_LastModified); |
| 225 | wakaba | 1.36 | print scalar make_navigate_links ($form{mypage}); |
| 226 | wakaba | 1.25 | print "Content-Type: text/css; charset=$charset\n"; |
| 227 | wakaba | 1.29 | print "Last-Modified: $lm\n"; |
| 228 | wakaba | 1.25 | print "\n"; |
| 229 | print $content; | ||
| 230 | } else { | ||
| 231 | print "Status: 406 Unsupported Media Type\n"; | ||
| 232 | wakaba | 1.29 | &print_header('WikiPageIsNotCSS', -noindex => 1); |
| 233 | wakaba | 1.25 | &print_content($database{WikiPageIsNotCSS}); |
| 234 | &print_footer('WikiPag |