]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/meta.pm
* Patch based on a patch from Ethan to support relative matching in
[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 my %permalink;
12 my %author;
13 my %authorurl;
14
15 sub import { #{{{
16         hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
17         hook(type => "filter", id => "meta", call => \&filter);
18         hook(type => "pagetemplate", id => "meta", 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 @{$links{$page}}, $value;
55                 }
56         }
57         elsif ($key eq 'title') {
58                 $title{$page}=$value;
59         }
60         elsif ($key eq 'permalink') {
61                 $permalink{$page}=$value;
62                 $meta{$page}.="<link rel=\"bookmark\" href=\"".encode_entities($value)."\" />\n";
63         }
64         else {
65                 $meta{$page}.="<meta name=\"".encode_entities($key).
66                         "\" content=\"".encode_entities($value)."\" />\n";
67                 if ($key eq 'author') {
68                         $author{$page}=$value;
69                 }
70                 elsif ($key eq 'authorurl') {
71                         $authorurl{$page}=$value;
72                 }
73         }
74
75         return "";
76 } # }}}
77
78 sub pagetemplate (@) { #{{{
79         my %params=@_;
80         my $page=$params{page};
81         my $template=$params{template};
82
83         $template->param(meta => $meta{$page})
84                 if exists $meta{$page} && $template->query(name => "meta");
85         if (exists $title{$page} && $template->query(name => "title")) {
86                 $template->param(title => $title{$page});
87                 $template->param(title_overridden => 1);
88         }
89         $template->param(permalink => $permalink{$page})
90                 if exists $permalink{$page} && $template->query(name => "permalink");
91         $template->param(author => $author{$page})
92                 if exists $author{$page} && $template->query(name => "author");
93         $template->param(authorurl => $authorurl{$page})
94                 if exists $authorurl{$page} && $template->query(name => "authorurl");
95         
96 } # }}}
97
98 1