bac16346932d2a00e1bc034d500a1fe8a08abebb
[ikiwiki.git] / IkiWiki / Plugin / meta.pm
1 #!/usr/bin/perl
2 # Ikiwiki metadata plugin.
3 package IkiWiki::Plugin::meta;
4
5 use warnings;
6 use strict;
7 use IkiWiki;
8
9 my %meta;
10 my %title;
11
12 sub import { #{{{
13         IkiWiki::hook(type => "preprocess", id => "meta", 
14                 call => \&preprocess);
15         IkiWiki::hook(type => "filter", id => "meta", 
16                 call => \&filter);
17         IkiWiki::hook(type => "pagetemplate", id => "meta", 
18                 call => \&pagetemplate);
19 } # }}}
20
21 sub filter (@) { #{{{
22         my %params=@_;
23         
24         $meta{$params{page}}='';
25
26         return $params{content};
27 } # }}}
28
29 sub preprocess (@) { #{{{
30         if (! @_) {
31                 return "";
32         }
33         my %params=@_;
34         my $key=shift;
35         my $value=$params{$key};
36         delete $params{$key};
37         my $page=$params{page};
38         delete $params{page};
39         delete $params{destpage};
40
41         eval q{use HTML::Entities};
42         # Always dencode, even if encoding later, since it might not be
43         # fully encoded.
44         $value=decode_entities($value);
45
46         if ($key eq 'link') {
47                 if (%params) {
48                         $meta{$page}.="<link href=\"".encode_entities($value)."\" ".
49                                 join(" ", map { encode_entities($_)."=\"".encode_entities(decode_entities($params{$_}))."\"" } keys %params).
50                                 " />\n";
51                 }
52                 else {
53                         # hidden WikiLink
54                         push @{$IkiWiki::links{$page}}, $value;
55                 }
56         }
57         elsif ($key eq 'title') {
58                 $title{$page}=$value;
59         }
60         else {
61                 $meta{$page}.="<meta name=\"".encode_entities($key).
62                         "\" content=\"".encode_entities($value)."\" />\n";
63         }
64
65         return "";
66 } # }}}
67
68 sub pagetemplate (@) { #{{{
69         my %params=@_;
70         my $page=$params{page};
71         my $template=$params{template};
72
73         $template->param(meta => $meta{$page})
74                 if exists $meta{$page} && $template->query(name => "meta");
75         $template->param(title => $title{$page})
76                 if exists $title{$page} && $template->query(name => "title");
77 } # }}}
78
79 1