Files
help/helpcontent2/helpers/update_tree.pl
Jens-Heiner Rechtien c82fbe9578 INTEGRATION: CWS ause018 (1.4.6); FILE MERGED
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
2005-02-11 13:53:45 +00:00

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=&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;
# 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);
}