diff options
-rw-r--r-- | lib/File/Cache/Parsed.pm | 4 | ||||
-rw-r--r-- | t/fcp-01.t | 2 | ||||
-rw-r--r-- | t/test-site/src/bar/list.tt | 2 | ||||
-rw-r--r-- | webcoso.pl (renamed from stest.pl) | 119 |
4 files changed, 97 insertions, 30 deletions
diff --git a/lib/File/Cache/Parsed.pm b/lib/File/Cache/Parsed.pm index a3843d1..bc4036d 100644 --- a/lib/File/Cache/Parsed.pm +++ b/lib/File/Cache/Parsed.pm @@ -80,7 +80,9 @@ sub get { return $self->{cache}{$filename} if exists $self->{cache}{$filename}; - my $contents=file($filename)->slurp; + my $contents=eval {file($filename)->slurp}; + + return if $@; my $pp=first {$filename =~ m{$_->[0]}} @{$self->{parsers}}; if ($pp) { @@ -112,3 +112,5 @@ is($fc->get($wr_file->stringify), 'bad', 'parsed after put'); } + +is($fc->get('nosuchfile'),undef,'return undef on non-existant files'); diff --git a/t/test-site/src/bar/list.tt b/t/test-site/src/bar/list.tt index 567b32b..fe0e939 100644 --- a/t/test-site/src/bar/list.tt +++ b/t/test-site/src/bar/list.tt @@ -3,3 +3,5 @@ [% FOR i IN [1,2,3] %] * line [% i %] [% END %] + +link: `<baz/>`_ @@ -18,12 +18,14 @@ 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, 'include|I=s'=>\@TMPLPATH, + 'clean'=>\$CLEAN, ); exit 1 unless $res; $SRCPATH=~s{/+$}{}; @@ -40,7 +42,20 @@ my $template_provider=Template::Provider->new({ my $template=Template->new({ LOAD_TEMPLATES=>[$template_provider], }); -my $rest=Text::Restructured->new({},'WebCoso'); + +my $rest=Text::Restructured->new( + { + D=>{ + 'file-insertion-enabled'=>0, # we use TT + generator=>0, + date=>0, + 'time'=>0, + 'source-link'=>0, + 'section-subtitles'=>1, + }, + }, + 'WebCoso'); + my $xml_parser=XML::LibXML->new(); my $xslt_proc=XML::LibXSLT->new(); my $xpath=XML::LibXML::XPathContext->new(); @@ -69,15 +84,6 @@ $fc->add_parser(qr{\.ya?ml$} => $fc->add_writer(qr{\.ya?ml$} => sub { DumpFile($_[0],$_[1]) }); - -sub dstUriFor { - my ($name)=@_; - warn "dstUriFor($name)\n"; - $name=~s{\.[^.]+\.[^.]+$}{.html}; - $name=~s{^\Q$SRCPATH\E/}{$DSTBASEURL}; - return $name; -} - sub getTitleFor { my ($lang,$path,$name)=@_; @@ -88,9 +94,9 @@ sub getTitleFor { $doc_name=~s{^\Q$DSTBASEURL\E}{$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); # absolutize it warn "getTitleFor($lang,$path,$name)->$doc_name\n"; my $doc=$fc->get($doc_name); @@ -106,6 +112,14 @@ sub getTitleFor { $xslt_proc->register_function('http://webcoso.thenautilus.net/','title-for',\&getTitleFor); +sub dstUriFor { + my ($name)=@_; + warn "dstUriFor($name)\n"; + $name=~s{\.[^.]+\.[^.]+$}{.html}; + $name=~s{^\Q$SRCPATH\E/}{$DSTBASEURL}; + return $name; +} + sub isLang { my ($lang,$name)=@_; warn "isLang($lang,$name)\n"; @@ -179,7 +193,7 @@ sub getTags { sub getChanges { my ($maker,$target,$deps,$matches)=@_; - print "changes: $target <- @$deps, @$matches\n"; + warn "changes: $target <- @$deps, @$matches\n"; open my $fh,'>',$target; } @@ -213,9 +227,9 @@ sub fromTo { { my %order=( - 'document.rest.tt'=>0, - 'document.rest.txt'=>1, - 'document.du.xml'=>2, + 'rest.tt'=>0, + 'rest.txt'=>1, + 'du.xml'=>2, ); sub earliest { my ($a,$b)=@_; @@ -224,26 +238,46 @@ sub earliest { ? $a : $b; } -} sub keepEarliest { my %dirs; for my $f (@_) { my $c=file($f); - $dirs{$c->parent}=earliest($c->basename,$dirs{$c->parent}); + $c->basename=~m{^document\.([^.]+)\.([^.]+\.[^.]+)$} + or die "Weird document name <$f>"; + my ($lang,$type)=($1,$2); + $dirs{$c->parent}->{$lang}=earliest($type,$dirs{$c->parent}->{$lang}); } my @ret; - while (my ($d,$f)=each %dirs) { - push @ret,file($d,$f)->stringify; + while (my ($d,$langs)=each %dirs) { + while (my ($lang,$type)=each %$langs) { + push @ret,file($d,"document.$lang.$type")->stringify; + } } return @ret; } +} my %docfiles=( - files=>sub{m{^document\.} and ($File::Next::dir !~ m{/\.svn/})}, - dirs=>sub{!m{^(tags|_webcoso)$}}); + files=>sub{m{^document\.}}, + dirs=>sub{!m{^(tags|_webcoso|\.svn)$}}); + +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)$}}})}=(); + + my $iter=File::Next::files({descend_filter=>sub{!m{^\.svn$}}},$SRCPATH,$DSTPATH); + while (defined (my $file=$iter->())) { + next if exists $to_keep{$file}; + unlink $file; + } + dir($DSTPATH)->rmtree; + dir($SRCPATH,'_webcoso')->rmtree; + exit 0; +} -my $maker=Slay::Maker->new({ +my $maker1st=Slay::Maker->new({ rules => [ ["$SRCPATH/tags/(**)/document.(*).rest.txt",':',"$SRCPATH/_webcoso/tags.yml",ifExists("$SRCPATH/tags/\$1/document.\$2.rest.tt"),'=',\&expandTT], ["$SRCPATH/tags/(**)/document.(*).du.xml",':',"$SRCPATH/_webcoso/tags.yml",ifExists("$SRCPATH/tags/\$1/document.\$2.rest.txt"),'=',\&parseRST], @@ -251,22 +285,47 @@ my $maker=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/changes.xml",':',keepEarliest(fromTo("$SRCPATH/",{%docfiles})),'=',\&getChanges], + ["$SRCPATH/_webcoso/tags.yml",':',fromTo($SRCPATH,{%docfiles,transform=>sub{my $s=shift;$s=~s{\.[^.]+\.[^.]+$}{.du.xml};$s}}),'=',\&getTags], + #["$SRCPATH/_webcoso/changes.xml",':',keepEarliest(fromTo($SRCPATH,{%docfiles})),'=',\&getChanges], + ], + options => { + auto_create_dirs => 1, + #debug => 1, + }, +}); +my $maker2nd=Slay::Maker->new({ + rules => [ ["$DSTPATH/tags/(**)/document.(*).html",':',"$SRCPATH/_webcoso/tags.yml","$SRCPATH/tags/\$1/document.\$2.du.xml",'=',\&du2html], ["$DSTPATH/(**)/document.(*).html",':',"$SRCPATH/_webcoso/tags.yml","$SRCPATH/\$1/document.\$2.du.xml",'=',\&du2html], ["$DSTPATH/()document.(*).html",':',"$SRCPATH/_webcoso/tags.yml","$SRCPATH/document.\$2.du.xml",'=',\&du2html], ], options => { auto_create_dirs => 1, - #detect_no_diffs => 1, - #detect_no_size_change => 1, #debug => 1, }, }); -my @targets=(fromTo("$SRCPATH/", +my @targets1st=(fromTo("$SRCPATH/", + { + %docfiles, + transform=>sub{ + my $src=shift; + $src=~s{\.[^.]+\.[^.]+$}{.du.xml}; + return $src; + }, + }), + fromTo("$SRCPATH/tags/", + { + %docfiles, + transform=>sub{ + my $src=shift; + $src=~s{\.[^.]+\.[^.]+$}{.du.xml}; + return $src; + }, + })); + +my @targets2nd=(fromTo("$SRCPATH/", { %docfiles, transform=>sub{ @@ -287,6 +346,8 @@ my @targets=(fromTo("$SRCPATH/", }, })); -print "targets: @targets\n"; -$maker->make(@targets); +print "targets 1st: @targets1st\n"; +$maker1st->make(@targets1st); +print "targets 2nd: @targets2nd\n"; +$maker2nd->make(@targets2nd); |