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