1
0
forked from 0ad/0ad
0ad/source/tools/i18n/StringExtract/XML.pm

84 lines
1.9 KiB
Perl
Raw Normal View History

use strict;
use warnings;
package StringExtract::XML;
use StringExtract::Utils;
use StringExtract::JSCode;
our $data = {
file_roots => [
'binaries/data/mods/official/art',
'binaries/data/mods/official/entities',
'binaries/data/mods/official/gui',
],
file_types => qr/\.xml$/i,
readfile_func => sub { extract(StringExtract::Utils::read_xml(@_)); },
};
sub extract {
my ($xmldata) = @_;
return unless $xmldata;
my ($root, $filename, %elements) = (@{$xmldata}[0, 1], %{$xmldata->[2]});
my @strings;
# Entities
if ($root eq 'entity') {
push @strings, map [ "noun:".$_->{content}, "Entity name ($filename)" ], @{$elements{name}};
# Actors
} elsif ($root eq 'object') {
push @strings, map [ "noun:".$_->{content}, "Actor name ($filename)" ], @{$elements{name}};
# Materials
} elsif ($root eq 'material') {
# GUI objects
} elsif ($root eq 'objects') {
recursive_extract_guiobject($filename, \@strings, [\%elements]);
# GUI setup
} elsif ($root eq 'setup') {
# Do nothing
# GUI sprites
} elsif ($root eq 'sprites') {
# Do nothing
# GUI styles
} elsif ($root eq 'styles') {
# Do nothing
} else {
warn "Unrecognised XML file type '$root' - ignoring";
}
return @strings;
}
sub recursive_extract_guiobject {
my ($filename, $strings, $elements) = @_;
for my $element (@$elements) {
push @$strings, [ "phrase:".$element->{tooltip}, "GUI tooltip ($filename)" ] if defined $element->{tooltip};
push @$strings, [ "phrase:".$element->{content}, "GUI text ($filename)" ] if defined $element->{content};
if ($element->{script}) {
push @$strings, StringExtract::JSCode::extract($_->{content}) for @{$element->{script}};
}
if ($element->{action}) {
push @$strings, StringExtract::JSCode::extract($_->{content}) for @{$element->{action}};
}
recursive_extract_guiobject($filename, $strings, $element->{object}) if $element->{object};
}
}
1;