/[pub]/suikawiki/script/default/suikawiki-config.ph
Suika

Diff of /suikawiki/script/default/suikawiki-config.ph

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by wakaba, Sat Oct 25 06:40:08 2003 UTC revision 1.18 by wakaba, Fri Apr 30 06:04:17 2004 UTC
# Line 1  Line 1 
1  package main;  =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;  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  ## URI (or part of URI) of Wiki CGI itself and its external addons  use Message::Util::QName::General [q<ExpandedURI>], {
31          ## Note: If your Wiki CGI URI is <http://foo.example/path/to/wiki.cgi>,    'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
32          ##              cookie-path: /path/to/  };
         ##              script-short-name: wiki.cgi  
         ##       URI parts MUST NOT contains "&" and/or non-URI characters.  
   our %uri = (  
     cookie_path         => '/~wakaba/-temp/expwiki/',  
     external_script     => '../wiki/script/',  
     script_short_name   => 'wiki',  
     ## If you use CVS repository of WikiDatabase,  
     #cvs_repository     => 'http://path-to-viewcvs/path-to-repository/',  
   );  
   our $url_cgi = "http://".($main::ENV{HTTP_HOST} || $main::ENV{SERVER_NAME}.($main::ENV{SERVER_PORT}==80?'':":$main::ENV{SERVER_PORT}"))."$uri{cookie_path}$uri{script_short_name}";  
   $uri{wiki_abs} = $url_cgi;  
   $uri{wiki} = qq($uri{cookie_path}$uri{script_short_name});      
   
 ## Path to modules and databases  
   push @main::INC, qw'lib ../wiki/lib lib';  
   
   require SuikaWiki::Implementation;  
   our $WIKI = SuikaWiki::Implementation->new;  
   
   our %PathTo = (       ## Path to your data, from the main CGI script (NOT from this config script)  
     CachePrefix         => q(./wikidata/.cache.),  # WikiPlugin  
     TempPrefix  => q(./wikidata/.tmp.),            # WikiPlugin, Image  
     convert     => q(/usr/X11R6/bin/convert),      # Image  
   );  
33    
34  ## Filesystem path mapping  push our @Config, sub ($) {
35      my $WIKI = shift;
36      use FindBin q($Bin);
37      use File::Spec;
38      
39      ## -- Filesystem path mapping
40    for (    for (
41       [db__content__dir        => q"./wikidata/page"],       [db__cache__dir          => q"./wikidata/cache/"],
42         [db__cache_struct__file  => q"./wikidata/cache/struct.db"],
43         [db__content__dir        => q"./wikidata/page/"],
44       [db__content__error_log  => q"./wikidata/log/db-content.log"],       [db__content__error_log  => q"./wikidata/log/db-content.log"],
45         [db__bdb__home_dir       => q"./wikidata/lock/"],
46         [db__bdb__log_dir        => q"./wikidata/log/bdb/"],
47         [db__bdb__log_file       => q"./wikidata/log/bdb.log"],
48         [db__bdb__temp_dir       => q"./wikidata/lock/"],
49       [db__lock__dir           => q"./wikidata/lock/"],       [db__lock__dir           => q"./wikidata/lock/"],
50         [db__lock__log_file      => q"./wikidata/log/lock.log"],
51         [db__log__dir            => q"./wikidata/log/"],
52         [db__temp__dir           => q"./wikidata/lock/"],
53    #     [namazu__index_dir       => q"/var/namazu/index/wiki"],
54    ) {    ) {
55      $WIKI->{config}->{path_to}->{$_->[0]} = $_->[1];      ## On system that does not set current directory as main script
56        ## directory, you should specify it instead of using "abs_path".
57        $WIKI->{config}->{path_to}->{$_->[0]} = File::Spec->catfile ($Bin, $_->[1]);
58    }    }
59    
60  ## Plugin  =begin comment
61    
62      ## -- Namazu URI Mapping (See SuikaWiki:SuikaWiki//Namazu) --
63      $WIKI->{config}->{nmz__uri_to_uri} = sub {
64        my ($nmzuri, %opt) = @_;
65        if ($nmzuri =~ s!^\Q$opt{o}->{wiki}->{config}->{path_to}->{db__content__dir}\E/*!!o) {
66          $nmzuri =~ s/\.txt$//;
67          return $opt{o}->{wiki}->uri_reference
68                          (page => $opt{o}->{wiki}->name ([
69            map {s/([0-9A-F][0-9A-F])/pack 'C', hex $1/ge; $_}
70            split m!\.ns/!, $nmzuri
71          ]), base => 1);
72        } else {
73          return ($nmzuri, $nmzuri);
74        }
75      };
76    
77    =end comment
78    
79    =cut
80    
81      ## -- WikiPlugin
82    push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {    push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
83      ## Obsolete interface      my $wiki = shift;
84      push @SuikaWiki::Plugin::plugin_directory, (      
85          q(../wiki/lib/SuikaWiki/Plugin/),      ## Installed plugin modules
86          q(../wiki/misc/plugins/),      $wiki->{plugin}->load_directory (qw(
87          q(lib/SuikaWiki/Plugin/),        lib/SuikaWiki/Plugin/
88          q(misc/plugins/),        misc/plugins/
89      );        misc/plugins/form/
90      SuikaWiki::Plugin->import_plugins ();        misc/plugins/format/
91          misc/plugins/link/
92          misc/plugins/view/
93        ));
94        
95        ## Configuration file as pseudo-plugin module
96      require 'wikidata/config.ph';      require 'wikidata/config.ph';
97    };    };
98    
99  ## Database mapping    ## -- WikiDatabase: Mapping logical to physical
100    push @{$WIKI->{event}->{database_loaded}}, sub {    push @{$WIKI->{event}->{database_loaded}}, sub {
101          my $wiki = shift;
102          
103        ## Main content        ## Main content
104        $WIKI->{db}->_set_prop_db (content => {-db_open => sub {        $wiki->{db}->_set_prop_db (content => {-db_open => sub {
105          require SuikaWiki::DB::FileSystem::YukiWikiDBNS;          require SuikaWiki::DB::FileSystem::LeafFile;
106          SuikaWiki::DB::FileSystem::YukiWikiDBNS->new          SuikaWiki::DB::FileSystem::LeafFile->new
107            (directory => $WIKI->{config}->{path_to}->{db__content__dir},            (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
108             logfile   => $WIKI->{config}->{path_to}->{db__content__error_log},             directory_suffix => '.ns',
109             suffix    => '.txt',             file_suffix    => '.txt',
110             -lock => &{$WIKI->{var}->{db}->{lock_prop}} ('content'));             root_key => $wiki->{config}->{page}->{Default},
111        }, -own => 1});             -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
112          }, -db_close => sub {
113            my %opt = @_;
114            $opt{prop_info}->{-db}->close;
115            delete $opt{prop_info}->{-db};
116          }});
117          
118          ## Properties
119          $wiki->{db}->_set_prop_db (content_prop => {-db_open => sub {
120            require SuikaWiki::DB::FileSystem::LeafProp;
121            SuikaWiki::DB::FileSystem::LeafProp->new
122              (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
123               directory_suffix => '.ns',
124               file_suffix    => '.prop',
125               root_key => $wiki->{config}->{page}->{Default},
126               -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop'));
127          }, -db_close => sub {
128            my %opt = @_;
129            $opt{prop_info}->{-db}->close;
130            delete $opt{prop_info}->{-db};
131          }});
132                
133        ## Last modified        ## Last modified
134        $WIKI->{db}->_set_prop_db (lastmodified => {-db_open => sub {        $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
135          require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;          require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
136          SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new          SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
137            (directory => $WIKI->{config}->{path_to}->{db__content__dir},            (directory => $wiki->{config}->{path_to}->{db__content__dir},
138             -lock => &{$WIKI->{var}->{db}->{lock_prop}} ('lastmodified'));             -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
139        }, -prop => 'last_modified', -own => 1});        }, -prop => 'last_modified', -db_close => sub {
140    };                my %opt = @_;
141            $opt{prop_info}->{-db}->close;
142            delete $opt{prop_info}->{-db};
143          }});
144          
145          ## Cache DBs
146          require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
147          my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
148                (directory => $wiki->{config}->{path_to}->{db__cache__dir},
149                 expires => 86400 * 3, removes => 86400 * 3); # 3 days
150          $wiki->{db}->_set_prop_db (m__search_result =>
151            {-db => $cachedb, -prop => 'search_result', -db_close => sub {
152              my %opt = @_;
153              $opt{prop_info}->{-db}->close;
154              delete $opt{prop_info}->{-db};
155            }});
156          $wiki->{db}->_set_prop_db (wpp__headsummary =>
157            {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
158              my %opt = @_;
159              $opt{prop_info}->{-db}->close;
160              delete $opt{prop_info}->{-db};
161            }});
162          $wiki->{db}->_set_prop_db (ref__item_template =>
163            {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
164              my %opt = @_;
165              $opt{prop_info}->{-db}->close;
166              delete $opt{prop_info}->{-db};
167            }});
168          
169          ## Referer Database (See Referer plugin module)
170          $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
171            require SuikaWiki::DB::FileSystem::Count;
172            SuikaWiki::DB::FileSystem::Count->new
173              (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
174               directory_suffix => '.ns',
175               file_suffix    => '.ref',
176               root_key => $wiki->{config}->{page}->{Default},
177               auto_mkdir => 0,
178               -lock => $wiki->{var}->{db}->{lock_prop}->('referer'));
179          }, -db_close => sub {
180            my %opt = @_;
181            $opt{prop_info}->{-db}->close;
182            delete $opt{prop_info}->{-db};
183          }});
184    
185    push @{$WIKI->{event}->{database_loaded}}, sub {        ## Additional WikiDB properties should be defined here
186      $WIKI->{db}->get (content => ['dummy']);        # ...    
     *main::database = $WIKI->{db}->{prop}->{content}->{-db}->{db_hash};  
     $SuikaWiki::Plugin::DB = $WIKI->{db};  
     for (@{$SuikaWiki::Plugin::On{WikiDatabaseLoaded}||[]}) { &{$_} }  
       
     package wiki::dummy;  
     sub meta {undef};  
     sub list_items {};  
     sub STORE {};  
187    };    };
188    
189      push @{$WIKI->{event}->{input_close}}, sub {
190        my ($wiki, $event) = @_;
191        try {
192          SuikaWiki::Plugin->module_package ('Referer')
193                         ->add_referer (wiki => $wiki,
194                                        uri => $wiki->{input}->meta_variable
195                                                 ('HTTP_REFERER'));
196        } catch SuikaWiki::Plugin::error with {
197          my $err = shift;
198          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
199        };
200        try {
201          SuikaWiki::Plugin->module_package ('RequestLog')
202                         ->http_request_log (wiki => $wiki,
203                                             prop => 'log__http_request');
204        } catch SuikaWiki::Plugin::error with {
205          my $err = shift;
206          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
207        };
208      };
209    
210  ## Name of Special WikiPage (linked as parts of navigations)    ## -- WikiName of special purpose WikiPages
   our %PageName = (  
     FrontPage   => 'HomePage',  
     IndexPage   => 'IndexPage',  
     InterWikiName       => 'Wiki//InterWikiName',  
     SearchPage  => 'Wiki//Page//Search',  
     CreatePage  => 'Wiki//Page//Create',  
     MenuBar     => 'Wiki//MenuBar',  
     RecentChanges       => 'RecentChanges',  
     RefererDontRecord   => 'Wiki//Referer//IgnoreSite',  
     RefererSiteName     => 'Wiki//Referer//SiteName',  
     ResourceNS  => 'Wiki//Resource//',  
     StyleList   => 'Wiki//Style//List//',  
     UserAgentList       => 'Wiki//UserAgentList',  
     AdminSpecialPage    => "\x11\x11Admin\x11Special\x11Page\x11\x11",  
   );  
211    $WIKI->{config}->{page} = {    $WIKI->{config}->{page} = {
212      Default         => [qw/HomePage/],      Default         => $WIKI->name ([qw/HomePage/]),
213      NewPageTemplate => [qw/Wiki NewPageTemplate/],      InterWikiName   => $WIKI->name ([qw/Wiki InterWikiName/]),
214        NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
215        'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
216    };    };
217    our %PageOf = %{$WIKI->{config}->{page}};    
218      ## -- WikiNamespace constants
219    $WIKI->{config}->{charset}->{internal} = 'euc-jp';    $WIKI->{config}->{name}->{space} = {
220    $WIKI->{config}->{charset}->{output} = 'iso-2022-jp';      separator => '//',
221    $WIKI->{config}->{charset}->{uri_param} = ''; # auto detect      separator_reg => qr#\s*//\s*#,
222    $WIKI->{config}->{charset}->{uri_query} = ''; # auto detect      self => '.',
223    our $kanjicode = 'euc'; # obsolete      parent => '..',
224        root => '//',
225      };
226      
227      ## -- Default character codes
228      $WIKI->{config}->{charset} = {
229        ## Internal code - MUST be ASCII + 8bit coding scheme
230          internal => 'euc-jp',
231        ## Default output code
232          output => 'iso-2022-jp',
233        ## "query" part in URI reference
234          uri_query => '', # auto-detected
235          uri_query_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
236          uri_param => '', # auto-detected
237          uri_param_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
238        ## PATH_INFO part in URI reference
239          uri_path_info => 'x-utf-8-10646', ## Reserved for future use
240        ## Fragment identifier in URI reference
241          uri_fragment => 'x-punycode',     ## Reserved for possible future use
242      };
243      
244      ## -- User option for media types
245      $WIKI->{config}->{ExpandedURI q<media-type:accept-media-type>} = {
246        q<IMT:text/css##> => 1,
247        q<IMT:text/plain##> => 1,
248        q<IMT:text/x-suikawiki;version="0.9"##> => 1,
249        q<IMT:application/x.suikawiki.config;version="2.0"##> => 1,
250      };
251      
252      ## -- Expires duration templates
253    $WIKI->{config}->{entity}->{expires} = {    $WIKI->{config}->{entity}->{expires} = {
254      edit => {delta => 60},      edit      => {delta => 60},
255      view => {delta => 2*3600},      view      => {delta => 2*3600},
256        list      => {delta => 60},
257      lm_flaged => {delta => 30*24*3600},      lm_flaged => {delta => 30*24*3600},
258        stylesheet => {delta => 30*24*3600},
259        error     => {delta => 60},
260      };
261    
262      ## -- Debug mode
263      $WIKI->{config}->{debug} = {
264        general => 0,
265        db => 0,
266        format => 0,
267        view => 0,
268    };    };
269    
 ## Misc. options  
   $SuikaWiki::Plugin::UserAgent::LoggingName = 1;  
         ## Use UA-name log? (require UserAgent plugin module)  
   
 ## Definition of views  
   
 require SuikaWiki::View;  
   
 push @{$SuikaWiki::Plugin::On{Load}}, sub {  
   SuikaWiki::View->definition ('read')->property (template => <<'EOH');  
 %html-document(title=>{%res(name=>{View:WebPageTitle});}p,link-meta=>{%predefined-template(name=>links);}p,content=>{  
   %section(level=>1,add-to-toc=>0,type=>body,title=>{%ns-short-page-name;}p,heading,content=>{  
     %section(id=>tools1,class=>tools,add-to-toc=>0,content=>{%predefined-template(name=>navbar);}p);  
     %section(level=>2,id=>read,add-to-toc=>0,content=>{  
       %if-calender(month,true=>{  
         %format(context=>form_input,template=>{%calender;});  
       },false=>{  
         %if-calender(true=>{  
           %format(context=>form_input,template=>{%calender-months;});  
         });  
       });  
       %read(comment);  
     }p);  
     %section(level=>2,id=>children,title=>{%res(name=>{Children:Title});}p,heading,  
     content=>{%page-list(ns=>{%page-name;}p,recursive=>0,type=>both,template=>{%res(name=>{Children:Item});}p);}p);  
     %section(level=>2,id=>see-also,title=>{%res(name=>SeeAlso);}p,heading,content=>{%search-result;}p);  
     %section(level=>2,id=>referer,title=>{%res(name=>Referer);}p,heading,content=>{%referer-list;}p);  
     %section(level=>2,id=>toc,title=>{%res(name=>{TOC:Title});}p,heading,add_to_toc=>0,content=>{%toc(drag);}p);  
     %section(id=>last-modified,add_to_toc=>0,content=>{%res(name=>{LastModified=});%last-modified;}p);  
     %section(class=>tools,add_to_toc=>0,content=>{%predefined-template(name=>navbar);}p);  
     %section(id=>footer,add-to-toc=>0,content=>{%predefined-template(name=>footer);}p);  
   }p);  
 }p);%log-hotness;  
 EOH  
   SuikaWiki::View->definition ('wrote')->property (template => SuikaWiki::View->definition ('-wrote')->property ('template').q(%log-hotness(weight=>2);));  
   SuikaWiki::View->definition ('WithMenu')->property (template => SuikaWiki::View->definition ('WithMenu')->property ('template').q(%log-hotness;));  
270  };  };
271    
272  =head1 NAME  =head1 SEE ALSO
273    
274  suikawiki-config.ph --- SuikaWiki: site configuration script  C<lib/suikawiki.pl>, C<wiki.cgi>,
275    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
276    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
277    
278  =head1 LICENSE  =head1 LICENSE
279    
280  Copyright 2003 Wakaba <w@suika.fam.cx>  Copyright 2003-2004 Wakaba <w@suika.fam.cx>.  All rights reserved.
281    
282  This program is free software; you can redistribute it and/or  This program is free software; you can redistribute it and/or
283  modify it under the same terms as Perl itself.  modify it under the same terms as Perl itself.

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.18

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24