/[pub]/suikawiki/script/wiki.cgi
Suika

Contents of /suikawiki/script/wiki.cgi

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.37 - (hide annotations) (download)
Fri Dec 13 06:17:44 2002 UTC (23 years, 7 months ago) by wakaba
Branch: MAIN
Changes since 1.36: +19 -6 lines
*** 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