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####################################################################################
9use File::Find;
10use File::Basename;
11use IO::File;
12use Cwd;
13use File::Copy;
14use Getopt::Long;
15use File::Path;
16use File::Copy;
17
18GetOptions(
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
35usage() unless defined $sourceDir;
36usage() unless defined $destDir;
37usage() unless defined $icuRoot;
38usage() unless defined $genldml;
39
40getPathToGenrb() unless defined $genrb;
41
42# create a temp directory and copy all the txt files there
43my $tempDir = $destDir."/temp";
44mkpath($tempDir);
45my $prefix;
46my $tempPackage="LDMLTestPackage";
47# set up environment
48if($$^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
56my @list;
57if (@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
73foreach $item (@list){
74    next if($item eq "." || $item eq "..");
75    resify($item) unless defined $ldmlOnly;
76}
77
78# Step 2:  create *.xml files
79foreach $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
87sub 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
129sub 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
164sub 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#
172sub getPathToGenrb{
173    $genrb = $icuRoot."/bin";
174}
175
176#-----------------------------------------------------------------------
177# Execute a command
178# Param: Command
179# Param: Display line, or '' to display command
180sub 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#-----------------------------------------------------------------------
199sub usage {
200    print << "END";
201Usage:
202txt2ldml.pl
203Options:
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
217txt2ldml creates *.xml file from *.txt files by invoking the respective tools
218Optionally, one or more locales may be specified on the command line.
219If this is done, only those locales will be processed.  If no locales
220are listed, all locales are processed.
221
222END
223  exit(0);
224}
225