Changed the way parameters are split to allow escaping the parameter separator.
[artemus.git] / waste / artemus1
blob7f228c5cccf6f7ea4a0f15846b21420bda70803a
1 #!/usr/bin/perl
3 =pod
5 =head1 NAME
7 artemus - Programa de sustitución de texto mediante templates (moldes).
9 =head1 SYNOPSIS
11 artemus [-i|--input=<fichero origen>]
12 [-o|--output=<fichero destino>]
13 [-d|--template_dir=<directorio>]
14 [-s|--start_mark=<marca inicio de comentario>]
15 [-e|--end_mark=<marca fin de comentario>]
16 [-h|-help]
18 artemus [-M|--dep] <fichero(s)>
20 =head1 DESCRIPTION
22 Pendiente.
24 =head1 AUTHOR
26 Angel Ortega
27 angel@triptico.com
29 =cut
31 ########################################
32 # Disposiciones iniciales y
33 # módulos requeridos
34 ########################################
36 use Getopt::Long;
39 ########################################
40 # Variables globales
41 ########################################
43 # Código de salida
44 $ExitCode = 0;
46 # ID del programa
47 $prog_id="artemus 1.04";
49 # directorio de templates
50 $templ_dir="./templates";
52 # hash de templates
53 %templates={};
55 # Marcas en los ficheros
56 $start_mark="<!-- ";
57 $mid_mark="#artemus ";
58 $end_mark=" -->";
59 $mark="";
61 # fichero de entrada
62 $org="";
64 # fichero de salida
65 $des="";
67 # ayuda
68 $help=0;
70 # Variables generales
71 %vars={};
73 # generar dependencias
74 $dep=0;
77 ########################################
78 # Punto de entrada al programa
79 ########################################
81 if(!GetOptions( "i|input=s" => \$org,
82 "o|output=s" => \$des,
83 "d|template_dir=s" => \$templ_dir,
84 "s|start_mark=s" => \$start_mark,
85 "e|end_mark=s" => \$end_mark,
86 "h|help" => \$help,
87 "M|MM|dep" => \$dep)
89 or $help)
91 system("perldoc $0");
92 exit(1);
96 # Crea la marca de identificación
97 $mark=$start_mark . $mid_mark;
99 read_variables();
101 read_templates() or die "Error leyendo templates $!";
103 unless($dep)
105 process($org, $des);
107 else
109 foreach $i (@ARGV)
111 process($i, undef);
116 ########################################
117 # Punto de salida del programa
118 ########################################
120 exit ($ExitCode);
123 ########################################
124 # Métodos y funciones públicas
125 ########################################
128 sub read_variables
129 # Lee las variables
131 my ($var,$value);
133 return(undef) unless open(F,"$templ_dir/VARS");
135 while(<F>)
137 chop;
139 unless(/^#/ or /^$/)
141 ($var,$value)=split("=",$_,2);
143 $vars{"\\\$".$var}=$value;
147 close F;
149 return(1);
153 sub read_templates
154 # Lee los templates del directorio
156 # Abre el directorio
157 return(undef) unless opendir(DIR, $templ_dir);
159 while($file=readdir(DIR))
161 if(-f $templ_dir."/".$file)
163 open(F,$templ_dir."/".$file) or return(undef);
165 while(<F>)
167 $templates{$file}.=$_;
170 close(F);
174 closedir(DIR);
176 return(1);
180 sub process
181 # procesa origen y destino
183 my ($org,$des)=@_;
184 my ($template,$params);
185 my ($t,$n,$c,$field,$value);
186 my ($i,$o,@d,$org2);
187 my ($base_rel);
189 if($org)
191 # calcula base_rel
192 $t=$org;
193 while($c=chop($t))
195 $n++ if $c eq "/";
198 while($n)
200 $base_rel.="../";
201 $n--;
204 $org2=$org;
206 if($dep)
208 $org2 =~ s/\.[a-z]*$/\.src/g;
211 open(ORG,$org2) or die "Imposible abrir $org2: $!";
212 $i=\*ORG;
214 else
216 $i=\*STDIN;
219 if($des)
221 open(DES,">".$des) or die "Imposible crear $des: $!";
222 $o=\*DES;
224 else
226 $o=\*STDOUT;
229 $vars{"\\\$base_rel"}=$base_rel;
230 $vars{"\\\$/"}=$base_rel;
232 print $o "$start_mark Built with $prog_id Angel Ortega 1999 $end_mark\n" unless($dep);
233 print $o "<meta name='generator' content='$prog_id'>\n\n";
235 @d=();
237 while(<$i>)
239 if(/^\Q$mark\E/)
241 chop;
243 # quita la marca inicial
244 s/\Q$mark\E//g;
246 # y la final
247 s/\Q$end_mark\E//g;
249 # recoge el template y los parámetros
250 ($template,$params)=split(" ",$_,2);
252 # almacena en la lista de dependencias
253 # (si no está ya)
254 $t=$templ_dir."/".$template;
256 push(@d,$t) unless grep(/\Q$t\E/,@d);
258 $t=$templates{$template} or
259 die "Template $template inexistente";
261 # recorre los parámetros haciendo
262 # las sustituciones
263 while(($field,$params)=split("=",$params,2))
265 $field="\\\$".$field;
267 if($params =~ /^"/)
269 $params =~ s/^"//;
271 # valor entre comillas
272 ($value,$params)=split(/"/,$params,2);
274 # extrae posibles espacios
275 $params =~ s/^ //;
277 else
279 # valor delimitado por espacio
280 ($value,$params)=split(" ",$params,2);
283 # sustituye
284 $t =~ s/$field/$value/g;
287 else
289 $t=$_;
292 # sustituciones especiales
294 $now=scalar localtime;
295 $t =~ s/\$date/$now/g;
297 # sustitución de variables globales
299 foreach $i (keys %vars)
301 $t =~ s/$i/$vars{$i}/g;
304 print $o $t unless($dep);
307 print $o "$org: $org2 @d\n" if($dep);
309 close(ORG);
310 close(DES);
314 ########### Fin del programa ############