/[pub]/suikawiki/wikidata/suikawiki-config.ph
Suika

Contents of /suikawiki/wikidata/suikawiki-config.ph

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (show annotations) (download)
Fri Aug 6 08:57:15 2004 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.20: +10 -2 lines
Ammends output of license section

1 =head1 NAME
2
3 suikawiki-config.ph - SuikaWiki: Configuration for SuikaWiki HTTP CGI Driver
4
5 =head1 DESCRIPTION
6
7 This is a configuration file for SuikaWiki Driver for HTTP CGI Script
8 (SWHCS). Basic options such as WikiDB directory mapping and
9 special purpose WikiPage names can be customized with this file.
10
11 More complex customizing, e.g. modifying navigation bar or
12 adding new mode, is also possible by config.ph (generated from
13 config.wp2) and WikiPlugin modules. For more information,
14 see <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>.
15
16 This file is part of SuikaWiki.
17
18 =cut
19
20 package wiki::driver::http;
21 use strict;
22
23 ## These lines should be removed after utf8 support
24 BEGIN {
25 $Message::Util::Formatter::Base::Token = qr/[\w._+\x80-\xFF-]+/;
26 require Message::Util::Formatter::Base;
27 }
28 use Message::Util::Error;
29
30 use Message::Util::QName::General [q<ExpandedURI>], {
31 'log' => q<http://suika.fam.cx/~wakaba/-temp/2004/05/01/reqlog#>,
32 'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
33 'pe' => q<http://suika.fam.cx/~wakaba/archive/2004/7/20/sw-propedit#>,
34 'relrev' => q<http://suika.fam.cx/~wakaba/archive/2004/7/25/html-relrev#>,
35 'ss' => q<http://suika.fam.cx/~wakaba/archive/2004/05/sw-stylesheet#>,
36 'sw' => q<http://suika.fam.cx/~wakaba/archive/2004/7/20/sw#>,
37 'sw09' => q<http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki%2F0.9#>,
38 };
39
40 BEGIN {
41 if ($main::ENV{REQUEST_URI} =~ /\#/) {
42 require SuikaWiki::Output::HTTP;
43 my $out = SuikaWiki::Output::HTTP->new;
44 $out->{status_code} = 401;
45 $out->{status_phrase} = q<Request-URI MUST NOT have Fragment Identifier>;
46 $out->{entity}->{media_type} = q<text/html>;
47 $out->{entity}->{charset} = q<iso-8859-1>;
48 $out->{entity}->{language} = [q<en>];
49 $out->{entity}->{body_is_octet_stream} = 1;
50 my $ua = $main::ENV{HTTP_USER_AGENT};
51 for ($ua) {
52 s/&/&amp;/g; s/</&lt;/g; s/([^\x20-\x7E])/sprintf '&#x%02X;', ord $1/ge;
53 };
54 $out->{entity}->{body} = qq<
55 <!DOCTYPE html SYSTEM>
56 <title>401 Bad Request-URI</title>
57 <h1>Bad Request-URI</h1>
58 <p>Your Request-URI has fragment identifier but it is not allowed here.
59 It might be a bug of your user agent ($ua). Please contact to the UA
60 vendor.</p>
61 >;
62 $out->output (output => 'http-cgi');
63 exit;
64 }
65 }
66
67 push our @Config, sub ($) {
68 my $WIKI = shift;
69 use FindBin q($Bin);
70 use File::Spec;
71
72 ## -- Filesystem path mapping
73 for (
74 [db__cache__dir => q"./wikidata/cache/"],
75 [db__cache_struct__file => q"./wikidata/cache/struct.db"],
76 [db__content__dir => q"./wikidata/page/"],
77 [db__content__error_log => q"./wikidata/log/db-content.log"],
78 [db__bdb__home_dir => q"./wikidata/lock/"],
79 [db__bdb__log_dir => q"./wikidata/log/bdb/"],
80 [db__bdb__log_file => q"./wikidata/log/bdb.log"],
81 [db__bdb__temp_dir => q"./wikidata/lock/"],
82 [db__lock__dir => q"./wikidata/lock/"],
83 [db__lock__log_file => q"./wikidata/log/lock.log"],
84 [db__log__dir => q"./wikidata/log/"],
85 [db__request_log__dir => q"./wikidata/rlog/"],
86 [db__static__dir => q"./wikidata/static/"],
87 [db__temp__dir => q"./wikidata/lock/"],
88 [namazu__index_dir => q"/var/namazu/index/suikawiki"],
89 ) {
90 ## On system that does not set current directory as main script
91 ## directory, you should specify it instead of using "abs_path".
92 $WIKI->{config}->{path_to}->{$_->[0]} = File::Spec->rel2abs ($_->[1], $Bin);
93 }
94
95 ## -- Namazu URI Mapping (See SuikaWiki:SuikaWiki//Namazu) --
96 $WIKI->{config}->{nmz__uri_to_uri} = sub {
97 my ($nmzuri, %opt) = @_;
98 if ($nmzuri =~ s!^\Q$opt{o}->{wiki}->{config}->{path_to}->{db__content__dir}\E/*!!o) {
99 $nmzuri =~ s/\.txt$//;
100 return $opt{o}->{wiki}->uri_reference
101 (page => $opt{o}->{wiki}->name ([
102 map {s/([0-9A-F][0-9A-F])/pack 'C', hex $1/ge; $_}
103 split m!\.ns/!, $nmzuri
104 ]), base => 1);
105 } else {
106 $nmzuri =~ s<^/home/wakaba/public_html/([^.]+)><http://suika.fam.cx/~wakaba/$1>;
107 return ($nmzuri, $nmzuri);
108 }
109 };
110
111 ## -- WikiPlugin
112 push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
113 my $wiki = shift;
114
115 ## Installed plugin modules
116 $wiki->{plugin}->load_directory (qw(
117 lib/SuikaWiki/Plugin/
118 misc/plugins/
119 misc/plugins/form/
120 misc/plugins/format/
121 misc/plugins/link/
122 misc/plugins/view/
123 ));
124
125 ## Configuration file as pseudo-plugin module
126 require 'wikidata/config.ph';
127 };
128
129 ## -- WikiDatabase: Mapping logical to physical
130 push @{$WIKI->{event}->{database_loaded}}, sub {
131 my $wiki = shift;
132
133 ## Main content
134 $wiki->{db}->_set_prop_db (content => {-db_open => sub {
135 require SuikaWiki::DB::FileSystem::LeafFile;
136 SuikaWiki::DB::FileSystem::LeafFile->new
137 (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
138 directory_suffix => '.ns',
139 file_suffix => '.txt',
140 root_key => $wiki->{config}->{page}->{Default},
141 -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
142 }, -db_close => sub {
143 my %opt = @_;
144 $opt{prop_info}->{-db}->close;
145 delete $opt{prop_info}->{-db};
146 }});
147
148 ## Properties
149 $wiki->{db}->_set_prop_db (content_prop => {-db_open => sub {
150 require SuikaWiki::DB::FileSystem::LeafProp;
151 SuikaWiki::DB::FileSystem::LeafProp->new
152 (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
153 directory_suffix => '.ns',
154 file_suffix => '.prop',
155 root_key => $wiki->{config}->{page}->{Default},
156 -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop'));
157 }, -db_close => sub {
158 my %opt = @_;
159 $opt{prop_info}->{-db}->close;
160 delete $opt{prop_info}->{-db};
161 }});
162
163 ## Last modified
164 $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
165 require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
166 SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
167 (directory => $wiki->{config}->{path_to}->{db__content__dir},
168 -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
169 }, -prop => 'last_modified', -db_close => sub {
170 my %opt = @_;
171 $opt{prop_info}->{-db}->close;
172 delete $opt{prop_info}->{-db};
173 }});
174
175 ## Static version
176 $wiki->{db}->_set_prop_db (static__css => {-db_open => sub {
177 require SuikaWiki::DB::FileSystem::LeafFileP;
178 SuikaWiki::DB::FileSystem::LeafFileP->new
179 (base_directory => $wiki->{config}->{path_to}->{db__static__dir},
180 directory_suffix => '.ns',
181 file_suffix => '.css',
182 root_key => $wiki->{config}->{page}->{Default});
183 }, -db_close => sub {
184 my %opt = @_;
185 $opt{prop_info}->{-db}->close;
186 delete $opt{prop_info}->{-db};
187 }});
188 $wiki->{config}->{ExpandedURI q<ss:use-static>} = 1;
189 ## URI maker for LeafFileP generated files
190 $wiki->{config}->{ExpandedURI q<ss:wikiname-to-uri>} = sub {
191 my (undef, %opt) = @_;
192 my $page = join '.ns/',
193 map {s/([^0-9A-Za-z_-])/sprintf '+%02X', ord $1/ge;$_}
194 @{$opt{wikiname}};
195 return URI->new ('wikidata/static/' . $page . '.css');
196 };
197 ## Reverse mapping of generate-uri
198 $wiki->{config}->{ExpandedURI q<ss:uri-to-wikiname>} = sub {
199 my (undef, %opt) = @_;
200 $opt{uri} =~ s!^.+/wikidata/static/!!g;
201 $opt{uri} =~ s/\?[^?]*$//g;
202 $opt{uri} =~ s/\.css$//g;
203 return $opt{wiki}->name
204 ([map {s/\+([0-9A-Fa-f_-][0-9A-Fa-f_-])/pack 'CC', hex $1/ge;$_}
205 split m!.ns/!, $opt{uri}]);
206 };
207
208
209 ## Cache DBs
210 require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
211 my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
212 (directory => $wiki->{config}->{path_to}->{db__cache__dir},
213 expires => 86400 * 3, removes => 86400 * 3); # 3 days
214 $wiki->{db}->_set_prop_db (m__search_result =>
215 {-db => $cachedb, -prop => 'search_result', -db_close => sub {
216 my %opt = @_;
217 $opt{prop_info}->{-db}->close;
218 delete $opt{prop_info}->{-db};
219 }});
220 $wiki->{db}->_set_prop_db (wpp__headsummary =>
221 {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
222 my %opt = @_;
223 $opt{prop_info}->{-db}->close;
224 delete $opt{prop_info}->{-db};
225 }});
226 $wiki->{db}->_set_prop_db (ref__item_template =>
227 {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
228 my %opt = @_;
229 $opt{prop_info}->{-db}->close;
230 delete $opt{prop_info}->{-db};
231 }});
232
233 ## Berkely DB Environment Preparation
234 use BerkeleyDB;
235 my $bdbenv = new BerkeleyDB::Env
236 -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
237 -Config => {
238 DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
239 DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
240 DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
241 },
242 -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
243 -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
244 -Verbose => $wiki->{config}->{debug}->{db};
245
246 $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
247 require SuikaWiki::DB::Hash;
248 new SuikaWiki::DB::Hash constructor => sub {
249 use MLDBM qw(BerkeleyDB::Hash);# Storable);
250 tie my %mldb, 'MLDBM',
251 -Filename => $wiki->{config}->{path_to}
252 ->{db__cache_struct__file},
253 -Env => $bdbenv,
254 -Flags => DB_CREATE,
255 -Mode => 0644;
256 \%mldb;
257 };
258 }});
259
260 ## Referer Database (See Referer plugin module)
261 $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
262 require SuikaWiki::DB::FileSystem::Count;
263 SuikaWiki::DB::FileSystem::Count->new
264 (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
265 directory_suffix => '.ns',
266 file_suffix => '.ref',
267 root_key => $wiki->{config}->{page}->{Default},
268 auto_mkdir => 0,
269 -lock => $wiki->{var}->{db}->{lock_prop}->('referer'));
270 }, -db_close => sub {
271 my %opt = @_;
272 $opt{prop_info}->{-db}->close;
273 delete $opt{prop_info}->{-db};
274 }});
275
276 ## HTTP Request Logging Database (See RequestLog plugin module)
277 $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
278 require SuikaWiki::DB::FileSystem::Count;
279 SuikaWiki::DB::FileSystem::Count->new
280 (base_directory => $wiki->{config}->{path_to}->{db__request_log__dir},
281 directory_suffix => '.ns',
282 file_suffix => '.rlog',
283 root_key => $wiki->{config}->{page}->{Default},
284 auto_mkdir => 1);
285 }, -db_close => sub {
286 my %opt = @_;
287 $opt{prop_info}->{-db}->close;
288 delete $opt{prop_info}->{-db};
289 }});
290
291 ## Additional WikiDB properties should be defined here
292 # ...
293 };
294
295 push @{$WIKI->{event}->{input_close}}, sub {
296 my ($wiki, $event) = @_;
297 try {
298 SuikaWiki::Plugin->module_package ('RequestLog')
299 ->http_request_log (wiki => $wiki,
300 prop => 'log__http_request');
301 } catch SuikaWiki::Plugin::error with {
302 my $err = shift;
303 $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
304 };
305 };
306
307 $WIKI->{config}->{engine_max_access} = 15;
308
309 ## -- WikiName of special purpose WikiPages
310 $WIKI->{config}->{page} = {
311 Default => $WIKI->name ([qw/HomePage/]),
312 InterWikiName => $WIKI->name ([qw/Wiki InterWikiName/]),
313 NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
314 'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
315 ExpandedURI q<log:root> => $WIKI->name ([]),
316 };
317
318 ## -- WikiNamespace constants
319 $WIKI->{config}->{name}->{space} = {
320 separator => '//',
321 separator_reg => qr#\s*//\s*#,
322 self => '.',
323 parent => '..',
324 root => '//',
325 };
326
327 ## -- Default character codes
328 $WIKI->{config}->{charset} = {
329 ## Internal code - MUST be ASCII + 8bit coding scheme
330 internal => 'euc-jp',
331 ## Default output code
332 output => 'iso-2022-jp',
333 ## "query" part in URI reference
334 uri_query => '', # auto-detected
335 uri_query_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
336 uri_param => '', # auto-detected
337 uri_param_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
338 ## PATH_INFO part in URI reference
339 uri_path_info => 'x-utf-8-10646', ## Reserved for future use
340 ## Fragment identifier in URI reference
341 uri_fragment => 'x-punycode', ## Reserved for possible future use
342 };
343
344 ## -- User option for media types
345 $WIKI->{config}->{ExpandedURI q<media-type:accept-media-type>} = {
346 q<IMT:text/css##> => 1,
347 q<IMT:text/plain##> => 1,
348 q<IMT:text/x-suikawiki;version="0.9"##> => 1,
349 q<IMT:application/x.suikawiki.config;version="2.0"##> => 1,
350 };
351
352 ## -- Expires duration templates
353 $WIKI->{config}->{entity}->{expires} = {
354 edit => {delta => 60},
355 view => {delta => 2*3600},
356 list => {delta => 60},
357 lm_flaged => {delta => 30*24*3600},
358 stylesheet => {delta => 30*24*3600},
359 error => {delta => 60},
360 };
361
362 ## -- User-editable content properties
363 $WIKI->{config}->{ExpandedURI q<pe:prop>} = {
364 'abstract' => {uri => ExpandedURI q<sw:abstract>,
365 ExpandedURI q<media-type:media-type-prop>
366 => ExpandedURI q<sw:abstract--type>},
367 'abstract--type' => {uri => ExpandedURI q<sw:abstract--type>,
368 type => ExpandedURI q<media-type:media-type>,
369 depend => [qw/abstract/]},
370 'category' => {uri => ExpandedURI q<sw:category>, is_list => 1},
371 'keyword' => {uri => ExpandedURI q<sw:keyword>, is_list => 1},
372 'license' => {uri => ExpandedURI q<sw:license>,
373 ExpandedURI q<media-type:media-type-prop>
374 => ExpandedURI q<sw:license--type>},
375 'license--type' => {uri => ExpandedURI q<sw:license--type>,
376 type => ExpandedURI q<media-type:media-type>,
377 depend => [qw/license/]},
378 'obsoleted' => {uri => ExpandedURI q<sw09:obsoleted>},
379 'rel-contents' => {uri => ExpandedURI q<relrev:contents>, is_list => 1},
380 'rel-index' => {uri => ExpandedURI q<relrev:index>, is_list => 1},
381 'rel-next' => {uri => ExpandedURI q<relrev:next>, is_list => 1},
382 'rel-prev' => {uri => ExpandedURI q<relrev:prev>, is_list => 1},
383 'rel-up' => {uri => ExpandedURI q<relrev:up>, is_list => 1},
384 };
385
386 ## -- Debug mode
387 $WIKI->{config}->{debug} = {
388 general => 0,
389 db => 0,
390 format => 0,
391 view => 0,
392 };
393
394 };
395
396 =head1 SEE ALSO
397
398 C<lib/suikawiki.pl>, C<wiki.cgi>,
399 <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
400 <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
401
402 =head1 LICENSE
403
404 Copyright 2003-2004 Wakaba <w@suika.fam.cx>. All rights reserved.
405
406 This program is free software; you can redistribute it and/or
407 modify it under the same terms as Perl itself.
408
409 =cut
410
411 1; # $Date: 2004/08/06 03:39:02 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24