Estoy escribiendo un pequeño script para extraer/copiar bloques de texto de un archivo latex, y deseo agregarle opciones mediante Getopt::Long.
Mi idea es poder usar el script al estilo Linux script [opciones] archivo pero me he topado con un pequeño dilema. Me explico: Al correr el script sobre un archivo deseo que acepte solo las extensiones .tex y .ltx; si el archivo no tiene extensión o es otra, dar un mensaje y salir.
Si el archivo de entrada es test.tex y se usa la opción --output que no esté seguida de una cadena, el valor por defecto sería test-out.tex, algo así:
produciría test-out.tex como salida, y
produciría otro.tex como salida.
En esto es donde me pierdo: deseo validar el archivo de entrada y salida, para que el archivo de entrada tenga solo la extensión válida y el nombre del archivo de salida no contenga la extensión ni sea el mismo nombre que el archivo de entrada.
No sé si es posible lo de asignarle un valor por defecto si se pasa la opción --output. De no ser así, mostrar un mensaje de error y salir.
El tema es que añadiré más opciones dentro del mismo script.
Dejo el código que llevo a la fecha:
Using perl Syntax Highlighting
- eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q' if 0;
- use v5.18;
- use File::Basename; #
- use Getopt::Long qw(:config bundling_override require_order); #
- use autodie; #
- #------------------------ Constantes -----------------------------------
- my $imageDir = "images"; #
- my $other = "other"; #
- my $BPL = '\begin{postscript}';
- my $EPL = '\end{postscript}';
- my $sipgf = 'pgfpicture';
- my $nopgf = 'pgfinterruptpicture';
- #---------------- Creamos el directorio para las imágenes -------------#
- -e $imageDir or mkdir($imageDir,0744) or die "No puedo crear $imageDir: $!\n";
- my $usage = <<"END_OF_USAGE";
- Uso: programa [opt] archivo.tex
- END_OF_USAGE
- my $output; # archivo de salida
- my $result=GetOptions (
- 'output|o=s' => \$output, # nombre archivo de salida
- 'help|h' => \$::opt_help, # muestra ayuda
- ) or die $usage;
- # help
- if ($::opt_help) {
- print $usage;
- exit(0);
- }
- #--------------------- Arreglo de la extensión -------------------------
- my @SuffixList = ('.tex', '', '.ltx'); # posibles
- my ($name, $path, $ext) = fileparse($ARGV[0], @SuffixList);
- $ext = '.tex' if not $ext;
- # nombre del archivo de salida
- if ($output eq '') {
- $output = "$name-out";
- print "El nombre de es $output";
- }
- #------------------- Abrimos el archivo -------------------------------
- open my $ENTRADA, '<', "$name$ext";
- my $archivo;
- {
- local $/;
- $archivo = <$ENTRADA>;
- }
- close $ENTRADA;
- #--------------------- Dividimos el archivo de entrada -----------------
- my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+?) (\\begin\{document\} .+?)(\\end\{document\}.*)\z/msx;
- # \pspicture to \begin{pspicture}
- $cuerpo =~ s/\\pspicture(\*)?(.+?)\\endpspicture/\\begin{pspicture$1}$2\\end{pspicture$1}/gmsx;
- # Verbatim environments
- my $VERBATIM = qr/(?: (v|V)erbatim\*?| PSTexample | aling)/xi;
- # postscript environment
- my $POSTSCRIPT = qr/(?: postscript)/xi;
- # tikzpicture environment
- my $ENVIRONMENT = qr/(?: tikzpicture | pspicture\*?)/xi;
- # falla izquierda (*SKIP)(*F)| acepta la derecha <img src="http://perlenespanol.com/foro/images/smilies/icon_smile.gif" alt=":)" title="Smile" />
- # tikz/pst to Postscript
- $cuerpo =~ s/\\begin\{$POSTSCRIPT\}.+?\\end\{$POSTSCRIPT\}(*SKIP)(*F)|
- (
- (?:\\(psset|tikzset)(\{(?:\{.*?\}|[^\{])*\}).*?)? # si está lo guardo
- (\\begin\{($ENVIRONMENT)\} (.*?) \\end\{\g{-2}\})
- )
- /$BPL\n$1\n$EPL/gmsx;
- # pgfpicture to Postscript
- $cuerpo =~ s/\\begin\{$POSTSCRIPT\}.+?\\end\{$POSTSCRIPT\}(*SKIP)(*F)|
- (
- \\begin\{$sipgf\}
- .*?
- (
- \\begin\{$nopgf\}
- .+?
- \\end\{$nopgf\}
- .*?
- )*?
- \\end\{$sipgf\}
- )
- /$BPL\n$1\n$EPL/gmsx;
- # other to PostScript
- my $EXPORT = qr/(forest|ganttchart|tikzcd|circuitikz|dependency|$other\*?)/x;
- $cuerpo =~ s/\\begin\{$POSTSCRIPT\}.+?\\end\{$POSTSCRIPT\}(*SKIP)(*F)|
- (\\begin\{($EXPORT)\} (.*?) \\end\{\g{-2}\})
- /$BPL\n$1\n$EPL/gmsx;
- # escribir la salida
- open my $SALIDA, '>', "$output$ext";
- print $SALIDA <<"EOC";
- $cabeza$cuerpo$final
- EOC
- close $SALIDA;
- __END__
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
Y el archivo test:
Using latex Syntax Highlighting
- \documentclass{article}
- \usepackage{lmodern}
- \usepackage{pstricks-add}
- \begin{document}
- texto\begin{pspicture}(-0.5,-0.5)(5,3.5)
- Deberia quedar dentro de postricpt
- \end{pspicture}texto
- \section{NO Anidados}
- PSPICTURE
- \psset{
- unit=1.0cm,
- }
- \begin{pspicture}(-0.5,-0.5)(5,3.5)
- Deberia quedar dentro de postricpt
- \end{pspicture}
- PGF
- \begin{pgfpicture}
- Deberia quedar dentro de postcript
- \end{pgfpicture}
- TIKZ
- \tikzset{
- algo
- }
- \begin{tikzpicture}
- \shadedraw [shading=ball] (0,0) circle (2cm);
- \end{tikzpicture}
- \section{Otros}
- \begin{forest}
- FOREST
- \end{forest}
- \begin{ganttchart}
- ganttchart
- \end{ganttchart}
- \begin{tikzcd}
- tikzcd
- \end{tikzcd}
- \begin{circuitikz}
- circuitikz
- \end{circuitikz}
- \begin{dependency}
- dependency
- \end{dependency}
- \section{Otros anidados en postscript}
- \begin{postscript}
- \begin{forest}
- FOREST
- \end{forest}
- \end{postscript}
- \begin{postscript}
- \begin{ganttchart}
- ganttchart
- \end{ganttchart}
- \end{postscript}
- \begin{postscript}
- \begin{tikzcd}
- tikzcd
- \end{tikzcd}
- \end{postscript}
- \begin{postscript}
- \begin{circuitikz}
- circuitikz
- \end{circuitikz}
- \end{postscript}
- \begin{postscript}
- \begin{dependency}
- dependency
- \end{dependency}
- \end{postscript}
- \section{Otros anidados en tikzpicture}
- \begin{tikzpicture}
- \begin{forest}
- FOREST
- \end{forest}
- \end{tikzpicture}
- \begin{tikzpicture}
- \begin{ganttchart}
- ganttchart
- \end{ganttchart}
- \end{tikzpicture}
- \begin{tikzpicture}
- \begin{tikzcd}
- tikzcd
- \end{tikzcd}
- \end{tikzpicture}
- \begin{tikzpicture}
- \begin{circuitikz}
- circuitikz
- \end{circuitikz}
- \end{tikzpicture}
- \begin{tikzpicture}
- \begin{dependency}
- dependency
- \end{dependency}
- \end{tikzpicture}
- \section{Anidados}
- PGF
- \begin{postscript}
- \begin{pgfpicture}
- PGF anidado queda de la misma manera
- \end{pgfpicture}
- \end{postscript}
- PSPICTURE
- \begin{postscript}
- \begin{pspicture}(-0.5,-0.5)(5,3.5)
- pspicture anidaddo queda de la misma manera
- \end{pspicture}
- \end{postscript}
- TIKZpicture
- \begin{postscript}
- \begin{tikzpicture}
- \shadedraw [shading=ball] (0,0) circle (2cm);
- \end{tikzpicture}
- \end{postscript}
- \end{document}
- \begin{pspicture}(-0.5,-0.5)(5,3.5)
- IGNORAR
- \end{pspicture}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Agradecido de antemano.
Saludos