Generate simple.xml.in.in from xkb layouts
[platform/upstream/ibus.git] / engine / gensimple.py
1 # vim:set et sts=4 sw=4:
2 #!/usr/bin/env python
3
4 from xml.dom import minidom
5
6 def simplfy_dom(node):
7     name = node.nodeName
8     children = {}
9     if len(node.childNodes) == 1 and node.childNodes[0].nodeType == node.TEXT_NODE:
10         return name, node.childNodes[0].nodeValue
11     for child in node.childNodes:
12         if child.nodeType != node.ELEMENT_NODE:
13             continue
14         child_name, child_value = simplfy_dom(child)
15         if child_name not in children:
16             children[child_name] = []
17         children[child_name].append(child_value)
18     return name, children
19
20 def parse_xml():
21     filename = "/usr/share/X11/xkb/rules/evdev.xml"
22     dom = minidom.parse(file(filename))
23     name, root = simplfy_dom(dom)
24
25     layouts = root['xkbConfigRegistry'][0]['layoutList'][0]['layout']
26     for layout in layouts:
27         config = layout['configItem'][0]
28         name = config['name'][0]
29         short_desc = config.get('shortDescription', [''])[0]
30         desc = config.get('description', [''])[0]
31         languages = config.get('languageList', [{}])[0].get('iso639Id', [])
32         variants = layout.get('variantList', [{}])[0].get('variant', [])
33         yield name, None, short_desc, desc, languages
34         for variant in variants:
35             variant_config = variant['configItem'][0]
36             variant_name = variant_config['name'][0]
37             variant_short_desc = variant_config.get('shortDescription', [''])[0]
38             variant_desc = variant_config.get('description', [''])[0]
39             variant_languages = variant_config.get('languageList', [{}])[0].get('iso639Id', [])
40             if not isinstance(variant_languages, list):
41                 variant_languages = [variant_languages]
42             yield name, variant_name, variant_short_desc, variant_desc, languages + variant_languages
43
44 def gen_xml():
45     header = u"""<component>
46         <name>org.freedesktop.IBus.Simple</name>
47         <description>A table based simple engine</description>
48         <exec>/home/penghuang/ibus/libexec/ibus-engine-simple</exec>
49         <version>1.4.99.20120104</version>
50         <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
51         <license>GPL</license>
52         <homepage>http://code.google.com/p/ibus</homepage>
53         <textdomain>ibus</textdomain>
54         <engines>"""
55     engine = u"""\t\t<engine>
56                         <name>%s</name>
57                         <language>%s</language>
58                         <license>GPL</license>
59                         <author>Peng Huang &lt;shawn.p.huang@gmail.com&gt;</author>
60                         <layout>%s</layout>
61                         <longname>%s</longname>
62                         <description>%s</description>
63                         <rank>%d</rank>
64                 </engine>"""
65     footer = u"""\t</engines>
66 </component>"""
67     
68     print header
69     
70     for name, vname, sdesc, desc, languages in parse_xml():
71         if vname:
72             ibus_name = "xkb:layout:%s-%s" % (name, vname)
73             layout = "%s(%s)" % (name, vname)
74         else:
75             ibus_name = "xkb:layout:%s" % name
76             layout = name
77         for l in languages:
78             out = engine % (ibus_name + u"-" + l, l, layout, desc, desc, 99)
79             print out.encode("utf8")
80     
81     print footer
82
83 if __name__ == "__main__":
84     gen_xml()