1 #!/usr/bin/perl 2 3 #################################################################################### 4 # txt2ldml.pl: 5 # This tool invokes genldml and genrb to produce res files from xml files 6 # Author: Ram Viswanadha 7 # 8 #################################################################################### 9 use File::Find; 10 use File::Basename; 11 use IO::File; 12 use Cwd; 13 use File::Copy; 14 use Getopt::Long; 15 use File::Path; 16 use File::Copy; 17 18 GetOptions( 19 "--lib=s" => \$envVar, 20 "--sourcedir=s" => \$sourceDir, 21 "--destdir=s" => \$destDir, 22 "--icuroot=s" => \$icuRoot, 23 "--genldml=s" => \$genldml, 24 "--genrb=s" => \$genrb, 25 "--ldml-only=s" => \$ldmlOnly, 26 "--ignore-collation" => \$ignoreCollation, 27 "--base=s" => \$baseFile, 28 "--ignore-specials" => \$ignoreSpecials, 29 "--ignore-layout" => \$ignoreLayout, 30 "--draft" => \$draft, 31 "--only-specials" => \$onlySpecials, 32 ); 33 34 35 usage() unless defined $sourceDir; 36 usage() unless defined $destDir; 37 usage() unless defined $icuRoot; 38 usage() unless defined $genldml; 39 40 getPathToGenrb() unless defined $genrb; 41 42 # create a temp directory and copy all the txt files there 43 my $tempDir = $destDir."/temp"; 44 mkpath($tempDir); 45 my $prefix; 46 my $tempPackage="LDMLTestPackage"; 47 # set up environment 48 if($$^O =~ /win/){ 49 $prefix =""; 50 cmd("set PATH=%PATH%;$icuRoot/bin;"); 51 }else{ 52 $prefix ="$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: " 53 } 54 55 # create list of xml files 56 my @list; 57 if (@ARGV) { 58 @list = @ARGV; 59 foreach (@list) { $_ .= ".txt" unless (/\.txt$/i); } 60 } else { 61 opendir(DIR,$sourceDir); 62 @list = grep{/\.txt$/} readdir(DIR); 63 closedir(DIR); 64 } 65 66 # creating res files and LDML files 67 # cannot be combined in one step 68 # since there may be dependencies while building 69 # the res files which may not be resolved until 70 # all files are built 71 72 # Step 1: create *.res files 73 foreach $item (@list){ 74 next if($item eq "." || $item eq ".."); 75 resify($item) unless defined $ldmlOnly; 76 } 77 78 # Step 2: create *.xml files 79 foreach $item (@list){ 80 next if($item eq "." || $item eq ".." ); 81 $txt = $item;; 82 $txt =~ s/\.txt$//i; 83 ldmlify($txt); 84 } 85 86 # run the xmlify converter 87 sub ldmlify{ 88 my $infile = shift; 89 my $genldmlExec = $genldml."/genldml"; 90 my $ic =""; 91 my $is =""; 92 my $il =""; 93 my $base = ""; 94 my $baseTyp = ""; 95 my $id = ""; 96 my $os = ""; 97 if (defined $ignoreCollation){ 98 $ic = "--ignore-collation"; 99 } 100 if (defined $ignoreSpecials){ 101 $is = "--ignore-specials"; 102 } 103 if(defined $ignoreLayout){ 104 $il = "--ignore-layout"; 105 } 106 if(defined $draft){ 107 $id = "--draft"; 108 } 109 if(defined $onlySpecials){ 110 $os = "--only-specials"; 111 } 112 if(defined $baseFile){ 113 $baseLoc = getBaseLocale($baseFile, $infile); 114 $base = "--base $baseLoc"; 115 116 # Commented out because currently we don't need to 117 # pass in the type argument to genldml 118 # can be uncommented if needed 119 #$baseLoc = getBaseType ($baseFile, $infile); 120 #if(baseLoc ne ""){ 121 # $baseTyp ="--base-type $baseLoc"; 122 #} 123 124 } 125 126 cmd("$prefix $genldmlExec --sourcedir $tempDir --destdir $destDir --package $tempPackage $base $baseTyp $ic $il $is $id $os $infile"); 127 } 128 129 sub getBaseLocale(){ 130 my $basefile = shift; 131 my $locale = shift; 132 $baseFH = IO::File->new($basefile,"r") 133 or die "could not open the file $basefile for reading: $! \n"; 134 while(defined ( $line = <$baseFH>)){ 135 if( $line =~ /^\<$locale\>/){ 136 ($loc,$bse) = split (/\>/, $line); 137 $bse =~ s/^\s+\<//; 138 return $bse; 139 } 140 } 141 } 142 143 #------------------------ 144 # This method is commented out for now 145 # can be uncommented if we need to pass baseType argument to 146 # genldml. Currently we don't need this feature 147 # P.S: Not tested. 148 #-------------------------- 149 #sub getBaseType(){ 150 # my $basefile = shift; 151 # my $locale = shift; 152 # $baseFH = IO::File->new($basefile,"r") 153 # or die "could not open the file $basefile for reading: $! \n"; 154 # while(defined ( $line = <$baseFH>)){ 155 # if( $line =~ /\<$locale\>/){ 156 # ($loc,$bse) = split (/\>/, $line); 157 # $bse =~ s/^\s+\<//; 158 # return $bse; 159 # } 160 # } 161 #} 162 163 # run genrb 164 sub resify{ 165 my $infile = shift; 166 my $genrbExec = $genrb."/genrb"; 167 168 cmd("$prefix $genrbExec --sourcedir $sourceDir --package-name $tempPackage --destdir $tempDir --encoding UTF8 $infile"); 169 } 170 171 # 172 sub getPathToGenrb{ 173 $genrb = $icuRoot."/bin"; 174 } 175 176 #----------------------------------------------------------------------- 177 # Execute a command 178 # Param: Command 179 # Param: Display line, or '' to display command 180 sub cmd { 181 my $cmd = shift; 182 my $prompt = shift; 183 $prompt = "Command: $cmd.." unless ($prompt); 184 print $prompt."\n"; 185 system($cmd); 186 my $exit_value = $? >> 8; 187 #my $signal_num = $? & 127; 188 #my $dumped_core = $? & 128; 189 if ($exit_value == 0) { 190 print "ok\n"; 191 } else { 192 ++$errCount; 193 print "ERROR ($exit_value)\n"; 194 exit(1); 195 } 196 } 197 198 #----------------------------------------------------------------------- 199 sub usage { 200 print << "END"; 201 Usage: 202 txt2ldml.pl 203 Options: 204 --lib=<environment variable for lib path> 205 --sourcedir=<directory> 206 --destdir=<directory> 207 --icuroot=<path to ICU's root directory> 208 --genldml=<path to genldml executatble> 209 --genrb=<path to genrb executatble> 210 --ignore-collation 211 --base=<the text file that contains the base to locale mapping including the path> 212 --ignore-layout 213 --ignore-specials 214 --only-specials 215 --draft 216 217 txt2ldml creates *.xml file from *.txt files by invoking the respective tools 218 Optionally, one or more locales may be specified on the command line. 219 If this is done, only those locales will be processed. If no locales 220 are listed, all locales are processed. 221 222 END 223 exit(0); 224 } 225