aboutsummaryrefslogtreecommitdiff
path: root/webcoso.pl
diff options
context:
space:
mode:
Diffstat (limited to 'webcoso.pl')
-rw-r--r--webcoso.pl102
1 files changed, 81 insertions, 21 deletions
diff --git a/webcoso.pl b/webcoso.pl
index 7840f53..3a788bb 100644
--- a/webcoso.pl
+++ b/webcoso.pl
@@ -110,12 +110,71 @@ sub getTitleFor {
return $title;
}
-$xslt_proc->register_function('http://webcoso.thenautilus.net/','title-for',\&getTitleFor);
+my $NS='http://webcoso.thenautilus.net/';
+
+$xslt_proc->register_function($NS,'title-for',\&getTitleFor);
+
+{my $tags_file;
+sub setXMLTagsSource {$tags_file=shift}
+sub getTagsXML {
+ my $doc=XML::LibXML::Document->new();
+ return $doc unless defined $tags_file;
+ my $tagged=$fc->get($tags_file);
+ return $doc unless defined $tagged;
+
+ my $de=$doc->createElemenNS($NS,'wc:tags');
+ $doc->setDocumentElement($de);
+ my ($tagname,$doclist);
+ while (($tagname,$doclist)=each %$tagged) {
+ my $te=$doc->createElemenNS($NS,'wc:tag');
+ $te->setAttribute('name',$tagname);
+ $de->appendChild($te);
+ my %docs;
+ push @{$docs{dstUriFor($_)}},langOf($_) for @$doclist;
+ my ($docurl,$langs);
+ while (($docurl,$langs)=each %docs) {
+ my $dle=$doc->createElemenNS($NS,'wc:doc');
+ $dle->setAttribute('uri',$docurl);
+ $te->appendChild($dle);
+ for my $lang (@$langs) {
+ my $le=$doc->createElemenNS($NS,'wc:lang');
+ $le->appendTextNode($lang);
+ $dle->appendChild($le);
+ }
+ }
+ }
+ return $doc;
+}
+}
+$xslt_proc->register_function($NS,'tagged',\&getTagsXML);
-sub dstUriFor {
+sub langOf {
+ my ($name)=@_;
+ $name=~m{(^|/)document\.([^.]+)(\.|$)} and return $2;
+ return;
+}
+
+sub typeOf {
my ($name)=@_;
- warn "dstUriFor($name)\n";
- $name=~s{\.[^.]+\.[^.]+$}{.html};
+ $name=~m{(^|/)document\.[^.]+\.([^.]+\.[^.]+)$} and return $2;
+ return;
+}
+
+sub typedAs {
+ my ($name,$newtype)=@_;
+ $name=~s{(^|/)(document\.[^.]+\.)([^.]+\.[^.]+)$}{$1$2$newtype};
+ return $name;
+}
+
+sub dstUriFor {
+ my ($name,$short)=(@_,1);
+ warn "dstUriFor($name,$short)\n";
+ if ($short) {
+ $name=~s{/[^/]+$}{/};
+ }
+ else {
+ $name=typedAs($name,'html');
+ }
$name=~s{^\Q$SRCPATH\E/}{$DSTBASEURL};
return $name;
}
@@ -124,7 +183,7 @@ sub isLang {
my ($lang,$name)=@_;
warn "isLang($lang,$name)\n";
return 1 if $name=~m{/$}; # assume that MultiViews on the server will work
- return 1 if $name=~m{/document\.$lang(\.|$)};
+ return 1 if langOf($name) eq $lang;
return;
}
@@ -165,6 +224,13 @@ sub du2html {
my $du=$fc->get($deps->[-1]);
my $xslt=file($deps->[-1])->parent->file('du2html.xsl');
$xslt=$fc->get($xslt);
+ if (@$deps>1) {
+ warn "tagging as $deps->[0]\n";
+ setXMLTagsSource($fc->get($deps->[0]));
+ }
+ else {
+ setXMLTagsSource(undef);
+ }
my $out=$xslt->transform($du,
XML::LibXSLT::xpath_to_string(
path => $matches->[0],
@@ -243,9 +309,11 @@ sub keepEarliest {
my %dirs;
for my $f (@_) {
my $c=file($f);
- $c->basename=~m{^document\.([^.]+)\.([^.]+\.[^.]+)$}
- or die "Weird document name <$f>";
- my ($lang,$type)=($1,$2);
+ my $lang=langOf($c->basename);
+ my $type=typeOf($c->basename);
+ if (!defined $lang or !defined $type) {
+ die "Weird document name <$f>";
+ }
$dirs{$c->parent}->{$lang}=earliest($type,$dirs{$c->parent}->{$lang});
}
my @ret;
@@ -285,7 +353,7 @@ my $maker1st=Slay::Maker->new({
["$SRCPATH/(**)/document.(*).du.xml",':',ifExists("$SRCPATH/\$1/document.\$2.rest.txt"),'=',\&parseRST],
["$SRCPATH/()document.(*).rest.txt",':',ifExists("$SRCPATH/document.\$2.rest.tt"),'=',\&expandTT],
["$SRCPATH/()document.(*).du.xml",':',ifExists("$SRCPATH/document.\$2.rest.txt"),'=',\&parseRST],
- ["$SRCPATH/_webcoso/tags.yml",':',fromTo($SRCPATH,{%docfiles,transform=>sub{my $s=shift;$s=~s{\.[^.]+\.[^.]+$}{.du.xml};$s}}),'=',\&getTags],
+ ["$SRCPATH/_webcoso/tags.yml",':',fromTo($SRCPATH,{%docfiles,transform=>sub{typedAs($_[0],'du.xml')}}),'=',\&getTags],
#["$SRCPATH/_webcoso/changes.xml",':',keepEarliest(fromTo($SRCPATH,{%docfiles})),'=',\&getChanges],
],
options => {
@@ -309,20 +377,12 @@ my $maker2nd=Slay::Maker->new({
my @targets1st=(fromTo("$SRCPATH/",
{
%docfiles,
- transform=>sub{
- my $src=shift;
- $src=~s{\.[^.]+\.[^.]+$}{.du.xml};
- return $src;
- },
+ transform=>sub{typedAs($_[0],'du.xml')},
}),
fromTo("$SRCPATH/tags/",
{
%docfiles,
- transform=>sub{
- my $src=shift;
- $src=~s{\.[^.]+\.[^.]+$}{.du.xml};
- return $src;
- },
+ transform=>sub{typedAs($_[0],'du.xml')},
}));
my @targets2nd=(fromTo("$SRCPATH/",
@@ -330,7 +390,7 @@ my @targets2nd=(fromTo("$SRCPATH/",
%docfiles,
transform=>sub{
my $src=shift;
- $src=~s{\.[^.]+\.[^.]+$}{.html};
+ $src=typedAs($src,'html');
$src=~s{^\Q$SRCPATH\E/}{$DSTPATH/};
return $src;
},
@@ -340,7 +400,7 @@ my @targets2nd=(fromTo("$SRCPATH/",
%docfiles,
transform=>sub{
my $src=shift;
- $src=~s{\.[^.]+\.[^.]+$}{.html};
+ $src=typedAs($src,'html');
$src=~s{^\Q$SRCPATH\E/tags/}{$DSTPATH/tags/};
return $src;
},