From 409e62021c5c05e0184a61d0692697c10a0b8283 Mon Sep 17 00:00:00 2001 From: joey Date: Fri, 28 Jul 2006 05:26:49 +0000 Subject: [PATCH] * Add getopt hook type, this allows plugins to add new command-line options. * Add --tagbase option to tag plugin. --- IkiWiki.pm | 14 ++++++++------ IkiWiki/Plugin/skeleton.pm | 6 ++++++ IkiWiki/Plugin/tag.pm | 11 +++++++++++ IkiWiki/Setup/Standard.pm | 1 + debian/changelog | 7 +++++++ doc/plugins/tag.mdwn | 6 ++++++ doc/plugins/write.mdwn | 12 ++++++++++++ doc/usage.mdwn | 3 ++- ikiwiki | 13 +++++++++++++ 9 files changed, 66 insertions(+), 7 deletions(-) diff --git a/IkiWiki.pm b/IkiWiki.pm index 4964f97a1..2b877a370 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -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 ($) { #{{{ diff --git a/IkiWiki/Plugin/skeleton.pm b/IkiWiki/Plugin/skeleton.pm index acbc88994..27da50e6f 100644 --- a/IkiWiki/Plugin/skeleton.pm +++ b/IkiWiki/Plugin/skeleton.pm @@ -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"); } #}}} diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm index c4e12e61d..56bf17e2c 100644 --- a/IkiWiki/Plugin/tag.pm +++ b/IkiWiki/Plugin/tag.pm @@ -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; diff --git a/IkiWiki/Setup/Standard.pm b/IkiWiki/Setup/Standard.pm index 25f038a06..4082ca7af 100644 --- a/IkiWiki/Setup/Standard.pm +++ b/IkiWiki/Setup/Standard.pm @@ -64,6 +64,7 @@ sub setup_standard { debug("refreshing wiki.."); } + loadplugins(); checkconfig(); lockwiki(); loadindex(); diff --git a/debian/changelog b/debian/changelog index db76807b1..1f4cabf2d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 Fri, 28 Jul 2006 01:17:48 -0400 + ikiwiki (1.11) unstable; urgency=low * Patch from Enrico that diff --git a/doc/plugins/tag.mdwn b/doc/plugins/tag.mdwn index fc8534dcb..517bbaa37 100644 --- a/doc/plugins/tag.mdwn +++ b/doc/plugins/tag.mdwn @@ -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. diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 90ffca3f4..a31f78b4e 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -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); diff --git a/doc/usage.mdwn b/doc/usage.mdwn index 8404d15da..691880a96 100644 --- a/doc/usage.mdwn +++ b/doc/usage.mdwn @@ -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 diff --git a/ikiwiki b/ikiwiki index cdb2042e1..a10876a96 100755 --- a/ikiwiki +++ b/ikiwiki @@ -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(); } } #}}} -- 2.44.0