| #!/usr/bin/perl |
| |
| #################################################################################### |
| # txt2ldml.pl: |
| # This tool invokes genldml and genrb to produce res files from xml files |
| # Author: Ram Viswanadha |
| # |
| #################################################################################### |
| use File::Find; |
| use File::Basename; |
| use IO::File; |
| use Cwd; |
| use File::Copy; |
| use Getopt::Long; |
| use File::Path; |
| use File::Copy; |
| |
| GetOptions( |
| "--lib=s" => \$envVar, |
| "--sourcedir=s" => \$sourceDir, |
| "--destdir=s" => \$destDir, |
| "--icuroot=s" => \$icuRoot, |
| "--genldml=s" => \$genldml, |
| "--genrb=s" => \$genrb, |
| "--ldml-only=s" => \$ldmlOnly, |
| "--ignore-collation" => \$ignoreCollation, |
| "--base=s" => \$baseFile, |
| "--ignore-specials" => \$ignoreSpecials, |
| "--ignore-layout" => \$ignoreLayout, |
| "--draft" => \$draft, |
| "--only-specials" => \$onlySpecials, |
| ); |
| |
| |
| usage() unless defined $sourceDir; |
| usage() unless defined $destDir; |
| usage() unless defined $icuRoot; |
| usage() unless defined $genldml; |
| |
| getPathToGenrb() unless defined $genrb; |
| |
| # create a temp directory and copy all the txt files there |
| my $tempDir = $destDir."/temp"; |
| mkpath($tempDir); |
| my $prefix; |
| my $tempPackage="LDMLTestPackage"; |
| # set up environment |
| if($$^O =~ /win/){ |
| $prefix =""; |
| cmd("set PATH=%PATH%;$icuRoot/bin;"); |
| }else{ |
| $prefix ="$ldVar=$ICU_ROOT/source/common:$ICU_ROOT/source/i18n:$ICU_ROOT/source/tools/toolutil:$ICU_ROOT/source/data/out:$ICU_ROOT/source/data: " |
| } |
| |
| # create list of xml files |
| my @list; |
| if (@ARGV) { |
| @list = @ARGV; |
| foreach (@list) { $_ .= ".txt" unless (/\.txt$/i); } |
| } else { |
| opendir(DIR,$sourceDir); |
| @list = grep{/\.txt$/} readdir(DIR); |
| closedir(DIR); |
| } |
| |
| # creating res files and LDML files |
| # cannot be combined in one step |
| # since there may be dependencies while building |
| # the res files which may not be resolved until |
| # all files are built |
| |
| # Step 1: create *.res files |
| foreach $item (@list){ |
| next if($item eq "." || $item eq ".."); |
| resify($item) unless defined $ldmlOnly; |
| } |
| |
| # Step 2: create *.xml files |
| foreach $item (@list){ |
| next if($item eq "." || $item eq ".." ); |
| $txt = $item;; |
| $txt =~ s/\.txt$//i; |
| ldmlify($txt); |
| } |
| |
| # run the xmlify converter |
| sub ldmlify{ |
| my $infile = shift; |
| my $genldmlExec = $genldml."/genldml"; |
| my $ic =""; |
| my $is =""; |
| my $il =""; |
| my $base = ""; |
| my $baseTyp = ""; |
| my $id = ""; |
| my $os = ""; |
| if (defined $ignoreCollation){ |
| $ic = "--ignore-collation"; |
| } |
| if (defined $ignoreSpecials){ |
| $is = "--ignore-specials"; |
| } |
| if(defined $ignoreLayout){ |
| $il = "--ignore-layout"; |
| } |
| if(defined $draft){ |
| $id = "--draft"; |
| } |
| if(defined $onlySpecials){ |
| $os = "--only-specials"; |
| } |
| if(defined $baseFile){ |
| $baseLoc = getBaseLocale($baseFile, $infile); |
| $base = "--base $baseLoc"; |
| |
| # Commented out because currently we don't need to |
| # pass in the type argument to genldml |
| # can be uncommented if needed |
| #$baseLoc = getBaseType ($baseFile, $infile); |
| #if(baseLoc ne ""){ |
| # $baseTyp ="--base-type $baseLoc"; |
| #} |
| |
| } |
| |
| cmd("$prefix $genldmlExec --sourcedir $tempDir --destdir $destDir --package $tempPackage $base $baseTyp $ic $il $is $id $os $infile"); |
| } |
| |
| sub getBaseLocale(){ |
| my $basefile = shift; |
| my $locale = shift; |
| $baseFH = IO::File->new($basefile,"r") |
| or die "could not open the file $basefile for reading: $! \n"; |
| while(defined ( $line = <$baseFH>)){ |
| if( $line =~ /^\<$locale\>/){ |
| ($loc,$bse) = split (/\>/, $line); |
| $bse =~ s/^\s+\<//; |
| return $bse; |
| } |
| } |
| } |
| |
| #------------------------ |
| # This method is commented out for now |
| # can be uncommented if we need to pass baseType argument to |
| # genldml. Currently we don't need this feature |
| # P.S: Not tested. |
| #-------------------------- |
| #sub getBaseType(){ |
| # my $basefile = shift; |
| # my $locale = shift; |
| # $baseFH = IO::File->new($basefile,"r") |
| # or die "could not open the file $basefile for reading: $! \n"; |
| # while(defined ( $line = <$baseFH>)){ |
| # if( $line =~ /\<$locale\>/){ |
| # ($loc,$bse) = split (/\>/, $line); |
| # $bse =~ s/^\s+\<//; |
| # return $bse; |
| # } |
| # } |
| #} |
| |
| # run genrb |
| sub resify{ |
| my $infile = shift; |
| my $genrbExec = $genrb."/genrb"; |
| |
| cmd("$prefix $genrbExec --sourcedir $sourceDir --package-name $tempPackage --destdir $tempDir --encoding UTF8 $infile"); |
| } |
| |
| # |
| sub getPathToGenrb{ |
| $genrb = $icuRoot."/bin"; |
| } |
| |
| #----------------------------------------------------------------------- |
| # Execute a command |
| # Param: Command |
| # Param: Display line, or '' to display command |
| sub cmd { |
| my $cmd = shift; |
| my $prompt = shift; |
| $prompt = "Command: $cmd.." unless ($prompt); |
| print $prompt."\n"; |
| system($cmd); |
| my $exit_value = $? >> 8; |
| #my $signal_num = $? & 127; |
| #my $dumped_core = $? & 128; |
| if ($exit_value == 0) { |
| print "ok\n"; |
| } else { |
| ++$errCount; |
| print "ERROR ($exit_value)\n"; |
| exit(1); |
| } |
| } |
| |
| #----------------------------------------------------------------------- |
| sub usage { |
| print << "END"; |
| Usage: |
| txt2ldml.pl |
| Options: |
| --lib=<environment variable for lib path> |
| --sourcedir=<directory> |
| --destdir=<directory> |
| --icuroot=<path to ICU's root directory> |
| --genldml=<path to genldml executatble> |
| --genrb=<path to genrb executatble> |
| --ignore-collation |
| --base=<the text file that contains the base to locale mapping including the path> |
| --ignore-layout |
| --ignore-specials |
| --only-specials |
| --draft |
| |
| txt2ldml creates *.xml file from *.txt files by invoking the respective tools |
| Optionally, one or more locales may be specified on the command line. |
| If this is done, only those locales will be processed. If no locales |
| are listed, all locales are processed. |
| |
| END |
| exit(0); |
| } |