Exemplo n.º 1
0
 def serialize(self, stream, encoding=None, fragment=False, format=None):
     try:
         text = ''.join(self.generate(stream, encoding, fragment, format))
     except TypeError:  # workaround for bug 905389 in Python < 2.5
         text = ''.join(
             tuple(self.generate(stream, encoding, fragment, format)))
     if not fragment:
         text = Format.strip(text)
     return text
Exemplo n.º 2
0
 def serialize(self, stream, encoding=None,
         fragment=False, format=None):
     try:
         text = ''.join(self.generate(stream, encoding, fragment, format))
     except TypeError: # workaround for bug 905389 in Python < 2.5
         text = ''.join(tuple(
             self.generate(stream, encoding, fragment, format)))
     if not fragment:
         text = Format.strip(text)
     return text
Exemplo n.º 3
0
    def generate(self, stream, encoding=None, fragment=False, format=None):
        """Serializes an event stream to bytes of the specified encoding.

        This function yields an encoded string over and over until the
        stream is exhausted.

        """
        decl = self.decl
        doctype = self.doctype
        encoding = encoding or self.encoding or 'utf-8'
        entity_map = self.entity_map
        format = self._get_format(format)
        if format:
            if format.decl is not None:
                decl = format.decl
            if format.doctype is not None:
                doctype = format.doctype
            if format.entity_map is not None:
                entity_map = format.entity_map
        if entity_map == True:
            # if True, use default HTML entity map
            entity_map = default_entity_map
        elif entity_map == False:
            entity_map = None
        if isinstance(doctype, basestring):
            # allow doctype strings
            doctype = doctypes[self.doctype]

        escape_cdata = XMLSerializer.escape_cdata
        escape_attrib = XMLSerializer.escape_attrib

        lastev = None
        stream = iter(stream)
        names = NamespaceStack(self.namespaces)
        if not fragment:
            if decl:
                yield '<?xml version="1.0" encoding="%s"?>\n' % encoding
            if doctype is not None:
                yield serialize_doctype(doctype) + '\n'
        text = None
        for ev, item in self.apply_filters(stream, format):
            if ev in (START, END) and item.tag == Fragment:
                continue
            elif ev == TEXT:
                if text is not None:
                    text = u''.join([text, item])
                else:
                    text = item
                continue
            if lastev == START:
                if ev == END and (not text or not (Format.strip(text)
                        or self.is_formatted(item.tag))) \
                        and self.can_be_empty_element(item.tag):
                    yield ' />'
                    lastev = END
                    text = None
                    names.pop()
                    continue
                yield ">"
            if text:
                yield escape_cdata(text, encoding, entity_map)
                text = None
            if ev == START:
                if item.tag == Comment:
                    yield "<!--%s-->" % item.text.encode(encoding)
                    lastev = COMMENT
                    continue
                elif item.tag == ProcessingInstruction:
                    yield "<?%s?>" % item.text.encode(encoding)
                    lastev = PI
                    continue
                else:
                    current_names = names.current
                    names.push(namespaces(item, remove=True))
                    qname = names.qname(item.tag, default=True)
                    yield "<" + qname.encode(encoding)
                    for k, v in item.attrib.items():
                        k = names.qname(k, default=False).encode(encoding)
                        v = escape_attrib(v, encoding)
                        yield ' %s="%s"' % (k, v)
                    for prefix, uri in names.current.items():
                        if prefix not in current_names \
                                or current_names[prefix] != uri:
                            v = escape_attrib(uri, encoding)
                            if prefix:
                                k = 'xmlns:' + prefix.encode(encoding)
                            else:
                                k = 'xmlns'
                            yield ' %s="%s"' % (k, v)
            elif ev == END and item.tag not in (Comment,
                                                ProcessingInstruction):
                qname = names.qname(item.tag, default=True)
                yield "</%s>" % qname.encode(encoding)
                names.pop()
            lastev = ev
        if fragment and text:
            yield escape_cdata(text, encoding, entity_map)
        return
Exemplo n.º 4
0
    def generate(self, stream, encoding=None,
            fragment=False, format=None):
        """Serializes an event stream to bytes of the specified encoding.

        This function yields an encoded string over and over until the
        stream is exhausted.

        """
        decl = self.decl
        doctype = self.doctype
        encoding = encoding or self.encoding or 'utf-8'
        entity_map = self.entity_map
        format = self._get_format(format)
        if format:
            if format.decl is not None:
                decl = format.decl
            if format.doctype is not None:
                doctype = format.doctype
            if format.entity_map is not None:
                entity_map = format.entity_map
        if entity_map == True:
            # if True, use default HTML entity map
            entity_map = default_entity_map
        elif entity_map == False:
            entity_map = None
        if isinstance(doctype, basestring):
            # allow doctype strings
            doctype = doctypes[self.doctype]

        escape_cdata = XMLSerializer.escape_cdata
        escape_attrib = XMLSerializer.escape_attrib

        lastev = None
        stream = iter(stream)
        names = NamespaceStack(self.namespaces)
        if not fragment:
            if decl:
                yield '<?xml version="1.0" encoding="%s"?>\n' % encoding
            if doctype is not None:
                yield serialize_doctype(doctype) + '\n'
        text = None
        for ev, item in self.apply_filters(stream, format):
            if ev in (START, END) and item.tag == Fragment:
                continue
            elif ev == TEXT:
                if text is not None:
                    text = u''.join([text, item])
                else:
                    text = item
                continue
            if lastev == START:
                if ev == END and (not text or not (Format.strip(text)
                        or self.is_formatted(item.tag))) \
                        and self.can_be_empty_element(item.tag):
                    yield ' />'
                    lastev = END
                    text = None
                    names.pop()
                    continue
                yield ">"
            if text:
                yield escape_cdata(text, encoding, entity_map)
                text = None
            if ev == START:
                if item.tag == Comment:
                    yield "<!--%s-->" % item.text.encode(encoding)
                    lastev = COMMENT
                    continue
                elif item.tag == ProcessingInstruction:
                    yield "<?%s?>" % item.text.encode(encoding)
                    lastev = PI
                    continue
                else:
                    current_names = names.current
                    names.push(namespaces(item, remove=True))
                    qname = names.qname(item.tag, default=True)
                    yield "<" + qname.encode(encoding)
                    for k, v in item.attrib.items():
                        k = names.qname(k, default=False).encode(encoding)
                        v = escape_attrib(v, encoding)
                        yield ' %s="%s"' % (k, v)
                    for prefix, uri in names.current.items():
                        if prefix not in current_names \
                                or current_names[prefix] != uri:
                            v = escape_attrib(uri, encoding)
                            if prefix:
                                k = 'xmlns:' + prefix.encode(encoding)
                            else:
                                k = 'xmlns'
                            yield ' %s="%s"' % (k, v)
            elif ev == END and item.tag not in (
                    Comment, ProcessingInstruction):
                qname = names.qname(item.tag, default=True)
                yield "</%s>" % qname.encode(encoding)
                names.pop()
            lastev = ev
        if fragment and text:
            yield escape_cdata(text, encoding, entity_map)
        return