forked from 0ad/0ad
84 lines
1.9 KiB
Perl
Executable File
84 lines
1.9 KiB
Perl
Executable File
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; |