mark down, open new todo
parent
3cb1c8fa3b
commit
840c3b9d64
|
@ -137,280 +137,5 @@ I've found myself wanting to know which [[plugins]] are switched on so I know wh
|
||||||
|
|
||||||
>>>>>>>>> Yeah - that would make sense. done. -- [[Will]]
|
>>>>>>>>> Yeah - that would make sense. done. -- [[Will]]
|
||||||
|
|
||||||
#!/usr/bin/perl
|
Patch is applied (along with some changes..). [[done]] (But, see
|
||||||
# Ikiwiki listpreprocessors plugin.
|
[[directive_docs]].
|
||||||
package IkiWiki::Plugin::listpreprocessors;
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use IkiWiki 2.00;
|
|
||||||
|
|
||||||
sub import { #{{{
|
|
||||||
hook(type => "getsetup", id => "listpreprocessors", call => \&getsetup);
|
|
||||||
hook(type => "checkconfig", id => "listpreprocessors", call => \&checkconfig);
|
|
||||||
hook(type => "needsbuild", id => "listpreprocessors", call => \&needsbuild);
|
|
||||||
hook(type => "preprocess", id => "listpreprocessors", call => \&preprocess);
|
|
||||||
} # }}}
|
|
||||||
|
|
||||||
sub getsetup () { #{{{
|
|
||||||
return
|
|
||||||
plugin => {
|
|
||||||
safe => 1,
|
|
||||||
rebuild => undef,
|
|
||||||
},
|
|
||||||
preprocessor_description_dir => {
|
|
||||||
type => "string",
|
|
||||||
description => "The ikiwiki directory that contains plugin descriptions.",
|
|
||||||
safe => 1,
|
|
||||||
rebuild => 1,
|
|
||||||
},
|
|
||||||
} #}}}
|
|
||||||
|
|
||||||
my @fullPluginList;
|
|
||||||
my @earlyPluginList;
|
|
||||||
my $pluginString;
|
|
||||||
|
|
||||||
sub checkconfig () { #{{{
|
|
||||||
if (!defined $config{plugin_description_dir}) {
|
|
||||||
$config{plugin_description_dir} = "ikiwiki/plugin/";
|
|
||||||
}
|
|
||||||
|
|
||||||
@earlyPluginList = sort( keys %{ $IkiWiki::hooks{preprocess} } );
|
|
||||||
} #}}}
|
|
||||||
|
|
||||||
sub needsbuild (@) { #{{{
|
|
||||||
my $needsbuild=shift;
|
|
||||||
|
|
||||||
@fullPluginList = sort( keys %{ $IkiWiki::hooks{preprocess} } );
|
|
||||||
$pluginString = join (' ', @earlyPluginList) . " : ". join (' ', @fullPluginList);
|
|
||||||
|
|
||||||
foreach my $page (keys %pagestate) {
|
|
||||||
if (exists $pagestate{$page}{listpreprocessors}{shown}) {
|
|
||||||
if ($pagestate{$page}{listpreprocessors}{shown} ne $pluginString) {
|
|
||||||
push @$needsbuild, $pagesources{$page};
|
|
||||||
}
|
|
||||||
if (exists $pagesources{$page} &&
|
|
||||||
grep { $_ eq $pagesources{$page} } @$needsbuild) {
|
|
||||||
# remove state, will be re-added if
|
|
||||||
# the [[!listpreprocessors]] is still there during the
|
|
||||||
# rebuild
|
|
||||||
delete $pagestate{$page}{listpreprocessors}{shown};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} # }}}
|
|
||||||
|
|
||||||
sub preprocess (@) { #{{{
|
|
||||||
my %params=@_;
|
|
||||||
|
|
||||||
$pagestate{$params{destpage}}{listpreprocessors}{shown}=$pluginString;
|
|
||||||
|
|
||||||
my @pluginlist;
|
|
||||||
|
|
||||||
if (defined $params{generated}) {
|
|
||||||
@pluginlist = @fullPluginList;
|
|
||||||
} else {
|
|
||||||
@pluginlist = @earlyPluginList;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $result = '<ul class="listpreprocessors">';
|
|
||||||
|
|
||||||
foreach my $plugin (@pluginlist) {
|
|
||||||
$result .= '<li class="listpreprocessors">';
|
|
||||||
$result .= htmllink($params{page}, $params{destpage}, IkiWiki::linkpage($config{plugin_description_dir} . $plugin));
|
|
||||||
$result .= '</li>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$result .= "</ul>";
|
|
||||||
|
|
||||||
return $result;
|
|
||||||
} # }}}
|
|
||||||
|
|
||||||
1
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
Here is the main listpreprocessors plugin. (Note, because this has double
|
|
||||||
square brackets in the source, it isn't quite displaying correctly - look
|
|
||||||
at the page source for details.) New template files follow:
|
|
||||||
|
|
||||||
#!/usr/bin/perl
|
|
||||||
# Ikiwiki listpreprocessors plugin.
|
|
||||||
package IkiWiki::Plugin::listpreprocessors;
|
|
||||||
|
|
||||||
use warnings;
|
|
||||||
use strict;
|
|
||||||
use Encode;
|
|
||||||
use IkiWiki 2.00;
|
|
||||||
|
|
||||||
sub import { #{{{
|
|
||||||
hook(type => "getsetup", id => "listpreprocessors", call => \&getsetup);
|
|
||||||
hook(type => "preprocess", id => "listpreprocessors", call => \&preprocess);
|
|
||||||
hook(type => "refresh", id => "listpreprocessors", call => \&refresh);
|
|
||||||
} # }}}
|
|
||||||
|
|
||||||
sub getsetup () { #{{{
|
|
||||||
return
|
|
||||||
plugin => {
|
|
||||||
safe => 1,
|
|
||||||
rebuild => undef,
|
|
||||||
},
|
|
||||||
preprocessor_description_dir => {
|
|
||||||
type => "string",
|
|
||||||
description => "The ikiwiki directory that contains plugin descriptions.",
|
|
||||||
safe => 1,
|
|
||||||
rebuild => 1,
|
|
||||||
},
|
|
||||||
preprocessor_description_autocreate => {
|
|
||||||
type => "boolean",
|
|
||||||
description => "Should pre-processor command descriptions be automatically created from a template.",
|
|
||||||
safe => 1,
|
|
||||||
rebuild => 1,
|
|
||||||
},
|
|
||||||
} #}}}
|
|
||||||
|
|
||||||
sub gendescription ($$) { #{{{
|
|
||||||
my $plugin=shift;
|
|
||||||
my $page=shift;
|
|
||||||
my $file=$page.".".$config{default_pageext};
|
|
||||||
my $template=template("preprocessor-description.tmpl");
|
|
||||||
$template->param(page => $page, plugin => $plugin);
|
|
||||||
writefile($file, $config{srcdir}, $template->output);
|
|
||||||
if ($config{rcs}) {
|
|
||||||
IkiWiki::rcs_add($file);
|
|
||||||
}
|
|
||||||
} #}}}
|
|
||||||
|
|
||||||
sub refresh () { #{{{
|
|
||||||
eval q{use File::Find};
|
|
||||||
error($@) if $@;
|
|
||||||
|
|
||||||
if (defined $config{preprocessor_description_autocreate} && ! $config{preprocessor_description_autocreate}) {
|
|
||||||
return; # create pages unless they explicitly ask us not to
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!defined $config{preprocessor_description_dir}) {
|
|
||||||
$config{preprocessor_description_dir} = "ikiwiki/plugin/";
|
|
||||||
}
|
|
||||||
|
|
||||||
my @pluginlist = sort( keys %{ $IkiWiki::hooks{preprocess} } );
|
|
||||||
my %pluginpages;
|
|
||||||
|
|
||||||
if (@pluginlist) {
|
|
||||||
my ($plugin,$page);
|
|
||||||
|
|
||||||
foreach $plugin (@pluginlist) {
|
|
||||||
$pluginpages{$plugin} = $config{preprocessor_description_dir} . $plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
my %pages;
|
|
||||||
foreach my $dir ($config{srcdir}, @{$config{underlaydirs}}, $config{underlaydir}) {
|
|
||||||
find({
|
|
||||||
no_chdir => 1,
|
|
||||||
wanted => sub {
|
|
||||||
$_=decode_utf8($_);
|
|
||||||
if (IkiWiki::file_pruned($_, $dir)) {
|
|
||||||
$File::Find::prune=1;
|
|
||||||
}
|
|
||||||
elsif (! -l $_) {
|
|
||||||
my ($f)=/$config{wiki_file_regexp}/; # untaint
|
|
||||||
return unless defined $f;
|
|
||||||
$f=~s/^\Q$dir\E\/?//;
|
|
||||||
return unless length $f;
|
|
||||||
return if $f =~ /\._([^.]+)$/; # skip internal page
|
|
||||||
if (! -d _) {
|
|
||||||
$pages{pagename($f)}=$f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, $dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($config{rcs}) {
|
|
||||||
IkiWiki::disable_commit_hook();
|
|
||||||
}
|
|
||||||
|
|
||||||
my $needcommit = 0;
|
|
||||||
|
|
||||||
while (($plugin,$page) = each %pluginpages) {
|
|
||||||
if (! exists $pages{$page}) {
|
|
||||||
$needcommit = 1;
|
|
||||||
gendescription($plugin,$page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($config{rcs}) {
|
|
||||||
if ($needcommit) {
|
|
||||||
IkiWiki::rcs_commit_staged(
|
|
||||||
gettext("automatic pre-processor description generation"),
|
|
||||||
undef, undef);
|
|
||||||
}
|
|
||||||
IkiWiki::enable_commit_hook();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} #}}}
|
|
||||||
|
|
||||||
sub preprocess (@) { #{{{
|
|
||||||
my %params=@_;
|
|
||||||
|
|
||||||
if (!defined $config{plugin_description_dir}) {
|
|
||||||
$config{plugin_description_dir} = "ikiwiki/plugin/";
|
|
||||||
}
|
|
||||||
|
|
||||||
my @pluginlist = sort( keys %{ $IkiWiki::hooks{preprocess} } );
|
|
||||||
foreach my $plugin (@pluginlist) {
|
|
||||||
$plugin = $config{plugin_description_dir} . $plugin;
|
|
||||||
}
|
|
||||||
my $pluginString = join (' or ', @pluginlist);
|
|
||||||
|
|
||||||
my $result = "[[!inline pages=\"$pluginString\" feeds=\"no\" show=0 sort=\"title\"";
|
|
||||||
|
|
||||||
if (defined $params{inline}) {
|
|
||||||
$result .= ' template=\"listpreprocessors-listonly\" archive="yes"';
|
|
||||||
} else {
|
|
||||||
$result .= ' template=\"listpreprocessors-inline\" archive="no"';
|
|
||||||
}
|
|
||||||
|
|
||||||
$result .= "]]";
|
|
||||||
|
|
||||||
return IkiWiki::preprocess($params{page}, $params{destpage},
|
|
||||||
IkiWiki::filter($params{page}, $params{destpage}, $result));
|
|
||||||
} # }}}
|
|
||||||
|
|
||||||
1
|
|
||||||
|
|
||||||
--------
|
|
||||||
|
|
||||||
This is what I was using for `listpreprocessors-inline.tmpl`:
|
|
||||||
|
|
||||||
<div class="listpreprocessorsinline">
|
|
||||||
|
|
||||||
<div class="inlineheader">
|
|
||||||
|
|
||||||
<span class="header">
|
|
||||||
<a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
</div><!--.inlineheader-->
|
|
||||||
|
|
||||||
<div class="inlinecontent">
|
|
||||||
<TMPL_VAR CONTENT>
|
|
||||||
</div><!--.inlinecontent-->
|
|
||||||
|
|
||||||
</div><!--.listpreprocessorsinline-->
|
|
||||||
|
|
||||||
--------
|
|
||||||
|
|
||||||
This is what I was using for `listpreprocessors-listonly.tmpl`:
|
|
||||||
|
|
||||||
<p class="listpreprocessors"><a href="<TMPL_VAR PAGEURL>"><TMPL_VAR TITLE></a></p>
|
|
||||||
|
|
||||||
--------
|
|
||||||
|
|
||||||
This is what I was using for `preprocessor-description.tmpl`:
|
|
||||||
|
|
||||||
The <TMPL_VAR plugin> preprocessor command currently has no description.
|
|
||||||
|
|
||||||
Maybe you should edit this page to add one.
|
|
||||||
|
|
||||||
[[tag done]]
|
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
The current basewiki is not self-documenting. In particular, if
|
||||||
|
[[plugins/listdirectives]] is used, it creates a list with a bunch of
|
||||||
|
broken links to directives/*, pages that do not currently exist in the
|
||||||
|
docwiki or basewiki.
|
||||||
|
|
||||||
|
This could be fixed by adding a page for each directive under to
|
||||||
|
`ikiwiki/directives`, and put those into a new underlay, which the plugin
|
||||||
|
could enable. Rather a lot of work and maintenance to document all the
|
||||||
|
directives like that.
|
||||||
|
|
||||||
|
I also considered having it link to the plugin that defined the
|
||||||
|
directive. Then all the plugins can be included in a new underlay, which
|
||||||
|
both [[plugins/listdirectives]] and [[plugins/websetup]] could enable.
|
||||||
|
(The latter could be improved by making the plugin names in the web setup
|
||||||
|
be links to docs about each plugin..)
|
||||||
|
|
||||||
|
The problem I ran into doing that is that the existing plugin pages have a
|
||||||
|
lot of stuff on them you probably don't want an underlay doing. The biggest
|
||||||
|
issues were wikilinks to other pages in the docwiki (which would end up
|
||||||
|
broken if the plugins were used as an underlay), and plugin pages that
|
||||||
|
include examples of the plugin in use, which are sometimes rather expensive
|
||||||
|
(eg, brokenlinks).
|
||||||
|
|
||||||
|
Either way requires a lot of reorganisation/doc work, and an onging
|
||||||
|
maintenance load.
|
||||||
|
|
||||||
|
BTW, this patch would be needed for the second approach, to allow
|
||||||
|
listdirectives to map from preprocessor directives back to the plugin that
|
||||||
|
defined them: --[[Joey]]
|
||||||
|
|
||||||
|
commit 0486b46a629cae19ce89492d5ac498bbf9b84f5f
|
||||||
|
Author: Joey Hess <joey@kodama.kitenet.net>
|
||||||
|
Date: Mon Aug 25 15:38:51 2008 -0400
|
||||||
|
|
||||||
|
record which plugins registered which hooks
|
||||||
|
|
||||||
|
diff --git a/IkiWiki.pm b/IkiWiki.pm
|
||||||
|
index e476521..afe982a 100644
|
||||||
|
--- a/IkiWiki.pm
|
||||||
|
+++ b/IkiWiki.pm
|
||||||
|
@@ -493,6 +493,7 @@ sub loadplugins () { #{{{
|
||||||
|
return 1;
|
||||||
|
} #}}}
|
||||||
|
|
||||||
|
+my $loading_plugin;
|
||||||
|
sub loadplugin ($) { #{{{
|
||||||
|
my $plugin=shift;
|
||||||
|
|
||||||
|
@@ -502,14 +503,18 @@ sub loadplugin ($) { #{{{
|
||||||
|
"$installdir/lib/ikiwiki") {
|
||||||
|
if (defined $dir && -x "$dir/plugins/$plugin") {
|
||||||
|
require IkiWiki::Plugin::external;
|
||||||
|
+ $loading_plugin=$plugin;
|
||||||
|
import IkiWiki::Plugin::external "$dir/plugins/$plugin";
|
||||||
|
+ $loading_plugin=undef;
|
||||||
|
$loaded_plugins{$plugin}=1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $mod="IkiWiki::Plugin::".possibly_foolish_untaint($plugin);
|
||||||
|
+ $loading_plugin=$plugin;
|
||||||
|
eval qq{use $mod};
|
||||||
|
+ $loading_plugin=undef;
|
||||||
|
if ($@) {
|
||||||
|
error("Failed to load plugin $mod: $@");
|
||||||
|
}
|
||||||
|
@@ -1429,6 +1434,9 @@ sub hook (@) { # {{{
|
||||||
|
|
||||||
|
return if $param{no_override} && exists $hooks{$param{type}}{$param{id}};
|
||||||
|
|
||||||
|
+ # Record which plugin was being loaded when the hook was defined.
|
||||||
|
+ $param{plugin}=$loading_plugin if defined $loading_plugin;
|
||||||
|
+
|
||||||
|
$hooks{$param{type}}{$param{id}}=\%param;
|
||||||
|
return 1;
|
||||||
|
} # }}}
|
Loading…
Reference in New Issue