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 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