]> sipb.mit.edu Git - ikiwiki.git/blobdiff - doc/todo/Add_a_plugin_to_list_available_pre-processor_commands.mdwn
Response
[ikiwiki.git] / doc / todo / Add_a_plugin_to_list_available_pre-processor_commands.mdwn
index 8c22f07a499fe01005c7f00747c30e85f2d46bea..e311addcddd37f7d0306f43c9eebb0cff1072fe4 100644 (file)
@@ -105,6 +105,130 @@ I've found myself wanting to know which [[plugins]] are switched on so I know wh
 >>>>>> you wanted.
 >>>>>> --[[Joey]]
 
+>>>>>>> I kinda agree about the page generation.  I don't like mixing an
+>>>>>>> inlined and a list though.  Besides which, that ends
+>>>>>>> up keeping much of complexity of the page generation because
+>>>>>>> the code still has to detect which pages are missing.  I've added
+>>>>>>> a patch that uses a list of wikilinks instead.  This way available
+>>>>>>> pages get linked correctly, and missing pages get normal creation
+>>>>>>> links.  The old patch is still here if you decide you prefer that. -- [[Will]]
+
+>>>>>>>> Can you explain the full/early list (why track both?) and generated parameter?
+
+>>>>>>>>> If you add in all the shortcuts you get quite a long list.  My original idea
+>>>>>>>>> was to just track the plugin commands.  This is the early list.  But then
+>>>>>>>>> I thought that it might be nice for someone looking at wiki source and
+>>>>>>>>> seeing a shortcut to know where it came from.  So I decided to make
+>>>>>>>>> displaying the full list an option, with the original concept as the default.
+
+>>>>>>>>> Another option here might be to generate the full list every time, but give
+>>>>>>>>> generated pre-processor commands (e.g. shortcuts) a different css class.
+>>>>>>>>> I'm not sure that is better than what I have though. 
+
+>>>>>>>>> I keep track of both in the page state because if a command moves from
+>>>>>>>>> a shortcut to the early list (or vice versa) it changes what should be
+>>>>>>>>> displayed in the default use of the plugin.  I thought about tracking just what
+>>>>>>>>> was actually used on the page, but I don't know in the needsbuild hook whether the `generated`
+>>>>>>>>> parameter has been supplied (or maybe the plugin is used twice on the page -
+>>>>>>>>> once in each form).  It was just easier to track both.
+
+>>>>>>>> Only code change I'd suggest is using `htmllink` rather than 
+>>>>>>>> generating a wikilink.
+
+>>>>>>>>> Yeah - that would make sense.  Will do. -- [[Will]]
+
+    #!/usr/bin/perl
+    # Ikiwiki listpreprocessors plugin.
+    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">[[' . $config{plugin_description_dir} . $plugin . ']]</li>';
+       }
+       
+       $result .= "</ul>";
+       
+       return IkiWiki::preprocess($params{page}, $params{destpage}, 
+               IkiWiki::filter($params{page}, $params{destpage}, $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: