class WrapTransformation(object): """Wrap selection in an element.""" def __init__(self, element): if isinstance(element, Element): self.element = element else: self.element = Element(element) def __call__(self, stream): for mark, event in stream: if mark: element = list(self.element.generate()) for prefix in element[:-1]: yield None, prefix yield mark, event start = mark stopped = False for mark, event in stream: if start is ENTER and mark is EXIT: yield mark, event stopped = True break if not mark: break yield mark, event else: stopped = True yield None, element[-1] if not stopped: yield mark, event else: yield mark, event
def render(self, xml=True): """ Returns a genshi.builder.Element, or raw rendered XML, depending on the value of `xml`. """ # Keep a namespace of XML nodes to render ns = dict() # Look at every key/value pair passed into the constructor... for key, value in self.__values__.items(): # If the value is a list, it's a set of Nodes. if isinstance(value, list): # Update the namespace with {NodeSet.name: [Element, Element]} ns.update({ key: [node.render(xml=False) for node in value] }) elif isinstance(value, Node): # # If the value is already a singular node, just add it to the # existing list of values. # ns.update({ key: value.render(xml=False) }) elif key.lower() in self.__fields__: field = self.__fields__[key.lower()] # Get the `transform`'ed value and store it in the namespace. fval = field.get_value(value) ns.update(fval) # The tagname is the class name in uppercase, e.g., `Hop` -> `<HOP>` name = self.__class__.__name__.upper() # Sort the keys for consistency items = sorted( ns.items(), lambda x, y: cmp(x[0].lower(), y[0].lower())) # # Create an `Element` for this node. # Its value should be the accumulated collection of its child # `Element`s. # element = Element(name)(*[ v if isinstance(v, Element) else Element(k.upper())(v) for k, v in items ]) # Return xml or a raw `Element`. if xml is False: return element return element.generate().render('xml')
def render(self, xml=True): """ Returns a genshi.builder.Element, or raw rendered XML, depending on the value of `xml`. """ # Keep a namespace of XML nodes to render ns = dict() # Look at every key/value pair passed into the constructor... for key, value in self.__values__.items(): # If the value is a list, it's a set of Nodes. if isinstance(value, list): # Update the namespace with {NodeSet.name: [Element, Element]} ns.update({key: [node.render(xml=False) for node in value]}) elif isinstance(value, Node): # # If the value is already a singular node, just add it to the # existing list of values. # ns.update({key: value.render(xml=False)}) elif key.lower() in self.__fields__: field = self.__fields__[key.lower()] # Get the `transform`'ed value and store it in the namespace. fval = field.get_value(value) ns.update(fval) # The tagname is the class name in uppercase, e.g., `Hop` -> `<HOP>` name = self.__class__.__name__.upper() # Sort the keys for consistency items = sorted(ns.items(), lambda x, y: cmp(x[0].lower(), y[0].lower())) # # Create an `Element` for this node. # Its value should be the accumulated collection of its child # `Element`s. # element = Element(name)(*[ v if isinstance(v, Element) else Element(k.upper())(v) for k, v in items ]) # Return xml or a raw `Element`. if xml is False: return element return element.generate().render('xml')