LibreOffice Module writerfilter (master) 1
factoryimpl_ns.py
Go to the documentation of this file.
1#!/usr/bin/env python
2#
3# This file is part of the LibreOffice project.
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9
10from xml.dom import minidom
11import sys
12
13
14# factoryConstructor
15
16
17def factoryConstructor(nsLabel):
18 print("""OOXMLFactory_%s::OOXMLFactory_%s()
19{
20}""" % (nsLabel, nsLabel))
21 print()
22
23
24# factoryDestructor
25
26
27def factoryDestructor(nsLabel):
28 print("""OOXMLFactory_%s::~OOXMLFactory_%s()
29{
30}""" % (nsLabel, nsLabel))
31 print()
32
33
34# factoryGetInstance
35
36
37def factoryGetInstance(nsLabel):
38 print("""OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::m_pInstance;
39
40OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::getInstance()
41{
42 if (!m_pInstance)
43 m_pInstance = new OOXMLFactory_%s();
44
45 return m_pInstance;
46}""" % (nsLabel, nsLabel, nsLabel))
47 print()
48
49
50# factoryAttributeToResourceMap
51
52
53def nsToLabel(nsNode):
54 return nsNode.getAttribute("name").replace('-', '_')
55
56
57def getChildByName(parentNode, childName):
58 elementNodes = [i for i in parentNode.childNodes if i.localName == childName]
59 assert len(elementNodes) == 1
60 return elementNodes[0]
61
62
63def resourceForAttribute(nsNode, attrNode):
64 resourceName = ""
65
66 for refNode in getChildrenByName(attrNode, "ref"):
67 refName = refNode.getAttribute("name")
68 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == refName]:
69 resourceName = resourceNode.getAttribute("resource")
70 break
71 if not len(resourceName):
72 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
73 resourceName = resourceForAttribute(nsNode, define)
74 break
75 if len(resourceName):
76 break
77
78 if not len(resourceName):
79 if len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") in ("base64Binary", "string")]):
80 resourceName = "String"
81 elif len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") == "boolean"]):
82 resourceName = "Boolean"
83 elif len([i for i in attrNode.getElementsByTagName("data") if i.getAttribute("type") in ("unsignedInt", "integer", "int")]):
84 resourceName = "Integer"
85 else:
86 dataNodes = attrNode.getElementsByTagName("data")
87 if len(dataNodes):
88 t = dataNodes[0].getAttribute("type")
89 # Denylist existing unexpected data types.
90 if t not in ("token", "long", "decimal", "float", "byte", "ST_DecimalNumber", "positiveInteger"):
91 raise Exception("unexpected data type: " + dataNodes[0].getAttribute("type"))
92 return resourceName
93
94
95def idForNamespace(nsNode):
96 return "NN_%s" % nsNode.getAttribute("name").replace('-', '_')
97
98
99def localIdForDefine(defineNode):
100 return "DEFINE_%s" % defineNode.getAttribute("name")
101
102
103def idForDefine(nsNode, defineNode):
104 return "%s|%s" % (idForNamespace(nsNode), localIdForDefine(defineNode))
105
106
107def fastNamespace(attrNode):
108 return "oox::NMSP_%s" % attrNode.getAttribute("prefix")
109
110
111def fastLocalName(attrNode):
112 if len(attrNode.getAttribute("localname")):
113 return "oox::XML_%s" % attrNode.getAttribute("localname")
114 else:
115 return "oox::XML_TOKEN_COUNT"
116
117
118def fastToken(attrNode):
119 ret = []
120 if len(attrNode.getAttribute("prefix")):
121 ret.append("%s|" % fastNamespace(attrNode))
122 ret.append(fastLocalName(attrNode))
123 return "".join(ret)
124
125
126def collectAttributeToResource(nsNode, defineNode):
127 ret_dict = {}
128 ret_order = []
129 for refNode in getChildrenByName(defineNode, "ref"):
130 refName = refNode.getAttribute("name")
131 parent = refNode.parentNode
132 if parent.localName in ("element", "attribute"):
133 continue
134 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
135 ret = collectAttributeToResource(nsNode, define)
136 ret_dict.update(ret[0])
137 ret_order.extend(ret[1])
138
139 attrNodes = defineNode.getElementsByTagName("attribute")
140 for attrNode in attrNodes:
141 attrToken = fastToken(attrNode)
142 resourceName = resourceForAttribute(nsNode, attrNode)
143 refDefine = "0"
144 if len(resourceName):
145 for refNode in attrNode.getElementsByTagName("ref"):
146 refName = refNode.getAttribute("name")
147 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
148 refDefine = idForDefine(nsNode, define)
149 ret_dict[attrToken] = "ResourceType::%s, %s" % (resourceName, refDefine)
150 ret_order.append(attrToken)
151
152 return [ret_dict, ret_order]
153
154
156 ret = []
157 attributes = collectAttributeToResource(nsNode, defineNode)
158 already_used = set()
159 for k in attributes[1]:
160 if not (k in already_used):
161 ret.append(" { %s, %s }," % (k, attributes[0][k]))
162 already_used.add(k)
163
164 return ret
165
166
168 print("""const AttributeInfo* OOXMLFactory_%s::getAttributeInfoArray(Id nId)
169{
170 switch (nId)
171 {""" % nsToLabel(nsNode))
172 for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
173 inner = "\n".join(factoryAttributeToResourceMapInner(nsNode, defineNode))
174 if len(inner):
175 print(" case %s:" % idForDefine(nsNode, defineNode))
176 print(" {")
177 print(" const static AttributeInfo info[] = {")
178 print(inner)
179 print(" { -1, ResourceType::NoResource, 0 }")
180 print(" };")
181 print(" return info;")
182 print(" }")
183 print(" break;")
184
185 print(""" default:
186 break;
187 }
188
189 return NULL;
190}""")
191 print()
192
193
194# factoryGetListValue
195
196
197def idToLabel(idName):
198 ns, ln = idName.split(':')
199 return "NS_%s::LN_%s" % (ns, ln)
200
201
202def appendValueData(values, name, value):
203 first = name[0:1]
204
205 if not (first in values):
206 values[first] = []
207
208 values[first].append([name, value])
209
210
211def printValueData(values):
212 if "" in values:
213 output_else = ""
214 for i in values[""]:
215 print(" %sif (aValue == \"%s\") { rOutValue = %s; return true; }" % (output_else, i[0], i[1]))
216 output_else = "else "
217 print(" else switch (aValue[0])")
218 else:
219 print(" if (aValue.empty())")
220 print(" return false;")
221 print(" switch (aValue[0])")
222
223 print(" {")
224 for k in sorted(values.keys()):
225 if k != "":
226 print(" case '%s':" % k)
227 output_else = ""
228 for i in values[k]:
229 print(" %sif (aValue == \"%s\") { rOutValue = %s; }" % (output_else, i[0], i[1]))
230 output_else = "else "
231 print(" else { return false; }")
232 print(" return true;")
233 print(" }")
234
235
237 print("""bool OOXMLFactory_%s::getListValue(Id nId, std::string_view aValue, sal_uInt32& rOutValue)
238{
239 (void) aValue;
240 (void) rOutValue;
241
242 switch (nId)
243 {""" % nsToLabel(nsNode))
244
245 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("resource") == "List"]:
246 print(" case %s:" % idForDefine(nsNode, resourceNode))
247 values = {}
248 for valueNode in getChildrenByName(resourceNode, "value"):
249 valueData = ""
250 if len(valueNode.childNodes):
251 valueData = valueNode.childNodes[0].data
252 appendValueData(values, valueData, idToLabel(valueNode.getAttribute("tokenid")))
253 printValueData(values)
254 print(" return false;")
255
256 print(""" default:
257 break;
258 }
259
260 return false;
261}
262""")
263
264
265# factoryCreateElementMap
266
267
268def contextResource(files, nsNode, refNode):
269 refName = refNode.getAttribute("name")
270 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == refName]:
271 return resourceNode.getAttribute("resource")
272
273 for includeNode in getChildrenByName(getChildByName(nsNode, "grammar"), "include"):
274 namespaceNode = files[includeNode.getAttribute("href")]
275 for resourceNode in [i for i in getChildrenByName(namespaceNode, "resource") if i.getAttribute("name") == refName]:
276 return resourceNode.getAttribute("resource")
277
278 if refName == "BUILT_IN_ANY_TYPE":
279 return "Any"
280 else:
281 for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
282 for resourceNode in [i for i in getChildrenByName(namespaceNode, "resource") if i.getAttribute("name") == refName]:
283 return resourceNode.getAttribute("resource")
284 return ""
285
286
287def idForRef(nsNode, refNode):
288 refName = refNode.getAttribute("name")
289 result1 = ""
290 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
291 result1 = idForDefine(nsNode, define)
292 if refName == "BUILT_IN_ANY_TYPE":
293 return "0"
294 elif result1 == "":
295 for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
296 for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
297 return idForDefine(namespaceNode, define)
298 else:
299 return result1
300
301
302def factoryCreateElementMapInner(files, nsNode, defineNode, resourceNamespaceNode=None):
303 if not resourceNamespaceNode:
304 resourceNamespaceNode = nsNode
305 ret = {}
306 for refNode in defineNode.getElementsByTagName("ref"):
307 parent = refNode.parentNode
308 if parent.localName in ("element", "attribute"):
309 continue
310 refName = refNode.getAttribute("name")
311
312 block = {}
313 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
314 block = factoryCreateElementMapInner(files, nsNode, define)
315
316 if len(block) == 0:
317 block1 = {}
318 for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
319 for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
320 block1.update(factoryCreateElementMapInner(files, namespaceNode, define, nsNode))
321 else:
322 block1 = block
323
324 if len(block1):
325 ret.update(block1)
326
327 for elementNode in defineNode.getElementsByTagName("element"):
328 resource = ""
329 for refNode in getChildrenByName(elementNode, "ref"):
330 refName = refNode.getAttribute("name")
331 resource = contextResource(files, resourceNamespaceNode, refNode)
332 if len(resource):
333 break
334 if len(resource):
335 ret[fastToken(elementNode)] = " case %s: rOutResource = ResourceType::%s; rOutElement = %s; break;" % (fastToken(elementNode), resource, idForRef(nsNode, getChildByName(elementNode, "ref")))
336
337 return ret
338
339
341 for startNode in getChildrenByName(nsNode, "start"):
342 startName = startNode.getAttribute("name")
343 block = None
344 for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == startName]:
345 block = factoryCreateElementMapInner(files, nsNode, defineNode)
346 print(" /* start: %s*/" % startName)
347 if block:
348 for k in block.keys():
349 print(block[k])
350
351
352def factoryCreateElementMap(files, nsNode):
353 print("""bool OOXMLFactory_%s::getElementId(Id nDefine, Id nId, ResourceType& rOutResource, Id& rOutElement)
354{
355 (void) rOutResource;
356 (void) rOutElement;
357
358 switch (nDefine)
359 {""" % nsToLabel(nsNode))
360
361 for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
362 inner = factoryCreateElementMapInner(files, nsNode, defineNode)
363 if len(inner):
364 print(" case %s:" % idForDefine(nsNode, defineNode))
365 print(" switch (nId)")
366 print(" {")
367 for k in sorted(inner.keys()):
368 print(inner[k])
369 print(" default: return false;")
370 print(" }")
371 print(" return true;")
372 print(" default:")
373 print(" switch (nId)")
374 print(" {")
376 print(""" default: return false;
377 }
378 return true;
379 }
380}
381""")
382
383
384# factoryActions
385
386
387def charactersActionForValues(nsNode, refNode):
388 ret = []
389
390 refName = refNode.getAttribute("name")
391 for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
392 ret.append(" {")
393 ret.append(" // %s" % defineNode.getAttribute("name"))
394 for dataNode in getChildrenByName(defineNode, "data"):
395 if dataNode.getAttribute("type") == "int":
396 ret.append(" OOXMLValue::Pointer_t pValue(new OOXMLIntegerValue(sText));")
397 ret.append(" pValueHandler->setValue(pValue);")
398 ret.append(" }")
399
400 return ret
401
402
403def factoryChooseAction(actionNode):
404 ret = []
405 extra_space = ""
406 if actionNode.hasAttribute("tokenid"):
407 ret.append(" if (sal::static_int_cast<Id>(pHandler->getId()) == %s)" % idToLabel(actionNode.getAttribute("tokenid")))
408 ret.append(" {")
409 extra_space = " "
410 for condNode in getChildrenByName(actionNode, "cond"):
411 ret.append(" {")
412 ret.append(" OOXMLPropertySetEntryToInteger aHandler(%s);" % idToLabel(condNode.getAttribute("tokenid")))
413 ret.append(" if (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))")
414 ret.append(" pStream->getPropertySetAttrs()->resolve(aHandler);")
415 ret.append("")
416 ret.append(" if (sal::static_int_cast<Id>(aHandler.getValue()) == %s)" % idToLabel(condNode.getAttribute("value")))
417 ret.append(" {")
418 extra_space = " "
419
420 if actionNode.getAttribute("action") in ("handleXNotes", "handleHdrFtr", "handleComment", "handlePicture", "handleBreak", "handleOutOfOrderBreak", "handleOLE", "handleFontRel", "handleHyperlinkURL", "handleAltChunk"):
421 ret.append(" %sif (OOXMLFastContextHandlerProperties* pProperties = dynamic_cast<OOXMLFastContextHandlerProperties*>(pHandler))" % extra_space)
422 ret.append(" %s pProperties->%s();" % (extra_space, actionNode.getAttribute("action")))
423 elif actionNode.getAttribute("action") == "propagateCharacterPropertiesAsSet":
424 ret.append(" %spHandler->propagateCharacterPropertiesAsSet(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
425 elif actionNode.getAttribute("action") in ("startCell", "endCell"):
426 ret.append(" %sif (OOXMLFastContextHandlerTextTableCell* pTextTableCell = dynamic_cast<OOXMLFastContextHandlerTextTableCell*>(pHandler))" % extra_space)
427 ret.append(" %s pTextTableCell->%s();" % (extra_space, actionNode.getAttribute("action")))
428 elif actionNode.getAttribute("action") in ("startRow", "endRow"):
429 ret.append(" %sif (OOXMLFastContextHandlerTextTableRow* pTextTableRow = dynamic_cast<OOXMLFastContextHandlerTextTableRow*>(pHandler))" % extra_space)
430 ret.append(" %s pTextTableRow->%s();" % (extra_space, actionNode.getAttribute("action")))
431 elif actionNode.getAttribute("action") == "handleGridAfter":
432 ret.append(" %sif (OOXMLFastContextHandlerValue* pValueHandler = dynamic_cast<OOXMLFastContextHandlerValue*>(pHandler))" % extra_space)
433 ret.append(" %s pValueHandler->%s();" % (extra_space, actionNode.getAttribute("action")))
434 # tdf#111550
435 elif actionNode.getAttribute("action") in ("start_P_Tbl"):
436 ret.append(" %sif (OOXMLFastContextHandlerTextTable* pTextTable = dynamic_cast<OOXMLFastContextHandlerTextTable*>(pHandler))" % extra_space)
437 ret.append(" %s pTextTable->%s();" % (extra_space, actionNode.getAttribute("action")))
438 elif actionNode.getAttribute("action") in ("sendProperty", "handleHyperlink"):
439 ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % extra_space)
440 ret.append(" %s pStream->%s();" % (extra_space, actionNode.getAttribute("action")))
441 elif actionNode.getAttribute("action") == "fieldstart":
442 ret.append(" %spHandler->startField();" % (extra_space))
443 elif actionNode.getAttribute("action") == "fieldsep":
444 ret.append(" %spHandler->fieldSeparator();" % (extra_space))
445 elif actionNode.getAttribute("action") == "fieldend":
446 ret.append(" %spHandler->endField();" % (extra_space))
447 elif actionNode.getAttribute("action") == "fieldlock":
448 ret.append(" %s{" % (extra_space))
449 ret.append(" %sOOXMLPropertySetEntryToBool aHandler(NS_ooxml::LN_CT_FldChar_fldLock);" % (extra_space))
450 ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % (extra_space))
451 ret.append(" %spStream->getPropertySetAttrs()->resolve(aHandler);" % (extra_space))
452 ret.append(" %sif (aHandler.getValue())" % (extra_space))
453 ret.append(" %spHandler->lockField();" % (extra_space))
454 ret.append(" %s}" % (extra_space))
455 elif actionNode.getAttribute("action") == "fieldlock_simple":
456 ret.append(" %s{" % (extra_space))
457 ret.append(" %sOOXMLPropertySetEntryToBool aHandler(NS_ooxml::LN_CT_SimpleField_fldLock);" % (extra_space))
458 ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % (extra_space))
459 ret.append(" %spStream->getPropertySetAttrs()->resolve(aHandler);" % (extra_space))
460 ret.append(" %sif (aHandler.getValue())" % (extra_space))
461 ret.append(" %spHandler->lockField();" % (extra_space))
462 ret.append(" %s}" % (extra_space))
463 elif actionNode.getAttribute("action") == "printproperty":
464 ret.append(" %sif (OOXMLFastContextHandlerStream* pStream = dynamic_cast<OOXMLFastContextHandlerStream*>(pHandler))" % extra_space)
465 ret.append(" %s pStream->sendProperty(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
466 elif actionNode.getAttribute("action") == "sendPropertiesWithId":
467 ret.append(" %spHandler->sendPropertiesWithId(%s);" % (extra_space, idToLabel(actionNode.getAttribute("sendtokenid"))))
468 elif actionNode.getAttribute("action") == "text":
469 ret.append(" %spHandler->text(sText);" % (extra_space))
470 elif actionNode.getAttribute("action") == "positionOffset":
471 ret.append(" %spHandler->positionOffset(sText);" % (extra_space))
472 elif actionNode.getAttribute("action") == "positivePercentage":
473 ret.append(" %spHandler->positivePercentage(sText);" % (extra_space))
474 elif actionNode.getAttribute("action") == "alignH":
475 ret.append(" %spHandler->alignH(sText);" % (extra_space))
476 elif actionNode.getAttribute("action") == "alignV":
477 ret.append(" %spHandler->alignV(sText);" % (extra_space))
478 elif actionNode.getAttribute("action") == "tokenproperty":
479 ret.append(" %sOOXMLFastHelper<OOXMLIntegerValue>::newProperty(pHandler, %s, pHandler->getToken());" % (extra_space, idToLabel("ooxml:token")))
480 else:
481 ret.append(" %spHandler->%s();" % (extra_space, actionNode.getAttribute("action")))
482
483 for condNode in getChildrenByName(actionNode, "cond"):
484 ret.append(" }")
485 ret.append(" }")
486 if actionNode.hasAttribute("tokenid"):
487 ret.append(" }")
488
489 return ret
490
491
492def factoryAction(nsNode, action):
493 switchblock1 = []
494 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if len([j for j in getChildrenByName(i, "action") if j.getAttribute("name") == action])]:
495 switchblock1.append("case %s:" % idForDefine(nsNode, resourceNode))
496 for actionNode in [i for i in getChildrenByName(resourceNode, "action") if i.getAttribute("name") == action]:
497 switchblock1.extend(factoryChooseAction(actionNode))
498 switchblock1.append(" break;")
499 switchblock1.append("")
500
501 switchblock2 = []
502 if action == "characters":
503 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("resource") == "Value"]:
504 if not len(getChildrenByName(resourceNode, "attribute")):
505 resourceName = resourceNode.getAttribute("name")
506 switchblock2.append("case %s:" % idForDefine(nsNode, resourceNode))
507 ret = []
508 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == resourceName]:
509 for refNode in getChildrenByName(define, "ref"):
510 ret.extend(charactersActionForValues(nsNode, refNode))
511 switchblock2.extend(ret)
512 switchblock2.append(" break;")
513
514 sys.stdout.write("void OOXMLFactory_%s::%sAction(OOXMLFastContextHandler*" % (nsToLabel(nsNode), action))
515 if len(switchblock1) or len(switchblock2):
516 sys.stdout.write(" pHandler")
517 if action == "characters":
518 sys.stdout.write(", const OUString&")
519 if "sText" in "".join(switchblock1) or "sText" in "".join(switchblock2):
520 sys.stdout.write(" sText")
521 print(")")
522 print("{")
523 if len(switchblock1) or len(switchblock2):
524 print(" sal_uInt32 nDefine = pHandler->getDefine();")
525 if len(switchblock1):
526 print(" switch (nDefine)")
527 print(" {")
528 if switchblock1[-1] == "":
529 switchblock1 = switchblock1[:-1]
530 sys.stdout.write(" ")
531 print("\n ".join(switchblock1))
532 print()
533 print(" default:")
534 print(" break;")
535 print(" }")
536 if len(switchblock2):
537 print(" switch (nDefine)")
538 print(" {")
539 print("\n ".join(switchblock2))
540 print()
541 print(" default:")
542 print(" break;")
543 print(" }")
544 print("}")
545
546
547def factoryActions(nsNode):
548 actions = []
549 for resourceNode in getChildrenByName(nsNode, "resource"):
550 for actionNode in getChildrenByName(resourceNode, "action"):
551 actionName = actionNode.getAttribute("name")
552 if actionName != "characters" and actionName not in actions:
553 actions.append(actionName)
554 for action in sorted(actions):
555 factoryAction(nsNode, action)
556 print()
557 factoryAction(nsNode, "characters")
558 print()
559
560
561# factoryGetResourceId
562
563
564def collectTokenToId(nsNode, defineNode):
565 ret = {}
566 for refNode in defineNode.getElementsByTagName("ref"):
567 refName = refNode.getAttribute("name")
568 parent = refNode.parentNode
569 if parent.localName in ("element", "attribute"):
570 continue
571 refblock1 = {}
572 for define in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == refName]:
573 refblock1.update(collectTokenToId(nsNode, define))
574 if not len(refblock1):
575 for namespaceNode in getChildrenByName(nsNode.parentNode, "namespace"):
576 for define in [i for i in getChildrenByName(getChildByName(namespaceNode, "grammar"), "define") if i.getAttribute("name") == refName]:
577 ret.update(collectTokenToId(namespaceNode, define))
578 else:
579 ret.update(refblock1)
580
581 defineName = defineNode.getAttribute("name")
582 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
583 for node in [i for i in resourceNode.childNodes if i.localName in ("element", "attribute")]:
584 if node.hasAttribute("tokenid"):
585 ret[fastToken(node)] = idToLabel(node.getAttribute("tokenid"))
586
587 return ret
588
589
590def factoryTokenToIdMapInner(nsNode, defineNode):
591 ids = collectTokenToId(nsNode, defineNode)
592 ret = []
593 for i in sorted(ids.keys()):
594 ret.append(" case %s: return %s;" % (i, ids[i]))
595
596 return ret
597
598
600 print("""Id OOXMLFactory_%s::getResourceId(Id nDefine, sal_Int32 nToken)
601{
602 (void) nDefine;
603 (void) nToken;
604
605 switch (nDefine)
606 {""" % nsToLabel(nsNode))
607 for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
608 inner = "\n".join(factoryTokenToIdMapInner(nsNode, defineNode))
609 if len(inner):
610 print(" case %s:" % idForDefine(nsNode, defineNode))
611 print(" switch (nToken)")
612 print(" {")
613 print(inner)
614 print(" }")
615 print(" break;")
616 print(" default:")
617 print(" switch (nToken)")
618 print(" {")
619 for startNode in getChildrenByName(nsNode, "start"):
620 startName = startNode.getAttribute("name")
621 for defineNode in [i for i in getChildrenByName(getChildByName(nsNode, "grammar"), "define") if i.getAttribute("name") == startName]:
622 inner = factoryTokenToIdMapInner(nsNode, defineNode)
623 if len(inner):
624 print("\n".join(inner))
625 print(""" }
626 break;
627 }
628 return 0;
629}
630""")
631
632
633# factoryAttributeAction
634
635
636def factoryAttributeActionDefineInner(nsNode, defineNode):
637 ret = []
638
639 defineName = defineNode.getAttribute("name")
640 block = []
641 output_else = ""
642 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
643 for attributeNode in getChildrenByName(resourceNode, "attribute"):
644 if attributeNode.hasAttribute("action"):
645 block.append(" %sif (nToken == static_cast<Token_t>(%s))" % (output_else, fastToken(attributeNode)))
646 block.append(" pHandler->%s(pValue);" % attributeNode.getAttribute("action"))
647 output_else = "else "
648 if len(block):
649 resource = ""
650 for resourceNode in [i for i in getChildrenByName(nsNode, "resource") if i.getAttribute("name") == defineName]:
651 resource = resourceNode.getAttribute("resource")
652 break
653 ret.append(" if (OOXMLFastContextHandler%s* pHandler = dynamic_cast<OOXMLFastContextHandler%s*>(_pHandler))" % (resource, resource))
654 ret.append(" {")
655 ret.extend(block)
656 ret.append(" }")
657
658 return ret
659
660
662 ret = []
663
664 for defineNode in getChildrenByName(getChildByName(nsNode, "grammar"), "define"):
665 inner = factoryAttributeActionDefineInner(nsNode, defineNode)
666 if len(inner):
667 ret.append(" case %s:" % idForDefine(nsNode, defineNode))
668 ret.extend(inner)
669 ret.append(" break;")
670
671 return ret
672
673
675 nsLabel = nsToLabel(nsNode)
676 inner = factoryAttributeActionInner(nsNode)
677 if len(inner):
678 print("""void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler* _pHandler, Token_t nToken, const OOXMLValue::Pointer_t& pValue)
679{
680 switch (_pHandler->getDefine())
681 {""" % nsLabel)
682 print("\n".join(inner))
683 print(" default:")
684 print(" break;")
685 print(" }")
686 print("}")
687 print()
688 else:
689 print("void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler*, Token_t, const OOXMLValue::Pointer_t&)" % nsLabel)
690 print("{")
691 print("}")
692 print()
693
694
695# createImpl
696
697
698def getChildrenByName(parentNode, childName):
699 return [i for i in parentNode.childNodes if i.localName == childName]
700
701
702def createImpl(modelNode, nsName):
703 print("""
704#include "ooxml/resourceids.hxx"
705#include "OOXMLFactory_%s.hxx"
706#include "ooxml/OOXMLFastHelper.hxx"
707#include "oox/token/tokens.hxx"
708
709#ifdef _MSC_VER
710#pragma warning(disable:4060) // switch statement contains no 'case' or 'default' labels
711#pragma warning(disable:4065) // switch statement contains 'default' but no 'case' labels
712#pragma warning(disable:4702) // unreachable code
713#endif
714
715namespace writerfilter {
716namespace ooxml {
717
718using namespace com::sun::star;
719
720/// @cond GENERATED""" % nsName)
721 print()
722
723 files = {}
724 for nsNode in getChildrenByName(modelNode, "namespace"):
725 files[nsNode.getAttribute("name")] = nsNode
726
727 for nsNode in [i for i in getChildrenByName(modelNode, "namespace") if i.getAttribute("name") == nsName]:
728 nsLabel = nsToLabel(nsNode)
729
730 factoryConstructor(nsLabel)
731 factoryDestructor(nsLabel)
732 factoryGetInstance(nsLabel)
734 factoryGetListValue(nsNode)
735 factoryCreateElementMap(files, nsNode)
736 factoryActions(nsNode)
739
740 print("""/// @endcond
741}}""")
742
743
744def main():
745 modelPath = sys.argv[1]
746 filePath = sys.argv[2]
747 modelNode = getChildByName(minidom.parse(modelPath), "model")
748 nsName = filePath.split('OOXMLFactory_')[1].split('.cxx')[0]
749 createImpl(modelNode, nsName)
750
751
752if __name__ == "__main__":
753 main()
754
755# vim:set shiftwidth=4 softtabstop=4 expandtab:
def getChildrenByName(parentNode, childName)
def factoryAction(nsNode, action)
def factoryTokenToIdMapInner(nsNode, defineNode)
def factoryAttributeActionDefineInner(nsNode, defineNode)
def factoryCreateElementMapInner(files, nsNode, defineNode, resourceNamespaceNode=None)
def factoryAttributeActionInner(nsNode)
def idToLabel(idName)
def fastNamespace(attrNode)
def getChildByName(parentNode, childName)
def factoryChooseAction(actionNode)
def factoryConstructor(nsLabel)
def collectAttributeToResource(nsNode, defineNode)
def createImpl(modelNode, nsName)
def idForDefine(nsNode, defineNode)
def idForRef(nsNode, refNode)
def factoryGetResourceId(nsNode)
def factoryGetListValue(nsNode)
def appendValueData(values, name, value)
def nsToLabel(nsNode)
def factoryAttributeAction(nsNode)
def factoryCreateElementMapFromStart(files, nsNode)
def collectTokenToId(nsNode, defineNode)
def factoryAttributeToResourceMapInner(nsNode, defineNode)
def factoryAttributeToResourceMap(nsNode)
def factoryCreateElementMap(files, nsNode)
def factoryGetInstance(nsLabel)
def factoryActions(nsNode)
def idForNamespace(nsNode)
def fastToken(attrNode)
def fastLocalName(attrNode)
def charactersActionForValues(nsNode, refNode)
def factoryDestructor(nsLabel)
def contextResource(files, nsNode, refNode)
def printValueData(values)
def localIdForDefine(defineNode)
def resourceForAttribute(nsNode, attrNode)