package WebCoso::Common;
use strict;
use warnings;
use Path::Class;
use XML::LibXML::XPathContext;
our $SRCPATH='src';
our $DSTPATH='dst';
our $DSTBASEURL='/';
my $xpath=XML::LibXML::XPathContext->new();
$xpath->registerNs('x', 'http://www.w3.org/1999/xhtml');
sub langOf {
my ($name)=@_;
$name=~m{(^|/)document\.([^.]+)(\.|$)} and return $2;
return;
}
sub typeOf {
my ($name)=@_;
$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;
}
sub isLang {
my ($lang,$name)=@_;
warn "isLang($lang,$name)\n";
return 1 if $name=~m{/$};
return 1 if langOf($name) eq $lang;
return;
}
sub getTitleFor {
my ($fc,$lang,$path,$name)=@_;
my $doc_name=$name;
$doc_name=~s{\.html$}{.du.xml};
$doc_name=~s{/$}{/document.$lang.du.xml};
if ($doc_name=~m{^\Q$DSTBASEURL\E}) {
$doc_name=~s{^\Q$DSTBASEURL\E}{$SRCPATH/};
}
else {
$doc_name=file($doc_name)->absolute(file($path)->parent)->relative($SRCPATH);
$doc_name="$SRCPATH/$doc_name";
}
warn "getTitleFor($lang,$path,$name)->$doc_name\n";
my $doc=$fc->get($doc_name);
unless ($doc) {
warn "No document for <$doc_name>, returning <$name>\n";
return $name;
}
my $title=$xpath->findnodes(
q{/document/title},
$doc);
return $title;
}
sub getTags {
my ($fc,@docs)=@_;
my %tagged;
for my $doc_name (@docs) {
my $doc=$fc->get($doc_name);
my @tags=map {$_->textContent}
$xpath->findnodes(
q{/document/docinfo/field[field_name='tags']/field_body/*/list_item},
$doc);
chomp for @tags;
push @{$tagged{$_}},$doc_name for @tags;
}
return \%tagged;
}
1;