diff options
Diffstat (limited to 'doc/todo')
-rw-r--r-- | doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn b/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn index 3ba0202a0..ee46973c8 100644 --- a/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn +++ b/doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn @@ -64,6 +64,13 @@ I've found myself wanting to know which [[plugins]] are switched on so I know wh >>> >>> -- [[Will]] +>>>> Just a quick note: pages are only created for pre-processor commands +>>>> that exist when the `refresh` hook is called. This is before the [[shortcuts]] are +>>>> processed. However, the list of available pre-processor commands will include +>>>> shortcuts if they have description pages (the list is generated later, after the +>>>> shortcuts have been added). While this was unplanned, it seems a reasonable +>>>> tradeoff between including all the large number of shortcuts and including none. -- [[Will]] + 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 @@ -72,6 +79,7 @@ Here is the main listpreprocessors plugin. (Note, because this has double square use warnings; use strict; + use Encode; use IkiWiki 2.00; sub import { #{{{ @@ -113,6 +121,8 @@ Here is the main listpreprocessors plugin. (Note, because this has double square } #}}} 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 @@ -132,18 +142,48 @@ Here is the main listpreprocessors plugin. (Note, because this has double square $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) { - gendescription($plugin,$page); + if (! exists $pages{$page}) { + $needcommit = 1; + gendescription($plugin,$page); + } } if ($config{rcs}) { - IkiWiki::rcs_commit_staged( - gettext("automatic pre-processor description generation"), - undef, undef); + if ($needcommit) { + IkiWiki::rcs_commit_staged( + gettext("automatic pre-processor description generation"), + undef, undef); + } IkiWiki::enable_commit_hook(); } } |