| Index: third_party/Python-Markdown/markdown/serializers.py
|
| diff --git a/third_party/Python-Markdown/markdown/serializers.py b/third_party/Python-Markdown/markdown/serializers.py
|
| deleted file mode 100644
|
| index 1e8d9dd288f00ea0d5e001a22eb5004001cbcbf5..0000000000000000000000000000000000000000
|
| --- a/third_party/Python-Markdown/markdown/serializers.py
|
| +++ /dev/null
|
| @@ -1,282 +0,0 @@
|
| -# markdown/searializers.py
|
| -#
|
| -# Add x/html serialization to Elementree
|
| -# Taken from ElementTree 1.3 preview with slight modifications
|
| -#
|
| -# Copyright (c) 1999-2007 by Fredrik Lundh. All rights reserved.
|
| -#
|
| -# fredrik@pythonware.com
|
| -# http://www.pythonware.com
|
| -#
|
| -# --------------------------------------------------------------------
|
| -# The ElementTree toolkit is
|
| -#
|
| -# Copyright (c) 1999-2007 by Fredrik Lundh
|
| -#
|
| -# By obtaining, using, and/or copying this software and/or its
|
| -# associated documentation, you agree that you have read, understood,
|
| -# and will comply with the following terms and conditions:
|
| -#
|
| -# Permission to use, copy, modify, and distribute this software and
|
| -# its associated documentation for any purpose and without fee is
|
| -# hereby granted, provided that the above copyright notice appears in
|
| -# all copies, and that both that copyright notice and this permission
|
| -# notice appear in supporting documentation, and that the name of
|
| -# Secret Labs AB or the author not be used in advertising or publicity
|
| -# pertaining to distribution of the software without specific, written
|
| -# prior permission.
|
| -#
|
| -# SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
|
| -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
|
| -# ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
|
| -# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
|
| -# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
| -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
| -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
| -# OF THIS SOFTWARE.
|
| -# --------------------------------------------------------------------
|
| -
|
| -
|
| -from __future__ import absolute_import
|
| -from __future__ import unicode_literals
|
| -from . import util
|
| -ElementTree = util.etree.ElementTree
|
| -QName = util.etree.QName
|
| -if hasattr(util.etree, 'test_comment'): # pragma: no cover
|
| - Comment = util.etree.test_comment
|
| -else: # pragma: no cover
|
| - Comment = util.etree.Comment
|
| -PI = util.etree.PI
|
| -ProcessingInstruction = util.etree.ProcessingInstruction
|
| -
|
| -__all__ = ['to_html_string', 'to_xhtml_string']
|
| -
|
| -HTML_EMPTY = ("area", "base", "basefont", "br", "col", "frame", "hr",
|
| - "img", "input", "isindex", "link", "meta" "param")
|
| -
|
| -try:
|
| - HTML_EMPTY = set(HTML_EMPTY)
|
| -except NameError: # pragma: no cover
|
| - pass
|
| -
|
| -_namespace_map = {
|
| - # "well-known" namespace prefixes
|
| - "http://www.w3.org/XML/1998/namespace": "xml",
|
| - "http://www.w3.org/1999/xhtml": "html",
|
| - "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
|
| - "http://schemas.xmlsoap.org/wsdl/": "wsdl",
|
| - # xml schema
|
| - "http://www.w3.org/2001/XMLSchema": "xs",
|
| - "http://www.w3.org/2001/XMLSchema-instance": "xsi",
|
| - # dublic core
|
| - "http://purl.org/dc/elements/1.1/": "dc",
|
| -}
|
| -
|
| -
|
| -def _raise_serialization_error(text): # pragma: no cover
|
| - raise TypeError(
|
| - "cannot serialize %r (type %s)" % (text, type(text).__name__)
|
| - )
|
| -
|
| -
|
| -def _encode(text, encoding):
|
| - try:
|
| - return text.encode(encoding, "xmlcharrefreplace")
|
| - except (TypeError, AttributeError): # pragma: no cover
|
| - _raise_serialization_error(text)
|
| -
|
| -
|
| -def _escape_cdata(text):
|
| - # escape character data
|
| - try:
|
| - # it's worth avoiding do-nothing calls for strings that are
|
| - # shorter than 500 character, or so. assume that's, by far,
|
| - # the most common case in most applications.
|
| - if "&" in text:
|
| - text = text.replace("&", "&")
|
| - if "<" in text:
|
| - text = text.replace("<", "<")
|
| - if ">" in text:
|
| - text = text.replace(">", ">")
|
| - return text
|
| - except (TypeError, AttributeError): # pragma: no cover
|
| - _raise_serialization_error(text)
|
| -
|
| -
|
| -def _escape_attrib(text):
|
| - # escape attribute value
|
| - try:
|
| - if "&" in text:
|
| - text = text.replace("&", "&")
|
| - if "<" in text:
|
| - text = text.replace("<", "<")
|
| - if ">" in text:
|
| - text = text.replace(">", ">")
|
| - if "\"" in text:
|
| - text = text.replace("\"", """)
|
| - if "\n" in text:
|
| - text = text.replace("\n", " ")
|
| - return text
|
| - except (TypeError, AttributeError): # pragma: no cover
|
| - _raise_serialization_error(text)
|
| -
|
| -
|
| -def _escape_attrib_html(text):
|
| - # escape attribute value
|
| - try:
|
| - if "&" in text:
|
| - text = text.replace("&", "&")
|
| - if "<" in text:
|
| - text = text.replace("<", "<")
|
| - if ">" in text:
|
| - text = text.replace(">", ">")
|
| - if "\"" in text:
|
| - text = text.replace("\"", """)
|
| - return text
|
| - except (TypeError, AttributeError): # pragma: no cover
|
| - _raise_serialization_error(text)
|
| -
|
| -
|
| -def _serialize_html(write, elem, qnames, namespaces, format):
|
| - tag = elem.tag
|
| - text = elem.text
|
| - if tag is Comment:
|
| - write("<!--%s-->" % _escape_cdata(text))
|
| - elif tag is ProcessingInstruction:
|
| - write("<?%s?>" % _escape_cdata(text))
|
| - else:
|
| - tag = qnames[tag]
|
| - if tag is None:
|
| - if text:
|
| - write(_escape_cdata(text))
|
| - for e in elem:
|
| - _serialize_html(write, e, qnames, None, format)
|
| - else:
|
| - write("<" + tag)
|
| - items = elem.items()
|
| - if items or namespaces:
|
| - items = sorted(items) # lexical order
|
| - for k, v in items:
|
| - if isinstance(k, QName):
|
| - k = k.text
|
| - if isinstance(v, QName):
|
| - v = qnames[v.text]
|
| - else:
|
| - v = _escape_attrib_html(v)
|
| - if qnames[k] == v and format == 'html':
|
| - # handle boolean attributes
|
| - write(" %s" % v)
|
| - else:
|
| - write(" %s=\"%s\"" % (qnames[k], v))
|
| - if namespaces:
|
| - items = namespaces.items()
|
| - items.sort(key=lambda x: x[1]) # sort on prefix
|
| - for v, k in items:
|
| - if k:
|
| - k = ":" + k
|
| - write(" xmlns%s=\"%s\"" % (k, _escape_attrib(v)))
|
| - if format == "xhtml" and tag.lower() in HTML_EMPTY:
|
| - write(" />")
|
| - else:
|
| - write(">")
|
| - if text:
|
| - if tag.lower() in ["script", "style"]:
|
| - write(text)
|
| - else:
|
| - write(_escape_cdata(text))
|
| - for e in elem:
|
| - _serialize_html(write, e, qnames, None, format)
|
| - if tag.lower() not in HTML_EMPTY:
|
| - write("</" + tag + ">")
|
| - if elem.tail:
|
| - write(_escape_cdata(elem.tail))
|
| -
|
| -
|
| -def _write_html(root,
|
| - encoding=None,
|
| - default_namespace=None,
|
| - format="html"):
|
| - assert root is not None
|
| - data = []
|
| - write = data.append
|
| - qnames, namespaces = _namespaces(root, default_namespace)
|
| - _serialize_html(write, root, qnames, namespaces, format)
|
| - if encoding is None:
|
| - return "".join(data)
|
| - else:
|
| - return _encode("".join(data))
|
| -
|
| -
|
| -# --------------------------------------------------------------------
|
| -# serialization support
|
| -
|
| -def _namespaces(elem, default_namespace=None):
|
| - # identify namespaces used in this tree
|
| -
|
| - # maps qnames to *encoded* prefix:local names
|
| - qnames = {None: None}
|
| -
|
| - # maps uri:s to prefixes
|
| - namespaces = {}
|
| - if default_namespace:
|
| - namespaces[default_namespace] = ""
|
| -
|
| - def add_qname(qname):
|
| - # calculate serialized qname representation
|
| - try:
|
| - if qname[:1] == "{":
|
| - uri, tag = qname[1:].split("}", 1)
|
| - prefix = namespaces.get(uri)
|
| - if prefix is None:
|
| - prefix = _namespace_map.get(uri)
|
| - if prefix is None:
|
| - prefix = "ns%d" % len(namespaces)
|
| - if prefix != "xml":
|
| - namespaces[uri] = prefix
|
| - if prefix:
|
| - qnames[qname] = "%s:%s" % (prefix, tag)
|
| - else:
|
| - qnames[qname] = tag # default element
|
| - else:
|
| - if default_namespace:
|
| - raise ValueError(
|
| - "cannot use non-qualified names with "
|
| - "default_namespace option"
|
| - )
|
| - qnames[qname] = qname
|
| - except TypeError: # pragma: no cover
|
| - _raise_serialization_error(qname)
|
| -
|
| - # populate qname and namespaces table
|
| - try:
|
| - iterate = elem.iter
|
| - except AttributeError:
|
| - iterate = elem.getiterator # cET compatibility
|
| - for elem in iterate():
|
| - tag = elem.tag
|
| - if isinstance(tag, QName) and tag.text not in qnames:
|
| - add_qname(tag.text)
|
| - elif isinstance(tag, util.string_type):
|
| - if tag not in qnames:
|
| - add_qname(tag)
|
| - elif tag is not None and tag is not Comment and tag is not PI:
|
| - _raise_serialization_error(tag)
|
| - for key, value in elem.items():
|
| - if isinstance(key, QName):
|
| - key = key.text
|
| - if key not in qnames:
|
| - add_qname(key)
|
| - if isinstance(value, QName) and value.text not in qnames:
|
| - add_qname(value.text)
|
| - text = elem.text
|
| - if isinstance(text, QName) and text.text not in qnames:
|
| - add_qname(text.text)
|
| - return qnames, namespaces
|
| -
|
| -
|
| -def to_html_string(element):
|
| - return _write_html(ElementTree(element).getroot(), format="html")
|
| -
|
| -
|
| -def to_xhtml_string(element):
|
| - return _write_html(ElementTree(element).getroot(), format="xhtml")
|
|
|