#!/usr/bin/env perl # Fills templates with haskell-escaped strings slurped from input files. # Takes two arguments, the first specifying the pathname of the target # relative to the root directory, the second specifying the root directory # (defaulting to ..). The template is assumed to have the same base name # as the target and to reside in the templates subdirectory of the root # directory. use strict; use warnings; # Utility routines: sub slurp { open FILE, $_[0] or die "couldn't open file '$_[0]': $!"; my $contents = do { local $/; ;}; close FILE; return $contents; } sub escape_for_haskell { my ($contents) = @_; $contents =~ s/\\/\\\\/g; $contents =~ s/\t/\\t/g; $contents =~ s/"/\\"/g; $contents =~ s/\n/\\n/g; return $contents; } # Template processors. my %processor = ( # -------------------------------------------------------------------------- 'Text/Pandoc/Writers/S5.hs' => { # -------------------------------------------------------------------------- proc => sub { my ($template) = @_; my $slides = escape_for_haskell(slurp "ui/default/slides.js"); my $s5core = escape_for_haskell(slurp "ui/default/s5-core.css"); my $framing = escape_for_haskell(slurp "ui/default/framing.css"); my $pretty = escape_for_haskell(slurp "ui/default/pretty.css"); my $opera = escape_for_haskell(slurp "ui/default/opera.css"); my $outline = escape_for_haskell(slurp "ui/default/outline.css"); my $print = escape_for_haskell(slurp "ui/default/print.css"); $template =~ s//$slides/; $template =~ s//$s5core/; $template =~ s//$framing/; $template =~ s//$pretty/; $template =~ s//$opera/; $template =~ s//$outline/; $template =~ s//$print/; return $template; }, }, # -------------------------------------------------------------------------- 'Text/Pandoc/ASCIIMathML.hs' => { # -------------------------------------------------------------------------- proc => sub { my ($template) = @_; my $script = escape_for_haskell(slurp "ASCIIMathML.js"); my $acknowledgements = " ASCIIMathML.js - copyright Peter Jipsen,". " released under the GPL\\nSee ". "http://www1.chapman.edu/~jipsen/mathml/asciimath.html/ "; $script =~ s/\/\*.*?\*\//\/\*$acknowledgements\*\//g; # strip comments $template =~ s//$script/; return $template; }, }, # -------------------------------------------------------------------------- 'Text/Pandoc/Writers/DefaultHeaders.hs' => { # -------------------------------------------------------------------------- proc => sub { my ($template) = @_; my $html = escape_for_haskell(slurp "headers/HtmlHeader"); my $latex = escape_for_haskell(slurp "headers/LaTeXHeader"); my $rtf = escape_for_haskell(slurp "headers/RTFHeader"); my $s5 = escape_for_haskell(slurp "headers/S5Header"); $template =~ s//$html/; $template =~ s//$latex/; $template =~ s//$rtf/; $template =~ s//$s5/; return $template; }, }, # -------------------------------------------------------------------------- # 'foo/bar/baz' => { # -------------------------------------------------------------------------- # template => 'optional-template-filename-defaults-to-baz' # proc => sub { # my ($template) = @_; # # Process. # return $template; # }, #}, ); # Main. my $target = shift @ARGV; if (!defined $target || !length $target) { print STDERR "Available targets:\n\n" . join "\n", keys %processor; die "\n\nYou must supply a target!\n"; } die "No processor exists for '$target'!\n" if ! exists $processor{$target}; my $rootdir = shift @ARGV || '..'; chdir $rootdir or die "Couldn't chdir to '$rootdir': $!"; my $template; if (exists $processor{$target}->{template}) { $template = $processor{$target}->{template}; } else { ($template = $target) =~ s!.*/+!!; } $template = "templates/$template"; die "No template exists for '$target'!\n" if ! -f "$template"; open OUTFILE, ">$target" or die "couldn't open file '$target': $!"; print OUTFILE <{proc}->(slurp($template)); print OUTFILE "\n"; close OUTFILE;