aboutsummaryrefslogtreecommitdiff
path: root/lib/WebCoso/Maker.pm
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2008-01-03 20:35:26 +0000
committerdakkar <dakkar@luxion>2008-01-03 20:35:26 +0000
commit2969fd3ef2ac1004ff4594198e84b31c60adb0c5 (patch)
treeef168964514cf84eca489683cbd00e4f58888fcb /lib/WebCoso/Maker.pm
parentrefactoring: xslt (diff)
downloadWebCoso-2969fd3ef2ac1004ff4594198e84b31c60adb0c5.tar.gz
WebCoso-2969fd3ef2ac1004ff4594198e84b31c60adb0c5.tar.bz2
WebCoso-2969fd3ef2ac1004ff4594198e84b31c60adb0c5.zip
refactoring: ReST
git-svn-id: svn://luxion/repos/WebCoso/trunk@328 fcb26f47-9200-0410-b104-b98ab5b095f3
Diffstat (limited to 'lib/WebCoso/Maker.pm')
-rw-r--r--lib/WebCoso/Maker.pm201
1 files changed, 201 insertions, 0 deletions
diff --git a/lib/WebCoso/Maker.pm b/lib/WebCoso/Maker.pm
new file mode 100644
index 0000000..0561a2c
--- /dev/null
+++ b/lib/WebCoso/Maker.pm
@@ -0,0 +1,201 @@
+package WebCoso::Maker;
+use strict;
+use warnings;
+use Slay::Maker;
+use File::Next;
+use Path::Class;
+use File::Cache::Parsed;
+use Cwd 'abs_path';
+use YAML::Syck;
+use WebCoso::Common;
+use WebCoso::TT;
+use WebCoso::XSLT;
+use WebCoso::ReST;
+
+my $fc=File::Cache::Parsed->new(follow=>1);
+$fc->add_parser(qr{\.ya?ml$} =>
+ sub { Load($_[1]) });
+$fc->add_writer(qr{\.ya?ml$} =>
+ sub { DumpFile($_[0],$_[1]) });
+
+my $template=WebCoso::TT->new(TMPLPATH=>\@WebCoso::Common::TMPLPATH,fc=>$fc);
+my $xslt=WebCoso::XSLT->new(fc=>$fc);
+my $rest=WebCoso::ReST->new(fc=>$fc);
+
+sub parseRST {
+ my ($maker,$target,$deps,$matches)=@_;
+
+ $fc->put($target,$fc->get($deps->[-1]));
+}
+
+sub getTags {
+ my ($maker,$target,$deps,$matches)=@_;
+
+ $fc->put($target,WebCoso::Common::getTags($fc,@$deps));
+}
+
+sub getChanges {
+ my ($maker,$target,$deps,$matches)=@_;
+
+ warn "changes: $target <- @$deps, @$matches\n";
+ open my $fh,'>',$target;
+}
+
+sub ifExists {
+ my ($src)=@_;
+ return sub {
+ my ($maker,$target,$matches)=@_;
+ my $dep=Slay::MakerRule::var_expand_dep($src,$target,$matches);
+ return if -e $target and ! -e $dep;
+ return $dep;
+ }
+}
+
+my %maker_opts=(
+ options => {
+ auto_create_dirs => 1,
+ #debug => 1,
+ },
+);
+
+my @passes=(
+ {maker=>Slay::Maker->new({
+ rules => [
+
+ # tags : must come first, otherwise tha "tags" directory will
+ # be taken as a normal document directory
+
+ ["$WebCoso::Common::SRCPATH/tags/(**)/document.(*).rest.txt",
+ ':',
+ "$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ ifExists("$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.rest.tt"),
+ '=',
+ $template->expandTT()],
+ ["$WebCoso::Common::SRCPATH/tags/(**)/document.(*).du.xml",
+ ':',
+ "$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ ifExists("$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.rest.txt"),
+ '=',
+ \&parseRST],
+
+ # normal documents, in subdirs
+
+ ["$WebCoso::Common::SRCPATH/(**)/document.(*).rest.txt",
+ ':',
+ ifExists("$WebCoso::Common::SRCPATH/\$1/document.\$2.rest.tt"),
+ '=',
+ $template->expandTT()],
+ ["$WebCoso::Common::SRCPATH/(**)/document.(*).du.xml",
+ ':',
+ ifExists("$WebCoso::Common::SRCPATH/\$1/document.\$2.rest.txt"),
+ '=',
+ \&parseRST],
+
+ # normal documents, in top dir
+
+ ["$WebCoso::Common::SRCPATH/()document.(*).rest.txt",
+ ':',
+ ifExists("$WebCoso::Common::SRCPATH/document.\$2.rest.tt"),
+ '=',
+ $template->expandTT()],
+ ["$WebCoso::Common::SRCPATH/()document.(*).du.xml",
+ ':',
+ ifExists("$WebCoso::Common::SRCPATH/document.\$2.rest.txt"),
+ '=',
+ \&parseRST],
+
+ # tags from normal documents (tag documents can't be tagged!)
+
+ ["$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ ':',
+ WebCoso::Common::fromTo($WebCoso::Common::SRCPATH,
+ {
+ %WebCoso::Common::docfiles,
+ transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')}
+ }),
+ '=',
+ \&getTags],
+
+ # changes (currently unimplemented)
+
+ ["$WebCoso::Common::SRCPATH/_webcoso/changes.xml",
+ ':',
+ WebCoso::Common::keepEarliest(
+ WebCoso::Common::fromTo(
+ $WebCoso::Common::SRCPATH,{%WebCoso::Common::docfiles}
+ )
+ ),
+ '=',
+ \&getChanges],
+ ],
+ %maker_opts,
+ }),
+ targets=>[
+ WebCoso::Common::fromTo("$WebCoso::Common::SRCPATH/",
+ {
+ %WebCoso::Common::docfiles,
+ transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')},
+ }),
+ WebCoso::Common::fromTo("$WebCoso::Common::SRCPATH/tags/",
+ {
+ %WebCoso::Common::docfiles,
+ transform=>sub{WebCoso::Common::typedAs($_[0],'du.xml')},
+ })]},
+ {maker=>Slay::Maker->new({
+ rules => [
+
+ # tags : must come first, otherwise tha "tags" directory will
+ # be taken as a normal document directory
+
+ ["$WebCoso::Common::DSTPATH/tags/(**)/document.(*).html",
+ ':',
+ "$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ "$WebCoso::Common::SRCPATH/tags/\$1/document.\$2.du.xml",
+ '=',
+ $xslt->du2html()],
+
+ # normal documents, in subdirs
+
+ ["$WebCoso::Common::DSTPATH/(**)/document.(*).html",
+ ':',
+ "$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ "$WebCoso::Common::SRCPATH/\$1/document.\$2.du.xml",
+ '=',
+ $xslt->du2html()],
+
+ # normal documents, in top dir
+
+ ["$WebCoso::Common::DSTPATH/()document.(*).html",
+ ':',
+ "$WebCoso::Common::SRCPATH/_webcoso/tags.yml",
+ "$WebCoso::Common::SRCPATH/document.\$2.du.xml",
+ '=',
+ $xslt->du2html()],
+ ],
+ %maker_opts,
+ }),
+ targets=>[WebCoso::Common::fromTo("$WebCoso::Common::SRCPATH/",
+ {
+ %WebCoso::Common::docfiles,
+ transform=>sub{
+ (my $file=WebCoso::Common::typedAs($_[0],'html'))
+ =~s{^\Q$WebCoso::Common::SRCPATH\E/}{$WebCoso::Common::DSTPATH/};
+ return $file;
+ },
+ }),
+ WebCoso::Common::fromTo("$WebCoso::Common::SRCPATH/tags/",
+ {
+ %WebCoso::Common::docfiles,
+ transform=>sub{
+ (my $file=WebCoso::Common::typedAs($_[0],'html'))
+ =~s{^\Q$WebCoso::Common::SRCPATH\E/tags/}{$WebCoso::Common::DSTPATH/tags/};
+ return $file;
+ },
+ })]},
+);
+
+sub make {
+ $_->{maker}->make(@{$_->{targets}}) for @passes;
+}
+
+1;