From 409b0fae3968de8b7ec3adfc4840ddad536757ff Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 3 Jan 2008 20:05:51 +0000 Subject: refactoring: TT git-svn-id: svn://luxion/repos/WebCoso/trunk@326 fcb26f47-9200-0410-b104-b98ab5b095f3 --- script/webcoso.pl | 203 +++++++++++++++++------------------------------------- 1 file changed, 63 insertions(+), 140 deletions(-) (limited to 'script') diff --git a/script/webcoso.pl b/script/webcoso.pl index 3552974..4803ac0 100644 --- a/script/webcoso.pl +++ b/script/webcoso.pl @@ -13,36 +13,25 @@ use XML::LibXML; use XML::LibXSLT; use YAML::Syck; use Getopt::Long; +use WebCoso::Common; +use WebCoso::TT; -my $SRCPATH='src'; -my $DSTPATH='dst'; -my $DSTBASEURL='/'; my @TMPLPATH=('common/'); my $CLEAN=0; { -my $res=GetOptions('src|s=s'=>\$SRCPATH, - 'dst|d=s'=>\$DSTPATH, - 'url|u=s'=>\$DSTBASEURL, +my $res=GetOptions('src|s=s'=>\$WebCoso::Common::SRCPATH, + 'dst|d=s'=>\$WebCoso::Common::DSTPATH, + 'url|u=s'=>\$WebCoso::Common::DSTBASEURL, 'include|I=s'=>\@TMPLPATH, 'clean'=>\$CLEAN, ); exit 1 unless $res; -$SRCPATH=~s{/+$}{}; -$DSTPATH=~s{/+$}{}; -$DSTBASEURL=~s{/*$}{/}; +$WebCoso::Common::SRCPATH=~s{/+$}{}; +$WebCoso::Common::DSTPATH=~s{/+$}{}; +$WebCoso::Common::DSTBASEURL=~s{/*$}{/}; } -my $stash={}; -my $template_provider=Template::Provider->new({ - INCLUDE_PATH=> \@TMPLPATH, - ABSOLUTE=>1, - RELATIVE=>1, -}); -my $template=Template->new({ - LOAD_TEMPLATES=>[$template_provider], -}); - my $rest=Text::Restructured->new( { D=>{ @@ -62,10 +51,6 @@ my $xpath=XML::LibXML::XPathContext->new(); $xpath->registerNs('x', 'http://www.w3.org/1999/xhtml'); my $fc=File::Cache::Parsed->new(follow=>1); -$fc->add_parser(qr{\.tt2?$} => - sub { - $template->context->template($_[0]); - }); $fc->add_parser(qr{\.rest\.txt$} => sub { my $dudom=$rest->Parse($_[1],$_[0]); @@ -84,18 +69,20 @@ $fc->add_parser(qr{\.ya?ml$} => $fc->add_writer(qr{\.ya?ml$} => sub { DumpFile($_[0],$_[1]) }); +my $template=WebCoso::TT->new(TMPLPATH=>\@TMPLPATH,fc=>$fc); + sub getTitleFor { my ($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/}; + if ($doc_name=~m{^\Q$WebCoso::Common::DSTBASEURL\E}) { + $doc_name=~s{^\Q$WebCoso::Common::DSTBASEURL\E}{$WebCoso::Common::SRCPATH/}; } else { - $doc_name=file($doc_name)->absolute(file($path)->parent)->relative($SRCPATH); # absolutize it - $doc_name="$SRCPATH/$doc_name"; + $doc_name=file($doc_name)->absolute(file($path)->parent)->relative($WebCoso::Common::SRCPATH); # absolutize it + $doc_name="$WebCoso::Common::SRCPATH/$doc_name"; } warn "getTitleFor($lang,$path,$name)->$doc_name\n"; @@ -130,7 +117,7 @@ sub getTagsXML { $te->setAttribute('name',$tagname); $de->appendChild($te); my %docs; - push @{$docs{dstUriFor($_)}},langOf($_) for @$doclist; + push @{$docs{WebCoso::Common::dstUriFor($_)}},WebCoso::Common::langOf($_) for @$doclist; my ($docurl,$langs); while (($docurl,$langs)=each %docs) { my $dle=$doc->createElementNS($NS,'wc:doc'); @@ -148,70 +135,6 @@ sub getTagsXML { } $xslt_proc->register_function($NS,'tagged',\&getTagsXML); -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{/$}; # assume that MultiViews on the server will work - return 1 if langOf($name) eq $lang; - return; -} - -$stash->{dstUriFor}=\&dstUriFor; -$stash->{isLang}=\&isLang; - -sub expandTT { - my ($maker,$target,$deps,$matches)=@_; - - warn "expandTT($target,@$deps,@$matches)\n"; - - my $tmpl=$fc->get($deps->[-1]); - my $vars={ path=> $matches->[0], - language => $matches->[1], - %$stash, - }; - if (@$deps>1) { - warn "tagging as $deps->[0]\n"; - $vars->{tagged}=$fc->get($deps->[0]); - } - push @{$template_provider->include_path}, - file($deps->[-1])->parent; - $fc->put($target, - $template->context->process($tmpl, - $vars)); - pop @{$template_provider->include_path}; -} - sub parseRST { my ($maker,$target,$deps,$matches)=@_; @@ -309,8 +232,8 @@ sub keepEarliest { my %dirs; for my $f (@_) { my $c=file($f); - my $lang=langOf($c->basename); - my $type=typeOf($c->basename); + my $lang=WebCoso::Common::langOf($c->basename); + my $type=WebCoso::Common::typeOf($c->basename); if (!defined $lang or !defined $type) { die "Weird document name <$f>"; } @@ -332,16 +255,16 @@ my %docfiles=( if ($CLEAN) { my %to_keep; - @to_keep{keepEarliest(fromTo($SRCPATH,{%docfiles,dirs=>sub{!m{^(_webcoso|\.svn)$}}}))}=(); - @to_keep{fromTo($SRCPATH,{files=>sub{!m{^document\.}},dirs=>sub{!m{^(_webcoso|\.svn)$}}})}=(); + @to_keep{keepEarliest(fromTo($WebCoso::Common::SRCPATH,{%docfiles,dirs=>sub{!m{^(_webcoso|\.svn)$}}}))}=(); + @to_keep{fromTo($WebCoso::Common::SRCPATH,{files=>sub{!m{^document\.}},dirs=>sub{!m{^(_webcoso|\.svn)$}}})}=(); - my $iter=File::Next::files({descend_filter=>sub{!m{^\.svn$}}},$SRCPATH,$DSTPATH); + my $iter=File::Next::files({descend_filter=>sub{!m{^\.svn$}}},$WebCoso::Common::SRCPATH,$WebCoso::Common::DSTPATH); while (defined (my $file=$iter->())) { next if exists $to_keep{$file}; unlink $file; } - dir($DSTPATH)->rmtree; - dir($SRCPATH,'_webcoso')->rmtree; + dir($WebCoso::Common::DSTPATH)->rmtree; + dir($WebCoso::Common::SRCPATH,'_webcoso')->rmtree; exit 0; } @@ -359,77 +282,77 @@ my @passes=( # tags : must come first, otherwise tha "tags" directory will # be taken as a normal document directory - ["$SRCPATH/tags/(**)/document.(*).rest.txt", + ["$WebCoso::Common::SRCPATH/tags/(**)/document.(*).rest.txt", ':', - "$SRCPATH/_webcoso/tags.yml", - ifExists("$SRCPATH/tags/\$1/document.\$2.rest.tt"), + "$WebCoso::Common::SRCPATH/_webcoso/tags.yml", + ifExists("$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.rest.tt"), '=', - \&expandTT], - ["$SRCPATH/tags/(**)/document.(*).du.xml", + $template->expandTT()], + ["$WebCoso::Common::SRCPATH/tags/(**)/document.(*).du.xml", ':', - "$SRCPATH/_webcoso/tags.yml", - ifExists("$SRCPATH/tags/\$1/document.\$2.rest.txt"), + "$WebCoso::Common::SRCPATH/_webcoso/tags.yml", + ifExists("$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.rest.txt"), '=', \&parseRST], # normal documents, in subdirs - ["$SRCPATH/(**)/document.(*).rest.txt", + ["$WebCoso::Common::SRCPATH/(**)/document.(*).rest.txt", ':', - ifExists("$SRCPATH/\$1/document.\$2.rest.tt"), + ifExists("$WebCoso::Common::SRCPATH/\$1/document.\$2.rest.tt"), '=', - \&expandTT], - ["$SRCPATH/(**)/document.(*).du.xml", + $template->expandTT()], + ["$WebCoso::Common::SRCPATH/(**)/document.(*).du.xml", ':', - ifExists("$SRCPATH/\$1/document.\$2.rest.txt"), + ifExists("$WebCoso::Common::SRCPATH/\$1/document.\$2.rest.txt"), '=', \&parseRST], # normal documents, in top dir - ["$SRCPATH/()document.(*).rest.txt", + ["$WebCoso::Common::SRCPATH/()document.(*).rest.txt", ':', - ifExists("$SRCPATH/document.\$2.rest.tt"), + ifExists("$WebCoso::Common::SRCPATH/document.\$2.rest.tt"), '=', - \&expandTT], - ["$SRCPATH/()document.(*).du.xml", + $template->expandTT()], + ["$WebCoso::Common::SRCPATH/()document.(*).du.xml", ':', - ifExists("$SRCPATH/document.\$2.rest.txt"), + ifExists("$WebCoso::Common::SRCPATH/document.\$2.rest.txt"), '=', \&parseRST], # tags from normal documents (tag documents can't be tagged!) - ["$SRCPATH/_webcoso/tags.yml", + ["$WebCoso::Common::SRCPATH/_webcoso/tags.yml", ':', - fromTo($SRCPATH, + fromTo($WebCoso::Common::SRCPATH, { %docfiles, - transform=>sub{typedAs($_[0],'du.xml')} + transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')} }), '=', \&getTags], # changes (currently unimplemented) - ["$SRCPATH/_webcoso/changes.xml", + ["$WebCoso::Common::SRCPATH/_webcoso/changes.xml", ':', - keepEarliest(fromTo($SRCPATH,{%docfiles})), + keepEarliest(fromTo($WebCoso::Common::SRCPATH,{%docfiles})), '=', \&getChanges], ], %maker_opts, }), targets=>[ - fromTo("$SRCPATH/", + fromTo("$WebCoso::Common::SRCPATH/", { %docfiles, - transform=>sub{typedAs($_[0],'du.xml')}, + transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')}, }), - fromTo("$SRCPATH/tags/", + fromTo("$WebCoso::Common::SRCPATH/tags/", { %docfiles, - transform=>sub{typedAs($_[0],'du.xml')}, + transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')}, })]}, {maker=>Slay::Maker->new({ rules => [ @@ -437,48 +360,48 @@ my @passes=( # tags : must come first, otherwise tha "tags" directory will # be taken as a normal document directory - ["$DSTPATH/tags/(**)/document.(*).html", + ["$WebCoso::Common::DSTPATH/tags/(**)/document.(*).html", ':', - "$SRCPATH/_webcoso/tags.yml", - "$SRCPATH/tags/\$1/document.\$2.du.xml", + "$WebCoso::Common::SRCPATH/_webcoso/tags.yml", + "$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.du.xml", '=', \&du2html], # normal documents, in subdirs - ["$DSTPATH/(**)/document.(*).html", + ["$WebCoso::Common::DSTPATH/(**)/document.(*).html", ':', - "$SRCPATH/_webcoso/tags.yml", - "$SRCPATH/\$1/document.\$2.du.xml", + "$WebCoso::Common::SRCPATH/_webcoso/tags.yml", + "$WebCoso::Common::SRCPATH/\$1/document.\$2.du.xml", '=', \&du2html], # normal documents, in top dir - ["$DSTPATH/()document.(*).html", + ["$WebCoso::Common::DSTPATH/()document.(*).html", ':', - "$SRCPATH/_webcoso/tags.yml", - "$SRCPATH/document.\$2.du.xml", + "$WebCoso::Common::SRCPATH/_webcoso/tags.yml", + "$WebCoso::Common::SRCPATH/document.\$2.du.xml", '=', \&du2html], ], %maker_opts, }), - targets=>[fromTo("$SRCPATH/", + targets=>[fromTo("$WebCoso::Common::SRCPATH/", { %docfiles, transform=>sub{ - (my $file=typedAs($_[0],'html')) - =~s{^\Q$SRCPATH\E/}{$DSTPATH/}; + (my $file=WebCoso::Common::typedAs($_[0],'html')) + =~s{^\Q$WebCoso::Common::SRCPATH\E/}{$WebCoso::Common::DSTPATH/}; return $file; }, }), - fromTo("$SRCPATH/tags/", + fromTo("$WebCoso::Common::SRCPATH/tags/", { %docfiles, transform=>sub{ - (my $file=typedAs($_[0],'html')) - =~s{^\Q$SRCPATH\E/tags/}{$DSTPATH/tags/}; + (my $file=WebCoso::Common::typedAs($_[0],'html')) + =~s{^\Q$WebCoso::Common::SRCPATH\E/tags/}{$WebCoso::Common::DSTPATH/tags/}; return $file; }, })]}, -- cgit v1.2.3