xref: /aosp_15_r20/external/cldr/tools/c/genldml/txt2ldml.pl (revision 912701f9769bb47905792267661f0baf2b85bed5)
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