-use vars qw{%config %links %oldlinks %oldpagemtime %renderedfiles %pagesources};
-
-# Holds global config settings, also used by some modules.
-our %config=( #{{{
- wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.html?$)},
- wiki_link_regexp => qr/\[\[([^\s\]]+)\]\]/,
- wiki_file_regexp => qr/(^[-A-Za-z0-9_.:\/+]+$)/,
- verbose => 0,
- wikiname => "wiki",
- default_pageext => ".mdwn",
- cgi => 0,
- svn => 1,
- url => '',
- cgiurl => '',
- historyurl => '',
- diffurl => '',
- anonok => 0,
- rebuild => 0,
- wrapper => undef,
- wrappermode => undef,
- srcdir => undef,
- destdir => undef,
- templatedir => "/usr/share/ikiwiki/templates",
- setup => undef,
- adminuser => undef,
-); #}}}
-
-# option parsing #{{{
-if (! exists $ENV{WRAPPED_OPTIONS}) {
- eval q{use Getopt::Long};
- GetOptions(
- "setup|s=s" => \$config{setup},
- "wikiname=s" => \$config{wikiname},
- "verbose|v!" => \$config{verbose},
- "rebuild!" => \$config{rebuild},
- "wrapper:s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" },
- "wrappermode=i" => \$config{wrappermode},
- "svn!" => \$config{svn},
- "anonok!" => \$config{anonok},
- "cgi!" => \$config{cgi},
- "url=s" => \$config{url},
- "cgiurl=s" => \$config{cgiurl},
- "historyurl=s" => \$config{historyurl},
- "diffurl=s" => \$config{diffurl},
- "exclude=s@" => sub {
- $config{wiki_file_prune_regexp}=qr/$config{wiki_file_prune_regexp}|$_[1]/;
- },
- "adminuser=s@" => sub { push @{$config{adminuser}}, $_[1] },
- "templatedir=s" => sub { $config{templatedir}=possibly_foolish_untaint($_[1]) },
- ) || usage();
-
- if (! $config{setup}) {
- usage() unless @ARGV == 2;
- $config{srcdir} = possibly_foolish_untaint(shift);
- $config{destdir} = possibly_foolish_untaint(shift);
- checkoptions();
+sub usage () { #{{{
+ die "usage: ikiwiki [options] source dest\n";
+} #}}}
+
+sub getconfig () { #{{{
+ if (! exists $ENV{WRAPPED_OPTIONS}) {
+ %config=(
+ wiki_file_prune_regexp => qr{((^|/).svn/|\.\.|^\.|\/\.|\.html?$|\.rss$)},
+ wiki_link_regexp => qr/\[\[(?:([^\s\]\|]+)\|)?([^\s\]]+)\]\]/,
+ wiki_processor_regexp => qr/\[\[(\w+)\s+([^\]]+)\]\]/,
+ wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/,
+ verbose => 0,
+ wikiname => "wiki",
+ default_pageext => ".mdwn",
+ cgi => 0,
+ svn => 1,
+ notify => 0,
+ url => '',
+ cgiurl => '',
+ historyurl => '',
+ diffurl => '',
+ anonok => 0,
+ rss => 0,
+ rebuild => 0,
+ refresh => 0,
+ getctime => 0,
+ hyperestraier => 0,
+ wrapper => undef,
+ wrappermode => undef,
+ svnrepo => undef,
+ svnpath => "trunk",
+ srcdir => undef,
+ destdir => undef,
+ templatedir => "/usr/share/ikiwiki/templates",
+ underlaydir => "/usr/share/ikiwiki/basewiki",
+ setup => undef,
+ adminuser => undef,
+ adminemail => undef,
+ );
+
+ eval q{use Getopt::Long};
+ GetOptions(
+ "setup|s=s" => \$config{setup},
+ "wikiname=s" => \$config{wikiname},
+ "verbose|v!" => \$config{verbose},
+ "rebuild!" => \$config{rebuild},
+ "refresh!" => \$config{refresh},
+ "getctime" => \$config{getctime},
+ "wrappermode=i" => \$config{wrappermode},
+ "svn!" => \$config{svn},
+ "anonok!" => \$config{anonok},
+ "hyperestraier" => \$config{hyperestraier},
+ "rss!" => \$config{rss},
+ "cgi!" => \$config{cgi},
+ "notify!" => \$config{notify},
+ "url=s" => \$config{url},
+ "cgiurl=s" => \$config{cgiurl},
+ "historyurl=s" => \$config{historyurl},
+ "diffurl=s" => \$config{diffurl},
+ "svnrepo" => \$config{svnrepo},
+ "svnpath" => \$config{svnpath},
+ "adminemail=s" => \$config{adminemail},
+ "exclude=s@" => sub {
+ $config{wiki_file_prune_regexp}=qr/$config{wiki_file_prune_regexp}|$_[1]/;
+ },
+ "adminuser=s@" => sub {
+ push @{$config{adminuser}}, $_[1]
+ },
+ "templatedir=s" => sub {
+ $config{templatedir}=possibly_foolish_untaint($_[1])
+ },
+ "underlaydir=s" => sub {
+ $config{underlaydir}=possibly_foolish_untaint($_[1])
+ },
+ "wrapper:s" => sub {
+ $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap"
+ },
+ ) || usage();
+
+ if (! $config{setup}) {
+ usage() unless @ARGV == 2;
+ $config{srcdir} = possibly_foolish_untaint(shift @ARGV);
+ $config{destdir} = possibly_foolish_untaint(shift @ARGV);
+ checkconfig();
+ }
+ }
+ else {
+ # wrapper passes a full config structure in the environment
+ # variable
+ eval possibly_foolish_untaint($ENV{WRAPPED_OPTIONS});
+ checkconfig();