def add(element1, element2): """Add element2 to element1, modify element1 in place and return it. This function modifies the node in place to make ensure there are not too many copies created in complicated programs. The reason this function also returns the element is to allow this function to be used in compound statements, for example: add(node1, invert(add(node2, node3)))""" newtag = Tag.addTags(element1.tag, element2.tag) #have to wrap the attributes in dict() to avoid a bus error newattribs = Attrib.addAttribs(dict(element1.attrib), dict(element2.attrib)) element1.tag = newtag element1.text = Text.addText(element1.text, element2.text) element1.tail = Text.addText(element1.tail, element2.tail) for i in element1.attrib: del element1.attrib[i] for key in newattribs.keys(): try: element1.set(key, newattribs[key]) except TypeError: log = logging.getLogger() log.error('TypeError: %s' % str(sys.exc_info()[1])) log.error('key = %s\tnewattribs[key] = %s' % (str(key), str(newattribs[key]))) raise return element1
def isUnitEvent(event): if event.getEventName() == "StartElementEvent": if Tag.isUnitTag(event.tag) and Attrib.isUnitAttrib(event.attr) and Text.isUnitText(event.text): return True else: return False elif event.getEventName() == "EndElementEvent": if Tag.isUnitTag(event.tag) and Text.isUnitText(event.text): return True else: return False else: raise TypeError("Invalid event type: %s" % str(event1))
def invert(element1): """Invert the element, modify in place and return it. This function modifies the node in place to make ensure there are not too many copies created in complicated programs. The reason this function also returns the element is to allow this function to be used in compound statements, for example: add(node1, invert(add(node2, node3))) """ # inverted = lxml.etree.Element(Tag.tagInverse(element1.tag), ) element1.tag = Tag.tagInverse(element1.tag) element1.text = Text.textInverse(element1.text) element1.tail = Text.textInverse(element1.tail) newattribs = Attrib.attribInverse(dict(element1.attrib)) for i in element1.attrib: del element1.attrib[i] for j in newattribs: element1.set(j, newattribs[j]) return element1
def addEvents(event1, event2): """Add the two events and return a new event. Raise TypeError if the event types do not match.""" import TreeGroup.Common.Attrib as Attrib import TreeGroup.Common.Tag as Tag import TreeGroup.Common.Text as Text if not type(event1) == type(event2): print("%s != %s" % (type(event1), type(event2))) raise TypeError if event1.getEventName() == "StartElementEvent": newevent = StartElementEvent(Tag.addTags(event1.tag, event2.tag), Attrib.addAttribs(event1.attr, event2.attr), Text.addText(event1.text, event2.text)) return newevent elif event1.getEventName() == "EndElementEvent": newevent = EndElementEvent(Tag.addTags(event1.tag, event2.tag), Text.addText(event1.text, event2.text)) return newevent else: raise TypeError("Invalid event type: %s" % str(event1))
def __eq__(self, o): if type(self) == type(o) and Tag.equal(self.tag, o.tag) and Text.equal(self.text, o.text): return True else: return False