diff options
Diffstat (limited to 'stest.pl')
-rw-r--r-- | stest.pl | 78 |
1 files changed, 61 insertions, 17 deletions
@@ -11,6 +11,7 @@ use Text::Restructured; use Text::Restructured::Writer::LibXML; use XML::LibXML; use XML::LibXSLT; +use YAML::Syck; my $stash={}; my $template=Template->new(); @@ -18,7 +19,7 @@ my $rest=Text::Restructured->new({},'WebCoso'); my $xml_parser=XML::LibXML->new(); my $xslt_proc=XML::LibXSLT->new(); -my $fc=File::Cache::Parsed->new(); +my $fc=File::Cache::Parsed->new(follow=>1); $fc->add_parser(qr{\.tt2?$} => sub { $template->context->template($_[0]); @@ -36,35 +37,65 @@ $fc->add_parser(qr{\.xslt?$} => ($xml_parser->parse_string($_[1],$_[0])) }); $fc->add_writer(qr{\.xml$} => sub { $_[1]->toFile($_[0]) }); +$fc->add_parser(qr{\.ya?ml$} => + sub { Load($_[1]) }); +$fc->add_writer(qr{\.ya?ml$} => + sub { DumpFile($_[0],$_[1]) }); + sub expandTT { my ($maker,$target,$deps,$matches)=@_; - print "TT: $target <- @$deps, @$matches\n"; - open my $fh,'>',$target; + my $tmpl=$fc->get($deps->[-1]); + my $vars={ path=> $matches->[0], + language => $matches->[1], + %$stash, + }; + if (@$deps>1) { + $vars->{tagged}=$fc->get($deps->[0]); + } + $fc->put($target, + $template->context->process($tmpl, + $vars)); } sub parseRST { my ($maker,$target,$deps,$matches)=@_; - print "RST: $target <- @$deps, @$matches\n"; - open my $fh,'>',$target; + $fc->put($target,$fc->get($deps->[0])); } sub du2html { my ($maker,$target,$deps,$matches)=@_; - print "HTML: $target <- @$deps, @$matches\n"; - open my $fh,'>',$target; + my $du=$fc->get($deps->[-1]); + my $xslt=file($deps->[-1])->parent->file('du2html.xsl'); + $xslt=$fc->get($xslt); + my $out=$xslt->transform($du, + XML::LibXSLT::xpath_to_string( + path => $matches->[0], + language => $matches->[1], + )); + $fc->put($target,$xslt->output_string($out)); } +{my $xpath=XML::LibXML::XPathContext->new(); +$xpath->registerNs('x', 'http://www.w3.org/1999/xhtml'); sub getTags { my ($maker,$target,$deps,$matches)=@_; - print "tags: $target <- @$deps, @$matches\n"; - open my $fh,'>',$target; + my %tagged; + for my $doc_name (@$deps) { + my $doc=$fc->get($doc_name); + my @tags=map {$_->textContext} + $xpath->find( + q{/document/docinfo/field[field_name='tags']/field_body/*/list_item}, + $doc); + push @{$tagged{$_}},$doc_name for @tags; + } + $fc->put($target,\%tagged); +} } - sub getChanges { my ($maker,$target,$deps,$matches)=@_; @@ -133,11 +164,14 @@ my %files=(files=>sub{m{^document\.}}); my $maker=Slay::Maker->new({ rules => [ - ['src/(**)/document.rest.txt',':',ifExists('src/$1/document.rest.tt'),'=',\&expandTT], - ['src/(**)/document.du.xml',':',ifExists('src/$1/document.rest.txt'),'=',\&parseRST], - ['deps/tags.xml',':',fromTo('src/',{%files,transform=>sub{my $s=shift;$s=~s{\..*$}{.du.xml};$s}}),'=',\&getTags], - ['deps/changes.xml',':',keepEarliest(fromTo('src/',{%files})),'=',\&getChanges], - ['dst/(**)/document.xhtml',':','deps/tags.xml','deps/changes.xml',ifExists('src/$1/document.du.xml'),'=',\&du2html], + ['src/(**)/document.(*).rest.txt',':',ifExists('src/$1/document.$2.rest.tt'),'=',\&expandTT], + ['src/(**)/document.(*).du.xml',':',ifExists('src/$1/document.$2.rest.txt'),'=',\&parseRST], + ['deps/tags.xml',':',fromTo('src/',{%files,transform=>sub{my $s=shift;$s=~s{\.[^.]+\.[^.]+$}{.du.xml};$s}}),'=',\&getTags], + #['deps/changes.xml',':',keepEarliest(fromTo('src/',{%files})),'=',\&getChanges], + + ['tags/(**)/document.(*).rest.txt',':','deps/tags.yml',ifExists('tags/$1/document.$2.rest.tt'),'=',\&expandTT], + ['tags/(**)/document.(*).du.xml',':','deps/tags.yml',ifExists('tags/$1/document.$2.rest.txt'),'=',\&parseRST], + ['dst/(**)/document.(*).xhtml',':','deps/tags.yml','deps/changes.xml',ifExists('src/$1/document.$2.du.xml'),ifExists('tags/$1/document.$2.du.xml'),'=',\&du2html], ], options => { auto_create_dirs => 1, @@ -152,11 +186,21 @@ my @targets=fromTo('src/', %files, transform=>sub{ my $src=shift; - $src=~s{\..*$}{.xhtml}; + $src=~s{\.[^.]+\.[^.]+$}{.xhtml}; $src=~s{^src/}{dst/}; return $src; }, - }); + }), + fromTo('tags/', + { + %files, + transform=>sub{ + my $src=shift; + $src=~s{\.[^.]+\.[^.]+$}{.xhtml}; + $src=~s{^tags/}{dst/}; + return $src; + }, + }); print "targets: @targets\n"; $maker->make(@targets); |