File indexing completed on 2024-03-24 15:14:43

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