* Patch from Ethan to allow using meta tags to set creation dates of pages.
[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         elsif ($key eq 'date') {
65                 eval q{use Date::Parse};
66                 if (! $@) {
67                         my $time = str2time($value);
68                         $IkiWiki::pagectime{$page}=$time if defined $time;
69                 }
70         }
71         else {
72                 $meta{$page}.="<meta name=\"".encode_entities($key).
73                         "\" content=\"".encode_entities($value)."\" />\n";
74                 if ($key eq 'author') {
75                         $author{$page}=$value;
76                 }
77                 elsif ($key eq 'authorurl') {
78                         $authorurl{$page}=$value;
79                 }
80         }
81
82         return "";
83 } # }}}
84
85 sub pagetemplate (@) { #{{{
86         my %params=@_;
87         my $page=$params{page};
88         my $template=$params{template};
89
90         $template->param(meta => $meta{$page})
91                 if exists $meta{$page} && $template->query(name => "meta");
92         if (exists $title{$page} && $template->query(name => "title")) {
93                 $template->param(title => $title{$page});
94                 $template->param(title_overridden => 1);
95         }
96         $template->param(permalink => $permalink{$page})
97                 if exists $permalink{$page} && $template->query(name => "permalink");
98         $template->param(author => $author{$page})
99                 if exists $author{$page} && $template->query(name => "author");
100         $template->param(authorurl => $authorurl{$page})
101                 if exists $authorurl{$page} && $template->query(name => "authorurl");
102         
103 } # }}}
104
105 1