]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/po.pm
po plugin: factorize most checks into a new match_istranslation PageSpec
[ikiwiki.git] / IkiWiki / Plugin / po.pm
index 58e184b9b9e4256608a9ed747ee8799f57519306..fb4741cd416e5496c10106cdd21186882e18894f 100644 (file)
@@ -36,17 +36,16 @@ sub targetpage (@) { #{{{
         my $page=$params{page};
         my $ext=$params{ext};
 
-       my ($origpage, $lang) = ($page =~ /(.*)[.]([a-z]{2}$)/);
-
-       if (defined $origpage && defined $lang
-           && (length($origpage) > 0) && (length($lang) > 0)
-           && defined $config{po_supported_languages}{$lang}) {
-               if (! $config{usedirs} || $page eq 'index') {
-                       return $origpage.".".$ext.".".$lang;
-               }
-               else {
-                       return $origpage."/index.".$ext.".".$lang;
-               }
+       if (! IkiWiki::PageSpec::match_istranslation($page, $page)) {
+               return;
+       }
+
+       my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
+       if (! $config{usedirs} || $page eq 'index') {
+               return $masterpage.".".$ext.".".$lang;
+       }
+       else {
+               return $masterpage."/index.".$ext.".".$lang;
        }
 } #}}}
 
@@ -68,4 +67,38 @@ sub htmlize (@) { #{{{
        return $params{content};
 } #}}}
 
+package IkiWiki::PageSpec;
+
+sub match_istranslation ($;@) { #{{{
+       my $page=shift;
+       my $wanted=shift;
+
+       my %params=@_;
+       my $file=exists $params{file} ? $params{file} : $IkiWiki::pagesources{$page};
+       if (! defined $file) {
+               return IkiWiki::FailReason->new("no file specified");
+       }
+
+       if (! IkiWiki::pagetype($page) eq 'po') {
+               return IkiWiki::FailReason->new("is not a PO file");
+       }
+
+       my ($masterpage, $lang) = ($page =~ /(.*)[.]([a-z]{2})$/);
+       if (! defined $masterpage || ! defined $lang
+           || ! (length($masterpage) > 0) || ! (length($lang) > 0)) {
+               return IkiWiki::FailReason->new("is not named like a translation file");
+       }
+
+       if (! defined $IkiWiki::pagesources{$masterpage}) {
+               return IkiWiki::FailReason->new("the master page does not exist");
+       }
+
+       if (! defined $IkiWiki::config{po_supported_languages}{$lang}) {
+               return IkiWiki::FailReason->new("language $lang is not supported");
+       }
+
+       return IkiWiki::SuccessReason->new("page $page is a translation");
+
+} #}}}
+
 1