2
# Utility to transcode the Zeitgeist ontology from Python code
3
# to a C header file defining a collection of macros for the
4
# members of the ontology
9
import zeitgeist.datamodel as dm
13
Converts CamelCase to CAMEL_CASE
16
for i in range(len(name) - 1) :
17
if name[i].islower() and name[i+1].isupper():
18
result += name[i].upper() + "_"
20
result += name[i].upper()
21
result += name[-1].upper()
24
def symbolname (symbol):
26
ns, name = symbol[symbol.rfind("/")+1:].split("#")
27
return "ZEITGEIST_%s_%s" % (ns.upper(), caseconv(name))
29
return symbol.uri.rpartition("#")[2].upper()
31
def output_symbol_func (body):
34
_ensure_symbols_loaded (void)
42
if (symbols_loaded) return;
46
symbols_loaded = TRUE;
51
symbols_func = header[1:] % re.sub(r'(?m)^(.+)$', r' \1', body)
55
s = filter(lambda x: x not in [dm.Interpretation, dm.Manifestation], l)
56
s = map(symbolname, s)
61
def alloc_array (name, symbols):
62
num_elems = len(symbols)
63
alloc_call = '%s = g_new (char*, %d);' % (name, num_elems)
64
elems = ['%s[%d] = %s;' % (name,i,symbols[i]) for i in xrange(0, num_elems)]
65
elems.insert(0, alloc_call)
66
return '\n'.join(elems)
68
def register_symbol (symbol):
69
uri = 'uri = %s;' % symbolname(symbol)
70
arrays = ['parents', 'children', 'all_children']
71
parents = alloc_array(arrays[0], get_symbols(symbol.get_parents()))
72
children = alloc_array(arrays[1], get_symbols(symbol.get_children()))
73
all_ch = alloc_array(arrays[2], get_symbols(symbol.get_all_children()))
75
si_call = 'info = symbol_info_new (uri, parents, children, all_children);'
76
register_call = 'zeitgeist_register_symbol (info);'
78
calls = [uri, parents, children, all_ch, si_call, register_call]
79
calls.extend(['g_free (%s);' % var for var in arrays])
81
return '\n'.join(calls) + '\n'
83
if __name__ == "__main__":
86
for interp in dm.Interpretation.get_all_children():
88
stmt = register_symbol (interp)
89
interpretations.append(stmt)
91
print >> sys.stderr, "Failed to convert %s: %s" % (interp, e)
93
for manif in dm.Manifestation.get_all_children():
95
stmt = register_symbol (manif)
96
manifestations.append(stmt)
98
print >> sys.stderr, "Failed to convert %s: %s" % (manif, e)
102
all_symbols.extend(interpretations)
103
all_symbols.extend(manifestations)
105
f = open('zeitgeist-symbols.template', 'r')
107
print output_symbol_func('\n'.join(all_symbols))