* Add getopt hook type, this allows plugins to add new command-line options.

* Add --tagbase option to tag plugin.
master
joey 2006-07-28 05:26:49 +00:00
parent 51d20d72f6
commit 409e62021c
9 changed files with 66 additions and 7 deletions

View File

@ -81,6 +81,14 @@ sub checkconfig () { #{{{
require IkiWiki::Rcs::Stub;
}
if (exists $hooks{checkconfig}) {
foreach my $id (keys %{$hooks{checkconfig}}) {
$hooks{checkconfig}{$id}{call}->();
}
}
} #}}}
sub loadplugins () { #{{{
foreach my $plugin (@{$config{plugin}}) {
my $mod="IkiWiki::Plugin::".possibly_foolish_untaint($plugin);
eval qq{use $mod};
@ -88,12 +96,6 @@ sub checkconfig () { #{{{
error("Failed to load plugin $mod: $@");
}
}
if (exists $hooks{checkconfig}) {
foreach my $id (keys %{$hooks{checkconfig}}) {
$hooks{checkconfig}{$id}{call}->();
}
}
} #}}}
sub error ($) { #{{{

View File

@ -9,6 +9,8 @@ use strict;
use IkiWiki;
sub import { #{{{
IkiWiki::hook(type => "getopt", id => "skeleton",
call => \&getopt);
IkiWiki::hook(type => "checkconfig", id => "skeleton",
call => \&checkconfig);
IkiWiki::hook(type => "preprocess", id => "skeleton",
@ -29,6 +31,10 @@ sub import { #{{{
call => \&cgi);
} # }}}
sub getopt () { #{{{
IkiWiki::debug("skeleton plugin getopt");
} #}}}
sub checkconfig () { #{{{
IkiWiki::debug("skeleton plugin checkconfig");
} #}}}

View File

@ -9,12 +9,20 @@ use IkiWiki;
my %tags;
sub import { #{{{
IkiWiki::hook(type => "getopt", id => "tag",
call => \&getopt);
IkiWiki::hook(type => "preprocess", id => "tag",
call => \&preprocess);
IkiWiki::hook(type => "pagetemplate", id => "tag",
call => \&pagetemplate);
} # }}}
sub getopt () { #{{{
eval q{use Getopt::Long};
Getopt::Long::Configure('pass_through');
GetOptions("tagbase=s" => \$IkiWiki::config{tagbase});
} #}}}
sub preprocess (@) { #{{{
if (! @_) {
return "";
@ -26,6 +34,9 @@ sub preprocess (@) { #{{{
$tags{$page} = [];
foreach my $tag (keys %params) {
if (exists $IkiWiki::config{tagbase}) {
$tag=$IkiWiki::config{tagbase}."/".$tag;
}
push @{$tags{$page}}, $tag;
# hidden WikiLink
push @{$IkiWiki::links{$page}}, $tag;

View File

@ -64,6 +64,7 @@ sub setup_standard {
debug("refreshing wiki..");
}
loadplugins();
checkconfig();
lockwiki();
loadindex();

7
debian/changelog vendored
View File

@ -1,3 +1,10 @@
ikiwiki (1.12) UNRELEASED; urgency=low
* Add getopt hook type, this allows plugins to add new command-line options.
* Add --tagbase option to tag plugin.
-- Joey Hess <joeyh@debian.org> Fri, 28 Jul 2006 01:17:48 -0400
ikiwiki (1.11) unstable; urgency=low
* Patch from Enrico that

View File

@ -6,6 +6,12 @@ The tags work the same as if you had put a (hidden) [[WikiLink]] on the page
for each tag, so you can use a [[GlobList]] to link to all pages that are
tagged with a given tag, for example.
This plugin has a configuration option. Set --tagbase=tag and all tags will
be located inside a "tag" subdirectory, so in the above example, the tags
are really set to tag/tech, tag/life, and tag/linux. This is a useful way
to avoid having to write the full path to tags, if you want to keep them
grouped together out of the way.
This plugin is included in ikiwiki, but is not enabled by default. If it is
enabled, you'll see a note below that this page is tagged with the "tags"
tag.

View File

@ -64,6 +64,18 @@ with the rest of the page.
Beyond PreProcessorDirectives, Other types of hooks that can be used by
plugins include:
## getopt
IkiWiki::hook(type => "getopt", id => "foo", call => \&getopt);
This allows for plugins to perform their own processing of command-line
options and so add options to the ikiwiki command line. It's called during
command line processing, with @ARGV full of any options that ikiwiki was
not able to process on its own. The function should process any options it
can, removing them from @ARGV. It should take care not to abort if it sees
an option it cannot process, and should just skip over those options and
leave them in @ARGV.
## checkconfig
IkiWiki::hook(type => "checkconfig", id => "foo", call => \&checkconfig);

View File

@ -66,7 +66,8 @@ These options control the mode that ikiwiki is operating in.
# CONFIG OPTIONS
These options configure the wiki.
These options configure the wiki. Note that plugins can add additional
configuration options of their own.
* --wikiname

13
ikiwiki
View File

@ -15,6 +15,7 @@ sub getconfig () { #{{{
if (! exists $ENV{WRAPPED_OPTIONS}) {
%config=defaultconfig();
eval q{use Getopt::Long};
Getopt::Long::Configure('pass_through');
GetOptions(
"setup|s=s" => \$config{setup},
"wikiname=s" => \$config{wikiname},
@ -66,6 +67,17 @@ sub getconfig () { #{{{
) || usage();
if (! $config{setup}) {
loadplugins();
if (exists $hooks{getopt}) {
foreach my $id (keys %{$hooks{getopt}}) {
$hooks{getopt}{$id}{call}->();
}
}
if (grep /^-/, @ARGV) {
print STDERR "Unknown option: $_\n"
foreach grep /^-/, @ARGV;
usage();
}
usage() unless @ARGV == 2;
$config{srcdir} = possibly_foolish_untaint(shift @ARGV);
$config{destdir} = possibly_foolish_untaint(shift @ARGV);
@ -79,6 +91,7 @@ sub getconfig () { #{{{
if ($@) {
error("WRAPPED_OPTIONS: $@");
}
loadplugins();
checkconfig();
}
} #}}}