Files
help/helpcontent2/helpers/update_tree.pl
Jens-Heiner Rechtien 7436648717 INTEGRATION: CWS hc680stoppers (1.5.18); FILE MERGED
2005/04/07 10:18:13 fpe 1.5.18.1: #i46823#
2005-04-08 15:18:16 +00:00

305 lines
9.8 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=&quot;(\d+)&quot;.*$/$1/;
($title = $_) =~ s/^.*title=&quot;(.*)&quot;.*$/$1/;
$helpsection{$id} = $title;
}
if (/node id=/) {
s/^\s*<.*node //;
s/<\/.*$//;
($id = $_) =~ s/^.*id=&quot;(\d+)&quot;.*$/$1/;
($title = $_) =~ s/^.*title=&quot;(.*)&quot;.*$/$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/&apos;/\'/gis; $cnt =~ s/&amp;/+/gis;
$cnt =~ s/&quot;/\'/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;
#fpe: i46823 - need to encode &s, added encoding
$text =~ s/&(?!amp;)/&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 =~ /^<help_section/) {
#example: <help_section application="scalc" id="08" title="表計算ドキュメント">
my ($fld1,$app,$fld3,$id,$fld5,$sec_title) = split('"', $text, 7);
#fpe: i46823 - need to encode &s, added encoding
$sec_title =~ s/&(?!amp;)/&amp;/g;
$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);
#fpe: i46823 - need to encode &s, added encoding
$node_title =~ s/&(?!amp;)/&amp;/g;
$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);
}