summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/meta.pm
blob: a4dd541f982eda7ef884395692f55a48baa85e83 (plain)
  1. #!/usr/bin/perl
  2. # Ikiwiki metadata plugin.
  3. package IkiWiki::Plugin::meta;
  4. use warnings;
  5. use strict;
  6. use IkiWiki 2.00;
  7. my %meta;
  8. my %title;
  9. my %permalink;
  10. my %author;
  11. my %authorurl;
  12. my %license;
  13. my %copyright;
  14. sub import { #{{{
  15. hook(type => "preprocess", id => "meta", call => \&preprocess, scan => 1);
  16. hook(type => "filter", id => "meta", call => \&filter);
  17. hook(type => "pagetemplate", id => "meta", call => \&pagetemplate);
  18. } # }}}
  19. sub filter (@) { #{{{
  20. my %params=@_;
  21. $meta{$params{page}}='';
  22. return $params{content};
  23. } # }}}
  24. sub scrub ($) { #{{{
  25. if (IkiWiki::Plugin::htmlscrubber->can("sanitize")) {
  26. return IkiWiki::Plugin::htmlscrubber::sanitize(content => shift);
  27. }
  28. else {
  29. return shift;
  30. }
  31. } #}}}
  32. sub preprocess (@) { #{{{
  33. if (! @_) {
  34. return "";
  35. }
  36. my %params=@_;
  37. my $key=shift;
  38. my $value=$params{$key};
  39. delete $params{$key};
  40. my $page=$params{page};
  41. delete $params{page};
  42. my $destpage=$params{destpage};
  43. delete $params{destpage};
  44. delete $params{preview};
  45. eval q{use HTML::Entities};
  46. # Always dencode, even if encoding later, since it might not be
  47. # fully encoded.
  48. $value=decode_entities($value);
  49. if ($key eq 'link') {
  50. if (%params) {
  51. $meta{$page}.=scrub("<link href=\"".encode_entities($value)."\" ".
  52. join(" ", map { encode_entities($_)."=\"".encode_entities(decode_entities($params{$_}))."\"" } keys %params).
  53. " />\n");
  54. }
  55. else {
  56. # hidden WikiLink
  57. push @{$links{$page}}, $value;
  58. }
  59. }
  60. elsif ($key eq 'title') {
  61. $title{$page}=HTML::Entities::encode_numeric($value);
  62. }
  63. elsif ($key eq 'permalink') {
  64. $permalink{$page}=$value;
  65. $meta{$page}.=scrub("<link rel=\"bookmark\" href=\"".encode_entities($value)."\" />\n");
  66. }
  67. elsif ($key eq 'date') {
  68. eval q{use Date::Parse};
  69. if (! $@) {
  70. my $time = str2time($value);
  71. $IkiWiki::pagectime{$page}=$time if defined $time;
  72. }
  73. }
  74. elsif ($key eq 'stylesheet') {
  75. my $rel=exists $params{rel} ? $params{rel} : "alternate stylesheet";
  76. my $title=exists $params{title} ? $params{title} : $value;
  77. # adding .css to the value prevents using any old web
  78. # editable page as a stylesheet
  79. my $stylesheet=bestlink($page, $value.".css");
  80. if (! length $stylesheet) {
  81. return "[[meta ".gettext("stylesheet not found")."]]";
  82. }
  83. $meta{$page}.='<link href="'.urlto($stylesheet, $page).
  84. '" rel="'.encode_entities($rel).
  85. '" title="'.encode_entities($title).
  86. "\" type=\"text/css\" />\n";
  87. }
  88. elsif ($key eq 'openid') {
  89. if (exists $params{server}) {
  90. $meta{$page}.='<link href="'.encode_entities($params{server}).
  91. "\" rel=\"openid.server\" />\n";
  92. }
  93. $meta{$page}.='<link href="'.encode_entities($value).
  94. "\" rel=\"openid.delegate\" />\n";
  95. }
  96. elsif ($key eq 'license') {
  97. $meta{$page}.="<link rel=\"license\" href=\"#page_license\" />\n";
  98. $license{$page}=IkiWiki::linkify($page, $destpage, $value);
  99. }
  100. elsif ($key eq 'copyright') {
  101. $meta{$page}.="<link rel=\"copyright\" href=\"#page_copyright\" />\n";
  102. $copyright{$page}=IkiWiki::linkify($page, $destpage, $value);
  103. }
  104. else {
  105. $meta{$page}.=scrub("<meta name=\"".encode_entities($key).
  106. "\" content=\"".encode_entities($value)."\" />\n");
  107. if ($key eq 'author') {
  108. $author{$page}=$value;
  109. }
  110. elsif ($key eq 'authorurl') {
  111. $authorurl{$page}=$value;
  112. }
  113. }
  114. return "";
  115. } # }}}
  116. sub pagetemplate (@) { #{{{
  117. my %params=@_;
  118. my $page=$params{page};
  119. my $template=$params{template};
  120. $template->param(meta => $meta{$page})
  121. if exists $meta{$page} && $template->query(name => "meta");
  122. if (exists $title{$page} && $template->query(name => "title")) {
  123. $template->param(title => $title{$page});
  124. $template->param(title_overridden => 1);
  125. }
  126. $template->param(permalink => $permalink{$page})
  127. if exists $permalink{$page} && $template->query(name => "permalink");
  128. $template->param(author => $author{$page})
  129. if exists $author{$page} && $template->query(name => "author");
  130. $template->param(authorurl => $authorurl{$page})
  131. if exists $authorurl{$page} && $template->query(name => "authorurl");
  132. $template->param(license => $license{$page})
  133. if exists $license{$page} && $template->query(name => "license");
  134. $template->param(copyright => $copyright{$page})
  135. if exists $copyright{$page} && $template->query(name => "copyright");
  136. } # }}}
  137. 1