2 # .po as a wiki page type
3 package IkiWiki::Plugin::po;
11 hook(type => "getsetup", id => "po", call => \&getsetup);
12 hook(type => "targetpage", id => "po", call => \&targetpage);
13 hook(type => "filter", id => "po", call => \&filter);
14 hook(type => "htmlize", id => "po", call => \&htmlize);
17 sub getsetup () { #{{{
21 rebuild => 1, # format plugin
23 po_supported_languages => {
25 example => { 'fr' => { 'name' => 'Français' },
26 'es' => { 'name' => 'Castellano' },
27 'de' => { 'name' => 'Deutsch' },
34 sub targetpage (@) { #{{{
36 my $page=$params{page};
39 if (! IkiWiki::PageSpec::match_istranslation($page, $page)) {
43 my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
44 if (! $config{usedirs} || $page eq 'index') {
45 return $masterpage.".".$ext.".".$lang;
48 return $masterpage."/index.".$ext.".".$lang;
52 # We use filter to convert PO to HTML, since the other plugins might do harm to it.
55 my $content = decode_utf8(encode_utf8($params{content}));
57 if (defined $pagesources{$params{page}} && $pagesources{$params{page}} =~ /\.po$/) {
58 $content = "<pre>" . $content . "</pre>";
64 # We need this to register the .po file extension
65 sub htmlize (@) { #{{{
67 return $params{content};
70 package IkiWiki::PageSpec;
72 sub match_istranslation ($;@) { #{{{
77 my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
78 if (! defined $file) {
79 return IkiWiki::FailReason->new("no file specified");
82 if (! IkiWiki::pagetype($page) eq 'po') {
83 return IkiWiki::FailReason->new("is not a PO file");
86 my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
87 if (! defined $masterpage || ! defined $lang
88 || ! (length($masterpage) > 0) || ! (length($lang) > 0)) {
89 return IkiWiki::FailReason->new("is not named like a translation file");
92 if (! defined $IkiWiki::pagesources{$masterpage}) {
93 return IkiWiki::FailReason->new("the master page does not exist");
96 if (! defined $IkiWiki::config{po_supported_languages}{$lang}) {
97 return IkiWiki::FailReason->new("language $lang is not supported");
100 return IkiWiki::SuccessReason->new("page $page is a translation");