1#!/usr/bin/perl -w 2# 3use strict; 4 5# Used to change the names of the image files generated by latex2html from imgxx.png 6# to meaningful names. Provision is made to go either from or to the meaningful names. 7# The meaningful names are obtained from a file called imagename_translations, which 8# is generated by extensions to latex2html in the make_image_file subroutine in 9# bacula.perl. 10 11# Opens the file imagename_translations and reads the contents into a hash. 12# The hash is creaed with the imgxx.png files as the key if processing TO 13# meaningful filenames, and with the meaningful filenames as the key if 14# processing FROM meaningful filenames. 15# Then opens the html file(s) indicated in the command-line arguments and 16# changes all image references according to the translations described in the 17# above file. Finally, it renames the image files. 18# 19# Original creation: 3-27-05 by Karl Cunningham. 20# Modified 5-21-05 to go FROM and TO meaningful filenames. 21# 22my $TRANSFILE = "imagename_translations"; 23my $path; 24 25# Loads the contents of $TRANSFILE file into the hash referenced in the first 26# argument. The hash is loaded to translate old to new if $direction is 0, 27# otherwise it is loaded to translate new to old. In this context, the 28# 'old' filename is the meaningful name, and the 'new' filename is the 29# imgxx.png filename. It is assumed that the old image is the one that 30# latex2html has used as the source to create the imgxx.png filename. 31# The filename extension is taken from the file 32sub read_transfile { 33 my ($trans,$direction) = @_; 34 35 if (!open IN,"<$path$TRANSFILE") { 36 print "WARNING: Cannot open image translation file $path$TRANSFILE for reading\n"; 37 print " Image filename translation aborted\n\n"; 38 exit 0; 39 } 40 41 while (<IN>) { 42 chomp; 43 my ($new,$old) = split(/\001/); 44 45 # Old filenames will usually have a leading ./ which we don't need. 46 $old =~ s/^\.\///; 47 48 # The filename extension of the old filename must be made to match 49 # the new filename because it indicates the encoding format of the image. 50 my ($ext) = $new =~ /(\.[^\.]*)$/; 51 $old =~ s/\.[^\.]*$/$ext/; 52 if ($direction == 0) { 53 $trans->{$new} = $old; 54 } else { 55 $trans->{$old} = $new; 56 } 57 } 58 close IN; 59} 60 61# Translates the image names in the file given as the first argument, according to 62# the translations in the hash that is given as the second argument. 63# The file contents are read in entirely into a string, the string is processed, and 64# the file contents are then written. No particular care is taken to ensure that the 65# file is not lost if a system failure occurs at an inopportune time. It is assumed 66# that the html files being processed here can be recreated on demand. 67# 68# Links to other files are added to the %filelist for processing. That way, 69# all linked files will be processed (assuming they are local). 70sub translate_html { 71 my ($filename,$trans,$filelist) = @_; 72 my ($contents,$out,$this,$img,$dest); 73 my $cnt = 0; 74 75 # If the filename is an external link ignore it. And drop any file:// from 76 # the filename. 77 $filename =~ /^(http|ftp|mailto)\:/ and return 0; 78 $filename =~ s/^file\:\/\///; 79 # Load the contents of the html file. 80 if (!open IF,"<$path$filename") { 81 print "WARNING: Cannot open $path$filename for reading\n"; 82 print " Image Filename Translation aborted\n\n"; 83 exit 0; 84 } 85 86 while (<IF>) { 87 $contents .= $_; 88 } 89 close IF; 90 91 # Now do the translation... 92 # First, search for an image filename. 93 while ($contents =~ /\<\s*IMG[^\>]*SRC=\"/si) { 94 $contents = $'; 95 $out .= $` . $&; 96 97 # The next thing is an image name. Get it and translate it. 98 $contents =~ /^(.*?)\"/s; 99 $contents = $'; 100 $this = $&; 101 $img = $1; 102 # If the image is in our list of ones to be translated, do it 103 # and feed the result to the output. 104 $cnt += $this =~ s/$img/$trans->{$img}/ if (defined($trans->{$img})); 105 $out .= $this; 106 } 107 $out .= $contents; 108 109 # Now send the translated text to the html file, overwriting what's there. 110 open OF,">$path$filename" or die "Cannot open $path$filename for writing\n"; 111 print OF $out; 112 close OF; 113 114 # Now look for any links to other files and add them to the list of files to do. 115 while ($out =~ /\<\s*A[^\>]*HREF=\"(.*?)\"/si) { 116 $out = $'; 117 $dest = $1; 118 # Drop an # and anything after it. 119 $dest =~ s/\#.*//; 120 $filelist->{$dest} = '' if $dest; 121 } 122 return $cnt; 123} 124 125# REnames the image files spefified in the %translate hash. 126sub rename_images { 127 my $translate = shift; 128 my ($response); 129 130 foreach (keys(%$translate)) { 131 if (! $translate->{$_}) { 132 print " WARNING: No destination Filename for $_\n"; 133 } else { 134 $response = `mv -f $path$_ $path$translate->{$_} 2>&1`; 135 $response and print "ERROR from system $response\n"; 136 } 137 } 138} 139 140################################################# 141############# MAIN ############################# 142################################################ 143 144# %filelist starts out with keys from the @ARGV list. As files are processed, 145# any links to other files are added to the %filelist. A hash of processed 146# files is kept so we don't do any twice. 147 148# The first argument must be either --to_meaningful_names or --from_meaningful_names 149 150my (%translate,$search_regex,%filelist,%completed,$thisfile); 151my ($cnt,$direction); 152 153my $arg0 = shift(@ARGV); 154$arg0 =~ /^(--to_meaningful_names|--from_meaningful_names)$/ or 155 die "ERROR: First argument must be either \'--to_meaningful_names\' or \'--from_meaningful_names\'\n"; 156 157$direction = ($arg0 eq '--to_meaningful_names') ? 0 : 1; 158 159(@ARGV) or die "ERROR: Filename(s) to process must be given as arguments\n"; 160 161# Use the first argument to get the path to the file of translations. 162my $tmp = $ARGV[0]; 163($path) = $tmp =~ /(.*\/)/; 164$path = '' unless $path; 165 166read_transfile(\%translate,$direction); 167 168foreach (@ARGV) { 169 # Strip the path from the filename, and use it later on. 170 if (s/(.*\/)//) { 171 $path = $1; 172 } else { 173 $path = ''; 174 } 175 $filelist{$_} = ''; 176 177 while ($thisfile = (keys(%filelist))[0]) { 178 $cnt += translate_html($thisfile,\%translate,\%filelist) if (!exists($completed{$thisfile})); 179 delete($filelist{$thisfile}); 180 $completed{$thisfile} = ''; 181 } 182 print "translate_images.pl: $cnt image filenames translated ",($direction)?"from":"to"," meaningful names\n"; 183} 184 185rename_images(\%translate); 186