Hello,
I am trying to write a plugin that changes the way the
tag directive works, and I am trying to do so
by using the inject 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
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
Hello,
I managed to replace the tag originalpreprocess_tag
function, using a different approach than usinginject
: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 fromIkiWiki::hooks
, which is not guaranteed to work in the future, contrary toinject
.Two questions:
- how ugly is my solution?
- is it possible to use
inject
to replace theIkiWiki::Plugin::tag::preprocess_tag
function?-- Louis