#!/usr/bin/perl use File::Find; use File::Basename; use Benchmark; $t0 = new Benchmark; # update the tree files in /misc/* $| = 1; my $prj = $ENV{ENVPRJ}; my $inpath = $ENV{INPATH}; terminate() if ( ! defined $inpath ); my $destpath = $inpath; my $with_lang = $ENV{WITH_LANG}; if ( defined $ENV{COMMON_OUTDIR} && $ENV{COMMON_OUTDIR} ne "" ) { $destpath =~ s/$ENV{OUTPATH}/$ENV{COMMON_OUTDIR}/; } if ( ! defined $prj ) { # do someting that works for manual call ($scriptname = `pwd`) =~ s/\n/\/$0/; ($tree_src = $scriptname) =~ s/\/update_tree.pl/\/..\/source\/auxiliary/; ($tree_dest = $scriptname) =~ s/\/update_tree.pl/\/..\/$destpath\/misc/; ($source_dir = $scriptname) =~ s/\/update_tree.pl/\/..\/source/; $treestrings = "$source_dir/text/shared/tree_strings.xhp"; } else { $tree_src = "$prj\/source\/auxiliary"; $tree_dest = "$prj\/$destpath\/misc"; $source_dir = "$prj\/source"; $treestrings = "$source_dir/text/shared/tree_strings.xhp"; print "$tree_src\n"; print "$tree_dest\n"; print "$source_dir\n"; print "$treestrings\n"; } # Get the English tree files as master #------------------------------- # Update English from xhp #------------------------------- &do_english; #------------------------------- # Update localizations from sdf #------------------------------- @langs = split /\s+/, $with_lang; &read_loc; print "################\nUpdating the treefiles for @langs \n"; for $l(@langs) { if ($l ne "en-US") { &do_lang($l); } } #------------------------------- # $t1 = new Benchmark; $td = timediff($t1, $t0); print timestr($td),"\n"; #################### # SUBS #################### sub terminate { $err = shift; print "$err\n\n"; $msg = <<"MSG"; update_tree.pl all languages in WITH_LANG are processed. WITH_LANG=ALL is not supported in manual calls. Updates the *.tree files. At first, the English file is updated based on the English help topic titles as read from the help files. Then, the localized tree files are written based on the English tree file and the localized help topic titles. Requires a valid SO/OOo environment. MSG die "$msg\n"; } #--------------------------------------------------- sub do_english { print "Processing en-US\n"; undef %helpsection; undef %node; &readtreestrings; &gettreefiles; &processtreefiles('en-US'); } #--------------------------------------------------- sub do_lang { $lng = shift; print "\n---------------------------------------------------\nProcessing $lng\n"; &processtreefiles($lng); print "\n"; } #--------------------------------------------------- sub readtreestrings { print "Reading tree strings for en-US..."; if (open TREE, $treestrings) { while () { chomp; s/<\/*help:productname>//gis; if (/help_section/) { s/^\s*<.*help_section//; s/<\/.*$//; ($id = $_) =~ s/^.*id="(\d+)".*$/$1/; ($title = $_) =~ s/^.*title="(.*)".*$/$1/; $helpsection{$id} = $title; } if (/node id=/) { s/^\s*<.*node //; s/<\/.*$//; ($id = $_) =~ s/^.*id="(\d+)".*$/$1/; ($title = $_) =~ s/^.*title="(.*)".*$/$1/; $node{$id} = $title; } } close TREE; } else { &terminate("Error opening $treestrings"); } print "done\n"; } #------------------------------------ sub gettreefiles { # Read the tree files from the directory # this list is also used for all foreign languages print "Reading tree files..."; if (opendir ENUS, "$tree_src") { @treeviews = grep /\.tree/, readdir ENUS; closedir ENUS; } else { &terminate("Cannot open directory $tree_src"); } print "done\n"; } #------------------------------------ sub processtreefiles { $lng = shift; use File::Temp qw/ tempfile /; for $tv(@treeviews) { print "\nProcessing $tv\n"; @lines = &readtv("$tree_src/$tv"); print "Read ".scalar @lines." lines\n"; for $l(@lines) { if ($l =~ /topic/) { ($id = $l) =~ s/^.*id="([^"]*)".*$/$1/gis; ($module = $id) =~ s/^([^\/]*).*$/$1/; $id =~ s/^.*?\///; $file = "$source_dir/$id"; if ($lng eq 'en-US') { # english comes from the file if (open F,$file) { print "."; undef $/; $cnt = ; close F; $cnt =~ s/^.*]+id="tit"[^>]*>([^<]*)<\/title>.*$/$1/gis; $cnt =~ s/'/\'/gis; $cnt =~ s/&/+/gis; $cnt =~ s/"/\'/gis; $cnt =~ s/&/+/gis; $l = "$cnt\n"; } else { print "!"; $l = "\n"; } } else { # localized comes from the localize sdf #print "\nid: $id"; if (defined($loc_title{$lng}->{$id})) { print "."; $l = "$loc_title{$lng}->{$id}\n"; } else { print "!"; } } } if ($l =~/{$id})) { $l =~ s/title="(.*)"/title="$node{$lng}->{$id}"/; } } } if ($l =~/{$id})) { $l =~ s/title="(.*)"/title="$helpsection{$lng}->{$id}"/; } } } } if ( ! -d "$tree_dest/$lng" ) { mkdir "$tree_dest/$lng" or die "\nCouldn't create directory \"$tree_dest/$lng\""; } my $treeoutdir = "$tree_dest/$lng"; my $tmpname_template=$tv."_XXXXX"; my ( $treetmpfilehandle, $treetmpfile ) = tempfile($tmpname_template, DIR => $treeoutdir); if (open TV, ">$treetmpfile") { for $line(@lines) { $line =~ s/\$\[officename\]/%PRODUCTNAME/g; $line =~ s/\$\[officeversion\]/%PRODUCTVERSION/g; print TV $line; } close TV; chmod 0664, $treetmpfile or &terminate("Cannot change rights on $treetmpfile"); rename($treetmpfile, "$tree_dest/$lng/$tv") or &terminate("Cannot write to $tvout"); } else { &terminate("Cannot write to $tvout"); } } } #------------------------------------ sub readtv { my $f = shift; if (open TV, $f) { $/ = "\n"; my @l = ; close TV; return @l; } else { &terminate("Error opening $f"); } } #------------------------------------ # read entries form localize.sdf files #------------------------------------ sub read_loc { print "\n\nReading localized titles..."; $/ = "\n"; @files = `find $source_dir/text -name localize.sdf`; for my $fname (@files) { $FS = '\t'; print "."; open(LOCALIZE_SDF, $fname) || die 'Cannot open "localize.sdf".'."$fname"; while () { my ($Fld1,$file,$Fld3,$Fld4,$id,$Fld6,$Fld7,$Fld8,$Fld9,$lang,$text) = split($FS, $_, 12); if ($id eq 'tit') { #strip filename $file =~ s/.*text\\/text\\/g; #convert \ to / in filename $file =~ s/\\/\//g; #fpe: i46823 - need to encode &s, added encoding $text =~ s/&(?!amp;)/&/g; # add entry to the hash $loc_title{$lang}->{$file} = $text; } if ($file =~ /tree_strings.xhp/) { #strip filename $file =~ s/.*text/text/g; #convert \ to / in filename $file =~ s/\\/\//g; if ($text =~ /^ my ($fld1,$app,$fld3,$id,$fld5,$sec_title) = split('"', $text, 7); #fpe: i46823 - need to encode &s, added encoding $sec_title =~ s/&(?!amp;)/&/g; $helpsection{$lang}->{$id} = $sec_title; } elsif ($text =~/ # BEWARE: title may contain escaped '"' so only match " not preceded by \ # using a zero‐width negative look‐behind assertion. my ($fld1,$id,$fld3,$node_title,$Fld5) = split(/(?{$id} = $node_title; } } } close LOCALIZE_SDF; } # statistics $total_elements=0; foreach $lang (keys %loc_title) { $no_elements = scalar(keys(%{$loc_title{$lang}})); push(@langstat, "$lang:\t ".$no_elements." matches\n"); $total_elements += $no_elements; } print "\ndone reading a total of ".$total_elements." localized titles for ".scalar(keys(%loc_title))." languages from ".scalar @files ." files\n"; print sort(@langstat); }