diff options
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"-=[ >>>nice<<< ]=-") - u'-=[ >>>nice<<< ]=-' + >>> d.replace_all("-=[ >>>nice<<< ]=-") + '-=[ >>>nice<<< ]=-' - >>> d.replace_all(u"-=[Mühlheim]=-") # uuml - latin small letter u with diaeresis - u'-=[M\\xfchlheim]=-' + >>> d.replace_all("-=[Mü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 @@ -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) @@ -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 @@ -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><bar?></p>') + self.assertEqual(html, '<p>foo</p>\n<p><bar?></p>') def test_example_macros2(self): html = creole2html( - markup_string=u"<<html>>{{{<nocode>}}}<</html>>", + markup_string="<<html>>{{{<nocode>}}}<</html>>", emitter_kwargs={ "verbose":1, "macros":example_macros, "stderr":sys.stderr, } ) - self.assertEqual(html, u'{{{<nocode>}}}') + self.assertEqual(html, '{{{<nocode>}}}') 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<br /> 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> >>> from creole import creole2html >>> creole2html("This is **creole //markup//**") - u'<p>This is <strong>creole <i>markup</i></strong></p>\n' + '<p>This is <strong>creole <i>markup</i></strong></p>\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 < and > to > """ 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() |