#!/usr/bin/perl # Ikiwiki getfield plugin. # Substitute field values in the content of the page. # See plugin/contrib/getfield for documentation. package IkiWiki::Plugin::getfield; use strict; =head1 NAME IkiWiki::Plugin::getfield - query the values of fields =head1 VERSION This describes version B<1.20101101> of IkiWiki::Plugin::getfield =cut our $VERSION = '1.20101101'; =head1 PREREQUISITES IkiWiki IkiWiki::Plugin::field =head1 AUTHOR Kathryn Andersen (RUBYKAT) http://github.com/rubykat =head1 COPYRIGHT Copyright (c) 2009 Kathryn Andersen This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use IkiWiki 3.00; sub import { hook(type => "getsetup", id => "getfield", call => \&getsetup); hook(type => "filter", id => "getfield", call => \&do_filter, last=>1); IkiWiki::loadplugin("field"); } #--------------------------------------------------------------- # Hooks # -------------------------------- sub getsetup () { return plugin => { safe => 1, rebuild => undef, }, } sub do_filter (@) { my %params=@_; my $page = $params{page}; my $destpage = ($params{destpage} ? $params{destpage} : $params{page}); my $page_file=$pagesources{$page}; my $page_type=pagetype($page_file); if (defined $page_type) { while ($params{content} =~ /{{\$([-\w\/]+#)?[-\w]+}}/) { # substitute {{$var}} variables (source-page) $params{content} =~ s/{{\$([-\w]+)}}/get_field_value($1,$page)/eg; # substitute {{$page#var}} variables (source-page) $params{content} =~ s/{{\$([-\w\/]+)#([-\w]+)}}/get_other_page_field_value($2,$page,$1)/eg; } } $page_file=$pagesources{$destpage}; $page_type=pagetype($page_file); if (defined $page_type) { while ($params{content} =~ /{{\+\$([-\w\/]+#)?[-\w]+\+}}/) { # substitute {{+$var+}} variables (dest-page) $params{content} =~ s/{{\+\$([-\w]+)\+}}/get_field_value($1,$destpage)/eg; # substitute {{+$page#var+}} variables (source-page) $params{content} =~ s/{{\+\$([-\w\/]+)#([-\w]+)\+}}/get_other_page_field_value($2,$destpage,$1)/eg; } } return $params{content}; } # do_filter #--------------------------------------------------------------- # Private functions # -------------------------------- sub get_other_page_field_value ($$$) { my $field = shift; my $page = shift; my $other_page = shift; my $use_page = bestlink($page, $other_page); # add a dependency for the page from which we get the value add_depends($page, $use_page); my $val = get_field_value($field, $use_page); if ($val eq $field) { return "${other_page}#$field"; } return $val; } # get_other_page_field_value sub get_field_value ($$) { my $field = shift; my $page = shift; my $value = IkiWiki::Plugin::field::field_get_value($field,$page); return $value if defined $value; # if there is no value, return the field name. return $field; } # get_field_value 1;