1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 __doc__ = \
22 """
23 WURFL <wurfl.sourceforge.net> conversion utility
24
25 usage: wurfl2python.py [options] WURFL_XML_FILE
26 """
27
28 import sys
29 from time import ctime
30
31 from pywurfl.wurflprocessor import DeviceHandler, WurflProcessor, op, main
32
33
34 __version__ = "4.4.0a"
35 __license__ = "LGPL"
36 __copyright__ = "Copyright 2004-2009, Armand Lynch"
37 __author__ = "Armand Lynch <lyncha@users.sourceforge.net>"
38 __contributors__ = "Pau Aliagas <pau@newtral.org>"
39 __url__ = "http://celljam.net/"
40 __all__ = ['DeviceSerializer']
41
42
44
45 idstr = "devices.devids[r'''%s'''] = "
46 new_caps = idstr + "devclass(%s, r'''%s''', r'''%s''', %s, {%s})\n"
47 no_caps = idstr + "devclass(%s, r'''%s''', r'''%s''', %s, None)\n"
48 capability_types = {}
49
51 s = []
52 c = []
53
54 if self.parent == "root":
55 parent = "None"
56 else:
57 parent = "devices.devids[r'''%s''']" % self.parent
58
59 for cap in sorted(self.capabilities):
60 value = self.capabilities[cap]
61 cap_type = self.capability_types.get(cap, None)
62 if cap_type == int:
63 c.append("r'''%s''':%d" % (cap, int(value.strip())))
64 elif cap_type == float:
65 c.append("r'''%s''':%f" % (cap, float(value.strip())))
66 elif cap_type == bool:
67 if value.lower() == "true":
68 c.append("r'''%s''':True" % cap)
69 elif value.lower() == "false":
70 c.append("r'''%s''':False" % cap)
71 else:
72 c.append("r'''%s''':r'''%s'''" % (cap, value))
73
74 if c:
75 s.append(self.new_caps % (self.devid, parent, self.devid,
76 self.devua, self.actual_device_root,
77 ','.join(c)))
78 else:
79 s.append(self.no_caps % (self.devid, parent, self.devid, self.devua,
80 self.actual_device_root))
81
82 return ''.join(s)
83
84
86
87 - def __init__(self, wurflxml, device_handler=None,
88 options={"outfile":"wurfl.py"}):
92
94 self.outfile.write(str(devobj))
95
97 if self.logfile != sys.stderr:
98 self.logfile = file(self.logfile, "wb")
99 if self.outfile is not None:
100 self.outfile = file(self.outfile, "wb")
101 else:
102 self.outfile = file("wurfl.py", "wb")
103
105 attrs = capability.attrib
106 devobj.capabilities[attrs["name"]] = attrs["value"]
107 if devobj.devid == 'generic':
108 try:
109 self.groups[group.get('id')].append(attrs["name"])
110 except KeyError:
111 self.groups[group.get('id')] = []
112 self.groups[group.get('id')].append(attrs["name"])
113
115 self.device_handler.capability_types = get_normalized_types(self.tree)
116
117 version = self.tree.findtext("*/ver").strip()
118 self.outfile.write('"""\n%s\n\n' % self.outfile.name)
119 self.outfile.write("Generated on: %s\n" % ctime())
120 self.outfile.write("Generated by: wurfl2python.py v%s\n" % __version__)
121 self.outfile.write('"""\n\n')
122 self.outfile.write("__all__ = ['devices', 'wurfl_version']\n")
123 self.outfile.write("wurfl_version = '''%s'''\n\n" % version)
124 self.outfile.write("from pywurfl import *\n\n")
125 self.outfile.write("devices = Devices()\n")
126
128 for group, names in self.groups.iteritems():
129 self.outfile.write("devices.devids['''generic'''].groups")
130 self.outfile.write("[r'''%s'''] = [r'''%s''']\n" % (group,
131 "''','''".join(names)))
132 self.outfile.write("\n")
133 self.outfile.write("for device in devices.devids.itervalues():\n")
134 self.outfile.write(" devices.devuas[device.devua] = device\n")
135 self.outfile.write("del device\n")
136 self.outfile.write("\n")
137
138
140 caps = {}
141 for capability in tree.findall("devices/device/group/capability"):
142 name = capability.attrib['name']
143 value = capability.attrib['value']
144 if name not in caps:
145 try:
146 int(value)
147 caps[name] = int
148 continue
149 except (TypeError, ValueError):
150 pass
151 try:
152 float(value)
153 caps[name] = float
154 continue
155 except (TypeError, ValueError):
156 pass
157
158 if value.strip().lower() in ("true", "false"):
159 caps[name] = bool
160 continue
161 else:
162 caps[name] = str
163 else:
164 if caps[name] == str:
165 continue
166 elif caps[name] == bool:
167 if value.strip().lower() in ("true", "false"):
168 continue
169 else:
170 caps[name] = str
171 elif caps[name] == float:
172 try:
173 float(value)
174 continue
175 except (TypeError, ValueError):
176 caps[name] = str
177 elif caps[name] == int:
178 try:
179 int(value)
180 continue
181 except (TypeError, ValueError):
182 caps[name] = str
183 return caps
184
185
186 if __name__ == "__main__":
187 op.add_option("-o", "--output", dest="outfile", default=None,
188 help="The name of the module to produce.")
189 main(WurflPythonWriter, DeviceSerializer, op)
190