summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.creole2
-rw-r--r--creole/__init__.py34
-rw-r--r--creole/creole2html/emitter.py99
-rw-r--r--creole/creole2html/parser.py133
-rw-r--r--creole/creole2html/rules.py18
-rw-r--r--creole/creole2html/str2dict.py12
-rw-r--r--creole/exceptions.py2
-rw-r--r--creole/html2creole/emitter.py38
-rw-r--r--creole/html2rest/emitter.py48
-rw-r--r--creole/html2textile/emitter.py34
-rw-r--r--creole/html_parser/config.py4
-rw-r--r--creole/html_parser/parser.py79
-rw-r--r--creole/html_tools/deentity.py50
-rw-r--r--creole/html_tools/strip_html.py48
-rw-r--r--creole/html_tools/text_tools.py20
-rw-r--r--creole/py3compat.py23
-rw-r--r--creole/rest2html/clean_writer.py38
-rw-r--r--creole/setup_utils.py4
-rw-r--r--creole/shared/base_emitter.py43
-rw-r--r--creole/shared/document_tree.py43
-rw-r--r--creole/shared/example_macros.py2
-rw-r--r--creole/shared/html_parser.py9
-rw-r--r--creole/shared/markup_table.py2
-rw-r--r--creole/shared/unknown_tags.py14
-rw-r--r--demo.py19
-rwxr-xr-xsetup.py4
-rw-r--r--test2.py36
-rw-r--r--tests/__init__.py11
-rw-r--r--tests/run_all_tests.py26
-rw-r--r--tests/test_TODOs.py12
-rw-r--r--tests/test_creole2html.py73
-rw-r--r--tests/test_cross_compare_all.py26
-rw-r--r--tests/test_cross_compare_creole.py8
-rw-r--r--tests/test_cross_compare_rest.py10
-rw-r--r--tests/test_cross_compare_textile.py2
-rw-r--r--tests/test_html2creole.py8
-rw-r--r--tests/test_html2rest.py10
-rw-r--r--tests/test_html2textile.py8
-rw-r--r--tests/test_macros.py18
-rw-r--r--tests/test_rest2html.py10
-rw-r--r--tests/test_utils.py38
-rw-r--r--tests/utils/base_unittest.py67
-rw-r--r--tests/utils/utils.py16
43 files changed, 635 insertions, 566 deletions
diff --git a/README.creole b/README.creole
index d902958..a5cd38d 100644
--- a/README.creole
+++ b/README.creole
@@ -96,6 +96,8 @@ How to do this, read: https://code.google.com/p/python-creole/wiki/UseInSetup
= history
+* v0.9pre
+** Add Python v3 support (like http://python3porting.com/noconv.html strategy)
* v0.8.5
** Bugfix in html2creole: ignore links without href
* v0.8.4
diff --git a/creole/__init__.py b/creole/__init__.py
index d97db67..3afdba4 100644
--- a/creole/__init__.py
+++ b/creole/__init__.py
@@ -18,22 +18,22 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
-__version__ = (0, 8, 5)
+__version__ = (0, 9, 0, "pre")
__api__ = (1, 0) # Creole 1.0 spec - http://wikicreole.org/
import os
import sys
-
from creole.creole2html.emitter import HtmlEmitter
from creole.creole2html.parser import BlockRules, CreoleParser
from creole.html2creole.emitter import CreoleEmitter
from creole.html2rest.emitter import ReStructuredTextEmitter
from creole.html2textile.emitter import TextileEmitter
from creole.html_parser.parser import HtmlParser
+from creole.py3compat import TEXT_TYPE
# TODO: Add git date to __version__
@@ -47,10 +47,10 @@ def creole2html(markup_string, debug=False, parser_kwargs={}, emitter_kwargs={})
"""
convert creole markup into html code
- >>> creole2html(u'This is **creole //markup//**!')
- u'<p>This is <strong>creole <i>markup</i></strong>!</p>'
+ >>> creole2html('This is **creole //markup//**!')
+ '<p>This is <strong>creole <i>markup</i></strong>!</p>'
"""
- assert isinstance(markup_string, unicode), "given markup_string must be unicode!"
+ assert isinstance(markup_string, TEXT_TYPE), "given markup_string must be unicode!"
# Create document tree from creole markup
document = CreoleParser(markup_string, **parser_kwargs).parse()
@@ -58,13 +58,13 @@ def creole2html(markup_string, debug=False, parser_kwargs={}, emitter_kwargs={})
document.debug()
# Build html code from document tree
- #print "creole2html HtmlEmitter kwargs:", emitter_kwargs
+ #print("creole2html HtmlEmitter kwargs:", emitter_kwargs)
return HtmlEmitter(document, **emitter_kwargs).emit()
def parse_html(html_string, debug=False, **parser_kwargs):
""" create the document tree from html code """
- assert isinstance(html_string, unicode), "given html_string must be unicode!"
+ assert isinstance(html_string, TEXT_TYPE), "given html_string must be unicode!"
h2c = HtmlParser(debug, **parser_kwargs)
document_tree = h2c.feed(html_string)
@@ -77,8 +77,8 @@ def html2creole(html_string, debug=False, parser_kwargs={}, emitter_kwargs={}):
"""
convert html code into creole markup
- >>> html2creole(u'<p>This is <strong>creole <i>markup</i></strong>!</p>')
- u'This is **creole //markup//**!'
+ >>> html2creole('<p>This is <strong>creole <i>markup</i></strong>!</p>')
+ 'This is **creole //markup//**!'
"""
document_tree = parse_html(html_string, debug, **parser_kwargs)
@@ -91,8 +91,8 @@ def html2textile(html_string, debug=False, parser_kwargs={}, emitter_kwargs={}):
"""
convert html code into textile markup
- >>> html2textile(u'<p>This is <strong>textile <i>markup</i></strong>!</p>')
- u'This is *textile __markup__*!'
+ >>> html2textile('<p>This is <strong>textile <i>markup</i></strong>!</p>')
+ 'This is *textile __markup__*!'
"""
document_tree = parse_html(html_string, debug, **parser_kwargs)
@@ -105,8 +105,8 @@ def html2rest(html_string, debug=False, parser_kwargs={}, emitter_kwargs={}):
"""
convert html code into textile markup
- >>> html2rest(u'<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
- u'This is **ReStructuredText** *markup*!'
+ >>> html2rest('<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
+ 'This is **ReStructuredText** *markup*!'
"""
document_tree = parse_html(html_string, debug, **parser_kwargs)
@@ -117,6 +117,8 @@ def html2rest(html_string, debug=False, parser_kwargs={}, emitter_kwargs={}):
if __name__ == '__main__':
- print "runing local doctest..."
+ print("runing local doctest...")
import doctest
- print doctest.testmod()#verbose=True)
+ print(
+ doctest.testmod()#verbose=True
+ )
diff --git a/creole/creole2html/emitter.py b/creole/creole2html/emitter.py
index 23c9054..3bb58d6 100644
--- a/creole/creole2html/emitter.py
+++ b/creole/creole2html/emitter.py
@@ -8,15 +8,16 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+
+from __future__ import division, absolute_import, print_function, unicode_literals
from xml.sax.saxutils import escape
import sys
import traceback
-
from creole.creole2html.parser import CreoleParser
from creole.creole2html.str2dict import str2dict
+from creole.py3compat import TEXT_TYPE
class HtmlEmitter:
@@ -52,25 +53,25 @@ class HtmlEmitter:
return self.html_escape(node.content)
def separator_emit(self, node):
- return u'<hr />\n\n'
+ return '<hr />\n\n'
def paragraph_emit(self, node):
- return u'<p>%s</p>\n' % self.emit_children(node)
+ return '<p>%s</p>\n' % self.emit_children(node)
def _list_emit(self, node, list_type):
if node.parent.kind in ("document",):
# The first list item
- formatter = u''
+ formatter = ''
else:
- formatter = u'\n'
+ formatter = '\n'
if list_type == "li":
formatter += (
- u'%(i)s<%(t)s>%(c)s</%(t)s>'
+ '%(i)s<%(t)s>%(c)s</%(t)s>'
)
else:
formatter += (
- u'%(i)s<%(t)s>%(c)s\n'
+ '%(i)s<%(t)s>%(c)s\n'
'%(i)s</%(t)s>'
)
return formatter % {
@@ -80,30 +81,30 @@ class HtmlEmitter:
}
def bullet_list_emit(self, node):
- return self._list_emit(node, list_type=u"ul")
+ return self._list_emit(node, list_type="ul")
def number_list_emit(self, node):
- return self._list_emit(node, list_type=u"ol")
+ return self._list_emit(node, list_type="ol")
def list_item_emit(self, node):
- return self._list_emit(node, list_type=u"li")
+ return self._list_emit(node, list_type="li")
def table_emit(self, node):
- return u'<table>\n%s</table>\n' % self.emit_children(node)
+ return '<table>\n%s</table>\n' % self.emit_children(node)
def table_row_emit(self, node):
- return u'<tr>\n%s</tr>\n' % self.emit_children(node)
+ return '<tr>\n%s</tr>\n' % self.emit_children(node)
def table_cell_emit(self, node):
- return u'\t<td>%s</td>\n' % self.emit_children(node)
+ return '\t<td>%s</td>\n' % self.emit_children(node)
def table_head_emit(self, node):
- return u'\t<th>%s</th>\n' % self.emit_children(node)
+ return '\t<th>%s</th>\n' % self.emit_children(node)
#--------------------------------------------------------------------------
def _typeface(self, node, tag):
- return u'<%(tag)s>%(data)s</%(tag)s>' % {
+ return '<%(tag)s>%(data)s</%(tag)s>' % {
"tag": tag,
"data": self.emit_children(node),
}
@@ -120,7 +121,7 @@ class HtmlEmitter:
def subscript_emit(self, node):
return self._typeface(node, tag="sub")
def underline_emit(self, node):
- return self._typeface(node, tag="u")
+ return self._typeface(node, tag="")
def small_emit(self, node):
return self._typeface(node, tag="small")
def delete_emit(self, node):
@@ -129,11 +130,11 @@ class HtmlEmitter:
#--------------------------------------------------------------------------
def header_emit(self, node):
- return u'<h%d>%s</h%d>\n' % (
+ return '<h%d>%s</h%d>\n' % (
node.level, self.html_escape(node.content), node.level)
def preformatted_emit(self, node):
- return u'<pre>%s</pre>' % self.html_escape(node.content)
+ return '<pre>%s</pre>' % self.html_escape(node.content)
def link_emit(self, node):
target = node.content
@@ -142,18 +143,18 @@ class HtmlEmitter:
else:
inside = self.html_escape(target)
- return u'<a href="%s">%s</a>' % (
+ return '<a href="%s">%s</a>' % (
self.attr_escape(target), inside)
def image_emit(self, node):
target = node.content
text = self.attr_escape(self.get_text(node))
- return u'<img src="%s" title="%s" alt="%s" />' % (
+ return '<img src="%s" title="%s" alt="%s" />' % (
self.attr_escape(target), text, text)
def macro_emit(self, node):
- #print node.debug()
+ #print(node.debug())
macro_name = node.macro_name
text = node.content
macro = None
@@ -161,10 +162,10 @@ class HtmlEmitter:
args = node.macro_args
try:
macro_kwargs = str2dict(args)
- except ValueError, e:
+ except ValueError as e:
exc_info = sys.exc_info()
return self.error(
- u"Wrong macro arguments: %r for macro '%s' (maybe wrong macro tag syntax?)" % (
+ "Wrong macro arguments: %r for macro '%s' (maybe wrong macro tag syntax?)" % (
args, macro_name
),
exc_info
@@ -180,24 +181,24 @@ class HtmlEmitter:
if isinstance(self.macros, dict):
try:
macro = self.macros[macro_name]
- except KeyError, e:
+ except KeyError as e:
exc_info = sys.exc_info()
else:
try:
macro = getattr(self.macros, macro_name)
- except AttributeError, e:
+ except AttributeError as e:
exc_info = sys.exc_info()
if macro == None:
return self.error(
- u"Macro '%s' doesn't exist" % macro_name,
+ "Macro '%s' doesn't exist" % macro_name,
exc_info
)
try:
result = macro(**macro_kwargs)
- except TypeError, err:
- msg = u"Macro '%s' error: %s" % (macro_name, err)
+ except TypeError as err:
+ msg = "Macro '%s' error: %s" % (macro_name, err)
exc_info = sys.exc_info()
if self.verbose > 1:
# Inject more information about the macro in traceback
@@ -206,21 +207,21 @@ class HtmlEmitter:
filename = inspect.getfile(macro)
try:
sourceline = inspect.getsourcelines(macro)[0][0].strip()
- except IOError, err:
+ except IOError as err:
evalue = etype("%s (error getting sourceline: %s from %s)" % (evalue, err, filename))
else:
evalue = etype("%s (sourceline: %r from %s)" % (evalue, sourceline, filename))
exc_info = etype, evalue, etb
return self.error(msg, exc_info)
- except Exception, err:
+ except Exception as err:
return self.error(
- u"Macro '%s' error: %s" % (macro_name, err),
+ "Macro '%s' error: %s" % (macro_name, err),
exc_info=sys.exc_info()
)
- if not isinstance(result, unicode):
- msg = u"Macro '%s' doesn't return a unicode string!" % macro_name
+ if not isinstance(result, TEXT_TYPE):
+ msg = "Macro '%s' doesn't return a unicode string!" % macro_name
if self.verbose > 1:
msg += " - returns: %r, type %r" % (result, type(result))
return self.error(msg)
@@ -234,22 +235,22 @@ class HtmlEmitter:
def break_emit(self, node):
if node.parent.kind == "list_item":
- return u"<br />\n" + "\t" * node.parent.level
+ return "<br />\n" + "\t" * node.parent.level
elif node.parent.kind in ("table_head", "table_cell"):
- return u"<br />\n\t\t"
+ return "<br />\n\t\t"
else:
- return u"<br />\n"
+ return "<br />\n"
def line_emit(self, node):
- return u"\n"
+ return "\n"
def pre_block_emit(self, node):
""" pre block, with newline at the end """
- return u"<pre>%s</pre>\n" % self.html_escape(node.content)
+ return "<pre>%s</pre>\n" % self.html_escape(node.content)
def pre_inline_emit(self, node):
""" pre without newline at the end """
- return u"<tt>%s</tt>" % self.html_escape(node.content)
+ return "<tt>%s</tt>" % self.html_escape(node.content)
def default_emit(self, node):
"""Fallback function for emitting unknown nodes."""
@@ -257,11 +258,11 @@ class HtmlEmitter:
def emit_children(self, node):
"""Emit all the children of a node."""
- return u''.join([self.emit_node(child) for child in node.children])
+ return ''.join([self.emit_node(child) for child in node.children])
def emit_node(self, node):
"""Emit a single node."""
- #print "%s_emit: %r" % (node.kind, node.content)
+ #print("%s_emit: %r" % (node.kind, node.content))
emit = getattr(self, '%s_emit' % node.kind, self.default_emit)
return emit(node)
@@ -279,23 +280,23 @@ class HtmlEmitter:
self.stderr.write(exception)
if self.verbose > 0:
- return u"[Error: %s]\n" % text
+ return "[Error: %s]\n" % text
else:
# No error output
- return u""
+ return ""
if __name__ == "__main__":
- txt = u"""this is **bold** ok?
+ txt = """this is **bold** ok?
for example ** this sentence"""
- print "-" * 80
+ print("-" * 80)
# from creole_alt.creole import CreoleParser
p = CreoleParser(txt)
document = p.parse()
p.debug()
html = HtmlEmitter(document).emit()
- print html
- print "-" * 79
- print html.replace(" ", ".").replace("\n", "\\n\n")
+ print(html)
+ print("-" * 79)
+ print(html.replace(" ", ".").replace("\n", "\\n\n"))
diff --git a/creole/creole2html/parser.py b/creole/creole2html/parser.py
index 4848474..44ac6c4 100644
--- a/creole/creole2html/parser.py
+++ b/creole/creole2html/parser.py
@@ -22,12 +22,13 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
from creole.creole2html.rules import BlockRules, INLINE_FLAGS, INLINE_RULES, \
SpecialRules, InlineRules
+from creole.py3compat import TEXT_TYPE
from creole.shared.document_tree import DocNode, DebugList
@@ -59,7 +60,7 @@ class CreoleParser:
def __init__(self, raw, block_rules=BlockRules, blog_line_breaks=True):
- assert isinstance(raw, unicode)
+ assert isinstance(raw, TEXT_TYPE)
self.raw = raw
# setup block element rules:
@@ -109,7 +110,7 @@ class CreoleParser:
# same method needs several names, because of group names in regexps.
def _text_repl(self, groups):
-# print "_text_repl()", self.cur.kind
+# print("_text_repl()", self.cur.kind)
# self.debug_groups(groups)
if self.cur.kind in ('table', 'table_row', 'bullet_list', 'number_list'):
@@ -118,7 +119,7 @@ class CreoleParser:
if self.cur.kind in ('document', 'section', 'blockquote'):
self.cur = DocNode('paragraph', self.cur)
- text = groups.get('text', u"")
+ text = groups.get('text', "")
if groups.get('space'):
# use wiki style line breaks and seperate a new line with one space
@@ -128,7 +129,7 @@ class CreoleParser:
if groups.get('break') and self.cur.kind in ('paragraph',
'emphasis', 'strong', 'pre_inline'):
- self.last_text_break = DocNode('break', self.cur, u"")
+ self.last_text_break = DocNode('break', self.cur, "")
self.text = None
_break_repl = _text_repl
@@ -138,7 +139,7 @@ class CreoleParser:
"""Handle raw urls in text."""
if not groups.get('escaped_url'):
# this url is NOT escaped
- target = groups.get('url_target', u"")
+ target = groups.get('url_target', "")
node = DocNode('link', self.cur)
node.content = target
DocNode('text', node, node.content)
@@ -146,7 +147,7 @@ class CreoleParser:
else:
# this url is escaped, we render it as text
if self.text is None:
- self.text = DocNode('text', self.cur, u"")
+ self.text = DocNode('text', self.cur, "")
self.text.content += groups.get('url_target')
_url_target_repl = _url_repl
_url_proto_repl = _url_repl
@@ -154,8 +155,8 @@ class CreoleParser:
def _link_repl(self, groups):
"""Handle all kinds of links."""
- target = groups.get('link_target', u"")
- text = (groups.get('link_text', u"") or u"").strip()
+ target = groups.get('link_target', "")
+ text = (groups.get('link_text', "") or "").strip()
parent = self.cur
self.cur = DocNode('link', self.cur)
self.cur.content = target
@@ -177,13 +178,13 @@ class CreoleParser:
assert macro_type in ("macro_inline", "macro_block")
if text_key:
- macro_text = groups.get(text_key, u"").strip()
+ macro_text = groups.get(text_key, "").strip()
else:
macro_text = None
node = DocNode(macro_type, self.cur, macro_text)
node.macro_name = groups[name_key]
- node.macro_args = groups.get(args_key, u"").strip()
+ node.macro_args = groups.get(args_key, "").strip()
self.text = None
@@ -199,10 +200,10 @@ class CreoleParser:
self.cur = self.root
self._add_macro(
groups,
- macro_type=u"macro_block",
- name_key=u"macro_block_start",
- args_key=u"macro_block_args",
- text_key=u"macro_block_text",
+ macro_type="macro_block",
+ name_key="macro_block_start",
+ args_key="macro_block_args",
+ text_key="macro_block_text",
)
_macro_block_start_repl = _macro_block_repl
_macro_block_args_repl = _macro_block_repl
@@ -214,9 +215,9 @@ class CreoleParser:
"""
self._add_macro(
groups,
- macro_type=u"macro_inline",
- name_key=u"macro_tag_name",
- args_key=u"macro_tag_args",
+ macro_type="macro_inline",
+ name_key="macro_tag_name",
+ args_key="macro_tag_args",
text_key=None,
)
_macro_tag_name_repl = _macro_tag_repl
@@ -229,10 +230,10 @@ class CreoleParser:
"""
self._add_macro(
groups,
- macro_type=u"macro_inline",
- name_key=u"macro_inline_start",
- args_key=u"macro_inline_args",
- text_key=u"macro_inline_text",
+ macro_type="macro_inline",
+ name_key="macro_inline_start",
+ args_key="macro_inline_args",
+ text_key="macro_inline_text",
)
_macro_inline_start_repl = _macro_inline_repl
_macro_inline_args_repl = _macro_inline_repl
@@ -242,8 +243,8 @@ class CreoleParser:
def _image_repl(self, groups):
"""Handles images and attachemnts included in the page."""
- target = groups.get('image_target', u"").strip()
- text = (groups.get('image_text', u"") or u"").strip()
+ target = groups.get('image_target', "").strip()
+ text = (groups.get('image_text', "") or "").strip()
node = DocNode("image", self.cur, target)
DocNode('text', node, text or node.content)
self.text = None
@@ -256,8 +257,8 @@ class CreoleParser:
def _item_repl(self, groups):
""" List item """
- bullet = groups.get('item_head', u"")
- text = groups.get('item_text', u"")
+ bullet = groups.get('item_head', "")
+ text = groups.get('item_text', "")
if bullet[-1] == '#':
kind = 'number_list'
else:
@@ -315,7 +316,7 @@ class CreoleParser:
else:
text = m.group('head').strip('= ')
self.cur = DocNode('table_head', tr)
- self.text = DocNode('text', self.cur, u"")
+ self.text = DocNode('text', self.cur, "")
self.parse_inline(text)
self.cur = tb
@@ -324,7 +325,7 @@ class CreoleParser:
def _pre_block_repl(self, groups):
self._upto_block()
kind = groups.get('pre_block_kind', None)
- text = groups.get('pre_block_text', u"")
+ text = groups.get('pre_block_text', "")
def remove_tilde(m):
return m.group('indent') + m.group('rest')
text = self.pre_escape_re.sub(remove_tilde, text)
@@ -338,10 +339,10 @@ class CreoleParser:
def _line_repl(self, groups):
""" Transfer newline from the original markup into the html code """
self._upto_block()
- DocNode('line', self.cur, u"")
+ DocNode('line', self.cur, "")
def _pre_inline_repl(self, groups):
- text = groups.get('pre_inline_text', u"")
+ text = groups.get('pre_inline_text', "")
DocNode('pre_inline', self.cur, text)
self.text = None
_pre_inline_text_repl = _pre_inline_repl
@@ -401,13 +402,13 @@ class CreoleParser:
def _escape_repl(self, groups):
if self.text is None:
- self.text = DocNode('text', self.cur, u"")
- self.text.content += groups.get('escaped_char', u"")
+ self.text = DocNode('text', self.cur, "")
+ self.text.content += groups.get('escaped_char', "")
def _char_repl(self, groups):
if self.text is None:
- self.text = DocNode('text', self.cur, u"")
- self.text.content += groups.get('char', u"")
+ self.text = DocNode('text', self.cur, "")
+ self.text.content += groups.get('char', "")
#--------------------------------------------------------------------------
@@ -415,14 +416,14 @@ class CreoleParser:
"""Invoke appropriate _*_repl method. Called for every matched group."""
# def debug(groups):
-# from pprint import pformat
+# from pprint(import pformat)
# data = dict([
-# group for group in groups.iteritems() if group[1] is not None
+# group for group in groups.items() if group[1] is not None
# ])
-# print "%s\n" % pformat(data)
+# print("%s\n" % pformat(data))
groups = match.groupdict()
- for name, text in groups.iteritems():
+ for name, text in groups.items():
if text is not None:
#if name != "char": debug(groups)
replace_method = getattr(self, '_%s_repl' % name)
@@ -450,29 +451,29 @@ class CreoleParser:
"""
Display the current document tree
"""
- print "_" * 80
+ print("_" * 80)
if start_node == None:
start_node = self.root
- print " document tree:"
+ print(" document tree:")
else:
- print " tree from %s:" % start_node
+ print(" tree from %s:" % start_node)
- print "=" * 80
+ print("=" * 80)
def emit(node, ident=0):
for child in node.children:
- print u"%s%s: %r" % (u" " * ident, child.kind, child.content)
+ print("%s%s: %r" % (" " * ident, child.kind, child.content))
emit(child, ident + 4)
emit(start_node)
- print "*" * 80
+ print("*" * 80)
def debug_groups(self, groups):
- print "_" * 80
- print " debug groups:"
- for name, text in groups.iteritems():
+ print("_" * 80)
+ print(" debug groups:")
+ for name, text in groups.items():
if text is not None:
- print "%15s: %r" % (name, text)
- print "-" * 80
+ print("%15s: %r" % (name, text))
+ print("-" * 80)
@@ -480,11 +481,11 @@ class CreoleParser:
if __name__ == "__main__":
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
- print "-" * 80
+ print("-" * 80)
- txt = u"""one **line** and //jo//
+ txt = """one **line** and //jo//
second line
**third**
@@ -492,8 +493,8 @@ block 2a
block 2b
block 2c"""
- print txt
- print "-" * 80
+ print(txt)
+ print("-" * 80)
blog_line_breaks = False
@@ -505,19 +506,19 @@ block 2c"""
def display_match(match):
groups = match.groupdict()
- for name, text in groups.iteritems():
+ for name, text in groups.items():
if name != "char" and text != None:
- print "%20s: %r" % (name, text)
+ print("%20s: %r" % (name, text))
- parser = CreoleParser(u"", blog_line_breaks=blog_line_breaks)
+ parser = CreoleParser("", blog_line_breaks=blog_line_breaks)
- print "_" * 80
- print "merged block rules test:"
+ print("_" * 80)
+ print("merged block rules test:")
re.sub(parser.block_re, display_match, txt)
- print "_" * 80
- print "merged inline rules test:"
+ print("_" * 80)
+ print("merged inline rules test:")
re.sub(parser.inline_re, display_match, txt)
@@ -526,14 +527,14 @@ block 2c"""
rexp = re.compile(rule, flags)
rexp.sub(display_match, txt)
- print "_" * 80
- print "single block rules match test:"
+ print("_" * 80)
+ print("single block rules match test:")
block_rules = BlockRules()
test_single(block_rules.rules, block_rules.re_flags, txt)
- print "_" * 80
- print "single inline rules match test:"
+ print("_" * 80)
+ print("single inline rules match test:")
test_single(INLINE_RULES, INLINE_FLAGS, txt)
- print "---END---"
+ print("---END---")
diff --git a/creole/creole2html/rules.py b/creole/creole2html/rules.py
index cf5c908..1a9c152 100644
--- a/creole/creole2html/rules.py
+++ b/creole/creole2html/rules.py
@@ -9,7 +9,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
@@ -229,22 +229,22 @@ def _verify_rules(rules, flags):
rule_list = []
for rule in rules:
try:
-# print rule
+# print(rule)
re.compile(rule, flags)
# Try to merge the rules. e.g. Check if group named double used.
rule_list.append(rule)
re.compile('|'.join(rule_list), flags)
- except Exception, err:
- print " *** Error with rule:"
- print rule
- print " -" * 39
+ except Exception as err:
+ print(" *** Error with rule:")
+ print(rule)
+ print(" -" * 39)
raise
- print "Rule test ok."
+ print("Rule test ok.")
if __name__ == "__main__":
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
- print "-" * 80
+ print("-" * 80)
diff --git a/creole/creole2html/str2dict.py b/creole/creole2html/str2dict.py
index c7434ca..87e343c 100644
--- a/creole/creole2html/str2dict.py
+++ b/creole/creole2html/str2dict.py
@@ -11,10 +11,12 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import shlex
+from creole.py3compat import TEXT_TYPE, PY3
+
# For str2dict()
KEYWORD_MAP = {
@@ -30,16 +32,16 @@ def str2dict(raw_content, encoding="utf-8"):
>>> str2dict('key1="value1" key2="value2"')
{'key2': 'value2', 'key1': 'value1'}
- >>> str2dict(u'A="B" C=1 D=1.1 E=True F=False G=None')
+ >>> str2dict('A="B" C=1 D=1.1 E=True F=False G=None')
{'A': 'B', 'C': 1, 'E': True, 'D': '1.1', 'G': None, 'F': False}
>>> str2dict('''key1="'1'" key2='"2"' key3="""'3'""" ''')
{'key3': 3, 'key2': 2, 'key1': 1}
- >>> str2dict(u'unicode=True')
+ >>> str2dict('unicode=True')
{'unicode': True}
"""
- if isinstance(raw_content, unicode):
+ if not PY3 and isinstance(raw_content, TEXT_TYPE):
# shlex.split doesn't work with unicode?!?
raw_content = raw_content.encode(encoding)
@@ -66,4 +68,4 @@ def str2dict(raw_content, encoding="utf-8"):
if __name__ == "__main__":
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/exceptions.py b/creole/exceptions.py
index cc42d26..44cddff 100644
--- a/creole/exceptions.py
+++ b/creole/exceptions.py
@@ -9,7 +9,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
class DocutilsImportError(ImportError):
pass
diff --git a/creole/html2creole/emitter.py b/creole/html2creole/emitter.py
index 051574a..34c8b76 100644
--- a/creole/html2creole/emitter.py
+++ b/creole/html2creole/emitter.py
@@ -10,7 +10,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import posixpath
from creole.shared.base_emitter import BaseEmitter
@@ -36,13 +36,13 @@ class CreoleEmitter(BaseEmitter):
def blockdata_pre_emit(self, node):
""" pre block -> with newline at the end """
- return u"{{{%s}}}\n" % self.deentity.replace_all(node.content)
+ return "{{{%s}}}\n" % self.deentity.replace_all(node.content)
def inlinedata_pre_emit(self, node):
""" a pre inline block -> no newline at the end """
- return u"{{{%s}}}" % self.deentity.replace_all(node.content)
+ return "{{{%s}}}" % self.deentity.replace_all(node.content)
def blockdata_pass_emit(self, node):
- return u"%s\n\n" % node.content
+ return "%s\n\n" % node.content
return node.content
#--------------------------------------------------------------------------
@@ -55,12 +55,12 @@ class CreoleEmitter(BaseEmitter):
def br_emit(self, node):
if self._inner_list != "":
- return u"\\\\"
+ return "\\\\"
else:
- return u"\n"
+ return "\n"
def headline_emit(self, node):
- return u"%s %s\n\n" % (u"=" * node.level, self.emit_children(node))
+ return "%s %s\n\n" % ("=" * node.level, self.emit_children(node))
#--------------------------------------------------------------------------
@@ -90,7 +90,7 @@ class CreoleEmitter(BaseEmitter):
#--------------------------------------------------------------------------
def hr_emit(self, node):
- return u"----\n\n"
+ return "----\n\n"
def a_emit(self, node):
link_text = self.emit_children(node)
@@ -100,15 +100,15 @@ class CreoleEmitter(BaseEmitter):
# e.g.: <a name="anchor-one">foo</a>
return link_text
if link_text == url:
- return u"[[%s]]" % url
+ return "[[%s]]" % url
else:
- return u"[[%s|%s]]" % (url, link_text)
+ return "[[%s|%s]]" % (url, link_text)
def img_emit(self, node):
src = node.attrs["src"]
if src.split(':')[0] == 'data':
- return u""
+ return ""
title = node.attrs.get("title", "")
alt = node.attrs.get("alt", "")
@@ -120,7 +120,7 @@ class CreoleEmitter(BaseEmitter):
if text == "": # Use filename as picture text
text = posixpath.basename(src)
- return u"{{%s|%s}}" % (src, text)
+ return "{{%s|%s}}" % (src, text)
#--------------------------------------------------------------------------
@@ -145,12 +145,12 @@ class CreoleEmitter(BaseEmitter):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
# import sys;sys.exit()
from creole.html_parser.parser import HtmlParser
- data = u"""
+ data = """
<ul>
<li><p>item 1</p>
<ul>
@@ -167,7 +167,7 @@ if __name__ == '__main__':
"""
-# print data.strip()
+# print(data.strip())
h2c = HtmlParser(
debug=True
)
@@ -178,7 +178,7 @@ if __name__ == '__main__':
debug=True
)
content = e.emit()
- print "*" * 79
- print content
- print "*" * 79
- print content.replace(" ", ".").replace("\n", "\\n\n")
+ print("*" * 79)
+ print(content)
+ print("*" * 79)
+ print(content.replace(" ", ".").replace("\n", "\\n\n"))
diff --git a/creole/html2rest/emitter.py b/creole/html2rest/emitter.py
index 0963722..fc42282 100644
--- a/creole/html2rest/emitter.py
+++ b/creole/html2rest/emitter.py
@@ -13,7 +13,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import posixpath
from creole.html_parser.config import BLOCK_TAGS
@@ -60,17 +60,17 @@ class ReStructuredTextEmitter(BaseEmitter):
def inlinedata_pre_emit(self, node):
""" a pre inline block -> no newline at the end """
- return u"<pre>%s</pre>" % self.deentity.replace_all(node.content)
+ return "<pre>%s</pre>" % self.deentity.replace_all(node.content)
def blockdata_pass_emit(self, node):
- return u"%s\n\n" % node.content
+ return "%s\n\n" % node.content
return node.content
#--------------------------------------------------------------------------
def emit_children(self, node):
"""Emit all the children of a node."""
- return u"".join(self.emit_children_list(node))
+ return "".join(self.emit_children_list(node))
def emit(self):
"""Emit the document represented by self.root DOM tree."""
@@ -81,19 +81,19 @@ class ReStructuredTextEmitter(BaseEmitter):
result = self.emit_children(node)
if self._substitution_data:
# add rest at the end
- result += u"%s\n\n" % self._get_block_data()
+ result += "%s\n\n" % self._get_block_data()
return result
def emit_node(self, node):
- result = u""
+ result = ""
if self._substitution_data and node.parent == self.root:
- result += u"%s\n\n" % self._get_block_data()
+ result += "%s\n\n" % self._get_block_data()
result += super(ReStructuredTextEmitter, self).emit_node(node)
return result
def p_emit(self, node):
- return u"%s\n\n" % self.emit_children(node)
+ return "%s\n\n" % self.emit_children(node)
HEADLINE_DATA = {
1:("=", True),
@@ -163,7 +163,7 @@ class ReStructuredTextEmitter(BaseEmitter):
#--------------------------------------------------------------------------
def hr_emit(self, node):
- return u"----\n\n"
+ return "----\n\n"
def _should_do_substitution(self, node):
node = node.parent
@@ -182,18 +182,18 @@ class ReStructuredTextEmitter(BaseEmitter):
if self._should_do_substitution(node):
# make a hyperlink reference
self._substitution_data.append(
- u".. _%s: %s" % (link_text, url)
+ ".. _%s: %s" % (link_text, url)
)
return "`%s`_" % link_text
# create a inline hyperlink
- return u"`%s <%s>`_" % (link_text, url)
+ return "`%s <%s>`_" % (link_text, url)
def img_emit(self, node):
src = node.attrs["src"]
if src.split(':')[0] == 'data':
- return u""
+ return ""
title = node.attrs.get("title", "")
alt = node.attrs.get("alt", "")
@@ -206,21 +206,21 @@ class ReStructuredTextEmitter(BaseEmitter):
substitution_text = posixpath.basename(src)
self._substitution_data.append(
- u".. |%s| image:: %s" % (substitution_text, src)
+ ".. |%s| image:: %s" % (substitution_text, src)
)
- return u"|%s|" % substitution_text
+ return "|%s|" % substitution_text
#--------------------------------------------------------------------------
def code_emit(self, node):
- return u"``%s``" % self._emit_content(node)
+ return "``%s``" % self._emit_content(node)
#--------------------------------------------------------------------------
def li_emit(self, node):
content = self.emit_children(node).strip("\n")
- result = u"\n%s%s %s\n" % (
+ result = "\n%s%s %s\n" % (
" " * (node.level - 1), self._list_markup, content
)
return result
@@ -253,17 +253,17 @@ class ReStructuredTextEmitter(BaseEmitter):
)
self.emit_children(node)
content = self._table.get_rest_table()
- return u"%s\n\n" % content
+ return "%s\n\n" % content
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
# import sys;sys.exit()
from creole.html_parser.parser import HtmlParser
- data = u"""<p>A nested bullet lists:</p>
+ data = """<p>A nested bullet lists:</p>
<ul>
<li><p>item 1</p>
<ul>
@@ -288,7 +288,7 @@ if __name__ == '__main__':
<p>5 <img alt="Image without files ext?" src="/path1/path2/image" /> five</p>
"""
- print data
+ print(data)
h2c = HtmlParser(
# debug=True
)
@@ -299,8 +299,8 @@ if __name__ == '__main__':
debug=True
)
content = e.emit()
- print "*" * 79
- print content
- print "*" * 79
- print content.replace(" ", ".").replace("\n", "\\n\n")
+ print("*" * 79)
+ print(content)
+ print("*" * 79)
+ print(content.replace(" ", ".").replace("\n", "\\n\n"))
diff --git a/creole/html2textile/emitter.py b/creole/html2textile/emitter.py
index a7aa081..44a3a2f 100644
--- a/creole/html2textile/emitter.py
+++ b/creole/html2textile/emitter.py
@@ -10,7 +10,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import posixpath
from creole.shared.base_emitter import BaseEmitter
@@ -37,23 +37,23 @@ class TextileEmitter(BaseEmitter):
def blockdata_pre_emit(self, node):
""" pre block -> with newline at the end """
- return u"<pre>%s</pre>\n" % self.deentity.replace_all(node.content)
+ return "<pre>%s</pre>\n" % self.deentity.replace_all(node.content)
def inlinedata_pre_emit(self, node):
""" a pre inline block -> no newline at the end """
- return u"<pre>%s</pre>" % self.deentity.replace_all(node.content)
+ return "<pre>%s</pre>" % self.deentity.replace_all(node.content)
def blockdata_pass_emit(self, node):
- return u"%s\n\n" % node.content
+ return "%s\n\n" % node.content
return node.content
#--------------------------------------------------------------------------
def p_emit(self, node):
- return u"%s\n\n" % self.emit_children(node)
+ return "%s\n\n" % self.emit_children(node)
def headline_emit(self, node):
- return u"h%i. %s\n\n" % (node.level, self.emit_children(node))
+ return "h%i. %s\n\n" % (node.level, self.emit_children(node))
#--------------------------------------------------------------------------
@@ -91,18 +91,18 @@ class TextileEmitter(BaseEmitter):
#--------------------------------------------------------------------------
def hr_emit(self, node):
- return u"----\n\n"
+ return "----\n\n"
def a_emit(self, node):
link_text = self.emit_children(node)
url = node.attrs["href"]
- return u'"%s":%s' % (link_text, url)
+ return '"%s":%s' % (link_text, url)
def img_emit(self, node):
src = node.attrs["src"]
if src.split(':')[0] == 'data':
- return u""
+ return ""
title = node.attrs.get("title", "")
alt = node.attrs.get("alt", "")
@@ -114,7 +114,7 @@ class TextileEmitter(BaseEmitter):
if text == "": # Use filename as picture text
text = posixpath.basename(src)
- return u"!%s(%s)!" % (src, text)
+ return "!%s(%s)!" % (src, text)
#--------------------------------------------------------------------------
@@ -133,12 +133,12 @@ class TextileEmitter(BaseEmitter):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
# import sys;sys.exit()
from creole.html_parser.parser import HtmlParser
- data = u"""
+ data = """
<h1>Textile</h1>
<table>
<tr>
@@ -152,7 +152,7 @@ if __name__ == '__main__':
</table>
"""
-# print data.strip()
+# print(data.strip())
h2c = HtmlParser(
debug=True
)
@@ -163,7 +163,7 @@ if __name__ == '__main__':
debug=True
)
content = e.emit()
- print "*" * 79
- print content
- print "*" * 79
- print content.replace(" ", ".").replace("\n", "\\n\n")
+ print("*" * 79)
+ print(content)
+ print("*" * 79)
+ print(content.replace(" ", ".").replace("\n", "\\n\n"))
diff --git a/creole/html_parser/config.py b/creole/html_parser/config.py
index 80ad71a..9790833 100644
--- a/creole/html_parser/config.py
+++ b/creole/html_parser/config.py
@@ -11,13 +11,13 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
BLOCK_TAGS = (
"address", "blockquote", "center", "dir", "div", "dl", "fieldset",
"form",
"h1", "h2", "h3", "h4", "h5", "h6",
- "hr", "ins", "isindex", "menu", "noframes", "noscript",
+ "hr", "ins", "isindex", "men", "noframes", "noscript",
"ul", "ol", "li", "table", "th", "tr", "td",
"p", "pre",
"br"
diff --git a/creole/html_parser/parser.py b/creole/html_parser/parser.py
index 41cf108..4bf698c 100644
--- a/creole/html_parser/parser.py
+++ b/creole/html_parser/parser.py
@@ -10,14 +10,15 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
+import sys
import warnings
-from HTMLParser import HTMLParser
from creole.html_parser.config import BLOCK_TAGS, IGNORE_TAGS
from creole.html_tools.strip_html import strip_html
+from creole.py3compat import TEXT_TYPE, BINARY_TYPE
from creole.shared.document_tree import DocNode, DebugList
from creole.shared.html_parser import HTMLParser2
@@ -51,32 +52,32 @@ class HtmlParser(HTMLParser2):
parse html code and create a document tree.
>>> p = HtmlParser()
- >>> p.feed(u"<p>html <strong>code</strong></p>")
+ >>> p.feed("<p>html <strong>code</strong></p>")
<DocNode document: None>
>>> p.debug()
________________________________________________________________________________
document tree:
================================================================================
p
- data: u'html '
+ data: 'html '
strong
- data: u'code'
+ data: 'code'
********************************************************************************
>>> p = HtmlParser()
- >>> p.feed(u"<p>html1 <script>var foo='<em>BAR</em>';</script> html2</p>")
+ >>> p.feed("<p>html1 <script>var foo='<em>BAR</em>';</script> html2</p>")
<DocNode document: None>
>>> p.debug()
________________________________________________________________________________
document tree:
================================================================================
p
- data: u'html1 '
+ data: 'html1 '
script
- data: u"var foo='<em>BAR"
- data: u'</em>'
- data: u"';"
- data: u' html2'
+ data: "var foo='<em>BAR"
+ data: '</em>'
+ data: "';"
+ data: ' html2'
********************************************************************************
"""
# placeholder html tag for pre cutout areas:
@@ -104,11 +105,11 @@ class HtmlParser(HTMLParser2):
def _pre_cut(self, data, type, placeholder):
if self.debugging:
- print "append blockdata: %r" % data
- assert isinstance(data, unicode), "blockdata is not unicode"
+ print("append blockdata: %r" % data)
+ assert isinstance(data, TEXT_TYPE), "blockdata is not unicode"
self.blockdata.append(data)
id = len(self.blockdata) - 1
- return u'<%s type="%s" id="%s" />' % (placeholder, type, id)
+ return '<%s type="%s" id="%s" />' % (placeholder, type, id)
def _pre_pre_inline_cut(self, groups):
return self._pre_cut(groups["pre_inline"], "pre", self._inline_placeholder)
@@ -124,17 +125,17 @@ class HtmlParser(HTMLParser2):
def _pre_cut_out(self, match):
groups = match.groupdict()
- for name, text in groups.iteritems():
+ for name, text in groups.items():
if text is not None:
if self.debugging:
- print "%15s: %r (%r)" % (name, text, match.group(0))
+ print("%15s: %r (%r)" % (name, text, match.group(0)))
method = getattr(self, '_pre_%s_cut' % name)
return method(groups)
# data = match.group("data")
def feed(self, raw_data):
- assert isinstance(raw_data, unicode), "feed data must be unicode!"
+ assert isinstance(raw_data, TEXT_TYPE), "feed data must be unicode!"
data = raw_data.strip()
# cut out <pre> and <tt> areas block tag areas
@@ -145,17 +146,17 @@ class HtmlParser(HTMLParser2):
data = strip_html(data)
if self.debugging:
- print "_" * 79
- print "raw data:"
- print repr(raw_data)
- print " -" * 40
- print "cleaned data:"
- print data
- print "-" * 79
-# print clean_data.replace(">", ">\n")
-# print "-"*79
-
- HTMLParser.feed(self, data)
+ print("_" * 79)
+ print("raw data:")
+ print(repr(raw_data))
+ print(" -" * 40)
+ print("cleaned data:")
+ print(data)
+ print("-" * 79)
+# print(clean_data.replace(">", ">\n"))
+# print("-"*79)
+
+ HTMLParser2.feed(self, data)
return self.root
@@ -209,7 +210,7 @@ class HtmlParser(HTMLParser2):
def handle_data(self, data):
self.debug_msg("data", "%r" % data)
- if isinstance(data, str):
+ if isinstance(data, BINARY_TYPE):
data = unicode(data)
DocNode("data", self.cur, content=data)
@@ -260,24 +261,24 @@ class HtmlParser(HTMLParser2):
def debug_msg(self, method, txt):
if not self.debugging:
return
- print "%-8s %8s: %s" % (self.getpos(), method, txt)
+ print("%-8s %8s: %s" % (self.getpos(), method, txt))
def debug(self, start_node=None):
"""
Display the current document tree
"""
- print "_" * 80
+ print("_" * 80)
if start_node == None:
start_node = self.root
- print " document tree:"
+ print(" document tree:")
else:
- print " tree from %s:" % start_node
+ print(" tree from %s:" % start_node)
- print "=" * 80
+ print("=" * 80)
def emit(node, ident=0):
for child in node.children:
- txt = u"%s%s" % (u" " * ident, child.kind)
+ txt = "%s%s" % (" " * ident, child.kind)
if child.content:
txt += ": %r" % child.content
@@ -288,18 +289,18 @@ class HtmlParser(HTMLParser2):
if child.level != None:
txt += " - level: %r" % child.level
- print txt
+ print(txt)
emit(child, ident + 4)
emit(start_node)
- print "*" * 80
+ print("*" * 80)
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
# p = HtmlParser(debug=True)
-# p.feed(u"""\
+# p.feed("""\
#<p><span>in span</span><br />
#<code>in code</code></p>
#""")
diff --git a/creole/html_tools/deentity.py b/creole/html_tools/deentity.py
index eff61fb..7a6ff1a 100644
--- a/creole/html_tools/deentity.py
+++ b/creole/html_tools/deentity.py
@@ -1,7 +1,6 @@
#!/usr/bin/env python
# coding: utf-8
-
"""
python-creole utils
~~~~~~~~~~~~~~~~~~~
@@ -11,10 +10,15 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
-import htmlentitydefs
+try:
+ import htmlentitydefs as entities
+except ImportError:
+ from html import entities # python 3
+
+from creole.py3compat import PY3
entities_rules = '|'.join([
@@ -22,7 +26,7 @@ entities_rules = '|'.join([
r"(&\#x(?P<hex>[a-fA-F0-9]+);)",
r"(&(?P<named>[a-zA-Z]+);)",
])
-#print entities_rules
+#print(entities_rules)
entities_regex = re.compile(
entities_rules, re.VERBOSE | re.UNICODE | re.MULTILINE
)
@@ -33,44 +37,52 @@ class Deentity(object):
replace html entity
>>> d = Deentity()
- >>> d.replace_all(u"-=[&nbsp;&gt;&#62;&#x3E;nice&lt;&#60;&#x3C;&nbsp;]=-")
- u'-=[ >>>nice<<< ]=-'
+ >>> d.replace_all("-=[&nbsp;&gt;&#62;&#x3E;nice&lt;&#60;&#x3C;&nbsp;]=-")
+ '-=[ >>>nice<<< ]=-'
- >>> d.replace_all(u"-=[M&uuml;hlheim]=-") # uuml - latin small letter u with diaeresis
- u'-=[M\\xfchlheim]=-'
+ >>> d.replace_all("-=[M&uuml;hlheim]=-") # uuml - latin small letter u with diaeresis
+ '-=[M\\xfchlheim]=-'
>>> d.replace_number("126")
- u'~'
+ '~'
>>> d.replace_hex("7E")
- u'~'
+ '~'
>>> d.replace_named("amp")
- u'&'
+ '&'
"""
def replace_number(self, text):
""" unicode number entity """
unicode_no = int(text)
- return unichr(unicode_no)
+ if PY3:
+ return chr(unicode_no)
+ else:
+ return unichr(unicode_no)
def replace_hex(self, text):
""" hex entity """
unicode_no = int(text, 16)
- return unichr(unicode_no)
+ if PY3:
+ return chr(unicode_no)
+ else:
+ return unichr(unicode_no)
def replace_named(self, text):
""" named entity """
if text == "nbsp":
# Non breaking spaces is not in htmlentitydefs
- return u" "
+ return " "
else:
- codepoint = htmlentitydefs.name2codepoint[text]
- character = unichr(codepoint)
- return character
+ codepoint = entities.name2codepoint[text]
+ if PY3:
+ return chr(codepoint)
+ else:
+ return unichr(codepoint)
def replace_all(self, content):
""" replace all html entities form the given text. """
def replace_entity(match):
groups = match.groupdict()
- for name, text in groups.iteritems():
+ for name, text in groups.items():
if text is not None:
replace_method = getattr(self, 'replace_%s' % name)
return replace_method(text)
@@ -83,4 +95,4 @@ class Deentity(object):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/html_tools/strip_html.py b/creole/html_tools/strip_html.py
index 8bcf577..60216f9 100644
--- a/creole/html_tools/strip_html.py
+++ b/creole/html_tools/strip_html.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
@@ -38,42 +38,42 @@ def strip_html(html_code):
"""
Delete whitespace from html code. Doesn't recordnize preformatted blocks!
- >>> strip_html(u' <p> one \\n two </p>')
- u'<p>one two</p>'
+ >>> strip_html(' <p> one \\n two </p>')
+ '<p>one two</p>'
- >>> strip_html(u'<p><strong><i>bold italics</i></strong></p>')
- u'<p><strong><i>bold italics</i></strong></p>'
+ >>> strip_html('<p><strong><i>bold italics</i></strong></p>')
+ '<p><strong><i>bold italics</i></strong></p>'
- >>> strip_html(u'<li> Force <br /> \\n linebreak </li>')
- u'<li>Force<br />linebreak</li>'
+ >>> strip_html('<li> Force <br /> \\n linebreak </li>')
+ '<li>Force<br />linebreak</li>'
- >>> strip_html(u'one <i>two \\n <strong> \\n three \\n </strong></i>')
- u'one <i>two <strong>three</strong> </i>'
+ >>> strip_html('one <i>two \\n <strong> \\n three \\n </strong></i>')
+ 'one <i>two <strong>three</strong> </i>'
- >>> strip_html(u'<p>a <unknown tag /> foobar </p>')
- u'<p>a <unknown tag /> foobar</p>'
+ >>> strip_html('<p>a <unknown tag /> foobar </p>')
+ '<p>a <unknown tag /> foobar</p>'
- >>> strip_html(u'<p>a <pre> preformated area </pre> foo </p>')
- u'<p>a<pre>preformated area</pre>foo</p>'
+ >>> strip_html('<p>a <pre> preformated area </pre> foo </p>')
+ '<p>a<pre>preformated area</pre>foo</p>'
- >>> strip_html(u'<p>a <img src="/image.jpg" /> image.</p>')
- u'<p>a <img src="/image.jpg" /> image.</p>'
+ >>> strip_html('<p>a <img src="/image.jpg" /> image.</p>')
+ '<p>a <img src="/image.jpg" /> image.</p>'
"""
def strip_tag(match):
block = match.group(0)
- end_tag = match.group("end") in ("/", u"/")
- startend_tag = match.group("startend") in ("/", u"/")
+ end_tag = match.group("end") in ("/", "/")
+ startend_tag = match.group("startend") in ("/", "/")
tag = match.group("tag")
-# print "_"*40
-# print match.groupdict()
-# print "block.......: %r" % block
-# print "end_tag.....:", end_tag
-# print "startend_tag:", startend_tag
-# print "tag.........: %r" % tag
+# print("_"*40)
+# print(match.groupdict())
+# print("block.......: %r" % block)
+# print("end_tag.....:", end_tag)
+# print("startend_tag:", startend_tag)
+# print("tag.........: %r" % tag)
if tag in BLOCK_TAGS:
return block.strip()
@@ -110,4 +110,4 @@ def strip_html(html_code):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/html_tools/text_tools.py b/creole/html_tools/text_tools.py
index bf974fc..28be3c9 100644
--- a/creole/html_tools/text_tools.py
+++ b/creole/html_tools/text_tools.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
@@ -21,17 +21,17 @@ def clean_whitespace(txt):
"""
Special whitespaces cleanup
- >>> clean_whitespace(u"\\n\\nfoo bar\\n\\n")
- u'foo bar\\n'
+ >>> clean_whitespace("\\n\\nfoo bar\\n\\n")
+ 'foo bar\\n'
- >>> clean_whitespace(u" foo bar \\n \\n")
- u' foo bar\\n'
+ >>> clean_whitespace(" foo bar \\n \\n")
+ ' foo bar\\n'
- >>> clean_whitespace(u" \\n \\n foo bar ")
- u' foo bar '
+ >>> clean_whitespace(" \\n \\n foo bar ")
+ ' foo bar '
- >>> clean_whitespace(u"foo bar")
- u'foo bar'
+ >>> clean_whitespace("foo bar")
+ 'foo bar'
"""
def cleanup(match):
start, txt, end = match.groups()
@@ -53,4 +53,4 @@ def clean_whitespace(txt):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/py3compat.py b/creole/py3compat.py
new file mode 100644
index 0000000..6c7facb
--- /dev/null
+++ b/creole/py3compat.py
@@ -0,0 +1,23 @@
+# coding: utf-8
+
+"""
+ Helper to support Python v2 and v3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ See also:
+ http://python3porting.com
+ https://bitbucket.org/gutworth/six/src/tip/six.py
+ http://packages.python.org/six/
+"""
+
+import sys
+
+# True if we are running on Python 3.
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+ TEXT_TYPE = str
+ BINARY_TYPE = bytes
+else:
+ TEXT_TYPE = unicode
+ BINARY_TYPE = str
diff --git a/creole/rest2html/clean_writer.py b/creole/rest2html/clean_writer.py
index e6611b3..cbeec70 100644
--- a/creole/rest2html/clean_writer.py
+++ b/creole/rest2html/clean_writer.py
@@ -16,7 +16,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
#import warnings
import sys
@@ -34,9 +34,13 @@ except ImportError:
" Please install: http://pypi.python.org/pypi/docutils"
) % evalue
evalue = etype(msg)
-# evalue.docutils = False #
- raise DocutilsImportError, evalue, etb
-# raise etype, evalue, etb
+
+ # Doesn't work with Python 3:
+ # http://www.python-forum.de/viewtopic.php?f=1&t=27507
+ # raise DocutilsImportError, evalue, etb
+
+ raise DocutilsImportError(msg)
+
DEBUG = False
@@ -75,7 +79,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object):
if tagname in IGNORE_TAGS:
if DEBUG:
- print "ignore tag %r" % tagname
+ print("ignore tag %r" % tagname)
return ""
parts = [tagname]
@@ -98,9 +102,9 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object):
self.attval(unicode(value))))
if DEBUG:
- print "Tag %r - ids: %r - attributes: %r - parts: %r" % (
+ print("Tag %r - ids: %r - attributes: %r - parts: %r" % (
tagname, getattr(node, "ids", "-"), attributes, parts
- )
+ ))
if empty:
infix = ' /'
@@ -108,7 +112,7 @@ class CleanHTMLTranslator(html4css1.HTMLTranslator, object):
infix = ''
html = '<%s%s>%s' % (' '.join(parts), infix, suffix)
if DEBUG:
- print "startag html: %r" % html
+ print("startag html: %r" % html)
return html
def visit_section(self, node):
@@ -166,11 +170,11 @@ def rest2html(content):
"""
Convert reStructuredText markup to clean html code: No extra div, class or ids.
- >>> rest2html(u"- bullet list")
- u'<ul>\\n<li>bullet list</li>\\n</ul>\\n'
+ >>> rest2html("- bullet list")
+ '<ul>\\n<li>bullet list</li>\\n</ul>\\n'
- >>> rest2html(u"A ReSt link to `PyLucid CMS <http://www.pylucid.org>`_ :)")
- u'<p>A ReSt link to <a href="http://www.pylucid.org">PyLucid CMS</a> :)</p>\\n'
+ >>> rest2html("A ReSt link to `PyLucid CMS <http://www.pylucid.org>`_ :)")
+ '<p>A ReSt link to <a href="http://www.pylucid.org">PyLucid CMS</a> :)</p>\\n'
"""
parts = publish_parts(
source=content,
@@ -187,9 +191,9 @@ def rest2html(content):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
-# print rest2html(u"""
+# print(rest2html(""")
#+------------+------------+
#| Headline 1 | Headline 2 |
#+============+============+
@@ -197,7 +201,7 @@ if __name__ == '__main__':
#+------------+------------+
# """)
-# print rest2html(u"""
+# print(rest2html(""")
#:homepage:
# http://code.google.com/p/python-creole/
#
@@ -205,7 +209,7 @@ if __name__ == '__main__':
# http://github.com/jedie/python-creole
# """)
- print rest2html(u"""
+ print(rest2html("""
===============
Section Title 1
===============
@@ -225,4 +229,4 @@ Section Title 5
Section Title 6
'''''''''''''''
- """)
+ """))
diff --git a/creole/setup_utils.py b/creole/setup_utils.py
index 2578e7b..0b8d846 100644
--- a/creole/setup_utils.py
+++ b/creole/setup_utils.py
@@ -99,7 +99,7 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No
emitter_kwargs={"unknown_emit":unknown_emit}
)
long_description_rest = long_description_rest_unicode.encode("utf-8")
- except Exception, err:
+ except Exception as err:
if raise_errors:
raise
# Don't raise the error e.g. in ./setup install process
@@ -128,4 +128,4 @@ GetLongDescription = _get_long_description # for backward-compatibility
if __name__ == "__main__":
package_root = os.path.abspath("../")
long_description = get_long_description(package_root)
- print long_description
+ print(long_description)
diff --git a/creole/shared/base_emitter.py b/creole/shared/base_emitter.py
index 541f2f0..0de1beb 100644
--- a/creole/shared/base_emitter.py
+++ b/creole/shared/base_emitter.py
@@ -10,11 +10,12 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import posixpath
from creole.html_parser.config import BLOCK_TAGS
from creole.html_tools.deentity import Deentity
+from creole.py3compat import TEXT_TYPE
from creole.shared.markup_table import MarkupTable
from creole.shared.unknown_tags import transparent_unknown_nodes
@@ -39,7 +40,7 @@ class BaseEmitter(object):
#--------------------------------------------------------------------------
def blockdata_pass_emit(self, node):
- return u"%s\n\n" % node.content
+ return "%s\n\n" % node.content
return node.content
#--------------------------------------------------------------------------
@@ -56,11 +57,11 @@ class BaseEmitter(object):
try:
return self.deentity.replace_named(entity)
- except KeyError, err:
+ except KeyError as err:
if self.debugging:
- print "unknown html entity found: %r" % entity
+ print("unknown html entity found: %r" % entity)
return "&%s" % entity # FIXME
- except UnicodeDecodeError, err:
+ except UnicodeDecodeError as err:
raise UnicodeError(
"Error handling entity %r: %s" % (entity, err)
)
@@ -82,13 +83,13 @@ class BaseEmitter(object):
#--------------------------------------------------------------------------
def p_emit(self, node):
- return u"%s\n\n" % self.emit_children(node)
+ return "%s\n\n" % self.emit_children(node)
def br_emit(self, node):
if self._inner_list != "":
- return u"\\\\"
+ return "\\\\"
else:
- return u"\n"
+ return "\n"
#--------------------------------------------------------------------------
@@ -99,7 +100,7 @@ class BaseEmitter(object):
def li_emit(self, node):
content = self.emit_children(node)
- return u"\n%s %s" % (self._inner_list, content)
+ return "\n%s %s" % (self._inner_list, content)
def _list_emit(self, node, list_type):
start_newline = False
@@ -112,7 +113,7 @@ class BaseEmitter(object):
else:
self._inner_list += list_type
- content = u"%s" % self.emit_children(node)
+ content = "%s" % self.emit_children(node)
self._inner_list = self._inner_list[:-1]
@@ -134,19 +135,19 @@ class BaseEmitter(object):
)
self.emit_children(node)
content = self._table.get_table_markup()
- return u"%s\n" % content
+ return "%s\n" % content
def tr_emit(self, node):
self._table.add_tr()
self.emit_children(node)
- return u""
+ return ""
def _escape_linebreaks(self, text):
text = text.strip()
text = text.split("\n")
lines = [line.strip() for line in text]
lines = [line for line in lines if line]
- content = u"\\\\".join(lines)
+ content = "\\\\".join(lines)
content = content.strip("\\")
return content
@@ -154,13 +155,13 @@ class BaseEmitter(object):
content = self.emit_children(node)
content = self._escape_linebreaks(content)
self._table.add_th(content)
- return u""
+ return ""
def td_emit(self, node):
content = self.emit_children(node)
content = self._escape_linebreaks(content)
self._table.add_td(content)
- return u""
+ return ""
#--------------------------------------------------------------------------
@@ -168,7 +169,7 @@ class BaseEmitter(object):
content = self.emit_children(node)
content = self._escape_linebreaks(content)
if node.kind in BLOCK_TAGS:
- content = u"%s\n\n" % content
+ content = "%s\n\n" % content
return content
def div_emit(self, node):
@@ -185,7 +186,7 @@ class BaseEmitter(object):
def emit_children(self, node):
"""Emit all the children of a node."""
- return u"".join(self.emit_children_list(node))
+ return "".join(self.emit_children_list(node))
def emit_children_list(self, node):
"""Emit all the children of a node."""
@@ -193,7 +194,7 @@ class BaseEmitter(object):
result = []
for child in node.children:
content = self.emit_node(child)
- assert isinstance(content, unicode)
+ assert isinstance(content, TEXT_TYPE)
result.append(content)
return result
@@ -217,11 +218,11 @@ class BaseEmitter(object):
if emit_method:
content = emit_method(node)
- if not isinstance(content, unicode):
+ if not isinstance(content, TEXT_TYPE):
unicode_error(method_name, emit_method, node, content)
else:
content = self._unknown_emit(self, node)
- if not isinstance(content, unicode):
+ if not isinstance(content, TEXT_TYPE):
unicode_error(method_name, self._unknown_emit, node, content)
self.last = node
@@ -238,4 +239,4 @@ class BaseEmitter(object):
def debug_msg(self, method, txt):
if not self.debugging:
return
- print "%13s: %s" % (method, txt)
+ print("%13s: %s" % (method, txt))
diff --git a/creole/shared/document_tree.py b/creole/shared/document_tree.py
index 2d71b13..e74b195 100644
--- a/creole/shared/document_tree.py
+++ b/creole/shared/document_tree.py
@@ -1,7 +1,6 @@
#!/usr/bin/env python
# coding: utf-8
-
"""
python-creole
~~~~~~~~~~~~~
@@ -11,11 +10,13 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import warnings
import inspect
+from creole.py3compat import TEXT_TYPE
+
class DocNode:
"""
@@ -33,7 +34,7 @@ class DocNode:
self.attrs = dict(attrs)
if content:
- assert isinstance(content, unicode), "Given content %r is not unicode, it's type: %s" % (
+ assert isinstance(content, TEXT_TYPE), "Given content %r is not unicode, it's type: %s" % (
content, type(content)
)
@@ -44,38 +45,38 @@ class DocNode:
"""
FIXME: Find a better was to do this.
- >>> node = DocNode(attrs={'foo':"bar", u"no":123})
+ >>> node = DocNode(attrs={'foo':"bar", "no":123})
>>> node.get_attrs_as_string()
- u'foo="bar" no="123"'
+ 'foo="bar" no="123"'
- >>> node = DocNode(attrs={"foo":'bar', "no":u"ABC"})
+ >>> node = DocNode(attrs={"foo":'bar', "no":"ABC"})
>>> node.get_attrs_as_string()
- u'foo="bar" no="ABC"'
+ 'foo="bar" no="ABC"'
"""
attr_list = []
- for key, value in self.attrs.iteritems():
- if not isinstance(value, unicode):
+ for key, value in self.attrs.items():
+ if not isinstance(value, TEXT_TYPE):
value = unicode(value)
- value_string = repr(value).lstrip("u").replace(u"'", u'"')
- attr_list.append(u"%s=%s" % (key, value_string))
- return u" ".join(attr_list)
+ value_string = repr(value).lstrip("").replace("'", '"')
+ attr_list.append("%s=%s" % (key, value_string))
+ return " ".join(attr_list)
def __str__(self):
return str(self.__repr__())
def __repr__(self):
- return u"<DocNode %s: %r>" % (self.kind, self.content)
-# return u"<DocNode %s (parent: %r): %r>" % (self.kind, self.parent, self.content)
+ return "<DocNode %s: %r>" % (self.kind, self.content)
+# return "<DocNode %s (parent: %r): %r>" % (self.kind, self.parent, self.content)
def debug(self):
- print "_" * 80
- print "\tDocNode - debug:"
- print "str(): %s" % self
- print "attributes:"
+ print("_" * 80)
+ print("\tDocNode - debug:")
+ print("str(): %s" % self)
+ print("attributes:")
for i in dir(self):
if i.startswith("_") or i == "debug":
continue
- print "%20s: %r" % (i, getattr(self, i, "---"))
+ print("%20s: %r" % (i, getattr(self, i, "---")))
class DebugList(list):
@@ -84,7 +85,7 @@ class DebugList(list):
super(DebugList, self).__init__()
def append(self, item):
-# for stack_frame in inspect.stack(): print stack_frame
+# for stack_frame in inspect.stack(): print(stack_frame)
line, method = inspect.stack()[1][2:4]
msg = "%-8s append: %-35r (%-15s line:%s)" % (
@@ -97,4 +98,4 @@ class DebugList(list):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/shared/example_macros.py b/creole/shared/example_macros.py
index 2d6f4ee..3d9624d 100644
--- a/creole/shared/example_macros.py
+++ b/creole/shared/example_macros.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
def html(text):
"""
diff --git a/creole/shared/html_parser.py b/creole/shared/html_parser.py
index 1e969e5..d8acfc7 100644
--- a/creole/shared/html_parser.py
+++ b/creole/shared/html_parser.py
@@ -1,16 +1,19 @@
# coding: utf-8
"""
- Patched version of HTMLParser.HTMLParser with patch from:
+ Patched version of HTMLParser with patch from:
http://bugs.python.org/issue670664
See also:
https://github.com/gregmuellegger/django/issues/1
"""
-import HTMLParser
+try:
+ import HTMLParser
+except ImportError:
+ from html import parser as HTMLParser # python 3
class HTMLParser2(HTMLParser.HTMLParser):
- """ Patched version of HTMLParser.HTMLParser """
+ """ Patched version of HTMLParser """
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.cdata_tag = None
diff --git a/creole/shared/markup_table.py b/creole/shared/markup_table.py
index 422c6a6..ec59e66 100644
--- a/creole/shared/markup_table.py
+++ b/creole/shared/markup_table.py
@@ -101,4 +101,4 @@ class MarkupTable(object):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/creole/shared/unknown_tags.py b/creole/shared/unknown_tags.py
index aac894e..4e3e079 100644
--- a/creole/shared/unknown_tags.py
+++ b/creole/shared/unknown_tags.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
from xml.sax.saxutils import escape
@@ -30,10 +30,10 @@ def _mask_content(emitter, node, mask_tag):
content = emitter.emit_children(node)
if not content:
# single tag
- return u"<<%(mask_tag)s>><%(tag)s%(attrs)s /><</%(mask_tag)s>>" % tag_data
+ return "<<%(mask_tag)s>><%(tag)s%(attrs)s /><</%(mask_tag)s>>" % tag_data
- start_tag = u"<<%(mask_tag)s>><%(tag)s%(attrs)s><</%(mask_tag)s>>" % tag_data
- end_tag = u"<<%(mask_tag)s>></%(tag)s><</%(mask_tag)s>>" % tag_data
+ start_tag = "<<%(mask_tag)s>><%(tag)s%(attrs)s><</%(mask_tag)s>>" % tag_data
+ end_tag = "<<%(mask_tag)s>></%(tag)s><</%(mask_tag)s>>" % tag_data
return start_tag + content + end_tag
@@ -89,10 +89,10 @@ def escape_unknown_nodes(emitter, node):
content = emitter.emit_children(node)
if not content:
# single tag
- return escape(u"<%(tag)s%(attrs)s />" % tag_data)
+ return escape("<%(tag)s%(attrs)s />" % tag_data)
- start_tag = escape(u"<%(tag)s%(attrs)s>" % tag_data)
- end_tag = escape(u"</%(tag)s>" % tag_data)
+ start_tag = escape("<%(tag)s%(attrs)s>" % tag_data)
+ end_tag = escape("</%(tag)s>" % tag_data)
return start_tag + content + end_tag
diff --git a/demo.py b/demo.py
index 31da5c0..962d3c8 100644
--- a/demo.py
+++ b/demo.py
@@ -7,11 +7,12 @@
~~~~~~~~~~~
"""
+from __future__ import division, absolute_import, print_function, unicode_literals
from creole import creole2html, html2creole, html2rest, html2textile
-source_creole = u"""\
+source_creole = """\
== simple demo
You can convert from:
@@ -30,21 +31,21 @@ More info on our [[http://code.google.com/p/python-creole/|Homepage]]."""
if __name__ == "__main__":
- print "_" * 79 + "\n*** Convert creole into html: ***\n\n"
+ print("_" * 79 + "\n*** Convert creole into html: ***\n\n")
html = creole2html(source_creole)
- print html
+ print(html)
- print "\n\n" + "_" * 79 + "\n*** Convert html back into creole: ***\n\n"
+ print("\n\n" + "_" * 79 + "\n*** Convert html back into creole: ***\n\n")
creole = html2creole(html)
- print creole
+ print(creole)
- print "\n\n" + "_" * 79 + "\n*** Convert html into ReStructuredText: ***\n\n"
+ print("\n\n" + "_" * 79 + "\n*** Convert html into ReStructuredText: ***\n\n")
rest = html2rest(html)
- print rest
+ print(rest)
- print "\n\n" + "_" * 79 + "\n*** Convert html into textile: ***\n\n"
+ print("\n\n" + "_" * 79 + "\n*** Convert html into textile: ***\n\n")
textile = html2textile(html)
- print textile
+ print(textile)
diff --git a/setup.py b/setup.py
index 9f109c6..e0bb64a 100755
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import os
import sys
@@ -27,7 +27,7 @@ def get_authors():
f = file(os.path.join(PACKAGE_ROOT, "AUTHORS"), "r")
authors = [l.strip(" *\r\n") for l in f if l.strip().startswith("*")]
f.close()
- except Exception, err:
+ except Exception as err:
authors = "[Error: %s]" % err
return authors
diff --git a/test2.py b/test2.py
index 8d722b7..975c1da 100644
--- a/test2.py
+++ b/test2.py
@@ -3,7 +3,7 @@ from tests.utils.utils import make_diff
from creole import html2creole, creole2html, html2rest
from creole.rest2html.clean_writer import rest2html
-source = u"""\
+source = """\
Text before table without headlines:
| ///var/www/YourSite///**media**/ | //Static media files//
@@ -13,7 +13,7 @@ Text before table without headlines:
[[/path/to/foo|bar]] link at the end.
"""
-source = u"""\
+source = """\
+---------------------------+
| * foo `table item`_ bar 1 |
| * foo `table item`_ bar 2 |
@@ -21,7 +21,7 @@ source = u"""\
.. _table item: foo/bar
"""
-source = u"""\
+source = """\
* foo `table item 1 <foo/bar/1/>`_ bar 1
* foo `table item 2 <foo/bar/2/>`_ bar 2
"""
@@ -54,26 +54,26 @@ source = u"""\
source += "\n"
html = rest2html(source)
-print "_" * 79
-print html
-print "=" * 79
+print("_" * 79)
+print(html)
+print("=" * 79)
#creole = html2creole(html)
-#print "_" * 79
-#print creole
-#print "=" * 79
+#print("_" * 79)
+#print(creole)
+#print("=" * 79)
#html2 = creole2html(creole)
-#print "_" * 79
-#print html2
-#print "=" * 79
+#print("_" * 79)
+#print(html2)
+#print("=" * 79)
rest2 = html2rest(html)
-print "_" * 79
-print rest2
-print "=" * 79
+print("_" * 79)
+print(rest2)
+print("=" * 79)
-#print "_" * 79
-#print make_diff(source, rest2)
-#print "=" * 79
+#print("_" * 79)
+#print(make_diff(source, rest2))
+#print("=" * 79)
diff --git a/tests/__init__.py b/tests/__init__.py
index e69de29..95c5a1c 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -0,0 +1,11 @@
+# coding: utf-8
+
+from __future__ import division, absolute_import, print_function, unicode_literals
+
+import unittest
+
+from . import run_all_tests as all_tests
+
+def run_all_tests():
+ suite = unittest.findTestCases(all_tests)
+ return suite
diff --git a/tests/run_all_tests.py b/tests/run_all_tests.py
index 820dc0c..0eec66e 100644
--- a/tests/run_all_tests.py
+++ b/tests/run_all_tests.py
@@ -9,7 +9,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
from doctest import testmod
import os
@@ -35,8 +35,8 @@ SKIP_FILES = ("setup.py", "test.py")
def run_all_doctests():
path = os.path.abspath(os.path.dirname(creole.__file__))
print
- print "_" * 79
- print "Running %r DocTests:\n" % path
+ print("_" * 79)
+ print("Running %r DocTests:\n" % path)
total_files = 0
total_doctests = 0
@@ -58,10 +58,10 @@ def run_all_doctests():
sys.path.insert(0, root)
try:
m = __import__(filename[:-3])
- except ImportError, err:
- print "***DocTest import %s error*** %s" % (filename, err)
- except Exception, err:
- print "***DocTest %s error*** %s" % (filename, err)
+ except ImportError as err:
+ print("***DocTest import %s error*** %s" % (filename, err))
+ except Exception as err:
+ print("***DocTest %s error*** %s" % (filename, err))
else:
failed, attempted = testmod(m)
total_attempted += attempted
@@ -71,22 +71,22 @@ def run_all_doctests():
if attempted and not failed:
filepath = os.path.join(root, filename)
- print "DocTest in %s OK (failed=%i, attempted=%i)" % (
+ print("DocTest in %s OK (failed=%i, attempted=%i)" % (
filepath, failed, attempted
- )
+ ))
finally:
del sys.path[0]
- print "*** %i files readed, runs %i doctests: failed=%i, attempted=%i" % (
+ print("*** %i files readed, runs %i doctests: failed=%i, attempted=%i" % (
total_files, total_doctests, total_failed, total_attempted
- )
+ ))
if __name__ == '__main__':
run_all_doctests()
print
- print "_" * 79
- print "Running Unittests:\n"
+ print("_" * 79)
+ print("Running Unittests:\n")
unittest.main(
# verbosity=99
diff --git a/tests/test_TODOs.py b/tests/test_TODOs.py
index 9f9a454..f84386d 100644
--- a/tests/test_TODOs.py
+++ b/tests/test_TODOs.py
@@ -12,12 +12,12 @@ from creole.html_tools.strip_html import strip_html
class StripHtml(unittest.TestCase):
def test_not_closed_image_tag(self):
- output = strip_html(u'<p>a <img src="/image.jpg"> image.</p>')
- self.assertEqual(output, u'<p>a <img src="/image.jpg"> image.</p>')
+ output = strip_html('<p>a <img src="/image.jpg"> image.</p>')
+ self.assertEqual(output, '<p>a <img src="/image.jpg"> image.</p>')
def test_remove_linebreak(self):
- output = strip_html(u'<strong>foo</strong>\n<ul><li>one</li></ul>')
- self.assertEqual(output, u'<strong>foo</strong><ul><li>one</li></ul>')
+ output = strip_html('<strong>foo</strong>\n<ul><li>one</li></ul>')
+ self.assertEqual(output, '<strong>foo</strong><ul><li>one</li></ul>')
@@ -44,11 +44,11 @@ class CrossCompareCreoleTests(BaseCreoleTest):
""" TODO: bold/italics cross paragraphs in creole2html
see: http://code.google.com/p/python-creole/issues/detail?id=13
"""
- self.assert_creole2html(u"""
+ self.assert_creole2html("""
But, should //not be...
...able// to cross paragraphs.
- """, u"""
+ """, """
<p>But, should <em>not be...</em></p>
<p>...able<em> to cross paragraphs.</em></p>
""")
diff --git a/tests/test_creole2html.py b/tests/test_creole2html.py
index cc71207..c67caa7 100644
--- a/tests/test_creole2html.py
+++ b/tests/test_creole2html.py
@@ -16,11 +16,14 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import sys
import unittest
-import StringIO
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO # python 3
from tests.utils.base_unittest import BaseCreoleTest
from tests import test_macros
@@ -41,9 +44,9 @@ class TestCreole2html(unittest.TestCase):
"""
Test if the traceback information send to a stderr handler.
"""
- my_stderr = StringIO.StringIO()
+ my_stderr = StringIO()
creole2html(
- markup_string=u"<<notexist1>><<notexist2>><</notexist2>>",
+ markup_string="<<notexist1>><<notexist2>><</notexist2>>",
emitter_kwargs={
"verbose":2,
"stderr":my_stderr,
@@ -67,53 +70,53 @@ class TestCreole2html(unittest.TestCase):
Test the default "html" macro, found in ./creole/default_macros.py
"""
html = creole2html(
- markup_string=u"<<html>><p>foo</p><</html>><bar?>",
+ markup_string="<<html>><p>foo</p><</html>><bar?>",
emitter_kwargs={
"verbose":1,
"macros":example_macros,
"stderr":sys.stderr,
}
)
- self.assertEqual(html, u'<p>foo</p>\n<p>&lt;bar?&gt;</p>')
+ self.assertEqual(html, '<p>foo</p>\n<p>&lt;bar?&gt;</p>')
def test_example_macros2(self):
html = creole2html(
- markup_string=u"<<html>>{{{&lt;nocode&gt;}}}<</html>>",
+ markup_string="<<html>>{{{&lt;nocode&gt;}}}<</html>>",
emitter_kwargs={
"verbose":1,
"macros":example_macros,
"stderr":sys.stderr,
}
)
- self.assertEqual(html, u'{{{&lt;nocode&gt;}}}')
+ self.assertEqual(html, '{{{&lt;nocode&gt;}}}')
def test_example_macros3(self):
html = creole2html(
- markup_string=u"<<html>>1<</html>><<html>>2<</html>>",
+ markup_string="<<html>>1<</html>><<html>>2<</html>>",
emitter_kwargs={
"verbose":1,
"macros":example_macros,
"stderr":sys.stderr,
}
)
- self.assertEqual(html, u'1\n2')
+ self.assertEqual(html, '1\n2')
def test_macro_dict(self):
"""
simple test for the "macro API"
"""
def test(text, foo, bar):
- return u"|".join([foo, bar, text])
+ return "|".join([foo, bar, text])
html = creole2html(
- markup_string=u"<<test bar='b' foo='a'>>c<</test>>",
+ markup_string="<<test bar='b' foo='a'>>c<</test>>",
emitter_kwargs={
"verbose":1,
"macros":{"test":test},
"stderr":sys.stderr,
}
)
- self.assertEqual(html, u'a|b|c')
+ self.assertEqual(html, 'a|b|c')
def test_macro_callable(self):
"""
@@ -124,7 +127,7 @@ class TestCreole2html(unittest.TestCase):
self.failUnlessRaises(DeprecationWarning,
creole2html,
- markup_string=u"<<test no=1 arg2='foo'>>bar<</test>>",
+ markup_string="<<test no=1 arg2='foo'>>bar<</test>>",
emitter_kwargs={
"verbose":1,
"macros":testmacro,
@@ -138,10 +141,10 @@ class TestCreole2html(unittest.TestCase):
"""
def test(text, foo):
pass
- my_stderr = StringIO.StringIO()
+ my_stderr = StringIO()
html = creole2html(
- markup_string=u"<<test bar='foo'>>c<</test>>",
+ markup_string="<<test bar='foo'>>c<</test>>",
emitter_kwargs={
"verbose":2,
"macros":{"test":test},
@@ -169,10 +172,10 @@ class TestCreole2html(unittest.TestCase):
"""
def test(text, foo):
pass
- my_stderr = StringIO.StringIO()
+ my_stderr = StringIO()
html = creole2html(
- markup_string=u"<<test bar='foo'>>c<</test>>",
+ markup_string="<<test bar='foo'>>c<</test>>",
emitter_kwargs={
"verbose":1,
"macros":{"test":test},
@@ -193,19 +196,19 @@ class TestCreole2html(unittest.TestCase):
class TestCreole2htmlMarkup(BaseCreoleTest):
def test_creole_basic(self):
- out_string = creole2html(u"a text line.")
+ out_string = creole2html("a text line.")
self.assertEqual(out_string, "<p>a text line.</p>")
def test_lineendings(self):
""" Test all existing lineending version """
- out_string = creole2html(u"first\nsecond")
- self.assertEqual(out_string, u"<p>first<br />\nsecond</p>")
+ out_string = creole2html("first\nsecond")
+ self.assertEqual(out_string, "<p>first<br />\nsecond</p>")
- out_string = creole2html(u"first\rsecond")
- self.assertEqual(out_string, u"<p>first<br />\nsecond</p>")
+ out_string = creole2html("first\rsecond")
+ self.assertEqual(out_string, "<p>first<br />\nsecond</p>")
- out_string = creole2html(u"first\r\nsecond")
- self.assertEqual(out_string, u"<p>first<br />\nsecond</p>")
+ out_string = creole2html("first\r\nsecond")
+ self.assertEqual(out_string, "<p>first<br />\nsecond</p>")
#--------------------------------------------------------------------------
@@ -313,7 +316,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
the end
""", r"""
<p>There exist three different macro types:<br />
- A [test macro1 - kwargs: args='foo1',text=u'bar1'] in a line...<br />
+ A [test macro1 - kwargs: args='foo1',text='bar1'] in a line...<br />
...a single [test macro1 - kwargs: foo='bar',text=None] tag,<br />
or: [test macro1 - kwargs: a=1,b=2,text=None] closed...</p>
@@ -382,7 +385,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
<<summary>Some funky page summary.<</summary>>
""", r"""
<p>wrong macro line:<br />
- [Error: Wrong macro arguments: u'>Some funky page summary.<</summary' for macro 'summary' (maybe wrong macro tag syntax?)]
+ [Error: Wrong macro arguments: '>Some funky page summary.<</summary' for macro 'summary' (maybe wrong macro tag syntax?)]
</p>
""",
)
@@ -456,7 +459,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
def test_wiki_style_line_breaks1(self):
html = creole2html(
- markup_string=self._prepare_text(u"""
+ markup_string=self._prepare_text("""
wiki style
linebreaks
@@ -464,7 +467,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
"""),
parser_kwargs={"blog_line_breaks":False},
)
- self.assertEqual(html, self._prepare_text(u"""
+ self.assertEqual(html, self._prepare_text("""
<p>wiki style linebreaks</p>
<p>...and not blog styled.</p>
@@ -472,7 +475,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
def test_wiki_style_line_breaks2(self):
html = creole2html(
- markup_string=self._prepare_text(u"""
+ markup_string=self._prepare_text("""
**one**
//two//
@@ -481,7 +484,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
"""),
parser_kwargs={"blog_line_breaks":False},
)
- self.assertEqual(html, self._prepare_text(u"""
+ self.assertEqual(html, self._prepare_text("""
<p><strong>one</strong> <i>two</i></p>
<ul>
@@ -492,7 +495,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
def test_wiki_style_line_breaks3(self):
html = creole2html(
- markup_string=self._prepare_text(u"""
+ markup_string=self._prepare_text("""
with blog line breaks, every line break would be convertet into<br />
with wiki style not.
@@ -508,7 +511,7 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
"""),
parser_kwargs={"blog_line_breaks":False},
)
- self.assertEqual(html, self._prepare_text(u"""
+ self.assertEqual(html, self._prepare_text("""
<p>with blog line breaks, every line break would be convertet into&lt;br /&gt; with wiki style not.</p>
<p>This is the first line,<br />
@@ -526,8 +529,8 @@ class TestCreole2htmlMarkup(BaseCreoleTest):
"""
https://code.google.com/p/python-creole/issues/detail?id=15
"""
- html = creole2html(markup_string=u"== Headline1 == \n== Headline2== ")
- self.assertEqual(html, self._prepare_text(u"""
+ html = creole2html(markup_string="== Headline1 == \n== Headline2== ")
+ self.assertEqual(html, self._prepare_text("""
<h2>Headline1</h2>
<h2>Headline2</h2>
"""))
diff --git a/tests/test_cross_compare_all.py b/tests/test_cross_compare_all.py
index 6136f8b..4b7c410 100644
--- a/tests/test_cross_compare_all.py
+++ b/tests/test_cross_compare_all.py
@@ -18,7 +18,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -154,7 +154,7 @@ class CrossCompareTests(BaseCreoleTest):
)
def test_horizontal_rule(self):
- all_markups = u"""
+ all_markups = """
Text before horizontal rule.
----
@@ -164,7 +164,7 @@ class CrossCompareTests(BaseCreoleTest):
self.cross_compare(
creole_string=all_markups,
#textile_string=all_markups, # FIXME: textile and <hr> ?
- html_string=u"""
+ html_string="""
<p>Text before horizontal rule.</p>
<hr />
@@ -174,7 +174,7 @@ class CrossCompareTests(BaseCreoleTest):
)
self.cross_compare(
rest_string=all_markups,
- html_string=u"""
+ html_string="""
<p>Text before horizontal rule.</p>
<hr />
<p>Text after the line.</p>
@@ -404,7 +404,7 @@ class CrossCompareTests(BaseCreoleTest):
def test_pre_contains_braces(self):
self.cross_compare(
- creole_string=u"""
+ creole_string="""
{{{
# Closing braces in nowiki:
if (x != NULL) {
@@ -414,7 +414,7 @@ class CrossCompareTests(BaseCreoleTest):
}}}
}}}
""",
- textile_string=u"""
+ textile_string="""
<pre>
# Closing braces in nowiki:
if (x != NULL) {
@@ -424,7 +424,7 @@ class CrossCompareTests(BaseCreoleTest):
}}}
</pre>
""",
- rest_string=u"""
+ rest_string="""
::
# Closing braces in nowiki:
@@ -434,7 +434,7 @@ class CrossCompareTests(BaseCreoleTest):
x[i]--;
}}}
""",
- html_string=u"""
+ html_string="""
<pre>
# Closing braces in nowiki:
if (x != NULL) {
@@ -474,15 +474,15 @@ class CrossCompareTests(BaseCreoleTest):
def test_simple_table(self):
self.cross_compare(
- creole_string=u"""
+ creole_string="""
|= Headline 1 |= Headline 2 |
| cell one | cell two |
""",
- textile_string=u"""
+ textile_string="""
|_. Headline 1|_. Headline 2|
|cell one|cell two|
""",
- html_string=u"""
+ html_string="""
<table>
<tr>
<th>Headline 1</th>
@@ -498,14 +498,14 @@ class CrossCompareTests(BaseCreoleTest):
strip_lines=True,
)
self.cross_compare(
- rest_string=u"""
+ rest_string="""
+------------+------------+
| Headline 1 | Headline 2 |
+============+============+
| cell one | cell two |
+------------+------------+
""",
- html_string=u"""
+ html_string="""
<table>
<tr><th>Headline 1</th>
<th>Headline 2</th>
diff --git a/tests/test_cross_compare_creole.py b/tests/test_cross_compare_creole.py
index 422fa4b..a4d227f 100644
--- a/tests/test_cross_compare_creole.py
+++ b/tests/test_cross_compare_creole.py
@@ -16,7 +16,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -417,12 +417,12 @@ class CrossCompareCreoleTests(BaseCreoleTest):
Note:
All cross compare tests use html2creole.HTML_MACRO_UNKNOWN_NODES
"""
- self.cross_compare_creole(u"""
+ self.cross_compare_creole("""
111 <<html>><x><</html>>foo<<html>></x><</html>> 222
333<<html>><x foo1="bar1"><</html>>foobar<<html>></x><</html>>444
555<<html>><x /><</html>>666
- """, u"""
+ """, """
<p>111 <x>foo</x> 222<br />
333<x foo1="bar1">foobar</x>444</p>
@@ -440,7 +440,7 @@ class CrossCompareCreoleTests(BaseCreoleTest):
)
def test_entities(self):
- self.cross_compare_creole(u"""
+ self.cross_compare_creole("""
less-than sign: <
greater-than sign: >
""", """
diff --git a/tests/test_cross_compare_rest.py b/tests/test_cross_compare_rest.py
index 4e0ed70..9f9925b 100644
--- a/tests/test_cross_compare_rest.py
+++ b/tests/test_cross_compare_rest.py
@@ -13,7 +13,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -23,7 +23,7 @@ from tests.utils.base_unittest import BaseCreoleTest
class CrossCompareReStTests(BaseCreoleTest):
def test_entities(self):
self.cross_compare_rest(
- rest_string=u"""
+ rest_string="""
less-than sign: <
greater-than sign: >
@@ -37,7 +37,7 @@ class CrossCompareReStTests(BaseCreoleTest):
def test_bullet_lists_basic(self):
self.cross_compare_rest(
- rest_string=u"""
+ rest_string="""
* item 1
* item 2
@@ -56,7 +56,7 @@ class CrossCompareReStTests(BaseCreoleTest):
def test_numbered_lists(self):
self.cross_compare_rest(
- rest_string=u"""
+ rest_string="""
#. item 1
#. item 2
@@ -86,7 +86,7 @@ class CrossCompareReStTests(BaseCreoleTest):
def test_bullet_lists_nested(self):
self.cross_compare_rest(
- rest_string=u"""
+ rest_string="""
A nested bullet lists:
* item 1
diff --git a/tests/test_cross_compare_textile.py b/tests/test_cross_compare_textile.py
index 3b78292..ce05acb 100644
--- a/tests/test_cross_compare_textile.py
+++ b/tests/test_cross_compare_textile.py
@@ -16,7 +16,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
diff --git a/tests/test_html2creole.py b/tests/test_html2creole.py
index 9c55bf1..72f8d59 100644
--- a/tests/test_html2creole.py
+++ b/tests/test_html2creole.py
@@ -13,7 +13,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -65,7 +65,7 @@ class TestHtml2CreoleMarkup(BaseCreoleTest):
"""
self.assertRaises(NotImplementedError,
html2creole,
- html_string=u"<unknwon>",
+ html_string="<unknwon>",
emitter_kwargs={"unknown_emit":raise_unknown_node}
)
@@ -174,7 +174,7 @@ class TestHtml2CreoleMarkup(BaseCreoleTest):
Box Drawing:
http://pylucid.org/_command/144/DecodeUnicode/display/66/
"""
- self.assert_html2creole(u"""
+ self.assert_html2creole("""
* less-than sign: < < <
* greater-than sign: > > >
* copyright sign: © ©
@@ -317,7 +317,7 @@ class TestHtml2CreoleMarkup(BaseCreoleTest):
""")
def test_nested_listsitems_with_paragraph(self):
- self.assert_html2creole(u"""
+ self.assert_html2creole("""
* item 1
** subitem 1.1
*** subsubitem 1.1.1
diff --git a/tests/test_html2rest.py b/tests/test_html2rest.py
index 5abc21c..3411eb8 100644
--- a/tests/test_html2rest.py
+++ b/tests/test_html2rest.py
@@ -13,7 +13,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -78,13 +78,13 @@ class ReStTests(BaseCreoleTest):
>>> from creole import creole2html
>>> creole2html("This is **creole //markup//**")
- u'<p>This is <strong>creole <i>markup</i></strong></p>
+ '<p>This is <strong>creole <i>markup</i></strong></p>
""",
html_string="""
<pre>
&gt;&gt;&gt; from creole import creole2html
&gt;&gt;&gt; creole2html(&quot;This is **creole //markup//**&quot;)
- u'&lt;p&gt;This is &lt;strong&gt;creole &lt;i&gt;markup&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;\n'
+ '&lt;p&gt;This is &lt;strong&gt;creole &lt;i&gt;markup&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;\n'
</pre>
"""
)
@@ -205,7 +205,7 @@ class ReStTests(BaseCreoleTest):
# Put unknown tags in a <pre> area.
# """
# self.assert_html2rest(
-# rest_string=u"""
+# rest_string="""
# 111 <<pre>><x><</pre>>foo<<pre>></x><</pre>> 222
# 333<<pre>><x foo1="bar1"><</pre>>foobar<<pre>></x><</pre>>444
#
@@ -228,7 +228,7 @@ class ReStTests(BaseCreoleTest):
# their child nodes' content.
# """
# self.assert_html2rest(
-# rest_string=u"""
+# rest_string="""
# 111 <<pre>><x><</pre>>foo<<pre>></x><</pre>> 222
# 333<<pre>><x foo1="bar1"><</pre>>foobar<<pre>></x><</pre>>444
#
diff --git a/tests/test_html2textile.py b/tests/test_html2textile.py
index 1979698..69f7983 100644
--- a/tests/test_html2textile.py
+++ b/tests/test_html2textile.py
@@ -13,7 +13,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -27,7 +27,7 @@ class TextileTests(BaseCreoleTest):
can't be cross tested, because textile would convert < to &#60; and > to &#62;
"""
self.assert_html2textile(
- textile_string=u"""
+ textile_string="""
less-than sign: <
greater-than sign: >
""",
@@ -43,7 +43,7 @@ class TextileTests(BaseCreoleTest):
Put unknown tags in a <pre> area.
"""
self.assert_html2textile(
- textile_string=u"""
+ textile_string="""
111 <<pre>><x><</pre>>foo<<pre>></x><</pre>> 222
333<<pre>><x foo1="bar1"><</pre>>foobar<<pre>></x><</pre>>444
@@ -66,7 +66,7 @@ class TextileTests(BaseCreoleTest):
their child nodes' content.
"""
self.assert_html2textile(
- textile_string=u"""
+ textile_string="""
111 <<pre>><x><</pre>>foo<<pre>></x><</pre>> 222
333<<pre>><x foo1="bar1"><</pre>>foobar<<pre>></x><</pre>>444
diff --git a/tests/test_macros.py b/tests/test_macros.py
index 48c79fc..5a564d6 100644
--- a/tests/test_macros.py
+++ b/tests/test_macros.py
@@ -11,30 +11,30 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
def test_macro1(**kwargs):
"""
>>> test_macro1(foo="bar")
- u"[test macro1 - kwargs: foo='bar']"
+ "[test macro1 - kwargs: foo='bar']"
>>> test_macro1()
- u'[test macro1 - kwargs: ]'
+ '[test macro1 - kwargs: ]'
>>> test_macro1(a=1,b=2)
- u'[test macro1 - kwargs: a=1,b=2]'
+ '[test macro1 - kwargs: a=1,b=2]'
"""
- kwargs = u','.join([u'%s=%r' % (k, v) for k, v in sorted(kwargs.items())])
- return u"[test macro1 - kwargs: %s]" % kwargs
+ kwargs = ','.join(['%s=%r' % (k, v) for k, v in sorted(kwargs.items())])
+ return "[test macro1 - kwargs: %s]" % kwargs
def test_macro2(char, text):
"""
- >>> test_macro2(char=u"|", text=u"a\\nb")
- u'a|b'
+ >>> test_macro2(char="|", text="a\\nb")
+ 'a|b'
"""
return char.join(text.split())
if __name__ == "__main__":
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/tests/test_rest2html.py b/tests/test_rest2html.py
index 88a3a03..8315621 100644
--- a/tests/test_rest2html.py
+++ b/tests/test_rest2html.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -20,7 +20,7 @@ from tests.utils.base_unittest import BaseCreoleTest
class ReSt2HtmlTests(BaseCreoleTest):
def test_clean_link_table(self):
- self.assert_rest2html(u"""
+ self.assert_rest2html("""
:homepage:
http://code.google.com/p/python-creole/
@@ -36,7 +36,7 @@ class ReSt2HtmlTests(BaseCreoleTest):
""")
def test_clean_table(self):
- self.assert_rest2html(u"""
+ self.assert_rest2html("""
+------------+------------+
| Headline 1 | Headline 2 |
+============+============+
@@ -54,7 +54,7 @@ class ReSt2HtmlTests(BaseCreoleTest):
""")
def test_clean_list(self):
- self.assert_rest2html(u"""
+ self.assert_rest2html("""
* item 1
* item 1.1
@@ -87,7 +87,7 @@ class ReSt2HtmlTests(BaseCreoleTest):
""")
def test_clean_headline(self):
- self.assert_rest2html(u"""
+ self.assert_rest2html("""
======
head 1
======
diff --git a/tests/test_utils.py b/tests/test_utils.py
index da02447..5b9135b 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -9,7 +9,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import unittest
@@ -29,14 +29,14 @@ class UtilsTests(MarkupTest):
def test_markup_table_creole(self):
t = MarkupTable(head_prefix="* ")
t.add_tr()
- t.add_th(u"head1")
- t.add_th(u"head2")
+ t.add_th("head1")
+ t.add_th("head2")
t.add_tr()
- t.add_td(u"1.1.")
- t.add_td(u"1.2.")
+ t.add_td("1.1.")
+ t.add_td("1.2.")
t.add_tr()
- t.add_td(u"2.1.")
- t.add_td(u"2.2.")
+ t.add_td("2.1.")
+ t.add_td("2.2.")
table = t.get_table_markup()
self.assertEqual2(
@@ -51,14 +51,14 @@ class UtilsTests(MarkupTest):
def test_markup_table_textile(self):
t = MarkupTable(head_prefix="_. ", auto_width=False)
t.add_tr()
- t.add_th(u"head1")
- t.add_th(u"head2")
+ t.add_th("head1")
+ t.add_th("head2")
t.add_tr()
- t.add_td(u"1.1.")
- t.add_td(u"1.2.")
+ t.add_td("1.1.")
+ t.add_td("1.2.")
t.add_tr()
- t.add_td(u"2.1.")
- t.add_td(u"2.2.")
+ t.add_td("2.1.")
+ t.add_td("2.2.")
table = t.get_table_markup()
self.assertEqual2(
@@ -73,14 +73,14 @@ class UtilsTests(MarkupTest):
def test_markup_table_rest(self):
t = MarkupTable(head_prefix="")
t.add_tr()
- t.add_th(u"head1")
- t.add_th(u"head2")
+ t.add_th("head1")
+ t.add_th("head2")
t.add_tr()
- t.add_td(u"1.1.")
- t.add_td(u"1.2.")
+ t.add_td("1.1.")
+ t.add_td("1.2.")
t.add_tr()
- t.add_td(u"2.1.")
- t.add_td(u"2.2.")
+ t.add_td("2.1.")
+ t.add_td("2.2.")
table = t.get_rest_table()
self.assertEqual2(
diff --git a/tests/utils/base_unittest.py b/tests/utils/base_unittest.py
index 61cdcc9..5dfefd2 100644
--- a/tests/utils/base_unittest.py
+++ b/tests/utils/base_unittest.py
@@ -11,13 +11,14 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import re
import sys
import warnings
from tests.utils.utils import MarkupTest
+from creole.py3compat import TEXT_TYPE
try:
@@ -37,7 +38,7 @@ from creole import creole2html, html2creole, html2textile, html2rest
try:
from creole.rest2html.clean_writer import rest2html
-except DocutilsImportError, err:
+except DocutilsImportError as err:
REST_INSTALLED = False
warnings.warn("Can't run all ReSt unittests: %s" % err)
else:
@@ -49,8 +50,8 @@ tabs2spaces_re = re.compile(r"^(\t*)(.*?)$", re.M)
def tabs2spaces(html):
""" form reformating textile html code
- >>> tabs2spaces(u"\\t<p>one<br />\\n\\t\\ttwo<br />\\n\\t\\t\\ttree</p>")
- u'<p>one<br />\\n two<br />\\n tree</p>'
+ >>> tabs2spaces("\\t<p>one<br />\\n\\t\\ttwo<br />\\n\\t\\t\\ttree</p>")
+ '<p>one<br />\\n two<br />\\n tree</p>'
"""
def reformat_tabs(match):
tabs = match.group(1)
@@ -60,15 +61,15 @@ def tabs2spaces(html):
if indent < 0:
indent = 0
-# print len(tabs), indent, repr(tabs), text
- return u" " * indent + text
+# print(len(tabs), indent, repr(tabs), text)
+ return " " * indent + text
return tabs2spaces_re.sub(reformat_tabs, html)
def strip_html_lines(html, strip_lines=False):
"""
- >>> strip_html_lines(u"\t<p>foo \\n\\n\t\t bar</p>", strip_lines=True)
- u'<p>foo\\nbar</p>'
+ >>> strip_html_lines("\t<p>foo \\n\\n\t\t bar</p>", strip_lines=True)
+ '<p>foo\\nbar</p>'
"""
html = "\n".join(
[line.strip(" \t") for line in html.splitlines() if line]
@@ -87,10 +88,10 @@ class BaseCreoleTest(MarkupTest):
text = text.replace("\t", "\\t")
print
- print "_" * 79
- print " Debug Text: %s" % msg
- print text
- print "-" * 79
+ print("_" * 79)
+ print(" Debug Text: %s" % msg)
+ print(text)
+ print("-" * 79)
def assert_creole2html(self, raw_creole, raw_html, \
strip_lines=False, debug=False, parser_kwargs={}, emitter_kwargs={}):
@@ -102,10 +103,10 @@ class BaseCreoleTest(MarkupTest):
# prepare whitespace on test strings
markup_string = self._prepare_text(raw_creole)
- assert isinstance(markup_string, unicode)
+ assert isinstance(markup_string, TEXT_TYPE)
html_string = self._prepare_text(raw_html)
- assert isinstance(html_string, unicode)
+ assert isinstance(html_string, TEXT_TYPE)
if strip_lines:
html_string = strip_html_lines(html_string, strip_lines)
if debug:
@@ -132,7 +133,7 @@ class BaseCreoleTest(MarkupTest):
Compare the genereted markup from the given >raw_html< html code, with
the given >creole_string< reference string.
"""
-# assert isinstance(raw_html, unicode)
+# assert isinstance(raw_html, TEXT_TYPE)
# creole_string = unicode(creole_string, encoding="utf8")
# raw_html = unicode(raw_html, "utf8")
@@ -140,12 +141,12 @@ class BaseCreoleTest(MarkupTest):
# prepare whitespace on test strings
markup = self._prepare_text(raw_creole)
- assert isinstance(markup, unicode)
+ assert isinstance(markup, TEXT_TYPE)
if debug:
self._debug_text("assert_creole2html() markup", markup)
html = self._prepare_text(raw_html)
- assert isinstance(html, unicode)
+ assert isinstance(html, TEXT_TYPE)
# convert html code into creole markup
out_string = html2creole(html, debug, parser_kwargs, emitter_kwargs)
@@ -167,8 +168,8 @@ class BaseCreoleTest(MarkupTest):
* creole2html
* html2creole
"""
- creole_string = unicode(creole_string)
- html_string = unicode(html_string)
+ assert isinstance(creole_string, TEXT_TYPE)
+ assert isinstance(html_string, TEXT_TYPE)
self.assertNotEqual(creole_string, html_string)
self.assert_creole2html(
@@ -197,9 +198,9 @@ class BaseCreoleTest(MarkupTest):
# compare html -> textile
textile_string2 = html2textile(html_string, debug, parser_kwargs, emitter_kwargs)
if debug:
- print "-" * 79
- print textile_string2
- print "-" * 79
+ print("-" * 79)
+ print(textile_string2)
+ print("-" * 79)
self.assertEqual(textile_string2, textile_string, msg="html2textile")
@@ -212,8 +213,8 @@ class BaseCreoleTest(MarkupTest):
* html2textile
* textile2html
"""
-# assert isinstance(textile_string, unicode)
-# assert isinstance(html_string, unicode)
+# assert isinstance(textile_string, TEXT_TYPE)
+# assert isinstance(html_string, TEXT_TYPE)
self.assertNotEqual(textile_string, html_string)
# compare html -> textile
@@ -251,9 +252,9 @@ class BaseCreoleTest(MarkupTest):
# compare html -> reStructuredText
rest_string2 = html2rest(html_string, debug, parser_kwargs, emitter_kwargs)
if debug:
- print "-" * 79
- print rest_string2
- print "-" * 79
+ print("-" * 79)
+ print(rest_string2)
+ print("-" * 79)
self.assertEqual(rest_string2, rest_string, msg="html2rest")
@@ -274,9 +275,9 @@ class BaseCreoleTest(MarkupTest):
html = rest2html(rest_string)
if debug:
- print rest_string
- print html_string
- print html
+ print(rest_string)
+ print(html_string)
+ print(html)
html = html.strip()
# html = html.replace("<br />", "<br />\n")
@@ -288,8 +289,8 @@ class BaseCreoleTest(MarkupTest):
def cross_compare_rest(self, rest_string, html_string, \
strip_lines=False, debug=False, parser_kwargs={}, emitter_kwargs={}):
-# assert isinstance(textile_string, unicode)
-# assert isinstance(html_string, unicode)
+# assert isinstance(textile_string, TEXT_TYPE)
+# assert isinstance(html_string, TEXT_TYPE)
self.assertNotEqual(rest_string, html_string)
rest_string, html_string = self.assert_html2rest(
@@ -334,4 +335,4 @@ class BaseCreoleTest(MarkupTest):
if __name__ == '__main__':
import doctest
- print doctest.testmod()
+ print(doctest.testmod())
diff --git a/tests/utils/utils.py b/tests/utils/utils.py
index 95d1695..34e659a 100644
--- a/tests/utils/utils.py
+++ b/tests/utils/utils.py
@@ -11,7 +11,7 @@
:license: GNU GPL v3 or above, see LICENSE for more details.
"""
-from __future__ import division, absolute_import
+from __future__ import division, absolute_import, print_function, unicode_literals
import difflib
import unittest
@@ -51,15 +51,15 @@ class MarkupTest(unittest.TestCase):
def assertEqual(self, first, second, msg=""):
if not first == second:
if VERBOSE >= 2:
- print "first: %r" % first
- print "second: %r" % second
+ print("first: %r" % first)
+ print("second: %r" % second)
#~ first = first.rstrip("\\n")
#~ second = second.rstrip("\\n")
diff = make_diff(first, second)
if VERBOSE >= 2:
- print "diff: %r" % diff
+ print("diff: %r" % diff)
first = self._format_output(first)
second = self._format_output(second)
@@ -75,7 +75,7 @@ class MarkupTest(unittest.TestCase):
"""
prepare the multiline, indentation text.
"""
- txt = unicode(txt)
+ #txt = unicode(txt)
txt = txt.splitlines()
assert txt[0] == "", "First assertion line must be empty! Is: %s" % repr(txt[0])
txt = txt[1:] # Skip the first line
@@ -98,8 +98,8 @@ class MarkupTest(unittest.TestCase):
if txt.startswith("\n"): txt = txt[1:]
# and strip *one* newline at the end of the text
if txt.endswith("\n"): txt = txt[:-1]
- #~ print repr(txt)
- #~ print "-"*79
+ #~ print(repr(txt))
+ #~ print("-"*79)
return txt
@@ -150,6 +150,6 @@ class MarkupTest(unittest.TestCase):
if __name__ == '__main__':
import doctest
- print "DocTest:", doctest.testmod()
+ print("DocTest:", doctest.testmod())
unittest.main()