1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 from lxml import etree
22
23 from translate.misc.xml_helpers import normalize_xml_space
24 from translate.storage.placeables import base, xliff, StringElem
25 from translate.storage.xml_extract import misc
26
27 __all__ = ['xml_to_strelem', 'strelem_to_xml']
28
29
30
32 try:
33 return klass(
34 id=node.attrib[u'id'],
35 rid=node.attrib.get('rid', None),
36 xid=node.attrib.get('xid', None),
37 xml_attrib=node.attrib,
38 )
39 except KeyError:
40 pass
41 return klass()
42
43
45 return klass(
46 id=node.attrib[u'id'],
47 sub=xml_to_strelem(node, xml_space).sub,
48 xml_attrib=node.attrib,
49 )
50
51
53 raise NotImplementedError
54
55
65
66 _class_dictionary = {
67
68 u'bx': (xliff.Bx, make_empty_replacement_placeable),
69
70 u'ex': (xliff.Ex, make_empty_replacement_placeable),
71 u'g': (xliff.G, make_g_placeable),
72
73
74
75 u'x': (xliff.X, make_empty_replacement_placeable),
76 }
77
78
86
87
89 if isinstance(string, unicode):
90 return string
91 elif isinstance(string, StringElem):
92 return unicode(string)
93 else:
94 return unicode(string.decode('utf-8'))
95
96
98 if dom_node is None:
99 return StringElem()
100 if isinstance(dom_node, basestring):
101 dom_node = etree.fromstring(dom_node)
102 normalize_xml_space(dom_node, xml_space, remove_start=True)
103 result = StringElem()
104 sub = result.sub
105 for child_dom_node in dom_node:
106 sub.append(make_placeable(child_dom_node, xml_space))
107 if child_dom_node.tail:
108 sub.append(StringElem(unicode(child_dom_node.tail)))
109
110
111
112 node_text = dom_node.text
113 if sub and node_text:
114 sub.insert(0, StringElem(unicode(node_text)))
115 elif node_text:
116 sub.append(unicode(node_text))
117 return result
118
119
120
121
123 dom_node = etree.Element(tagname)
124 if placeable.id is not None:
125 dom_node.attrib['id'] = placeable.id
126 if placeable.xid is not None:
127 dom_node.attrib['xid'] = placeable.xid
128 if placeable.rid is not None:
129 dom_node.attrib['rid'] = placeable.rid
130
131 if hasattr(placeable, 'xml_attrib'):
132 for attrib, value in placeable.xml_attrib.items():
133 dom_node.set(attrib, value)
134
135 return dom_node
136
137
139 assert type(placeable) is xliff.UnknownXML
140
141 from copy import copy
142 node = copy(placeable.xml_node)
143 for i in range(len(node)):
144 del node[0]
145 node.tail = None
146 node.text = None
147
148 return node
149
150 _placeable_dictionary = {
151 xliff.Bpt: lambda placeable: placeable_as_dom_node(placeable, 'bpt'),
152 xliff.Bx: lambda placeable: placeable_as_dom_node(placeable, 'bx'),
153 xliff.Ept: lambda placeable: placeable_as_dom_node(placeable, 'ept'),
154 xliff.Ex: lambda placeable: placeable_as_dom_node(placeable, 'ex'),
155 xliff.G: lambda placeable: placeable_as_dom_node(placeable, 'g'),
156 xliff.It: lambda placeable: placeable_as_dom_node(placeable, 'it'),
157 xliff.Ph: lambda placeable: placeable_as_dom_node(placeable, 'ph'),
158 xliff.Sub: lambda placeable: placeable_as_dom_node(placeable, 'sub'),
159 xliff.X: lambda placeable: placeable_as_dom_node(placeable, 'x'),
160 xliff.UnknownXML: unknown_placeable_as_dom_node,
161 base.Bpt: lambda placeable: placeable_as_dom_node(placeable, 'bpt'),
162 base.Bx: lambda placeable: placeable_as_dom_node(placeable, 'bx'),
163 base.Ept: lambda placeable: placeable_as_dom_node(placeable, 'ept'),
164 base.Ex: lambda placeable: placeable_as_dom_node(placeable, 'ex'),
165 base.G: lambda placeable: placeable_as_dom_node(placeable, 'g'),
166 base.It: lambda placeable: placeable_as_dom_node(placeable, 'it'),
167 base.Ph: lambda placeable: placeable_as_dom_node(placeable, 'ph'),
168 base.Sub: lambda placeable: placeable_as_dom_node(placeable, 'sub'),
169 base.X: lambda placeable: placeable_as_dom_node(placeable, 'x'),
170 }
171
172
174 if not len(node):
175 if not node.text:
176 node.text = unicode(string)
177 else:
178 node.text += unicode(string)
179 else:
180 lastchild = node.getchildren()[-1]
181 if lastchild.tail is None:
182 lastchild.tail = ''
183 lastchild.tail += unicode(string)
184 return node
185
186
206
207
209 try:
210 return xml_to_strelem(etree.fromstring('<source>%s</source>' % (pstr)))
211 except Exception, exc:
212 raise
213 return None
214 xliff.parsers = [parse_xliff]
215