From 7bcf7f61d7372d3df64de4b8f8ec361a436622be Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 2 Jun 2012 22:04:37 +0000 Subject: mycv_split_contents.pl in scripts/, per author git-svn-id: svn://tug.org/texlive/trunk@26807 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/scripts/mycv/mycv_split_contents.pl | 209 +++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100755 Master/texmf-dist/scripts/mycv/mycv_split_contents.pl (limited to 'Master/texmf-dist/scripts') diff --git a/Master/texmf-dist/scripts/mycv/mycv_split_contents.pl b/Master/texmf-dist/scripts/mycv/mycv_split_contents.pl new file mode 100755 index 00000000000..1fc172764dc --- /dev/null +++ b/Master/texmf-dist/scripts/mycv/mycv_split_contents.pl @@ -0,0 +1,209 @@ +#!/usr/bin/perl + +# ------------------------------------------------------- +# Copyright 2012 Ghersi Andrea (ghanhawk@gmail.com). +# +# This work may be distributed and/or modified under the +# conditions of the LaTeX Project Public License version +# 1.3c, available at 'http://www.latex-project.org/lppl'. +# ------------------------------------------------------- + +# $Id: mycv_split_contents.pl 89 2012-05-19 18:23:03Z ghangenit $ + +use Getopt::Long; +use File::Path; +use warnings; +use strict; +use Cwd; + +# hashes with errors and warnings messages + +my %errors = ( + OME => "$0: ERROR opening <%s> in output mode (CWD: %s): %s\n", + IME => "$0: ERROR opening <%s> in input mode (CWD: %s): %s\n", + NIF => "$0: ERROR: no input file provided!\nUse the option <-i infile>.\n", + NOD => "$0: ERROR: no output dir. provided!\nUse the option <-o outdir>.\n", + IOE => "$0: ERROR: input file and output dir are the same!\n" +); + +my %warnings = ( + NVC => "WARNING:: <%s> is not recognized as a valid component!\n" . + "A component can only be 'header', 'body' or 'footer'.\n" +); + +my $outdir = 'Contents'; # default output dir +my $infile = 'cv_contents.tex'; # default input file +my $cwd = getcwd(); # current directory +my %opt = (); # hash for options + +### +### + +sub _usage() +{ + print STDERR << "EOF"; + + Usage: $0 [-h] [-e] [-i infile] [-o outdir] [-m modelfile] + Version <1.0> + + Options: + ======== + + -o outdir \t : uses as output dir {default: 'Contents'} + -m mdlfile \t : writes basic model directives to the file + -i infile \t : uses as input file {default: 'cv_contents.tex'} + -e \t : keeps file names extension in model directives + -h \t : this help message + + Examples: + ========= + + 1) Splits the input file 'cv_contents.tex' into multiple files (they + will be created in the directory 'Contents'), as specified in the + file itself - the input file is not modified: + + [$0 -i cv_contents.tex] + + 2) As above but, in addiction, a basic model file (model-spl.tex) for + multiple files is created (in the model directives, the file names + extension will be removed): + + [$0 -i cv_contents.tex -m model-spl.tex] + + 3) As above, but file names in the model directives will keep their + own extension: + + [$0 -i cv_contents.tex -m model-spl.tex -e] + +EOF + exit 0; +} + +### +### + +sub mcdie { printf STDERR @_, $!; exit 1; } + +### +### + +sub processCommandLine() +{ + GetOptions ( + 'o=s' => \$opt{o}, 'i=s' => \$opt{i}, + 'm=s' => \$opt{m}, 'h' => \$opt{h}, + 'e' => \$opt{e} + ) or _usage(); + + $opt{h} and _usage(); + _usage() if ( $#ARGV > -1 ); + + _dealWithInOutFiles(); + return \%opt; +} + +### +### + +sub _dealWithInOutFiles +{ + $opt{o} and $outdir = $opt{o}; + $opt{i} and $infile = $opt{i}; + + if ( $infile eq "" ){ die $errors{NIF} } + if ( $outdir eq "" ){ die $errors{NOD} } + if ( $infile eq $outdir ){ die $errors{IOE} } + + $opt{outdir} = $outdir; + $opt{infile} = $infile; +} + +### +### + +sub fileprocess ($) +{ + my $cmdoptions = shift; + my $outdir = $cmdoptions->{'outdir'}; + my $linehook = '###'; + my %components; + my $sep = '::'; + + open INFILE, $cmdoptions->{'infile'} or + mcdie( $errors{IME}, $cmdoptions->{'infile'}, $cwd ); + + mkpath($outdir); + (-d $outdir) or mcdie( $errors{OME}, $outdir, $cwd ); + + while ( my $line = ) + { + my @info; my $ctype=''; + if ( $line =~ /$linehook/ ) + { + PROCESSLINE: + @info = split(/$sep/, $line); + + $ctype=$info[2]; # contains the component type (header,...) + chomp($ctype); + + if ( $info[2] ) + { + if ( $ctype =~ /header/ ) { push (@{$components{h}}, $line) } + elsif ( $ctype =~ /body/ ){ push (@{$components{b}}, $line) } + elsif ( $ctype =~ /footer/ ){ push (@{$components{f}}, $line) } + else { printf STDERR $warnings{NVC}, $ctype } + } + + if ( $info[1] ) # contains the file name to write + { + open OUTFILE, '>', "$outdir/$info[1]" or + mcdie( $errors{OME}, $info[1], $cwd ); + + while ( $line = ) + { + if ( $line =~ /$linehook/ ) + { + close OUTFILE; + goto PROCESSLINE; + } + else { print OUTFILE $line } # write to file + } + } + } + } + + close INFILE; + if ( $cmdoptions->{'m'} ) + { + open OUTFILE, '>', $cmdoptions->{'m'} or + mcdie( $errors{OME}, $cmdoptions->{'m'}, $cwd ); + + for my $key ( keys %components ) + { + if ( $key eq "b" ) { print OUTFILE "\\def\\bodylayoutlist{%\n" } + elsif ( $key eq "h" ) { print OUTFILE "\\def\\headerlayoutlist{%\n" } + elsif ( $key eq "f" ) { print OUTFILE "\\def\\footerlayoutlist{%\n" } + + my @info; my $cnt=0; my $fname=''; + while ( $components{$key}[$cnt] ) + { + @info = split(/$sep/, $components{$key}[$cnt]); + $cnt++; + + $fname=$info[1]; + if ( !$cmdoptions->{'e'} ){ $fname =~ s{\.[^.]+$}{} } + if ( $info[1] ){ chomp($fname); print OUTFILE " $fname@" } + if ( $info[3] ){ chomp($info[3]); print OUTFILE ":$info[3]" } + print OUTFILE ",\n"; + } + print OUTFILE "}\n"; + } + close OUTFILE; + } +} + +## +## MAIN +## + +fileprocess( processCommandLine() ); -- cgit v1.2.3