diff options
-rw-r--r-- | markdown/__init__.py | 10 | ||||
-rw-r--r-- | markdown/searializers.py (renamed from markdown/html4.py) | 47 | ||||
-rw-r--r-- | tests/extensions/extra/tables.html | 12 | ||||
-rw-r--r-- | tests/misc/attributes2.html | 6 | ||||
-rw-r--r-- | tests/misc/blank-block-quote.html | 2 | ||||
-rw-r--r-- | tests/test_apis.py | 12 |
6 files changed, 52 insertions, 37 deletions
diff --git a/markdown/__init__.py b/markdown/__init__.py index 9b964b7..762da31 100644 --- a/markdown/__init__.py +++ b/markdown/__init__.py @@ -43,7 +43,7 @@ from treeprocessors import build_treeprocessors from inlinepatterns import build_inlinepatterns from postprocessors import build_postprocessors from extensions import Extension -import html4 +from searializers import to_html_string, to_xhtml_string # For backwards compatibility in the 2.0.x series # The things defined in these modules started off in __init__.py so third @@ -67,10 +67,10 @@ class Markdown: } output_formats = { - 'html' : html4.to_html_string, - 'html4' : html4.to_html_string, - 'xhtml' : util.etree.tostring, - 'xhtml1': util.etree.tostring, + 'html' : to_html_string, + 'html4' : to_html_string, + 'xhtml' : to_xhtml_string, + 'xhtml1': to_xhtml_string, } def __init__(self, extensions=[], **kwargs): diff --git a/markdown/html4.py b/markdown/searializers.py index 611e628..39dcb56 100644 --- a/markdown/html4.py +++ b/markdown/searializers.py @@ -119,6 +119,8 @@ def _escape_attrib_html(text, encoding): try: if "&" in text: text = text.replace("&", "&") + if "<" in text: + text = text.replace("<", "<") if ">" in text: text = text.replace(">", ">") if "\"" in text: @@ -128,7 +130,7 @@ def _escape_attrib_html(text, encoding): _raise_serialization_error(text) -def _serialize_html(write, elem, encoding, qnames, namespaces): +def _serialize_html(write, elem, encoding, qnames, namespaces, format): tag = elem.tag text = elem.text if tag is Comment: @@ -141,7 +143,7 @@ def _serialize_html(write, elem, encoding, qnames, namespaces): if text: write(_escape_cdata(text, encoding)) for e in elem: - _serialize_html(write, e, encoding, qnames, None) + _serialize_html(write, e, encoding, qnames, None, format) else: write("<" + tag) items = elem.items() @@ -166,24 +168,28 @@ def _serialize_html(write, elem, encoding, qnames, namespaces): k.encode(encoding), _escape_attrib(v, encoding) )) - write(">") - tag = tag.lower() - if text: - if tag == "script" or tag == "style": - write(_encode(text, encoding)) - else: - write(_escape_cdata(text, encoding)) - for e in elem: - _serialize_html(write, e, encoding, qnames, None) - if tag not in HTML_EMPTY: - write("</" + tag + ">") + if format == "xhtml" and tag in HTML_EMPTY: + write(" />") + else: + write(">") + tag = tag.lower() + if text: + if tag == "script" or tag == "style": + write(_encode(text, encoding)) + else: + write(_escape_cdata(text, encoding)) + for e in elem: + _serialize_html(write, e, encoding, qnames, None, format) + if tag not in HTML_EMPTY: + write("</" + tag + ">") if elem.tail: write(_escape_cdata(elem.tail, encoding)) def write_html(root, f, # keyword arguments encoding="us-ascii", - default_namespace=None): + default_namespace=None, + format="html"): assert root is not None if not hasattr(f, "write"): f = open(f, "wb") @@ -194,7 +200,7 @@ def write_html(root, f, root, encoding, default_namespace ) _serialize_html( - write, root, encoding, qnames, namespaces + write, root, encoding, qnames, namespaces, format ) # -------------------------------------------------------------------- @@ -273,5 +279,14 @@ def to_html_string(element, encoding=None): data = [] file = dummy() file.write = data.append - write_html(ElementTree(element).getroot(),file,encoding) + write_html(ElementTree(element).getroot(), file, encoding, format="html") + return "".join(data) + +def to_xhtml_string(element, encoding=None): + class dummy: + pass + data = [] + file = dummy() + file.write = data.append + write_html(ElementTree(element).getroot(), file, encoding, format="xhtml") return "".join(data) diff --git a/tests/extensions/extra/tables.html b/tests/extensions/extra/tables.html index c931e6a..1d626da 100644 --- a/tests/extensions/extra/tables.html +++ b/tests/extensions/extra/tables.html @@ -85,13 +85,13 @@ </thead> <tbody> <tr> -<td align="left" /> +<td align="left"></td> <td align="center">Q</td> -<td align="right" /> +<td align="right"></td> </tr> <tr> <td align="left">W</td> -<td align="center" /> +<td align="center"></td> <td align="right">W</td> </tr> </tbody> @@ -106,13 +106,13 @@ </thead> <tbody> <tr> -<td /> +<td></td> <td>Q</td> -<td /> +<td></td> </tr> <tr> <td>W</td> -<td /> +<td></td> <td>W</td> </tr> </tbody> diff --git a/tests/misc/attributes2.html b/tests/misc/attributes2.html index 5971cc8..b78fee0 100644 --- a/tests/misc/attributes2.html +++ b/tests/misc/attributes2.html @@ -1,6 +1,6 @@ -<p id="TABLE.OF.CONTENTS" /> +<p id="TABLE.OF.CONTENTS"></p> <ul> -<li id="TABLEOFCONTENTS" /> +<li id="TABLEOFCONTENTS"></li> </ul> <p id="TABLEOFCONTENTS">Or in the middle of the text </p> -<p id="tableofcontents" />
\ No newline at end of file +<p id="tableofcontents"></p>
\ No newline at end of file diff --git a/tests/misc/blank-block-quote.html b/tests/misc/blank-block-quote.html index 23df17a..966078c 100644 --- a/tests/misc/blank-block-quote.html +++ b/tests/misc/blank-block-quote.html @@ -1,3 +1,3 @@ <p>aaaaaaaaaaa</p> -<blockquote /> +<blockquote></blockquote> <p>bbbbbbbbbbb</p>
\ No newline at end of file diff --git a/tests/test_apis.py b/tests/test_apis.py index eecfbf6..0de897a 100644 --- a/tests/test_apis.py +++ b/tests/test_apis.py @@ -277,7 +277,7 @@ class testETreeComments(unittest.TestCase): Test that ElementTree Comments work. These tests should only be a concern when using cElementTree with third - party serializers (including markdown's html4 serializer). While markdown + party serializers (including markdown's (x)html serializer). While markdown doesn't use ElementTree.Comment itself, we should certainly support any third party extensions which may. Therefore, these tests are included to ensure such support is maintained. @@ -301,14 +301,14 @@ class testETreeComments(unittest.TestCase): def testCommentSerialization(self): """ Test that an ElementTree Comment serializes properly. """ - self.assertEqual(markdown.html4.to_html_string(self.comment), + self.assertEqual(markdown.searializers.to_html_string(self.comment), '<!--foo-->') def testCommentPrettify(self): """ Test that an ElementTree Comment is prettified properly. """ pretty = markdown.treeprocessors.PrettifyTreeprocessor() pretty.run(self.comment) - self.assertEqual(markdown.html4.to_html_string(self.comment), + self.assertEqual(markdown.searializers.to_html_string(self.comment), '<!--foo-->\n') @@ -325,7 +325,7 @@ class testAtomicString(unittest.TestCase): p = markdown.util.etree.SubElement(tree, 'p') p.text = u'some *text*' new = self.inlineprocessor.run(tree) - self.assertEqual(markdown.html4.to_html_string(new), + self.assertEqual(markdown.searializers.to_html_string(new), '<div><p>some <em>text</em></p></div>') def testSimpleAtomicString(self): @@ -334,7 +334,7 @@ class testAtomicString(unittest.TestCase): p = markdown.util.etree.SubElement(tree, 'p') p.text = markdown.util.AtomicString(u'some *text*') new = self.inlineprocessor.run(tree) - self.assertEqual(markdown.html4.to_html_string(new), + self.assertEqual(markdown.searializers.to_html_string(new), '<div><p>some *text*</p></div>') def testNestedAtomicString(self): @@ -352,6 +352,6 @@ class testAtomicString(unittest.TestCase): span2.tail = markdown.util.AtomicString(u' *test*') span1.tail = markdown.util.AtomicString(u' *with*') new = self.inlineprocessor.run(tree) - self.assertEqual(markdown.html4.to_html_string(new), + self.assertEqual(markdown.searializers.to_html_string(new), '<div><p>*some* <span>*more* <span>*text* <span>*here*</span> *to*</span> *test*</span> *with*</p></div>') |