225 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
| #!/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);
 | |
| }
 |