forked from amazingfate/help
2005/02/07 19:17:41 hjs 1.4.6.5: #i39062# remove obsolete line 2005/02/07 18:55:09 hjs 1.4.6.4: #i39062# improe language selection 2005/02/07 14:07:00 hjs 1.4.6.3: #i39062# correct path for tree templates 2005/02/04 18:06:17 hjs 1.4.6.2: #i39062# script cleanup 2005/02/04 16:38:10 hjs 1.4.6.1: #i39062# prepare update_tree.pl for in-build use
299 lines
9.5 KiB
Perl
299 lines
9.5 KiB
Perl
#!/usr/bin/perl
|
|
|
|
use File::Find;
|
|
use File::Basename;
|
|
use Benchmark;
|
|
|
|
$t0 = new Benchmark;
|
|
# update the tree files in <platform>/misc/*
|
|
|
|
$| = 1;
|
|
|
|
my $prj = $ENV{ENVPRJ};
|
|
|
|
my $inpath = $ENV{INPATH};
|
|
my $with_lang = $ENV{WITH_LANG};
|
|
terminate() if ( ! defined $inpath );
|
|
|
|
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/\/..\/$inpath\/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\/$inpath\/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 (<TREE>) {
|
|
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;
|
|
|
|
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 = <F>; close F;
|
|
$cnt =~ s/^.*<title[^>]+id="tit"[^>]*>([^<]*)<\/title>.*$/$1/gis;
|
|
$cnt =~ s/'/\'/gis; $cnt =~ s/&/+/gis;
|
|
$cnt =~ s/"/\'/gis; $cnt =~ s/&/+/gis;
|
|
$l = "<topic id=\"$module/$id\">$cnt</topic>\n";
|
|
} else {
|
|
print "!";
|
|
$l = "<!-- removed $module/$id -->\n";
|
|
}
|
|
} else { # localized comes from the localize sdf
|
|
#print "\nid: $id";
|
|
if (defined($loc_title{$lng}->{$id})) {
|
|
print ".";
|
|
$l = "<topic id=\"$module/$id\">$loc_title{$lng}->{$id}</topic>\n";
|
|
} else {
|
|
print "!";
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($l =~/<node/) {
|
|
($id = $l) =~ s/^.*id="(\d+)".*$/$1/gis;
|
|
if ($lng eq 'en-US') {
|
|
if (defined($node{$id})) {
|
|
$l =~ s/title="(.*)"/title="$node{$id}"/;
|
|
} else {
|
|
$l =~ s/title="(.*)"/title="NOTFOUND:$id"/;
|
|
}
|
|
} else {
|
|
if (defined($node{$lng}->{$id})) {
|
|
$l =~ s/title="(.*)"/title="$node{$lng}->{$id}"/;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($l =~/<help_section/) {
|
|
($id = $l) =~ s/^.*id="(\d+)".*$/$1/gis;
|
|
if ($lng eq 'en-US') {
|
|
if (defined($helpsection{$id})) {
|
|
$l =~ s/title="(.*)"/title="$helpsection{$id}"/;
|
|
} else {
|
|
print "#";
|
|
$l =~ s/title="(.*)"/title="NOTFOUND:$id"/;
|
|
}
|
|
} else {
|
|
if (defined($helpsection{$lng}->{$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\"";
|
|
}
|
|
$tvout = "$tree_dest/$lng/$tv";
|
|
if (open TV, ">$tvout") {
|
|
for $line(@lines) {
|
|
$line =~ s/\$\[officename\]/%PRODUCTNAME/g;
|
|
$line =~ s/\$\[officeversion\]/%PRODUCTVERSION/g;
|
|
print TV $line;
|
|
}
|
|
close TV;
|
|
} else {
|
|
&terminate("Cannot write to $tvout");
|
|
}
|
|
}
|
|
}
|
|
|
|
#------------------------------------
|
|
sub readtv {
|
|
my $f = shift;
|
|
if (open TV, $f) {
|
|
$/ = "\n";
|
|
my @l = <TV>;
|
|
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 (<LOCALIZE_SDF>) {
|
|
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;
|
|
# 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 =~ /^<help_section/) {
|
|
#example: <help_section application="scalc" id="08" title="表計算ドキュメント">
|
|
my ($fld1,$app,$fld3,$id,$fld5,$sec_title) = split('"', $text, 7);
|
|
$helpsection{$lang}->{$id} = $sec_title;
|
|
} elsif ($text =~/<node id=/) {
|
|
# example: <node id="0205" title="Tabelas em documentos de texto">
|
|
# 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(/(?<!\\)"/, $text, 5);
|
|
$node{$lang}->{$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);
|
|
}
|
|
|