3 from sys import argv, stdout, stderr
6 from libglibcodegen import NS_TP, camelcase_to_upper, get_docstring, \
7 get_descendant_text, get_by_path
9 class Generator(object):
10 def __init__(self, prefix, dom):
11 self.prefix = prefix + '_'
12 self.spec = get_by_path(dom, "spec")[0]
21 stdout.write('/* Generated from ')
22 stdout.write(get_descendant_text(get_by_path(self.spec, 'title')))
23 version = get_by_path(self.spec, "version")
25 stdout.write(', version ' + get_descendant_text(version))
27 for copyright in get_by_path(self.spec, 'copyright'):
28 stdout.write(get_descendant_text(copyright))
30 stdout.write(get_descendant_text(get_by_path(self.spec, 'license')))
32 stdout.write(get_descendant_text(get_by_path(self.spec, 'docstring')))
43 for elem in self.spec.getElementsByTagNameNS(NS_TP, '*'):
44 if elem.localName == 'flags':
46 elif elem.localName == 'enum':
49 def do_flags(self, flags):
50 name = flags.getAttribute('plural') or flags.getAttribute('name')
51 value_prefix = flags.getAttribute('singular') or \
52 flags.getAttribute('value-prefix') or \
53 flags.getAttribute('name')
58 """ % (self.prefix + name).replace('_', ''))
59 for flag in get_by_path(flags, 'flag'):
60 self.do_gtkdoc(flag, value_prefix)
62 docstrings = get_by_path(flags, 'docstring')
67 """ % get_descendant_text(docstrings).replace('\n', ' '))
69 * Bitfield/set of flags generated from the Telepathy specification.
73 for flag in get_by_path(flags, 'flag'):
74 self.do_val(flag, value_prefix)
78 """ % (self.prefix + name).replace('_', ''))
80 def do_enum(self, enum):
81 name = enum.getAttribute('singular') or enum.getAttribute('name')
82 value_prefix = enum.getAttribute('singular') or \
83 enum.getAttribute('value-prefix') or \
84 enum.getAttribute('name')
85 name_plural = enum.getAttribute('plural') or \
86 enum.getAttribute('name') + 's'
91 """ % (self.prefix + name).replace('_', ''))
92 vals = get_by_path(enum, 'enumvalue')
94 self.do_gtkdoc(val, value_prefix)
96 docstrings = get_by_path(enum, 'docstring')
101 """ % get_descendant_text(docstrings).replace('\n', ' '))
103 * Bitfield/set of flags generated from the Telepathy specification.
108 self.do_val(val, value_prefix)
113 * NUM_%(upper-plural)s:
115 * 1 higher than the highest valid value of #%(mixed-name)s.
117 #define NUM_%(upper-plural)s (%(last-val)s+1)
119 """ % {'mixed-name' : (self.prefix + name).replace('_', ''),
120 'upper-plural' : (self.prefix + name_plural).upper(),
121 'last-val' : vals[-1].getAttribute('value')})
123 def do_val(self, val, value_prefix):
124 name = val.getAttribute('name')
125 suffix = val.getAttribute('suffix')
126 use_name = (self.prefix + value_prefix + '_' + \
127 (suffix or name)).upper()
128 assert not (name and suffix) or name == suffix, \
129 'Flag/enumvalue name %s != suffix %s' % (name, suffix)
130 stdout.write(' %s = %s,\n' % (use_name, val.getAttribute('value')))
132 def do_gtkdoc(self, node, value_prefix):
134 stdout.write((self.prefix + value_prefix + '_' +
135 node.getAttribute('suffix')).upper())
136 stdout.write(': <![CDATA[')
137 docstring = get_by_path(node, 'docstring')
138 stdout.write(get_descendant_text(docstring).replace('\n', ' '))
139 stdout.write(']]>\n')
149 if __name__ == '__main__':
151 Generator(argv[0], xml.dom.minidom.parse(argv[1]))()