File indexing completed on 2023-05-30 10:41:17
0001 #!/usr/bin/perl 0002 # 0003 # wordlist_xml2json.pl 0004 # 0005 # SPDX-FileCopyrightText: 2014 Holger Kaelberer <holger.k@elberer.de> 0006 # 0007 # 0008 # SPDX-License-Identifier: GPL-3.0-or-later 0009 # 0010 # Transforms GCompris' wordlist xml syntax in a corresponding json 0011 # document. Reads from stdin, writes to stdout (UTF8 encoded). 0012 # 0013 # It produces the following json format: 0014 # 0015 # { "name":"default-gd", 0016 # "description":"GĂ idhlig", 0017 # "locale":"gd", 0018 # "levels":[ { "level":1, 0019 # "speed":150, <-- optional 0020 # "fallspeed":7000, <-- optional 0021 # "sublevels":10, <-- optional 0022 # "words":["a","jim", "beam", ... ]}, <-- mandatory 0023 # { "level":2, ... } 0024 # ] 0025 # } 0026 # 0027 # Example usage: 0028 # ./wordlist_xml2json.php <default-en.xml >default-en.json 0029 # 0030 0031 use XML::Simple; 0032 use Data::Dumper; 0033 use JSON; 0034 use utf8; 0035 use Encode; 0036 0037 binmode STDIN, ":utf8"; 0038 binmode STDOUT, ":utf8"; 0039 binmode STDERR, ":utf8"; 0040 0041 my $xml_str; 0042 while (<STDIN>) { 0043 $xml_str .= encode('utf8', $_); 0044 } 0045 my $xml = XMLin($xml_str); 0046 0047 my $obj = {}; 0048 0049 # Wordlist attributes: 0050 $obj->{name} = $xml->{Wordlist}->{name} if (exists($xml->{Wordlist}->{name})); 0051 $obj->{locale} = $xml->{Wordlist}->{locale}; 0052 $obj->{description} = $xml->{Wordlist}->{description}; 0053 $obj->{name} = $xml->{Wordlist}->{name}; 0054 0055 # levels 0056 $obj->{levels} = (); 0057 my $levels; 0058 if (ref($xml->{Wordlist}->{level}) eq "ARRAY") { 0059 $levels = $xml->{Wordlist}->{level}; 0060 } else { 0061 # assume scalar for single level files: 0062 $levels = [$xml->{Wordlist}->{level}]; 0063 } 0064 foreach $l (@{$levels}) { 0065 $l->{level} = $l->{value}; delete $l->{value}; 0066 my $wordarr = []; 0067 foreach $word (split('\n', $l->{content})) { 0068 $word =~ s/^\s+//; 0069 $word =~ s/\s+$//; 0070 push(@$wordarr, $word) if (length($word) > 0); 0071 } 0072 $l->{words} = $wordarr; 0073 delete $l->{content}; 0074 0075 push (@{$obj->{levels}}, $l); 0076 } 0077 0078 my $json = JSON->new->allow_nonref->pretty; 0079 0080 my $json_text = $json->encode( $obj ); 0081 0082 print $json_text; 0083 0084 #EOF