Home | History | Annotate | Download | only in genldml
      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