ikiwiki/doc/forum/inject__95__preprocess__95_...

76 lines
2.2 KiB
Plaintext
Raw Normal View History

2014-01-05 15:22:45 +01:00
[[!meta title="Cannot manage to inject preprocess_tag"]]
2014-01-05 15:19:31 +01:00
Hello,
I am trying to write a plugin that changes the way the
[[ikiwiki/directive/tag]] [[ikiwiki/directive]] works, and I am trying to do so
by using the [[inject|plugins/write/#index81h3]] function. The piece of code
that should (if I understood well the `inject` function) do the trick is :
sub import {
inject(
name => 'IkiWiki::Plugin::tag::preprocess_tag',
call => \&my_preprocess_tag
);
}
Howere, this does not change anything about the effect of the `tag` directive.
I have tried some variants, like calling `inject` outside the `import`
function, or calling `IkiWiki::loadplugin("tag");` to ensure that the
[[plugins/tag]] is loaded, but none of these things work. Any idea?
*Disclaimer:* although proficient in several languages, I am a beginner in Perl.
Here is the full code of (a very early version of) my plugin.
#! /usr/bin/perl
require 5.002;
package IkiWiki::Plugin::parenttag;
use warnings;
use strict;
use IkiWiki 3.00;
my $orig_preprocess_tag=\&preprocess_tag;
sub import {
inject(
name => 'IkiWiki::Plugin::tag::preprocess_tag',
call => \&my_preprocess_tag
);
}
sub my_preprocess_tag(@) {
print "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nWorking!\n";
return "TODO";
}
1
-- [[Louis|spalax]]
2014-01-13 21:23:43 +01:00
> Hello,
> I managed to replace the tag original `preprocess_tag` function, using a different approach than using `inject`:
>
> my $orig_preprocess_tag;
>
> sub import {
> IkiWiki::loadplugin("tag");
> $orig_preprocess_tag = \&{$IkiWiki::hooks{preprocess}{tag}{call}};
> hook(type => "preprocess", id => "tag", call => \&my_preprocess_tag);
> }
>
> And later on, I can call the original `preprocess_tag` function using:
>
> $orig_preprocess_tag->(...)
>
> The problem is that I am digging into `IkiWiki.pm` package to extract data from `IkiWiki::hooks`, which is not guaranteed to work in the future, contrary to `inject`.
>
> Two questions:
>
> - how ugly is my solution?
> - is it possible to use `inject` to replace the `IkiWiki::Plugin::tag::preprocess_tag` function?
>
> -- [[Louis|spalax]]