aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2008-01-02 21:20:15 +0000
committerdakkar <dakkar@luxion>2008-01-02 21:20:15 +0000
commitd0d6cd4b581cb016493401e190e5b813218816e5 (patch)
tree3e1d909fd3da973cf82517a973991b8a80e8cdab
parentugly way to get titles... may require double-run (diff)
downloadWebCoso-d0d6cd4b581cb016493401e190e5b813218816e5.tar.gz
WebCoso-d0d6cd4b581cb016493401e190e5b813218816e5.tar.bz2
WebCoso-d0d6cd4b581cb016493401e190e5b813218816e5.zip
better handling of non-existing files, and a --clean option
git-svn-id: svn://luxion/repos/WebCoso/trunk@319 fcb26f47-9200-0410-b104-b98ab5b095f3
-rw-r--r--lib/File/Cache/Parsed.pm4
-rw-r--r--t/fcp-01.t2
-rw-r--r--t/test-site/src/bar/list.tt2
-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) {
diff --git a/t/fcp-01.t b/t/fcp-01.t
index 88ed9bf..7626cd4 100644
--- a/t/fcp-01.t
+++ b/t/fcp-01.t
@@ -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/>`_
diff --git a/stest.pl b/webcoso.pl
index 280a0c5..7840f53 100644
--- a/stest.pl
+++ b/webcoso.pl
@@ -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);