diff options
Diffstat (limited to 'kiostdetool/extractxml')
-rwxr-xr-x | kiostdetool/extractxml | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/kiostdetool/extractxml b/kiostdetool/extractxml new file mode 100755 index 0000000..629ab1d --- /dev/null +++ b/kiostdetool/extractxml @@ -0,0 +1,120 @@ +#! /usr/bin/perl +# +# This script extracts messages from kiosk_data.xml +# and writes on standard output (usually redirected to rc.cpp) +# the equivalent i18n() calls so that xgettext can parse them. +# +# It is based on extractrc but differs in the following ways: +# *) Extracts <caption> and <description> tags +# *) Performs equivalent of QString::simplifyWhiteSpace on all strings +# +# known flags: +# --tag=name : extract also the tag name +# --context=name : give all i18n calls a context name: i18n( "name",...) + +$filename = ""; +@filenames = (); + +sub writeoutstring +{ + print STDOUT "i18n(\""; + if (@_[0]) + { + # We have a I18N context + print STDOUT @_[0]; + print STDOUT "\",\""; + } + print STDOUT @_[1]; + print STDOUT "\"); // $filename \n"; +} + +$extratags = ""; +$context = ""; # I18N context + +ARGUMENTS: while (defined ($ARGV[0])) +{ + $_ = shift; + + if (/^--tag=(\w+)/) # --tag=name + { + $extratags .= "|" . $1; + next ARGUMENTS; + } + elsif (/^--context=(\w+)/) # --context=name + { + $context = $1; + next ARGUMENTS; + } + + $filename = $_; # maybe check for more options + +if (! $filename) { + print STDERR "no file to open\n"; + exit 1; +} + +$string = ""; +$intext = 0; +$linenr = 0; +$inskippedprop = 0; + +open(FILE, $filename); + +READING: while ( <FILE> ) { + $linenr++; + if ($linenr == 1 && ($_ !~ /^<!DOCTYPE/) && ($_ !~ /^<\?xml/)) { + last READING; + } + + $string .= "\\n" . $_; + chomp($string); + + $textstring = '(caption|description' . $extratags .')>'; + + # The 'database' property contains strings that shouldn't be translated + if ($inskippedprop == 0 && ($string =~ /<property name=\"database\"/ || $string=~ /<property name=\"associations\"/)) { + $inskippedprop = 1; + } elsif ($inskippedprop == 1 && ($string =~ /<\/property/)) { + $inskippedprop = 0; + $string = ""; + } + + if ($inskippedprop == 0 && $intext == 0) { + if ($string =~ /<$textstring/) { + $string =~ s/^.*<$textstring//; + $intext = 1; + $starting_linenr = $linenr; + } else { + $string = ""; + } + } + + if (($intext == 1) && ($string =~ /<\/$textstring/)) { + my $text = $string; + $text =~ s/<\/$textstring.*$//; + $text =~ s/</</g; + $text =~ s/>/>/g; + $text =~ s/&/&/g; + $text =~ s/\\n/ /g; + $text =~ s/\\([^n])/\\\\$1/g; + $text =~ s/\"/\\\"/g; + $text =~ s/ +/ /g; + $text =~ s/^ //g; + $text =~ s/ $//g; + writeoutstring($context, $text); + $string =~ s/^.*<\/$textstring//; + $intext = 0; + # Text can be multiline in .ui files (possibly), but we warn about it in XMLGUI .rc files. + if ($linenr != $starting_linenr && $filename =~ m/\.rc$/) { + print STDERR "there is <text> floating $filename\n"; + } + } + +} + +if ($intext == 1) { + print STDERR "parsing error in $filename $linenr\n"; + exit 1; +} + +} |