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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.19 - (hide annotations) (download)
Sun Jul 25 06:55:01 2004 UTC (19 years, 9 months ago) by wakaba
Branch: MAIN
Changes since 1.18: +23 -3 lines
Property Editor implemented

1 wakaba 1.13 =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 w 1.1 use strict;
22 wakaba 1.6
23 wakaba 1.13 ## 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 wakaba 1.6 }
28 wakaba 1.13 use Message::Util::Error;
29 wakaba 1.6
30 wakaba 1.15 use Message::Util::QName::General [q<ExpandedURI>], {
31 wakaba 1.16 'log' => q<http://suika.fam.cx/~wakaba/-temp/2004/05/01/reqlog#>,
32 wakaba 1.15 'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
33 wakaba 1.19 '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 wakaba 1.18 'ss' => q<http://suika.fam.cx/~wakaba/archive/2004/05/sw-stylesheet#>,
36 wakaba 1.19 '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 wakaba 1.15 };
39    
40 wakaba 1.14 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 wakaba 1.13 push our @Config, sub ($) {
68     my $WIKI = shift;
69 wakaba 1.16 use FindBin q($Bin);
70     use File::Spec;
71 wakaba 1.13
72     ## -- Filesystem path mapping
73     for (
74 wakaba 1.14 [db__cache__dir => q"./wikidata/cache/"],
75     [db__cache_struct__file => q"./wikidata/cache/struct.db"],
76 wakaba 1.13 [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 wakaba 1.16 [db__request_log__dir => q"./wikidata/rlog/"],
86 wakaba 1.18 [db__static__dir => q"./wikidata/static/"],
87 wakaba 1.13 [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 wakaba 1.17 $WIKI->{config}->{path_to}->{$_->[0]} = File::Spec->rel2abs ($_->[1], $Bin);
93 wakaba 1.13 }
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 wakaba 1.14 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 wakaba 1.19 -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
142 wakaba 1.15 }, -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 wakaba 1.19 -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop'));
157 wakaba 1.13 }, -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 wakaba 1.18 ## 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 wakaba 1.13 ## 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 wakaba 1.14 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 wakaba 1.13 }});
275    
276     ## HTTP Request Logging Database (See RequestLog plugin module)
277     $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
278 wakaba 1.16 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 wakaba 1.13 }});
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 wakaba 1.18 $WIKI->{config}->{engine_max_access} = 15;
308    
309 wakaba 1.13 ## -- 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 wakaba 1.16 ExpandedURI q<log:root> => $WIKI->name ([]),
316 wakaba 1.13 };
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 wakaba 1.15
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 wakaba 1.13
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 wakaba 1.19 ## -- User-editable content properties
363     $WIKI->{config}->{ExpandedURI q<pe:prop>} = {
364     'abstract' => {uri => ExpandedURI q<sw:abstract>},
365     'abstract--type' => {uri => ExpandedURI q<sw:abstract--type>,
366     type => ExpandedURI q<media-type:media-type>,
367     depend => [qw/abstract/]},
368     'category' => {uri => ExpandedURI q<sw:category>, is_list => 1},
369     'keyword' => {uri => ExpandedURI q<sw:keyword>, is_list => 1},
370     'obsoleted' => {uri => ExpandedURI q<sw09:obsoleted>},
371     'rel-contents' => {uri => ExpandedURI q<relrev:contents>},
372     'rel-index' => {uri => ExpandedURI q<relrev:index>},
373     'rel-next' => {uri => ExpandedURI q<relrev:next>},
374     'rel-prev' => {uri => ExpandedURI q<relrev:prev>},
375     'rel-up' => {uri => ExpandedURI q<relrev:up>},
376     };
377    
378 wakaba 1.13 ## -- Debug mode
379     $WIKI->{config}->{debug} = {
380     general => 0,
381     db => 0,
382     format => 0,
383     view => 0,
384     };
385 wakaba 1.11
386 wakaba 1.8 };
387 w 1.1
388 wakaba 1.13 =head1 SEE ALSO
389 wakaba 1.6
390 wakaba 1.13 C<lib/suikawiki.pl>, C<wiki.cgi>,
391     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
392     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
393 wakaba 1.6
394     =head1 LICENSE
395    
396 wakaba 1.13 Copyright 2003-2004 Wakaba <w@suika.fam.cx>. All rights reserved.
397 wakaba 1.6
398     This program is free software; you can redistribute it and/or
399     modify it under the same terms as Perl itself.
400    
401     =cut
402    
403 wakaba 1.19 1; # $Date: 2004/06/03 06:40:02 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24