10from xml.dom
import minidom
18 print(
"""OOXMLFactory_%s::OOXMLFactory_%s()
20}""" % (nsLabel, nsLabel))
28 print(
"""OOXMLFactory_%s::~OOXMLFactory_%s()
30}""" % (nsLabel, nsLabel))
38 print(
"""OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::m_pInstance;
40OOXMLFactory_ns::Pointer_t OOXMLFactory_%s::getInstance()
43 m_pInstance = new OOXMLFactory_%s();
46}
""" % (nsLabel, nsLabel, nsLabel))
54 return nsNode.getAttribute(
"name").replace(
'-',
'_')
58 elementNodes = [i
for i
in parentNode.childNodes
if i.localName == childName]
59 assert len(elementNodes) == 1
60 return elementNodes[0]
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")
71 if not len(resourceName):
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"
86 dataNodes = attrNode.getElementsByTagName(
"data")
88 t = dataNodes[0].getAttribute(
"type")
90 if t
not in (
"token",
"long",
"decimal",
"float",
"byte",
"ST_DecimalNumber",
"positiveInteger"):
91 raise Exception(
"unexpected data type: " + dataNodes[0].getAttribute(
"type"))
96 return "NN_%s" % nsNode.getAttribute(
"name").replace(
'-',
'_')
100 return "DEFINE_%s" % defineNode.getAttribute(
"name")
108 return "oox::NMSP_%s" % attrNode.getAttribute(
"prefix")
112 if len(attrNode.getAttribute(
"localname")):
113 return "oox::XML_%s" % attrNode.getAttribute(
"localname")
115 return "oox::XML_TOKEN_COUNT"
120 if len(attrNode.getAttribute(
"prefix")):
130 refName = refNode.getAttribute(
"name")
131 parent = refNode.parentNode
132 if parent.localName
in (
"element",
"attribute"):
136 ret_dict.update(ret[0])
137 ret_order.extend(ret[1])
139 attrNodes = defineNode.getElementsByTagName(
"attribute")
140 for attrNode
in attrNodes:
144 if len(resourceName):
145 for refNode
in attrNode.getElementsByTagName(
"ref"):
146 refName = refNode.getAttribute(
"name")
149 ret_dict[attrToken] =
"ResourceType::%s, %s" % (resourceName, refDefine)
150 ret_order.append(attrToken)
152 return [ret_dict, ret_order]
159 for k
in attributes[1]:
160 if not (k
in already_used):
161 ret.append(
" { %s, %s }," % (k, attributes[0][k]))
168 print(
"""const AttributeInfo* OOXMLFactory_%s::getAttributeInfoArray(Id nId)
171 {""" % nsToLabel(nsNode))
175 print(
" case %s:" %
idForDefine(nsNode, defineNode))
177 print(
" const static AttributeInfo info[] = {")
179 print(
" { -1, ResourceType::NoResource, 0 }")
181 print(
" return info;")
198 ns, ln = idName.split(
':')
199 return "NS_%s::LN_%s" % (ns, ln)
205 if not (first
in values):
208 values[first].append([name, value])
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])")
219 print(
" if (aValue.empty())")
220 print(
" return false;")
221 print(
" switch (aValue[0])")
224 for k
in sorted(values.keys()):
226 print(
" case '%s':" % 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;")
237 print(
"""bool OOXMLFactory_%s::getListValue(Id nId, std::string_view aValue, sal_uInt32& rOutValue)
243 {""" % nsToLabel(nsNode))
245 for resourceNode
in [i
for i
in getChildrenByName(nsNode,
"resource")
if i.getAttribute(
"resource") ==
"List"]:
246 print(
" case %s:" %
idForDefine(nsNode, resourceNode))
250 if len(valueNode.childNodes):
251 valueData = valueNode.childNodes[0].data
254 print(
" return false;")
265# factoryCreateElementMap
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")
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")
278 if refName ==
"BUILT_IN_ANY_TYPE":
282 for resourceNode
in [i
for i
in getChildrenByName(namespaceNode,
"resource")
if i.getAttribute(
"name") == refName]:
283 return resourceNode.getAttribute(
"resource")
288 refName = refNode.getAttribute(
"name")
292 if refName ==
"BUILT_IN_ANY_TYPE":
303 if not resourceNamespaceNode:
304 resourceNamespaceNode = nsNode
306 for refNode
in defineNode.getElementsByTagName(
"ref"):
307 parent = refNode.parentNode
308 if parent.localName
in (
"element",
"attribute"):
310 refName = refNode.getAttribute(
"name")
327 for elementNode
in defineNode.getElementsByTagName(
"element"):
330 refName = refNode.getAttribute(
"name")
342 startName = startNode.getAttribute(
"name")
346 print(
" /* start: %s*/" % startName)
348 for k
in block.keys():
353 print(
"""bool OOXMLFactory_%s::getElementId(Id nDefine, Id nId, ResourceType& rOutResource, Id& rOutElement)
359 {""" % nsToLabel(nsNode))
364 print(
" case %s:" %
idForDefine(nsNode, defineNode))
365 print(
" switch (nId)")
367 for k
in sorted(inner.keys()):
369 print(
" default: return false;")
371 print(
" return true;")
373 print(
" switch (nId)")
376 print(
""" default: return false;
387def charactersActionForValues(nsNode, refNode):
390 refName = refNode.getAttribute("name")
393 ret.append(
" // %s" % defineNode.getAttribute(
"name"))
395 if dataNode.getAttribute(
"type") ==
"int":
396 ret.append(
" OOXMLValue::Pointer_t pValue(new OOXMLIntegerValue(sText));")
397 ret.append(
" pValueHandler->setValue(pValue);")
406 if actionNode.hasAttribute(
"tokenid"):
407 ret.append(
" if (sal::static_int_cast<Id>(pHandler->getId()) == %s)" %
idToLabel(actionNode.getAttribute(
"tokenid")))
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);")
416 ret.append(
" if (sal::static_int_cast<Id>(aHandler.getValue()) == %s)" %
idToLabel(condNode.getAttribute(
"value")))
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")))
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")))
481 ret.append(
" %spHandler->%s();" % (extra_space, actionNode.getAttribute(
"action")))
486 if actionNode.hasAttribute(
"tokenid"):
495 switchblock1.append(
"case %s:" %
idForDefine(nsNode, resourceNode))
496 for actionNode
in [i
for i
in getChildrenByName(resourceNode,
"action")
if i.getAttribute(
"name") == action]:
498 switchblock1.append(
" break;")
499 switchblock1.append(
"")
502 if action ==
"characters":
503 for resourceNode
in [i
for i
in getChildrenByName(nsNode,
"resource")
if i.getAttribute(
"resource") ==
"Value"]:
505 resourceName = resourceNode.getAttribute(
"name")
506 switchblock2.append(
"case %s:" %
idForDefine(nsNode, resourceNode))
511 switchblock2.extend(ret)
512 switchblock2.append(
" break;")
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")
523 if len(switchblock1)
or len(switchblock2):
524 print(
" sal_uInt32 nDefine = pHandler->getDefine();")
525 if len(switchblock1):
526 print(
" switch (nDefine)")
528 if switchblock1[-1] ==
"":
529 switchblock1 = switchblock1[:-1]
530 sys.stdout.write(
" ")
531 print(
"\n ".join(switchblock1))
536 if len(switchblock2):
537 print(
" switch (nDefine)")
539 print(
"\n ".join(switchblock2))
551 actionName = actionNode.getAttribute(
"name")
552 if actionName !=
"characters" and actionName
not in actions:
553 actions.append(actionName)
554 for action
in sorted(actions):
566 for refNode
in defineNode.getElementsByTagName(
"ref"):
567 refName = refNode.getAttribute(
"name")
568 parent = refNode.parentNode
569 if parent.localName
in (
"element",
"attribute"):
574 if not len(refblock1):
579 ret.update(refblock1)
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"):
593 for i
in sorted(ids.keys()):
594 ret.append(
" case %s: return %s;" % (i, ids[i]))
600 print(
"""Id OOXMLFactory_%s::getResourceId(Id nDefine, sal_Int32 nToken)
606 {""" % nsToLabel(nsNode))
610 print(
" case %s:" %
idForDefine(nsNode, defineNode))
611 print(
" switch (nToken)")
617 print(
" switch (nToken)")
620 startName = startNode.getAttribute(
"name")
624 print(
"\n".join(inner))
633# factoryAttributeAction
636def factoryAttributeActionDefineInner(nsNode, defineNode):
639 defineName = defineNode.getAttribute("name")
642 for resourceNode
in [i
for i
in getChildrenByName(nsNode,
"resource")
if i.getAttribute(
"name") == defineName]:
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 "
650 for resourceNode
in [i
for i
in getChildrenByName(nsNode,
"resource")
if i.getAttribute(
"name") == defineName]:
651 resource = resourceNode.getAttribute(
"resource")
653 ret.append(
" if (OOXMLFastContextHandler%s* pHandler = dynamic_cast<OOXMLFastContextHandler%s*>(_pHandler))" % (resource, resource))
667 ret.append(
" case %s:" %
idForDefine(nsNode, defineNode))
669 ret.append(
" break;")
678 print(
"""void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler* _pHandler, Token_t nToken, const OOXMLValue::Pointer_t& pValue)
680 switch (_pHandler->getDefine())
682 print("\n".join(inner))
689 print(
"void OOXMLFactory_%s::attributeAction(OOXMLFastContextHandler*, Token_t, const OOXMLValue::Pointer_t&)" % nsLabel)
699 return [i
for i
in parentNode.childNodes
if i.localName == childName]
704#include "ooxml/resourceids.hxx"
705#include "OOXMLFactory_%s.hxx"
706#include "ooxml/OOXMLFastHelper.hxx"
707#include "oox/token/tokens.hxx"
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
715namespace writerfilter {
718using namespace com::sun::star;
720/// @cond GENERATED""" % nsName)
725 files[nsNode.getAttribute(
"name")] = nsNode
727 for nsNode
in [i
for i
in getChildrenByName(modelNode,
"namespace")
if i.getAttribute(
"name") == nsName]:
740 print(
"""/// @endcond
745 modelPath = sys.argv[1]
746 filePath = sys.argv[2]
748 nsName = filePath.split(
'OOXMLFactory_')[1].split(
'.cxx')[0]
752if __name__ ==
"__main__":
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 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 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 fastLocalName(attrNode)
def charactersActionForValues(nsNode, refNode)
def factoryDestructor(nsLabel)
def contextResource(files, nsNode, refNode)
def printValueData(values)
def localIdForDefine(defineNode)
def resourceForAttribute(nsNode, attrNode)