Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] python-docutils: update to 0.16rc1.
@ 2019-12-25  6:09 voidlinux-github
  2020-01-18  9:10 ` [PR PATCH] [Closed]: " voidlinux-github
  0 siblings, 1 reply; 2+ messages in thread
From: voidlinux-github @ 2019-12-25  6:09 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 393 bytes --]

There is a new pull request by sgn against master on the void-packages repository

https://github.com/sgn/void-packages python-docutils-update
https://github.com/void-linux/void-packages/pull/17768

python-docutils: update to 0.16rc1.
- python3 check passed
- python 2 check failed for some testcases

A patch file from https://github.com/void-linux/void-packages/pull/17768.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-python-docutils-update-17768.patch --]
[-- Type: text/x-diff, Size: 376913 bytes --]

From dbbe94e69b02be482befaf78c9f5e94c1e6409af Mon Sep 17 00:00:00 2001
From: Doan Tran Cong Danh <congdanhqx@gmail.com>
Date: Wed, 25 Dec 2019 12:53:32 +0700
Subject: [PATCH] python-docutils: update to 0.16rc1.

---
 .../0001-py3-Use-new-style-classes.patch      |  394 ----
 .../0002-py3-Switch-to-print-functions.patch  | 1517 ---------------
 ...3-Switch-to-except-foo-as-bar-syntax.patch |  719 -------
 ...-py3-Add-aliases-for-removed-symbols.patch |  599 ------
 ...ve-some-additional-undefined-symbols.patch |   80 -
 ...deprecated-form-of-raising-exception.patch |  263 ---
 ...-Replace-sys.maxint-with-sys.maxsize.patch |  103 -
 ...s.SliceType-with-slice-remove-types..patch |  128 --
 .../0009-py3-Use-absolute_import-future.patch | 1699 -----------------
 ...3-Use-sorted-foo-instead-of-foo.sort.patch |  236 ---
 ...mplify-code-following-recent-changes.patch |   49 -
 ...e-foo-bar-instead-of-type-foo-is-bar.patch |  120 --
 .../0013-Consistent-Python-3-checks.patch     |  594 ------
 ...4-py3-Replace-foo.next-with-next-foo.patch |   74 -
 ...lace-foo.has_key-bar-with-bar-in-foo.patch |   38 -
 ...-definition-of-nodes.Element.__conta.patch |   47 -
 ...-ConfigParser-to-configparser-rename.patch |   93 -
 .../patches/0018-py3-Replace-ur-prefix.patch  |  599 ------
 ...es-to-facilitate-integration-of-py3-.patch |  920 ---------
 ...py3-Handle-StringIO-to-io-transition.patch |   78 -
 ...-Python-2-3-compatibility-definition.patch |   91 -
 ...ndle-urllib-urllib2-to-urlib.-rename.patch |  202 --
 .../patches/0023-py3-Fix-magic-methods.patch  |  352 ----
 ...y3-Wrap-foo.keys-zip-foo-bar-in-list.patch |  147 --
 .../patches/0025-Simplify-code.patch          |   84 -
 ...andle-os.getcwdu-to-os.getcwd-rename.patch |   42 -
 .../python-docutils/patches/test-import.patch |   20 +
 srcpkgs/python-docutils/template              |   12 +-
 28 files changed, 28 insertions(+), 9272 deletions(-)
 delete mode 100644 srcpkgs/python-docutils/patches/0001-py3-Use-new-style-classes.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0002-py3-Switch-to-print-functions.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0003-py3-Switch-to-except-foo-as-bar-syntax.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0004-py3-Add-aliases-for-removed-symbols.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0005-py3-Resolve-some-additional-undefined-symbols.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0006-py3-Replace-deprecated-form-of-raising-exception.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0007-py3-Replace-sys.maxint-with-sys.maxsize.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0008-py3-Replace-types.SliceType-with-slice-remove-types..patch
 delete mode 100644 srcpkgs/python-docutils/patches/0009-py3-Use-absolute_import-future.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0010-py3-Use-sorted-foo-instead-of-foo.sort.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0011-Cleanup-simplify-code-following-recent-changes.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0012-Use-isinstance-foo-bar-instead-of-type-foo-is-bar.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0013-Consistent-Python-3-checks.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0014-py3-Replace-foo.next-with-next-foo.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0015-py3-Replace-foo.has_key-bar-with-bar-in-foo.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0016-Remove-duplicate-definition-of-nodes.Element.__conta.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0017-Handle-ConfigParser-to-configparser-rename.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0018-py3-Replace-ur-prefix.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0019-Formatting-changes-to-facilitate-integration-of-py3-.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0020-py3-Handle-StringIO-to-io-transition.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0021-Remove-auxiliary-Python-2-3-compatibility-definition.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0022-py3-Handle-urllib-urllib2-to-urlib.-rename.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0023-py3-Fix-magic-methods.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0024-py3-Wrap-foo.keys-zip-foo-bar-in-list.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0025-Simplify-code.patch
 delete mode 100644 srcpkgs/python-docutils/patches/0026-py3-Handle-os.getcwdu-to-os.getcwd-rename.patch
 create mode 100644 srcpkgs/python-docutils/patches/test-import.patch

diff --git a/srcpkgs/python-docutils/patches/0001-py3-Use-new-style-classes.patch b/srcpkgs/python-docutils/patches/0001-py3-Use-new-style-classes.patch
deleted file mode 100644
index 1014ee6298a..00000000000
--- a/srcpkgs/python-docutils/patches/0001-py3-Use-new-style-classes.patch
+++ /dev/null
@@ -1,394 +0,0 @@
-From 41f436c476b1cb6736050a12de0c9732c800019a Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:40:58 +0700
-Subject: [PATCH 01/26] py3: Use new style classes
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8345 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/__init__.py                |  2 +-
- docutils/core.py                    |  2 +-
- docutils/nodes.py                   | 54 +++++++++++++++++++++--------
- docutils/parsers/rst/roles.py       |  4 +--
- docutils/parsers/rst/states.py      |  4 +--
- docutils/parsers/rst/tableparser.py |  2 +-
- docutils/statemachine.py            |  8 ++---
- docutils/transforms/__init__.py     |  2 +-
- docutils/utils/__init__.py          |  2 +-
- docutils/utils/math/latex2mathml.py |  2 +-
- test/DocutilsTestSupport.py         |  2 +-
- test/alltests.py                    |  2 +-
- test/test_statemachine.py           |  2 +-
- tools/buildhtml.py                  |  4 +--
- tools/dev/create_unimap.py          |  4 +--
- tools/dev/unicode2rstsubs.py        |  2 +-
- 16 files changed, 61 insertions(+), 37 deletions(-)
-
-diff --git a/docutils/__init__.py b/docutils/__init__.py
-index f06e810..7d6a679 100644
---- a/docutils/__init__.py
-+++ b/docutils/__init__.py
-@@ -92,7 +92,7 @@ class ApplicationError(StandardError): pass
- class DataError(ApplicationError): pass
- 
- 
--class SettingsSpec:
-+class SettingsSpec(object):
- 
-     """
-     Runtime setting specification base class.
-diff --git a/docutils/core.py b/docutils/core.py
-index 3dc12e8..2eebbf2 100644
---- a/docutils/core.py
-+++ b/docutils/core.py
-@@ -23,7 +23,7 @@ from docutils.transforms import Transformer
- from docutils.utils.error_reporting import ErrorOutput, ErrorString
- import docutils.readers.doctree
- 
--class Publisher:
-+class Publisher(object):
- 
-     """
-     A facade encapsulating the high-level logic of a Docutils system.
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index d830616..9573208 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -1112,12 +1112,12 @@ class FixedTextElement(TextElement):
- #  Mixins
- # ========
- 
--class Resolvable:
-+class Resolvable(object):
- 
-     resolved = 0
- 
- 
--class BackLinkable:
-+class BackLinkable(object):
- 
-     def add_backref(self, refid):
-         self['backrefs'].append(refid)
-@@ -1127,39 +1127,63 @@ class BackLinkable:
- #  Element Categories
- # ====================
- 
--class Root: pass
-+class Root(object):
-+    pass
-+
-+
-+class Titular(object):
-+    pass
- 
--class Titular: pass
- 
--class PreBibliographic:
-+class PreBibliographic(object):
-     """Category of Node which may occur before Bibliographic Nodes."""
- 
--class Bibliographic: pass
- 
--class Decorative(PreBibliographic): pass
-+class Bibliographic(object):
-+    pass
-+
-+
-+class Decorative(PreBibliographic):
-+    pass
-+
-+
-+class Structural(object):
-+    pass
-+
-+
-+class Body(object):
-+    pass
- 
--class Structural: pass
- 
--class Body: pass
-+class General(Body):
-+    pass
- 
--class General(Body): pass
- 
- class Sequential(Body):
-     """List-like elements."""
- 
-+
- class Admonition(Body): pass
- 
-+
- class Special(Body):
-     """Special internal body elements."""
- 
-+
- class Invisible(PreBibliographic):
-     """Internal elements that don't appear in output."""
- 
--class Part: pass
- 
--class Inline: pass
-+class Part(object):
-+    pass
-+
-+
-+class Inline(object):
-+    pass
-+
- 
--class Referential(Resolvable): pass
-+class Referential(Resolvable):
-+    pass
- 
- 
- class Targetable(Resolvable):
-@@ -1171,7 +1195,7 @@ class Targetable(Resolvable):
-     Required for MoinMoin/reST compatibility."""
- 
- 
--class Labeled:
-+class Labeled(object):
-     """Contains a `label` as its first element."""
- 
- 
-@@ -1856,7 +1880,7 @@ node_class_names = """
- """A list of names of all concrete Node subclasses."""
- 
- 
--class NodeVisitor:
-+class NodeVisitor(object):
- 
-     """
-     "Visitor" pattern [GoF95]_ abstract superclass implementation for
-diff --git a/docutils/parsers/rst/roles.py b/docutils/parsers/rst/roles.py
-index 918e564..aa42c80 100644
---- a/docutils/parsers/rst/roles.py
-+++ b/docutils/parsers/rst/roles.py
-@@ -181,7 +181,7 @@ def register_generic_role(canonical_name, node_class):
-     register_canonical_role(canonical_name, role)
- 
- 
--class GenericRole:
-+class GenericRole(object):
- 
-     """
-     Generic interpreted text role, where the interpreted text is simply
-@@ -198,7 +198,7 @@ class GenericRole:
-         return [self.node_class(rawtext, utils.unescape(text), **options)], []
- 
- 
--class CustomRole:
-+class CustomRole(object):
- 
-     """
-     Wrapper for custom interpreted text roles.
-diff --git a/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py
-index d8ca9f0..2ece3b3 100644
---- a/docutils/parsers/rst/states.py
-+++ b/docutils/parsers/rst/states.py
-@@ -126,7 +126,7 @@ class ParserError(ApplicationError): pass
- class MarkupMismatch(Exception): pass
- 
- 
--class Struct:
-+class Struct(object):
- 
-     """Stores data attributes for dotted-attribute access."""
- 
-@@ -459,7 +459,7 @@ def build_regexp(definition, compile=True):
-         return regexp
- 
- 
--class Inliner:
-+class Inliner(object):
- 
-     """
-     Parse inline markup; call the `parse()` method.
-diff --git a/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
-index e19388b..45af72f 100644
---- a/docutils/parsers/rst/tableparser.py
-+++ b/docutils/parsers/rst/tableparser.py
-@@ -40,7 +40,7 @@ class TableMarkupError(DataError):
-             DataError.__init__(self, *args)
- 
- 
--class TableParser:
-+class TableParser(object):
- 
-     """
-     Abstract superclass for the common parts of the syntax-specific parsers.
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 6bb3c6b..2188982 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -114,7 +114,7 @@ from docutils import utils
- from docutils.utils.error_reporting import ErrorOutput
- 
- 
--class StateMachine:
-+class StateMachine(object):
- 
-     """
-     A finite state machine for text filters using regular expressions.
-@@ -518,7 +518,7 @@ class StateMachine:
-             observer(*info)
- 
- 
--class State:
-+class State(object):
- 
-     """
-     State superclass. Contains a list of transitions, and transition methods.
-@@ -1034,7 +1034,7 @@ class StateWS(State):
-         return context, next_state, results
- 
- 
--class _SearchOverride:
-+class _SearchOverride(object):
- 
-     """
-     Mix-in class to override `StateMachine` regular expression behavior.
-@@ -1067,7 +1067,7 @@ class SearchStateMachineWS(_SearchOverride, StateMachineWS):
-     pass
- 
- 
--class ViewList:
-+class ViewList(object):
- 
-     """
-     List with extended functionality: slices of ViewList objects are child
-diff --git a/docutils/transforms/__init__.py b/docutils/transforms/__init__.py
-index b009c5f..9271133 100644
---- a/docutils/transforms/__init__.py
-+++ b/docutils/transforms/__init__.py
-@@ -30,7 +30,7 @@ from docutils import languages, ApplicationError, TransformSpec
- class TransformError(ApplicationError): pass
- 
- 
--class Transform:
-+class Transform(object):
- 
-     """
-     Docutils transform component abstract base class.
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index be1c37e..7760f38 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -33,7 +33,7 @@ class SystemMessage(ApplicationError):
- class SystemMessagePropagation(ApplicationError): pass
- 
- 
--class Reporter:
-+class Reporter(object):
- 
-     """
-     Info/warning/error reporter and ``system_message`` element generator.
-diff --git a/docutils/utils/math/latex2mathml.py b/docutils/utils/math/latex2mathml.py
-index bcb4877..1a01bc8 100644
---- a/docutils/utils/math/latex2mathml.py
-+++ b/docutils/utils/math/latex2mathml.py
-@@ -155,7 +155,7 @@ negatables = {'=': u'\u2260',
-               r'\equiv': u'\u2262'}
- 
- # LaTeX to MathML translation stuff:
--class math:
-+class math(object):
-     """Base class for MathML elements."""
- 
-     nchildren = 1000000
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 54ba1c4..f7986f5 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -92,7 +92,7 @@ except:
- StringList.__repr__ = StringList.__str__
- 
- 
--class DevNull:
-+class DevNull(object):
- 
-     """Output sink."""
- 
-diff --git a/test/alltests.py b/test/alltests.py
-index 4a9b50f..9373124 100755
---- a/test/alltests.py
-+++ b/test/alltests.py
-@@ -24,7 +24,7 @@ import DocutilsTestSupport              # must be imported before docutils
- import docutils
- 
- 
--class Tee:
-+class Tee(object):
- 
-     """Write to a file and a stream (default: stdout) simultaneously."""
- 
-diff --git a/test/test_statemachine.py b/test/test_statemachine.py
-index 0e41337..07c561e 100755
---- a/test/test_statemachine.py
-+++ b/test/test_statemachine.py
-@@ -203,7 +203,7 @@ class SMWSTests(unittest.TestCase):
-         self.assertEqual(self.sm.run(testtext), expected)
- 
- 
--class EmptyClass:
-+class EmptyClass(object):
-     pass
- 
- 
-diff --git a/tools/buildhtml.py b/tools/buildhtml.py
-index 3333eab..aa4c759 100755
---- a/tools/buildhtml.py
-+++ b/tools/buildhtml.py
-@@ -107,7 +107,7 @@ class OptionParser(frontend.OptionParser):
-         return source, destination
- 
- 
--class Struct:
-+class Struct(object):
- 
-     """Stores data attributes for dotted-attribute access."""
- 
-@@ -115,7 +115,7 @@ class Struct:
-         self.__dict__.update(keywordargs)
- 
- 
--class Builder:
-+class Builder(object):
- 
-     def __init__(self):
-         self.publishers = {
-diff --git a/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
-index 0e45458..a1d92ac 100755
---- a/tools/dev/create_unimap.py
-+++ b/tools/dev/create_unimap.py
-@@ -28,8 +28,8 @@ def w(s):
- text_map = {}
- math_map = {}
- 
--class Visitor:
--    
-+
-+class Visitor(object):
-     """Node visitor for contents of unicode.xml."""
- 
-     def visit_character(self, node):
-diff --git a/tools/dev/unicode2rstsubs.py b/tools/dev/unicode2rstsubs.py
-index b741894..d719005 100755
---- a/tools/dev/unicode2rstsubs.py
-+++ b/tools/dev/unicode2rstsubs.py
-@@ -59,7 +59,7 @@ def process(infile):
-     grouper.write_sets()
- 
- 
--class CharacterEntitySetExtractor:
-+class CharacterEntitySetExtractor(object):
- 
-     """
-     Extracts character entity information from unicode.xml file, groups it by
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0002-py3-Switch-to-print-functions.patch b/srcpkgs/python-docutils/patches/0002-py3-Switch-to-print-functions.patch
deleted file mode 100644
index a6c73523433..00000000000
--- a/srcpkgs/python-docutils/patches/0002-py3-Switch-to-print-functions.patch
+++ /dev/null
@@ -1,1517 +0,0 @@
-From ede25690b4b71fbab02506f3a0919e9101b7b73b Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:47:55 +0700
-Subject: [PATCH 02/26] py3: Switch to print functions
-
-Remove all uses of print as a statement. This includes comments, many of
-which are simply removed as noise (they're in version control and can be
-re-added later, if necessary).
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8346 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/core.py                              | 37 +++++++------
- docutils/io.py                                |  7 ++-
- docutils/nodes.py                             |  3 +-
- docutils/parsers/rst/directives/body.py       |  3 +-
- docutils/parsers/rst/roles.py                 |  1 -
- docutils/parsers/rst/states.py                |  4 +-
- docutils/statemachine.py                      | 55 +++++++++----------
- docutils/transforms/universal.py              |  3 +-
- docutils/utils/__init__.py                    |  1 -
- docutils/utils/math/latex2mathml.py           |  1 -
- docutils/utils/math/tex2mathml_extern.py      |  7 ++-
- docutils/utils/smartquotes.py                 | 19 ++++---
- docutils/writers/_html_base.py                |  9 ---
- docutils/writers/latex2e/__init__.py          |  9 ++-
- install.py                                    |  5 +-
- setup.py                                      | 11 ++--
- test/DocutilsTestSupport.py                   | 27 ++++-----
- test/alltests.py                              | 32 +++++------
- test/package_unittest.py                      | 11 ++--
- test/test_error_reporting.py                  |  7 ++-
- test/test_functional.py                       |  5 +-
- test/test_io.py                               |  4 +-
- .../test_rst/test_directives/test_code.py     | 14 +++--
- .../test_directives/test_code_long.py         |  7 ++-
- .../test_directives/test_code_none.py         |  4 +-
- .../test_rst/test_doctest_blocks.py           | 12 ++--
- test/test_settings.py                         |  9 +--
- test/test_statemachine.py                     | 23 ++++----
- test/test_transforms/test_smartquotes.py      | 10 ++--
- .../test_strip_elements_with_class.py         |  2 +-
- test/test_viewlist.py                         | 14 -----
- tools/dev/create_unimap.py                    |  1 +
- tools/dev/generate_punctuation_chars.py       | 48 +---------------
- tools/dev/profile_docutils.py                 |  1 +
- tools/dev/unicode2rstsubs.py                  |  1 +
- tools/quicktest.py                            |  1 +
- tools/rst2odt_prepstyles.py                   | 28 +++++-----
- 37 files changed, 195 insertions(+), 241 deletions(-)
-
-diff --git a/docutils/core.py b/docutils/core.py
-index 2eebbf2..6a99020 100644
---- a/docutils/core.py
-+++ b/docutils/core.py
-@@ -11,6 +11,7 @@ custom component objects first, and pass *them* to
- 
- .. _The Docutils Publisher: http://docutils.sf.net/docs/api/publisher.html
- """
-+from __future__ import print_function
- 
- __docformat__ = 'reStructuredText'
- 
-@@ -243,24 +244,24 @@ class Publisher(object):
-         if not self.document:
-             return
-         if self.settings.dump_settings:
--            print >>self._stderr, '\n::: Runtime settings:'
--            print >>self._stderr, pprint.pformat(self.settings.__dict__)
-+            print('\n::: Runtime settings:', file=self._stderr)
-+            print(pprint.pformat(self.settings.__dict__), file=self._stderr)
-         if self.settings.dump_internals:
--            print >>self._stderr, '\n::: Document internals:'
--            print >>self._stderr, pprint.pformat(self.document.__dict__)
-+            print('\n::: Document internals:', file=self._stderr)
-+            print(pprint.pformat(self.document.__dict__), file=self._stderr)
-         if self.settings.dump_transforms:
--            print >>self._stderr, '\n::: Transforms applied:'
--            print >>self._stderr, (' (priority, transform class, '
--                                 'pending node details, keyword args)')
--            print >>self._stderr, pprint.pformat(
-+            print('\n::: Transforms applied:', file=self._stderr)
-+            print(' (priority, transform class, pending node details, '
-+                  'keyword args)', file=self._stderr)
-+            print(pprint.pformat(
-                 [(priority, '%s.%s' % (xclass.__module__, xclass.__name__),
-                   pending and pending.details, kwargs)
-                  for priority, xclass, pending, kwargs
--                 in self.document.transformer.applied])
-+                 in self.document.transformer.applied]), file=self._stderr)
-         if self.settings.dump_pseudo_xml:
--            print >>self._stderr, '\n::: Pseudo-XML:'
--            print >>self._stderr, self.document.pformat().encode(
--                'raw_unicode_escape')
-+            print('\n::: Pseudo-XML:', file=self._stderr)
-+            print(self.document.pformat().encode(
-+                'raw_unicode_escape'), file=self._stderr)
- 
-     def report_Exception(self, error):
-         if isinstance(error, utils.SystemMessage):
-@@ -275,8 +276,8 @@ class Publisher(object):
-                 u'Unable to open destination file for writing:\n'
-                 u'  %s\n' % ErrorString(error))
-         else:
--            print >>self._stderr, u'%s' % ErrorString(error)
--            print >>self._stderr, ("""\
-+            print(u'%s' % ErrorString(error), file=self._stderr)
-+            print(("""\
- Exiting due to error.  Use "--traceback" to diagnose.
- Please report errors to <docutils-users@lists.sf.net>.
- Include "--traceback" output, Docutils version (%s%s),
-@@ -284,12 +285,12 @@ Python version (%s), your OS type & version, and the
- command line used.""" % (__version__,
-                          docutils.__version_details__ and
-                          ' [%s]'%docutils.__version_details__ or '',
--                         sys.version.split()[0]))
-+                         sys.version.split()[0])), file=self._stderr)
- 
-     def report_SystemMessage(self, error):
--        print >>self._stderr, ('Exiting due to level-%s (%s) system message.'
--                             % (error.level,
--                                utils.Reporter.levels[error.level]))
-+        print('Exiting due to level-%s (%s) system message.' % (
-+            error.level, utils.Reporter.levels[error.level]),
-+              file=self._stderr)
- 
-     def report_UnicodeError(self, error):
-         data = error.object[error.start:error.end]
-diff --git a/docutils/io.py b/docutils/io.py
-index 79cb012..3b0f93e 100644
---- a/docutils/io.py
-+++ b/docutils/io.py
-@@ -6,6 +6,7 @@
- I/O classes provide a uniform API for low-level input and output.  Subclasses
- exist for a variety of input/output mechanisms.
- """
-+from __future__ import print_function
- 
- __docformat__ = 'reStructuredText'
- 
-@@ -343,9 +344,9 @@ class FileOutput(Output):
-         elif (# destination is file-type object -> check mode:
-               mode and hasattr(self.destination, 'mode')
-               and mode != self.destination.mode):
--                print >>self._stderr, ('Warning: Destination mode "%s" '
--                               'differs from specified mode "%s"' %
--                               (self.destination.mode, mode))
-+                print('Warning: Destination mode "%s" differs from specified '
-+                      'mode "%s"' % (self.destination.mode, mode),
-+                      file=self._stderr)
-         if not destination_path:
-             try:
-                 self.destination_path = self.destination.name
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index 9573208..8a5b7bb 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -19,6 +19,7 @@ hierarchy.
- 
- .. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd
- """
-+from __future__ import print_function
- 
- __docformat__ = 'reStructuredText'
- 
-@@ -1724,7 +1725,7 @@ class system_message(Special, BackLinkable, PreBibliographic, Element):
-         try:
-             Element.__init__(self, rawsource, *children, **attributes)
-         except:
--            print 'system_message: children=%r' % (children,)
-+            print('system_message: children=%r' % (children,))
-             raise
- 
-     def astext(self):
-diff --git a/docutils/parsers/rst/directives/body.py b/docutils/parsers/rst/directives/body.py
-index c8bf172..b60c3ad 100644
---- a/docutils/parsers/rst/directives/body.py
-+++ b/docutils/parsers/rst/directives/body.py
-@@ -11,13 +11,13 @@ See `docutils.parsers.rst.directives` for API details.
- __docformat__ = 'reStructuredText'
- 
- 
--import sys
- from docutils import nodes
- from docutils.parsers.rst import Directive
- from docutils.parsers.rst import directives
- from docutils.parsers.rst.roles import set_classes
- from docutils.utils.code_analyzer import Lexer, LexerError, NumberLines
- 
-+
- class BasePseudoSection(Directive):
- 
-     required_arguments = 1
-@@ -167,7 +167,6 @@ class CodeBlock(Directive):
-             node.attributes['source'] = self.options['source']
-         # analyze content and add nodes for every token
-         for classes, value in tokens:
--            # print (classes, value)
-             if classes:
-                 node += nodes.inline(value, value, classes=classes)
-             else:
-diff --git a/docutils/parsers/rst/roles.py b/docutils/parsers/rst/roles.py
-index aa42c80..bf786b7 100644
---- a/docutils/parsers/rst/roles.py
-+++ b/docutils/parsers/rst/roles.py
-@@ -342,7 +342,6 @@ def code_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
- 
-     # analyse content and add nodes for every token
-     for classes, value in tokens:
--        # print (classes, value)
-         if classes:
-             node += nodes.inline(value, value, classes=classes)
-         else:
-diff --git a/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py
-index 2ece3b3..a2970c8 100644
---- a/docutils/parsers/rst/states.py
-+++ b/docutils/parsers/rst/states.py
-@@ -2758,8 +2758,8 @@ class Text(RSTState):
-             src, srcline = self.state_machine.get_source_and_line()
-             # TODO: why is abs_line_number() == srcline+1
-             # if the error is in a table (try with test_tables.py)?
--            # print "get_source_and_line", srcline
--            # print "abs_line_number", self.state_machine.abs_line_number()
-+            # print("get_source_and_line", srcline)
-+            # print("abs_line_number", self.state_machine.abs_line_number())
-             msg = self.reporter.severe('Unexpected section title.',
-                 nodes.literal_block(blocktext, blocktext),
-                 source=src, line=srcline)
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 2188982..6714a04 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -103,6 +103,7 @@ How To Use This Module
- 
-        sm.unlink()
- """
-+from __future__ import print_function
- 
- __docformat__ = 'restructuredtext'
- 
-@@ -213,15 +214,15 @@ class StateMachine(object):
-         self.line_offset = -1
-         self.current_state = initial_state or self.initial_state
-         if self.debug:
--            print >>self._stderr, (
-+            print((
-                 u'\nStateMachine.run: input_lines (line_offset=%s):\n| %s'
--                % (self.line_offset, u'\n| '.join(self.input_lines)))
-+                % (self.line_offset, u'\n| '.join(self.input_lines))), file=self._stderr)
-         transitions = None
-         results = []
-         state = self.get_state()
-         try:
-             if self.debug:
--                print >>self._stderr, '\nStateMachine.run: bof transition'
-+                print('\nStateMachine.run: bof transition', file=self._stderr)
-             context, result = state.bof(context)
-             results.extend(result)
-             while True:
-@@ -231,17 +232,17 @@ class StateMachine(object):
-                         if self.debug:
-                             source, offset = self.input_lines.info(
-                                 self.line_offset)
--                            print >>self._stderr, (
-+                            print((
-                                 u'\nStateMachine.run: line (source=%r, '
-                                 u'offset=%r):\n| %s'
--                                % (source, offset, self.line))
-+                                % (source, offset, self.line)), file=self._stderr)
-                         context, next_state, result = self.check_line(
-                             context, state, transitions)
-                     except EOFError:
-                         if self.debug:
--                            print >>self._stderr, (
-+                            print((
-                                 '\nStateMachine.run: %s.eof transition'
--                                % state.__class__.__name__)
-+                                % state.__class__.__name__), file=self._stderr)
-                         result = state.eof(context)
-                         results.extend(result)
-                         break
-@@ -251,10 +252,10 @@ class StateMachine(object):
-                     self.previous_line() # back up for another try
-                     transitions = (exception.args[0],)
-                     if self.debug:
--                        print >>self._stderr, (
-+                        print((
-                               '\nStateMachine.run: TransitionCorrection to '
-                               'state "%s", transition %s.'
--                              % (state.__class__.__name__, transitions[0]))
-+                              % (state.__class__.__name__, transitions[0])), file=self._stderr)
-                     continue
-                 except StateCorrection, exception:
-                     self.previous_line() # back up for another try
-@@ -264,10 +265,10 @@ class StateMachine(object):
-                     else:
-                         transitions = (exception.args[1],)
-                     if self.debug:
--                        print >>self._stderr, (
-+                        print((
-                               '\nStateMachine.run: StateCorrection to state '
-                               '"%s", transition %s.'
--                              % (next_state, transitions[0]))
-+                              % (next_state, transitions[0])), file=self._stderr)
-                 else:
-                     transitions = None
-                 state = self.get_state(next_state)
-@@ -288,11 +289,11 @@ class StateMachine(object):
-         """
-         if next_state:
-             if self.debug and next_state != self.current_state:
--                print >>self._stderr, (
-+                print((
-                     '\nStateMachine.get_state: Changing state from '
-                     '"%s" to "%s" (input line %s).'
-                     % (self.current_state, next_state,
--                       self.abs_line_number()))
-+                       self.abs_line_number())), file=self._stderr)
-             self.current_state = next_state
-         try:
-             return self.states[self.current_state]
-@@ -382,15 +383,11 @@ class StateMachine(object):
-             # line is None if index is "Just past the end"
-             src, srcline = self.get_source_and_line(offset + self.input_offset)
-             return src, srcline + 1
--        except (IndexError): # `offset` is off the list
-+        except (IndexError):  # `offset` is off the list
-             src, srcline = None, None
-             # raise AssertionError('cannot find line %d in %s lines' %
-             #                      (offset, len(self.input_lines)))
-             #                      # list(self.input_lines.lines())))
--        # assert offset == srcoffset, str(self.input_lines)
--        # print "get_source_and_line(%s):" % lineno,
--        # print offset + 1, '->', src, srcline
--        # print self.input_lines
-         return (src, srcline)
- 
-     def insert_input(self, input_lines, source):
-@@ -445,24 +442,24 @@ class StateMachine(object):
-             transitions =  state.transition_order
-         state_correction = None
-         if self.debug:
--            print >>self._stderr, (
-+            print((
-                   '\nStateMachine.check_line: state="%s", transitions=%r.'
--                  % (state.__class__.__name__, transitions))
-+                  % (state.__class__.__name__, transitions)), file=self._stderr)
-         for name in transitions:
-             pattern, method, next_state = state.transitions[name]
-             match = pattern.match(self.line)
-             if match:
-                 if self.debug:
--                    print >>self._stderr, (
-+                    print((
-                           '\nStateMachine.check_line: Matched transition '
-                           '"%s" in state "%s".'
--                          % (name, state.__class__.__name__))
-+                          % (name, state.__class__.__name__)), file=self._stderr)
-                 return method(match, context, next_state)
-         else:
-             if self.debug:
--                print >>self._stderr, (
-+                print((
-                       '\nStateMachine.check_line: No match in state "%s".'
--                      % state.__class__.__name__)
-+                      % state.__class__.__name__), file=self._stderr)
-             return state.no_match(context, transitions)
- 
-     def add_state(self, state_class):
-@@ -494,10 +491,10 @@ class StateMachine(object):
-     def error(self):
-         """Report error details."""
-         type, value, module, line, function = _exception_data()
--        print >>self._stderr, u'%s: %s' % (type, value)
--        print >>self._stderr, 'input line %s' % (self.abs_line_number())
--        print >>self._stderr, (u'module %s, line %s, function %s' %
--                               (module, line, function))
-+        print(u'%s: %s' % (type, value), file=self._stderr)
-+        print('input line %s' % (self.abs_line_number()), file=self._stderr)
-+        print((u'module %s, line %s, function %s' %
-+                               (module, line, function)), file=self._stderr)
- 
-     def attach_observer(self, observer):
-         """
-@@ -1329,7 +1326,7 @@ class ViewList(object):
-     def pprint(self):
-         """Print the list in `grep` format (`source:offset:value` lines)"""
-         for line in self.xitems():
--            print "%s:%d:%s" % line
-+            print("%s:%d:%s" % line)
- 
- 
- class StringList(ViewList):
-diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py
-index 3f8ddbc..47e1276 100644
---- a/docutils/transforms/universal.py
-+++ b/docutils/transforms/universal.py
-@@ -17,12 +17,12 @@ Transforms needed by most or all documents:
- __docformat__ = 'reStructuredText'
- 
- import re
--import sys
- import time
- from docutils import nodes, utils
- from docutils.transforms import TransformError, Transform
- from docutils.utils import smartquotes
- 
-+
- class Decorations(Transform):
- 
-     """
-@@ -257,7 +257,6 @@ class SmartQuotes(Transform):
-             alternative = smart_quotes.startswith('alt')
-         except AttributeError:
-             alternative = False
--        # print repr(alternative)
- 
-         document_language = self.document.settings.language_code
-         lc_smartquotes = self.document.settings.smartquotes_locales
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index 7760f38..692335a 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -173,7 +173,6 @@ class Reporter(object):
-         if not 'source' in attributes: # 'line' is absolute line number
-             try: # look up (source, line-in-source)
-                 source, line = self.get_source_and_line(attributes.get('line'))
--                # print "locator lookup", kwargs.get('line'), "->", source, line
-             except AttributeError:
-                 source, line = None, None
-             if source is not None:
-diff --git a/docutils/utils/math/latex2mathml.py b/docutils/utils/math/latex2mathml.py
-index 1a01bc8..255e96f 100644
---- a/docutils/utils/math/latex2mathml.py
-+++ b/docutils/utils/math/latex2mathml.py
-@@ -384,7 +384,6 @@ def parse_latex_math(string, inline=True):
-             c2 = string[1]
-         else:
-             c2 = ''
--##        print n, string, c, c2, node.__class__.__name__
-         if c == ' ':
-             pass
-         elif c == '\\':
-diff --git a/docutils/utils/math/tex2mathml_extern.py b/docutils/utils/math/tex2mathml_extern.py
-index e461836..3e7f158 100644
---- a/docutils/utils/math/tex2mathml_extern.py
-+++ b/docutils/utils/math/tex2mathml_extern.py
-@@ -15,6 +15,7 @@
- # Wrappers for TeX->MathML conversion by external tools
- # =====================================================
- 
-+from __future__ import print_function
- import subprocess
- 
- document_template = r"""\documentclass{article}
-@@ -141,6 +142,6 @@ def blahtexml(math_code, inline=True, reporter=None):
- 
- if __name__ == "__main__":
-     example = ur'\frac{\partial \sin^2(\alpha)}{\partial \vec r} \varpi \, \text{Grüße}'
--    # print latexml(example).encode('utf8')
--    # print ttm(example)#.encode('utf8')
--    print blahtexml(example).encode('utf8')
-+    # print(latexml(example).encode('utf8'))
-+    # print(ttm(example))
-+    print(blahtexml(example).encode('utf8'))
-diff --git a/docutils/utils/smartquotes.py b/docutils/utils/smartquotes.py
-index ebf0240..148a4c9 100644
---- a/docutils/utils/smartquotes.py
-+++ b/docutils/utils/smartquotes.py
-@@ -315,6 +315,7 @@ Version History
- 1.5_1.0: Tue, 09 Mar 2004 08:08:35 -0500
-         - Initial release
- """
-+from __future__ import print_function
- 
- options = r"""
- Options
-@@ -964,16 +965,16 @@ if __name__ == "__main__":
-     args = parser.parse_args()
- 
-     if args.doc:
--        print (__doc__)
-+        print(__doc__)
-     elif args.actionhelp:
--        print options
-+        print(options)
-     elif args.stylehelp:
--        print
--        print "Available styles (primary open/close, secondary open/close)"
--        print "language tag   quotes"
--        print "============   ======"
-+        print()
-+        print("Available styles (primary open/close, secondary open/close)")
-+        print("language tag   quotes")
-+        print("============   ======")
-         for key in sorted(smartchars.quotes.keys()):
--            print "%-14s %s" % (key, smartchars.quotes[key])
-+            print("%-14s %s" % (key, smartchars.quotes[key]))
-     elif args.test:
-         # Unit test output goes to stderr.
-         import unittest
-@@ -1006,5 +1007,5 @@ if __name__ == "__main__":
-             else:
-                 args.language += '-x-altquot'
-         text = sys.stdin.read().decode(args.encoding)
--        print smartyPants(text, attr=args.action,
--                          language=args.language).encode(args.encoding)
-+        print(smartyPants(text, attr=args.action,
-+                          language=args.language).encode(args.encoding))
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index b357120..fa27911 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -494,7 +494,6 @@ class HTMLTranslator(nodes.NodeVisitor):
-     # the end of this file).
- 
-     def is_compactable(self, node):
--        # print "is_compactable %s ?" % node.__class__,
-         # explicite class arguments have precedence
-         if 'compact' in node['classes']:
-             return True
-@@ -503,11 +502,9 @@ class HTMLTranslator(nodes.NodeVisitor):
-         # check config setting:
-         if (isinstance(node, (nodes.field_list, nodes.definition_list))
-             and not self.settings.compact_field_lists):
--            # print "`compact-field-lists` is False"
-             return False
-         if (isinstance(node, (nodes.enumerated_list, nodes.bullet_list))
-             and not self.settings.compact_lists):
--            # print "`compact-lists` is False"
-             return False
-         # more special cases:
-         if (self.topic_classes == ['contents']): # TODO: self.in_contents
-@@ -882,7 +879,6 @@ class HTMLTranslator(nodes.NodeVisitor):
-         if 'sectnum' in node['classes']:
-             # get section number (strip trailing no-break-spaces)
-             sectnum = node.astext().rstrip(u' ')
--            # print sectnum.encode('utf-8')
-             self.body.append('<span class="sectnum">%s</span> '
-                                     % self.encode(sectnum))
-             # Content already processed:
-@@ -1194,7 +1190,6 @@ class HTMLTranslator(nodes.NodeVisitor):
-         pass # never reached
- 
-     def visit_math_block(self, node):
--        # print node.astext().encode('utf8')
-         math_env = pick_math_environment(node.astext())
-         self.visit_math(node, math_env=math_env)
- 
-@@ -1611,20 +1606,16 @@ class SimpleListChecker(nodes.GenericNodeVisitor):
-         raise nodes.NodeFound
- 
-     def visit_list_item(self, node):
--        # print "visiting list item", node.__class__
-         children = [child for child in node.children
-                     if not isinstance(child, nodes.Invisible)]
--        # print "has %s visible children" % len(children)
-         if (children and isinstance(children[0], nodes.paragraph)
-             and (isinstance(children[-1], nodes.bullet_list) or
-                  isinstance(children[-1], nodes.enumerated_list) or
-                  isinstance(children[-1], nodes.field_list))):
-             children.pop()
--        # print "%s children remain" % len(children)
-         if len(children) <= 1:
-             return
-         else:
--            # print "found", child.__class__, "in", node.__class__
-             raise nodes.NodeFound
- 
-     def pass_node(self, node):
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 2ee1270..5c33d0a 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -15,7 +15,6 @@ __docformat__ = 'reStructuredText'
- 
- import sys
- import os
--import time
- import re
- import string
- import urllib
-@@ -28,6 +27,7 @@ from docutils.utils.error_reporting import SafeString
- from docutils.transforms import writer_aux
- from docutils.utils.math import pick_math_environment, unichar2tex
- 
-+
- class Writer(writers.Writer):
- 
-     supported = ('latex','latex2e')
-@@ -2283,14 +2283,14 @@ class LaTeXTranslator(nodes.NodeVisitor):
-             href = self.document.nameids[node['refname']]
-         # if not self.docutils_footnotes:
-             # TODO: insert footnote content at (or near) this place
--            # print "footnote-ref to", node['refid']
-+            # print("footnote-ref to", node['refid'])
-             # footnotes = (self.document.footnotes +
-             #              self.document.autofootnotes +
-             #              self.document.symbol_footnotes)
-             # for footnote in footnotes:
--            #     # print footnote['ids']
-+            #     # print(footnote['ids'])
-             #     if node.get('refid', '') in footnote['ids']:
--            #         print 'matches', footnote['ids']
-+            #         print('matches', footnote['ids'])
-         format = self.settings.footnote_references
-         if format == 'brackets':
-             self.append_hypertargets(node)
-@@ -2623,7 +2623,6 @@ class LaTeXTranslator(nodes.NodeVisitor):
-                                  r'\begin{%s}' % math_env,
-                                  '%s',
-                                  r'\end{%s}' % math_env])
--        # print repr(wrapper), repr(math_code)
-         self.out.append(wrapper % math_code)
-         if node['classes']:
-             self.depart_inline(node)
-diff --git a/install.py b/install.py
-index 2085627..b7de278 100755
---- a/install.py
-+++ b/install.py
-@@ -15,12 +15,13 @@ one of::
-     python setup.py install --help
-     python setup.py --help
- """
-+from __future__ import print_function
- 
- from distutils import core
- from setup import do_setup
- 
--if __name__ == '__main__' :
--    print __doc__
-+if __name__ == '__main__':
-+    print(__doc__)
-     core._setup_stop_after = 'config'
-     dist = do_setup()
-     dist.commands = ['install']
-diff --git a/setup.py b/setup.py
-index f801ea2..4280b98 100755
---- a/setup.py
-+++ b/setup.py
-@@ -2,9 +2,12 @@
- # $Id: setup.py 8304 2019-07-30 09:51:07Z grubert $
- # Copyright: This file has been placed in the public domain.
- 
-+from __future__ import print_function
-+
- import sys
- import os
- import glob
-+
- try:
-     import setuptools
-     from distutils.core import setup, Command
-@@ -17,10 +20,10 @@ try:
-     from distutils.util import convert_path
-     from distutils import log
- except ImportError:
--    print ('Error: The "distutils" standard module, which is required for the ')
--    print ('installation of Docutils, could not be found.  You may need to ')
--    print ('install a package called "python-devel" (or similar) on your ')
--    print ('system using your package manager.')
-+    print('Error: The "distutils" standard module, which is required for the ')
-+    print('installation of Docutils, could not be found.  You may need to ')
-+    print('install a package called "python-devel" (or similar) on your ')
-+    print('system using your package manager.')
-     sys.exit(1)
- 
- 
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index f7986f5..25196ec 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -38,6 +38,7 @@ Exports the following:
-     - `HtmlFragmentTestSuite`
-     - `DevNull` (output sink)
- """
-+from __future__ import print_function
- __docformat__ = 'reStructuredText'
- 
- import sys
-@@ -230,17 +231,17 @@ class CustomTestCase(StandardTestCase):
-         try:
-             self.assertEqual(output, expected)
-         except AssertionError, error:
--            print >>sys.stderr, '\n%s\ninput:' % (self,)
--            print >>sys.stderr, input
-+            print('\n%s\ninput:' % (self,), file=sys.stderr)
-+            print(input, file=sys.stderr)
-             try:
-                 comparison = ''.join(self.compare(expected.splitlines(1),
-                                                   output.splitlines(1)))
--                print >>sys.stderr, '-: expected\n+: output'
--                print >>sys.stderr, comparison
-+                print('-: expected\n+: output', file=sys.stderr)
-+                print(comparison, file=sys.stderr)
-             except AttributeError:      # expected or output not a string
-                 # alternative output for non-strings:
--                print >>sys.stderr, 'expected: %r' % expected
--                print >>sys.stderr, 'output:   %r' % output
-+                print('expected: %r' % expected, file=sys.stderr)
-+                print('output:   %r' % output, file=sys.stderr)
-             raise error
- 
- 
-@@ -375,20 +376,20 @@ class TransformTestCase(CustomTestCase):
-     def test_transforms_verbosely(self):
-         if self.run_in_debugger:
-             pdb.set_trace()
--        print '\n', self.id
--        print '-' * 70
--        print self.input
-+        print('\n', self.id)
-+        print('-' * 70)
-+        print(self.input)
-         settings = self.settings.copy()
-         settings.__dict__.update(self.suite_settings)
-         document = utils.new_document('test data', settings)
-         self.parser.parse(self.input, document)
--        print '-' * 70
--        print document.pformat()
-+        print('-' * 70)
-+        print(document.pformat())
-         for transformClass in self.transforms:
-             transformClass(document).apply()
-         output = document.pformat()
--        print '-' * 70
--        print output
-+        print('-' * 70)
-+        print(output)
-         self.compare_output(self.input, output, self.expected)
- 
- 
-diff --git a/test/alltests.py b/test/alltests.py
-index 9373124..364593f 100755
---- a/test/alltests.py
-+++ b/test/alltests.py
-@@ -1,12 +1,12 @@
- #!/bin/sh
- ''''exec python -u "$0" "$@" #'''
-+from __future__ import print_function
- 
- # $Id: alltests.py 8124 2017-06-23 02:29:16Z goodger $
- # Author: David Goodger <goodger@python.org>
- # Copyright: This module has been placed in the public domain.
- 
--__doc__ = \
--"""
-+__doc__ = """\
- All modules named 'test_*.py' in the current directory, and recursively in
- subdirectories (packages) called 'test_*', are loaded and test suites within
- are run.
-@@ -15,7 +15,7 @@ are run.
- import time
- # Start point for actual elapsed time, including imports
- # and setup outside of unittest.
--start = time.time()
-+start = time.time()  # noqa
- 
- import sys
- import os
-@@ -57,12 +57,13 @@ def pformat(suite):
-         if line[-1:] == '[':
-             indent += step
-         else:
--            if line [-5:] == ']>]>,':
-+            if line[-5:] == ']>]>,':
-                 indent -= step * 2
-             elif line[-3:] == ']>,':
-                 indent -= step
-     return '\n'.join(output)
- 
-+
- def suite():
-     path, script = os.path.split(sys.argv[0])
-     suite = package_unittest.loadTestModules(DocutilsTestSupport.testroot,
-@@ -70,26 +71,25 @@ def suite():
-     sys.stdout.flush()
-     return suite
- 
-+
- # must redirect stderr *before* first import of unittest
- sys.stdout = sys.stderr = Tee('alltests.out')
- 
--import package_unittest
-+import package_unittest  # noqa
- 
- 
- if __name__ == '__main__':
-     suite = suite()
--    print ('Testing Docutils %s with Python %s on %s at %s'
--           % (docutils.__version__, sys.version.split()[0],
--              time.strftime('%Y-%m-%d'), time.strftime('%H:%M:%S')))
--    print ('OS: %s %s %s (%s, %s)'
--        % (platform.system(), platform.release(), platform.version(),
--           sys.platform, platform.platform()))
--    print 'Working directory: %s' % os.getcwd()
--    print 'Docutils package: %s' % os.path.dirname(docutils.__file__)
-+    print('Testing Docutils %s with Python %s on %s at %s' % (
-+        docutils.__version__, sys.version.split()[0],
-+        time.strftime('%Y-%m-%d'), time.strftime('%H:%M:%S')))
-+    print('OS: %s %s %s (%s, %s)' % (
-+        platform.system(), platform.release(), platform.version(),
-+        sys.platform, platform.platform()))
-+    print('Working directory: %s' % os.getcwd())
-+    print('Docutils package: %s' % os.path.dirname(docutils.__file__))
-     sys.stdout.flush()
-     result = package_unittest.main(suite)
--    #if package_unittest.verbosity > 1:
--    #    print >>sys.stderr, pformat(suite) # check the test suite
-     finish = time.time()
--    print 'Elapsed time: %.3f seconds' % (finish - start)
-+    print('Elapsed time: %.3f seconds' % (finish - start))
-     sys.exit(not result.wasSuccessful())
-diff --git a/test/package_unittest.py b/test/package_unittest.py
-index 0efab12..daf11f4 100644
---- a/test/package_unittest.py
-+++ b/test/package_unittest.py
-@@ -9,6 +9,7 @@ This module extends unittest.py with `loadTestModules()`, by loading multiple
- test modules from a directory.  Optionally, test packages are also loaded,
- recursively.
- """
-+from __future__ import print_function
- 
- import sys
- import os
-@@ -37,8 +38,8 @@ Options:
- def usageExit(msg=None):
-     """Print usage and exit."""
-     if msg:
--        print msg
--    print USAGE
-+        print(msg)
-+    print(USAGE)
-     sys.exit(2)
- 
- def parseArgs(argv=sys.argv):
-@@ -96,11 +97,11 @@ def loadTestModules(path, name='', packages=None):
-     sys.path.insert(0, path)
-     for mod in testModules:
-         if debug:
--            print >>sys.stderr, "importing %s" % mod
-+            print("importing %s" % mod, file=sys.stderr)
-         try:
-             module = import_module(mod)
-         except ImportError:
--            print >>sys.stderr, "ERROR: Can't import %s, skipping its tests:" % mod
-+            print("ERROR: Can't import %s, skipping its tests:" % mod, file=sys.stderr)
-             sys.excepthook(*sys.exc_info())
-         else:
-             # if there's a suite defined, incorporate its contents
-@@ -148,7 +149,7 @@ def main(suite=None):
-         suite = unittest.defaultTestLoader.loadTestsFromModule(
-               __import__('__main__'))
-     if debug:
--        print >>sys.stderr, "Debug: Suite=%s" % suite
-+        print("Debug: Suite=%s" % suite, file=sys.stderr)
-     testRunner = unittest.TextTestRunner(verbosity=verbosity)
-     # run suites (if we were called from test_all) or suite...
-     if type(suite) == type([]):
-diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py
-index 902e878..c4eae40 100644
---- a/test/test_error_reporting.py
-+++ b/test/test_error_reporting.py
-@@ -20,13 +20,14 @@ instances like, e.g., ::
-   try:
-     something
-   except IOError, error:
--    print 'Found %s' % error
-+    print('Found %s' % error)
- 
- unless the minimal required Python version has this problem fixed.
- """
- 
- import unittest
--import sys, os
-+import sys
-+import os
- import codecs
- from io import StringIO, BytesIO
- 
-@@ -42,7 +43,7 @@ if sys.version_info < (3,0): # problems solved in py3k
-         # Why does getlocale return the defaultlocale in Python 3.2 ????
-         # oldlocale = (None, None) # test suite runs without locale
-     except ImportError:
--        print ('cannot test error reporting with problematic locales,\n'
-+        print('cannot test error reporting with problematic locales,\n'
-             '`import locale` failed.')
- 
- 
-diff --git a/test/test_functional.py b/test/test_functional.py
-index 43710de..5d3beb9 100755
---- a/test/test_functional.py
-+++ b/test/test_functional.py
-@@ -9,6 +9,7 @@ Perform tests with the data in the functional/ directory.
- 
- Read README.txt for details on how this is done.
- """
-+from __future__ import print_function
- 
- import sys
- import os
-@@ -194,8 +195,8 @@ expected output and check it in:
-                 expected_path, params['destination_path']))
-             if sys.version_info < (3,0):
-                 diff = diff.encode(sys.stderr.encoding or 'ascii', 'replace')
--            print >>sys.stderr, '\n%s:' % (self,)
--            print >>sys.stderr, diff
-+            print('\n%s:' % (self,), file=sys.stderr)
-+            print(diff, file=sys.stderr)
-             raise
-         # Execute optional function containing extra tests:
-         if '_test_more' in namespace:
-diff --git a/test/test_io.py b/test/test_io.py
-index 6ea4789..737a19d 100755
---- a/test/test_io.py
-+++ b/test/test_io.py
-@@ -69,7 +69,7 @@ blah
-         input = io.StringInput(source=b"""\
- #! python
- # -*- coding: ascii -*-
--print "hello world"
-+print("hello world")
- """)
-         data = input.read()
-         self.assertEqual(input.successful_encoding, 'ascii')
-@@ -77,7 +77,7 @@ print "hello world"
- #! python
- # extraneous comment; prevents coding slug from being read
- # -*- coding: ascii -*-
--print "hello world"
-+print("hello world")
- """)
-         data = input.read()
-         self.assertNotEqual(input.successful_encoding, 'ascii')
-diff --git a/test/test_parsers/test_rst/test_directives/test_code.py b/test/test_parsers/test_rst/test_directives/test_code.py
-index 30fe74f..51c1558 100644
---- a/test/test_parsers/test_rst/test_directives/test_code.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code.py
-@@ -98,7 +98,7 @@ totest['code-parsing'] = [
- .. code:: python
-   :class: testclass
- 
--   print 'hello world' # to stdout
-+   print('hello world') # to stdout
- """,
- """\
- <document source="test data">
-@@ -106,9 +106,12 @@ totest['code-parsing'] = [
-          \n\
-         <inline classes="keyword">
-             print
--         \n\
-+        <inline classes="punctuation">
-+            (
-         <inline classes="literal string single">
-             'hello world'
-+        <inline classes="punctuation">
-+            )
-          \n\
-         <inline classes="comment single">
-             # to stdout
-@@ -124,7 +127,7 @@ totest['code-parsing'] = [
-       '''
- 
-       # and now for something completely different
--      print 8/2
-+      print(8/2)
- """,
- """\
- <document source="test data">
-@@ -163,13 +166,16 @@ totest['code-parsing'] = [
-             \n\
-         <inline classes="keyword">
-             print
--         \n\
-+        <inline classes="punctuation">
-+            (
-         <inline classes="literal number integer">
-             8
-         <inline classes="operator">
-             /
-         <inline classes="literal number integer">
-             2
-+        <inline classes="punctuation">
-+            )
- """],
- ["""\
- .. code:: latex
-diff --git a/test/test_parsers/test_rst/test_directives/test_code_long.py b/test/test_parsers/test_rst/test_directives/test_code_long.py
-index 43eb886..74f16d5 100644
---- a/test/test_parsers/test_rst/test_directives/test_code_long.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code_long.py
-@@ -29,7 +29,7 @@ totest['code-parsing-long'] = [
-       '''
- 
-       # and now for something completely different
--      print 8/2
-+      print(8/2)
- """,
- """\
- <document source="test data">
-@@ -68,13 +68,16 @@ totest['code-parsing-long'] = [
-             \n\
-         <inline classes="keyword">
-             print
--         \n\
-+        <inline classes="punctuation">
-+            (
-         <inline classes="literal number integer">
-             8
-         <inline classes="operator">
-             /
-         <inline classes="literal number integer">
-             2
-+        <inline classes="punctuation">
-+            )
- """],
- ["""\
- .. code:: latex
-diff --git a/test/test_parsers/test_rst/test_directives/test_code_none.py b/test/test_parsers/test_rst/test_directives/test_code_none.py
-index 86653e6..515772c 100644
---- a/test/test_parsers/test_rst/test_directives/test_code_none.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code_none.py
-@@ -37,7 +37,7 @@ totest['code-parsing-none'] = [
-       '''
- 
-       # and now for something completely different
--      print 8/2
-+      print(8/2)
- """,
- """\
- <document source="test data">
-@@ -59,7 +59,7 @@ totest['code-parsing-none'] = [
-             # and now for something completely different
-         <inline classes="ln">
-             12 \n\
--            print 8/2
-+            print(8/2)
- """],
- ["""\
- .. code:: latex
-diff --git a/test/test_parsers/test_rst/test_doctest_blocks.py b/test/test_parsers/test_rst/test_doctest_blocks.py
-index dabc2ec..4f367db 100755
---- a/test/test_parsers/test_rst/test_doctest_blocks.py
-+++ b/test/test_parsers/test_rst/test_doctest_blocks.py
-@@ -21,7 +21,7 @@ totest['doctest_blocks'] = [
- ["""\
- Paragraph.
- 
-->>> print "Doctest block."
-+>>> print("Doctest block.")
- Doctest block.
- 
- Paragraph.
-@@ -31,7 +31,7 @@ Paragraph.
-     <paragraph>
-         Paragraph.
-     <doctest_block xml:space="preserve">
--        >>> print "Doctest block."
-+        >>> print("Doctest block.")
-         Doctest block.
-     <paragraph>
-         Paragraph.
-@@ -39,7 +39,7 @@ Paragraph.
- ["""\
- Paragraph.
- 
-->>> print "    Indented output."
-+>>> print("    Indented output.")
-     Indented output.
- """,
- """\
-@@ -47,13 +47,13 @@ Paragraph.
-     <paragraph>
-         Paragraph.
-     <doctest_block xml:space="preserve">
--        >>> print "    Indented output."
-+        >>> print("    Indented output.")
-             Indented output.
- """],
- ["""\
- Paragraph.
- 
--    >>> print "    Indented block & output."
-+    >>> print("    Indented block & output.")
-         Indented block & output.
- """,
- """\
-@@ -62,7 +62,7 @@ Paragraph.
-         Paragraph.
-     <block_quote>
-         <doctest_block xml:space="preserve">
--            >>> print "    Indented block & output."
-+            >>> print("    Indented block & output.")
-                 Indented block & output.
- """],
- ]
-diff --git a/test/test_settings.py b/test/test_settings.py
-index 5b687eb..d101a59 100755
---- a/test/test_settings.py
-+++ b/test/test_settings.py
-@@ -8,6 +8,7 @@
- """
- Tests of runtime settings.
- """
-+from __future__ import print_function
- 
- import sys
- import os
-@@ -111,10 +112,10 @@ class ConfigFileTests(unittest.TestCase):
-         try:
-             self.assertEqual(result, expected)
-         except AssertionError:
--            print >>sys.stderr, '\n%s\n' % (self,)
--            print >>sys.stderr, '-: expected\n+: result'
--            print >>sys.stderr, ''.join(self.compare(expected.splitlines(1),
--                                                     result.splitlines(1)))
-+            print('\n%s\n' % (self,), file=sys.stderr)
-+            print('-: expected\n+: result', file=sys.stderr)
-+            print(''.join(self.compare(expected.splitlines(1),
-+                                                     result.splitlines(1))), file=sys.stderr)
-             raise
- 
-     def test_nofiles(self):
-diff --git a/test/test_statemachine.py b/test/test_statemachine.py
-index 07c561e..6352ca4 100755
---- a/test/test_statemachine.py
-+++ b/test/test_statemachine.py
-@@ -7,6 +7,7 @@
- """
- Test module for statemachine.py.
- """
-+from __future__ import print_function
- 
- import unittest
- import sys
-@@ -56,47 +57,47 @@ class MockState(statemachine.StateWS):
-     def bof(self, context):
-         self.levelholder[0] += 1
-         self.level = self.levelholder[0]
--        if self.debug: print >>sys.stderr, 'StateMachine%s' % self.level
-+        if self.debug: print('StateMachine%s' % self.level, file=sys.stderr)
-         return [], ['StateMachine%s' % self.level]
- 
-     def blank(self, match, context, next_state):
-         result = ['blank%s' % self.level]
--        if self.debug: print >>sys.stderr, 'blank%s' % self.level
-+        if self.debug: print('blank%s' % self.level, file=sys.stderr)
-         if context and context[-1] and context[-1][-2:] == '::':
-             result.extend(self.literalblock())
-         return [], None, result
- 
-     def indent(self, match, context, next_state):
--        if self.debug: print >>sys.stderr, 'indent%s' % self.level
-+        if self.debug: print('indent%s' % self.level, file=sys.stderr)
-         context, next_state, result = statemachine.StateWS.indent(
-               self, match, context, next_state)
-         return context, next_state, ['indent%s' % self.level] + result
- 
-     def known_indent(self, match, context, next_state):
--        if self.debug: print >>sys.stderr, 'known_indent%s' % self.level
-+        if self.debug: print('known_indent%s' % self.level, file=sys.stderr)
-         context, next_state, result = statemachine.StateWS.known_indent(
-               self, match, context, next_state)
-         return context, next_state, ['known_indent%s' % self.level] + result
- 
-     def bullet(self, match, context, next_state):
--        if self.debug: print >>sys.stderr, 'bullet%s' % self.level
-+        if self.debug: print('bullet%s' % self.level, file=sys.stderr)
-         context, next_state, result \
-               = self.known_indent(match, context, next_state)
-         return [], next_state, ['bullet%s' % self.level] + result
- 
-     def text(self, match, context, next_state):
--        if self.debug: print >>sys.stderr, 'text%s' % self.level
-+        if self.debug: print('text%s' % self.level, file=sys.stderr)
-         return [match.string], next_state, ['text%s' % self.level]
- 
-     def literalblock(self):
-         indented, indent, offset, good = self.state_machine.get_indented()
--        if self.debug: print >>sys.stderr, 'literalblock%s(%s)' % (self.level,
--                                                                   indent)
-+        if self.debug: print('literalblock%s(%s)' % (self.level,
-+                                                                   indent), file=sys.stderr)
-         return ['literalblock%s(%s)' % (self.level, indent)]
- 
-     def eof(self, context):
-         self.levelholder[0] -= 1
--        if self.debug: print >>sys.stderr, 'finished%s' % self.level
-+        if self.debug: print('finished%s' % self.level, file=sys.stderr)
-         return ['finished%s' % self.level]
- 
- 
-@@ -169,10 +170,10 @@ class SMWSTests(unittest.TestCase):
-         self.assertTrue(good)
-         self.sm.previous_line(3)
-         if self.sm.debug:
--            print '\ntest_get_indented: self.sm.line:\n', self.sm.line
-+            print('\ntest_get_indented: self.sm.line:\n', self.sm.line)
-         indented, indent, offset, good = self.sm.get_indented()
-         if self.sm.debug:
--            print '\ntest_get_indented: indented:\n', indented
-+            print('\ntest_get_indented: indented:\n', indented)
-         self.assertEqual(indent, lbindent)
-         self.assertEqual(indented, literalblock)
-         self.assertEqual(offset, (len(para1) + len(item1) + len(item2)
-diff --git a/test/test_transforms/test_smartquotes.py b/test/test_transforms/test_smartquotes.py
-index fb46b30..e2874c0 100644
---- a/test/test_transforms/test_smartquotes.py
-+++ b/test/test_transforms/test_smartquotes.py
-@@ -18,7 +18,7 @@ Test module for universal.SmartQuotes transform.
- """
- 
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
-+from __init__ import DocutilsTestSupport  # must be imported before docutils
- from docutils.transforms.universal import SmartQuotes
- from docutils.parsers.rst import Parser
- 
-@@ -69,11 +69,11 @@ Do not "educate" quotes ``inside "literal" text`` and ::
-   "literal" blocks.
- 
- Keep quotes straight in code and math: 
--:code:`print "hello"` :math:`1' 12"`.
-+:code:`print("hello")` :math:`1' 12"`.
- 
- .. code::
- 
--   print "hello"
-+   print("hello")
-   
- .. math::
- 
-@@ -92,13 +92,13 @@ u"""\
-     <paragraph>
-         Keep quotes straight in code and math:
-         <literal classes="code">
--            print "hello"
-+            print("hello")
-          
-         <math>
-             1' 12"
-         .
-     <literal_block classes="code" xml:space="preserve">
--        print "hello"
-+        print("hello")
-     <math_block xml:space="preserve">
-         f'(x) = df(x)/dx
- """],
-diff --git a/test/test_transforms/test_strip_elements_with_class.py b/test/test_transforms/test_strip_elements_with_class.py
-index 7a36fb9..6503586 100644
---- a/test/test_transforms/test_strip_elements_with_class.py
-+++ b/test/test_transforms/test_strip_elements_with_class.py
-@@ -37,7 +37,7 @@ this is ham
- .. code::
-    :class: spam
-    
--   print "spam"
-+   print("spam")
-    
- .. image:: spam.jpg
-    :class: spam
-diff --git a/test/test_viewlist.py b/test/test_viewlist.py
-index 23ba033..f5df548 100755
---- a/test/test_viewlist.py
-+++ b/test/test_viewlist.py
-@@ -9,8 +9,6 @@ Test module for the ViewList class from statemachine.py.
- """
- 
- import unittest
--import sys
--import re
- from DocutilsTestSupport import statemachine
- 
- 
-@@ -76,7 +74,6 @@ class ViewListTests(unittest.TestCase):
-         self.assertEqual(a, a_list)
-         self.assertEqual(a.items, [('a', i+1) for (i, v) in enumerate(a_list)])
-         self.assertEqual(a.parent, self.a)
--        # a.pprint()
- 
-     def test_set_slice(self):
-         a = statemachine.ViewList(self.a[:])
-@@ -84,8 +81,6 @@ class ViewListTests(unittest.TestCase):
-         s[2:2] = self.b
-         s_list = self.a_list[2:-2]
-         s_list[2:2] = self.b_list
--        # s.pprint()
--        # s[1:4].pprint()
-         self.assertEqual(s, s_list)
-         self.assertEqual(s, a[2:-2])
-         self.assertEqual(s.items, a[2:-2].items)
-@@ -119,7 +114,6 @@ class ViewListTests(unittest.TestCase):
-         a = statemachine.ViewList(self.a)
-         a.append('Q', 'runtime')
-         a.append(self.b)
--        # a.pprint()
-         self.assertEqual(a, a_list)
-         self.assertEqual(a.info(len(self.a)), ('runtime', 0))
-         self.assertEqual(a.info(-2), ('b', len(self.b) - 2))
-@@ -131,7 +125,6 @@ class ViewListTests(unittest.TestCase):
-         a.extend(self.b)
-         self.assertEqual(a, a_list)
-         self.assertEqual(a.info(len(self.a) + 1), ('b', 1))
--        # a.pprint()
- 
-     def test_view(self):
-         a = statemachine.ViewList(self.a[:])
-@@ -176,16 +169,9 @@ class ViewListTests(unittest.TestCase):
-     def test_sort(self):
-         c = self.c[:]
-         c.reverse()
--        # c.pprint()
-         c.sort()
-         self.assertEqual(self.c, c)
- 
--#         print
--#         print a
--#         print s
--#         print a.items
--#         print s.items
--
- 
- class StringList(unittest.TestCase):
- 
-diff --git a/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
-index a1d92ac..85ac264 100755
---- a/tools/dev/create_unimap.py
-+++ b/tools/dev/create_unimap.py
-@@ -9,6 +9,7 @@
- # Get unicode.xml from
- # <http://www.w3.org/2003/entities/xml/unicode.xml>.
- 
-+from __future__ import print_function
- from xml.dom import minidom
- import sys
- import pprint
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index e05515d..5947fe5 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -33,14 +33,13 @@
- # .. _inline markup recognition rules:
- #     ../../docs/ref/rst/restructuredtext.html#inline-markup
- 
-+from __future__ import print_function
- 
--# Setup::
--
--import sys, re
-+import sys
- import unicodedata
- 
- if sys.version_info >= (3,):
--    unichr = chr # unichr not available in Py3k
-+    unichr = chr  # unichr not available in Py3k
- else:
-     import codecs
-     sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
-@@ -421,44 +420,3 @@ if __name__ == '__main__':
-         }
- 
-     print(module_template % substitutions)
--
--
--# test prints
--# ~~~~~~~~~~~
--#
--# For interactive use in development you may uncomment the following
--# definitions::
--
--    # print "wide" Unicode characters:
--    # ucharlists = unicode_charlists(unicode_punctuation_categories)
--    # for key in ucharlists:
--    #     if key.endswith('wide'):
--    #         print key, ucharlists[key]
--
--    # print 'openers = ', repr(openers)
--    # print 'closers = ', repr(closers)
--    # print 'delimiters = ', repr(delimiters)
--    # print 'closing_delimiters = ', repr(closing_delimiters)
--
--    # ucharlists = unicode_charlists(unicode_punctuation_categories)
--    # for cat, chars in ucharlists.items():
--    #     # print cat, chars
--    #     # compact output (visible with a comprehensive font):
--    #     print (u":%s: %s" % (cat, u''.join(chars))).encode('utf8')
--
--# verbose print
--#
--# ::
--
--    # print 'openers:'
--    # for ch in openers:
--    #     print ch.encode('utf8'), unicodedata.name(ch)
--    # print 'closers:'
--    # for ch in closers:
--    #     print ch.encode('utf8'), unicodedata.name(ch)
--    # print 'delimiters:'
--    # for ch in delimiters:
--    #     print ch.encode('utf8'), unicodedata.name(ch)
--    # print 'closing_delimiters:'
--    # for ch in closing_delimiters:
--    #     print ch.encode('utf8'), unicodedata.name(ch)
-diff --git a/tools/dev/profile_docutils.py b/tools/dev/profile_docutils.py
-index 1f43ecc..4b9125d 100755
---- a/tools/dev/profile_docutils.py
-+++ b/tools/dev/profile_docutils.py
-@@ -4,6 +4,7 @@
- # Author: Lea Wiemann <LeWiemann@gmail.com>
- # Copyright: This script has been placed in the public domain.
- 
-+from __future__ import print_function
- import os.path
- import docutils.core
- import hotshot.stats
-diff --git a/tools/dev/unicode2rstsubs.py b/tools/dev/unicode2rstsubs.py
-index d719005..b51eec4 100755
---- a/tools/dev/unicode2rstsubs.py
-+++ b/tools/dev/unicode2rstsubs.py
-@@ -19,6 +19,7 @@ The input file, unicode.xml, is maintained as part of the MathML 2
- Recommentation XML source, and is available from
- <http://www.w3.org/2003/entities/xml/>.
- """
-+from __future__ import print_function
- 
- import sys
- import os
-diff --git a/tools/quicktest.py b/tools/quicktest.py
-index 4ddbe59..3b6b6b4 100755
---- a/tools/quicktest.py
-+++ b/tools/quicktest.py
-@@ -5,6 +5,7 @@
- #          David Goodger <goodger@python.org>
- # Copyright: This module has been placed in the public domain.
- 
-+from __future__ import print_function
- try:
-     import locale
-     locale.setlocale(locale.LC_ALL, '')
-diff --git a/tools/rst2odt_prepstyles.py b/tools/rst2odt_prepstyles.py
-index b0b7dcc..67f8942 100755
---- a/tools/rst2odt_prepstyles.py
-+++ b/tools/rst2odt_prepstyles.py
-@@ -9,9 +9,10 @@ Fix a word-processor-generated styles.odt for odtwriter use: Drop page size
- specifications from styles.xml in STYLE_FILE.odt.
- """
- 
--#
- # Author: Michael Schutte <michi@uiae.at>
- 
-+from __future__ import print_function
-+
- from lxml import etree
- import sys
- import zipfile
-@@ -24,28 +25,29 @@ NAMESPACES = {
-     "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
- }
- 
-+
- def prepstyle(filename):
--    
-+
-     zin = zipfile.ZipFile(filename)
-     styles = zin.read("styles.xml")
--    
-+
-     root = etree.fromstring(styles)
--    for el in root.xpath("//style:page-layout-properties", 
--        namespaces=NAMESPACES):
-+    for el in root.xpath("//style:page-layout-properties",
-+                         namespaces=NAMESPACES):
-         for attr in el.attrib:
-             if attr.startswith("{%s}" % NAMESPACES["fo"]):
-                 del el.attrib[attr]
--    
-+
-     tempname = mkstemp()
-     zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w",
--        zipfile.ZIP_DEFLATED)
--    
-+                           zipfile.ZIP_DEFLATED)
-+
-     for item in zin.infolist():
-         if item.filename == "styles.xml":
-             zout.writestr(item, etree.tostring(root))
-         else:
-             zout.writestr(item, zin.read(item.filename))
--    
-+
-     zout.close()
-     zin.close()
-     shutil.move(tempname[1], filename)
-@@ -54,14 +56,12 @@ def prepstyle(filename):
- def main():
-     args = sys.argv[1:]
-     if len(args) != 1:
--        print >> sys.stderr, __doc__
--        print >> sys.stderr, "Usage: %s STYLE_FILE.odt\n" % sys.argv[0]
-+        print(__doc__, file=sys.stderr)
-+        print("Usage: %s STYLE_FILE.odt\n" % sys.argv[0], file=sys.stderr)
-         sys.exit(1)
-     filename = args[0]
-     prepstyle(filename)
- 
-+
- if __name__ == '__main__':
-     main()
--
--
--# vim:tw=78:sw=4:sts=4:et:
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0003-py3-Switch-to-except-foo-as-bar-syntax.patch b/srcpkgs/python-docutils/patches/0003-py3-Switch-to-except-foo-as-bar-syntax.patch
deleted file mode 100644
index 261eb62c14e..00000000000
--- a/srcpkgs/python-docutils/patches/0003-py3-Switch-to-except-foo-as-bar-syntax.patch
+++ /dev/null
@@ -1,719 +0,0 @@
-From c361270fb4ee9172a337f5e9c0b014b362fb0b71 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:49:35 +0700
-Subject: [PATCH 03/26] py3: Switch to 'except foo as bar' syntax
-
-This is the only form supported in Python 3.x.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8347 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/core.py                            |  4 ++--
- docutils/frontend.py                        |  8 ++++----
- docutils/io.py                              | 12 ++++++------
- docutils/parsers/rst/directives/__init__.py |  6 +++---
- docutils/parsers/rst/directives/body.py     |  2 +-
- docutils/parsers/rst/directives/html.py     |  2 +-
- docutils/parsers/rst/directives/misc.py     | 20 ++++++++++----------
- docutils/parsers/rst/directives/tables.py   | 10 +++++-----
- docutils/parsers/rst/roles.py               |  4 ++--
- docutils/parsers/rst/states.py              | 20 ++++++++++----------
- docutils/statemachine.py                    |  6 +++---
- docutils/utils/__init__.py                  |  2 +-
- docutils/utils/error_reporting.py           |  4 ++--
- docutils/writers/_html_base.py              |  4 ++--
- docutils/writers/docutils_xml.py            |  2 +-
- docutils/writers/latex2e/__init__.py        |  2 +-
- test/DocutilsTestSupport.py                 |  8 ++++----
- test/package_unittest.py                    |  2 +-
- test/test_error_reporting.py                | 14 +++++++-------
- test/test_language.py                       |  4 ++--
- test/test_publisher.py                      |  4 ++--
- test/test_utils.py                          |  2 +-
- 22 files changed, 71 insertions(+), 71 deletions(-)
-
-diff --git a/docutils/core.py b/docutils/core.py
-index 6a99020..12a0c93 100644
---- a/docutils/core.py
-+++ b/docutils/core.py
-@@ -219,10 +219,10 @@ class Publisher(object):
-             self.apply_transforms()
-             output = self.writer.write(self.document, self.destination)
-             self.writer.assemble_parts()
--        except SystemExit, error:
-+        except SystemExit as error:
-             exit = 1
-             exit_status = error.code
--        except Exception, error:
-+        except Exception as error:
-             if not self.settings:       # exception too early to report nicely
-                 raise
-             if self.settings.traceback: # Propagate exceptions?
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 1aeae5c..689d904 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -62,7 +62,7 @@ def read_config_file(option, opt, value, parser):
-     """
-     try:
-         new_settings = parser.get_config_file_settings(value)
--    except ValueError, error:
-+    except ValueError as error:
-         parser.error(error)
-     parser.values.update(new_settings, parser)
- 
-@@ -346,7 +346,7 @@ class Option(optparse.Option):
-                 value = getattr(values, setting)
-                 try:
-                     new_value = self.validator(setting, value, parser)
--                except Exception, error:
-+                except Exception as error:
-                     raise (optparse.OptionValueError(
-                         'Error in option "%s":\n    %s'
-                         % (opt, ErrorString(error))),
-@@ -605,7 +605,7 @@ class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
-         if read_config_files and not self.defaults['_disable_config']:
-             try:
-                 config_settings = self.get_standard_config_settings()
--            except ValueError, error:
-+            except ValueError as error:
-                 self.error(SafeString(error))
-             self.set_defaults_from_dict(config_settings.__dict__)
- 
-@@ -826,7 +826,7 @@ Skipping "%s" configuration file.
-                         new_value = option.validator(
-                             setting, value, option_parser,
-                             config_parser=self, config_section=section)
--                    except Exception, error:
-+                    except Exception as error:
-                         raise (ValueError(
-                             'Error in config file "%s", section "[%s]":\n'
-                             '    %s\n'
-diff --git a/docutils/io.py b/docutils/io.py
-index 3b0f93e..4466fdb 100644
---- a/docutils/io.py
-+++ b/docutils/io.py
-@@ -114,7 +114,7 @@ class Input(TransformSpec):
-                 self.successful_encoding = enc
-                 # Return decoded, removing BOMs.
-                 return decoded.replace(u'\ufeff', u'')
--            except (UnicodeError, LookupError), err:
-+            except (UnicodeError, LookupError) as err:
-                 error = err # in Python 3, the <exception instance> is
-                             # local to the except clause
-         raise UnicodeError(
-@@ -244,7 +244,7 @@ class FileInput(Input):
- 
-                 try:
-                     self.source = open(source_path, mode, **kwargs)
--                except IOError, error:
-+                except IOError as error:
-                     raise InputError(error.errno, error.strerror, source_path)
-             else:
-                 self.source = sys.stdin
-@@ -272,7 +272,7 @@ class FileInput(Input):
-                 data = b'\n'.join(data.splitlines()) + b'\n'
-             else:
-                 data = self.source.read()
--        except (UnicodeError, LookupError), err: # (in Py3k read() decodes)
-+        except (UnicodeError, LookupError) as err: # (in Py3k read() decodes)
-             if not self.encoding and self.source_path:
-                 # re-read in binary mode and decode with heuristics
-                 b_source = open(self.source_path, 'rb')
-@@ -362,7 +362,7 @@ class FileOutput(Output):
-             kwargs = {}
-         try:
-             self.destination = open(self.destination_path, self.mode, **kwargs)
--        except IOError, error:
-+        except IOError as error:
-             raise OutputError(error.errno, error.strerror,
-                               self.destination_path)
-         self.opened = True
-@@ -384,7 +384,7 @@ class FileOutput(Output):
- 
-         try:
-             self.destination.write(data)
--        except TypeError, e:
-+        except TypeError as e:
-             if sys.version_info >= (3,0) and isinstance(data, bytes):
-                 try:
-                     self.destination.buffer.write(data)
-@@ -397,7 +397,7 @@ class FileOutput(Output):
-                             self.destination.encoding, self.encoding))
-                     else:
-                         raise e
--        except (UnicodeError, LookupError), err:
-+        except (UnicodeError, LookupError) as err:
-             raise UnicodeError(
-                 'Unable to encode output data. output-encoding is: '
-                 '%s.\n(%s)' % (self.encoding, ErrorString(err)))
-diff --git a/docutils/parsers/rst/directives/__init__.py b/docutils/parsers/rst/directives/__init__.py
-index e0d09fc..8789346 100644
---- a/docutils/parsers/rst/directives/__init__.py
-+++ b/docutils/parsers/rst/directives/__init__.py
-@@ -86,7 +86,7 @@ def directive(directive_name, language_module, document):
-     canonicalname = None
-     try:
-         canonicalname = language_module.directives[normname]
--    except AttributeError, error:
-+    except AttributeError as error:
-         msg_text.append('Problem retrieving directive entry from language '
-                         'module %r: %s.' % (language_module, error))
-     except KeyError:
-@@ -113,7 +113,7 @@ def directive(directive_name, language_module, document):
-         return None, messages
-     try:
-         module = __import__(modulename, globals(), locals(), level=1)
--    except ImportError, detail:
-+    except ImportError as detail:
-         messages.append(document.reporter.error(
-             'Error importing directive module "%s" (directive "%s"):\n%s'
-             % (modulename, directive_name, detail),
-@@ -309,7 +309,7 @@ def unicode_code(code):
-                 return unichr(int(value, 16))
-             else:                           # other text
-                 return code
--    except OverflowError, detail:
-+    except OverflowError as detail:
-         raise ValueError('code too large (%s)' % detail)
- 
- def single_char_or_unicode(argument):
-diff --git a/docutils/parsers/rst/directives/body.py b/docutils/parsers/rst/directives/body.py
-index b60c3ad..eef1df5 100644
---- a/docutils/parsers/rst/directives/body.py
-+++ b/docutils/parsers/rst/directives/body.py
-@@ -147,7 +147,7 @@ class CodeBlock(Directive):
-         try:
-             tokens = Lexer(u'\n'.join(self.content), language,
-                            self.state.document.settings.syntax_highlight)
--        except LexerError, error:
-+        except LexerError as error:
-             raise self.warning(error)
- 
-         if 'number-lines' in self.options:
-diff --git a/docutils/parsers/rst/directives/html.py b/docutils/parsers/rst/directives/html.py
-index 78671e8..ea36936 100644
---- a/docutils/parsers/rst/directives/html.py
-+++ b/docutils/parsers/rst/directives/html.py
-@@ -55,7 +55,7 @@ class MetaBody(states.SpecializedBody):
-             try:
-                 attname, val = utils.extract_name_value(token)[0]
-                 node[attname.lower()] = val
--            except utils.NameValueError, detail:
-+            except utils.NameValueError as detail:
-                 line = self.state_machine.line
-                 msg = self.reporter.error(
-                       'Error parsing meta tag attribute "%s": %s.'
-diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
-index 7672de6..0fc3610 100644
---- a/docutils/parsers/rst/directives/misc.py
-+++ b/docutils/parsers/rst/directives/misc.py
-@@ -73,12 +73,12 @@ class Include(Directive):
-             include_file = io.FileInput(source_path=path,
-                                         encoding=encoding,
-                                         error_handler=e_handler)
--        except UnicodeEncodeError, error:
-+        except UnicodeEncodeError as error:
-             raise self.severe(u'Problems with "%s" directive path:\n'
-                               'Cannot encode input file path "%s" '
-                               '(wrong locale?).' %
-                               (self.name, SafeString(path)))
--        except IOError, error:
-+        except IOError as error:
-             raise self.severe(u'Problems with "%s" directive path:\n%s.' %
-                       (self.name, ErrorString(error)))
-         startline = self.options.get('start-line', None)
-@@ -89,7 +89,7 @@ class Include(Directive):
-                 rawtext = ''.join(lines[startline:endline])
-             else:
-                 rawtext = include_file.read()
--        except UnicodeError, error:
-+        except UnicodeError as error:
-             raise self.severe(u'Problem with "%s" directive:\n%s' %
-                               (self.name, ErrorString(error)))
-         # start-after/end-before: no restrictions on newlines in match-text,
-@@ -213,12 +213,12 @@ class Raw(Directive):
-                 # TODO: currently, raw input files are recorded as
-                 # dependencies even if not used for the chosen output format.
-                 self.state.document.settings.record_dependencies.add(path)
--            except IOError, error:
-+            except IOError as error:
-                 raise self.severe(u'Problems with "%s" directive path:\n%s.'
-                                   % (self.name, ErrorString(error)))
-             try:
-                 text = raw_file.read()
--            except UnicodeError, error:
-+            except UnicodeError as error:
-                 raise self.severe(u'Problem with "%s" directive:\n%s'
-                     % (self.name, ErrorString(error)))
-             attributes['source'] = path
-@@ -230,7 +230,7 @@ class Raw(Directive):
-             import urllib2
-             try:
-                 raw_text = urllib2.urlopen(source).read()
--            except (urllib2.URLError, IOError, OSError), error:
-+            except (urllib2.URLError, IOError, OSError) as error:
-                 raise self.severe(u'Problems with "%s" directive URL "%s":\n%s.'
-                     % (self.name, self.options['url'], ErrorString(error)))
-             raw_file = io.StringInput(source=raw_text, source_path=source,
-@@ -238,7 +238,7 @@ class Raw(Directive):
-                                       error_handler=e_handler)
-             try:
-                 text = raw_file.read()
--            except UnicodeError, error:
-+            except UnicodeError as error:
-                 raise self.severe(u'Problem with "%s" directive:\n%s'
-                                   % (self.name, ErrorString(error)))
-             attributes['source'] = source
-@@ -320,7 +320,7 @@ class Unicode(Directive):
-         for code in codes:
-             try:
-                 decoded = directives.unicode_code(code)
--            except ValueError, error:
-+            except ValueError as error:
-                 raise self.error(u'Invalid character code: %s\n%s'
-                     % (code, ErrorString(error)))
-             element += nodes.Text(utils.unescape(decoded), decoded)
-@@ -406,7 +406,7 @@ class Role(Directive):
-                 self.state.parse_directive_block(
-                 self.content[1:], self.content_offset, converted_role,
-                 option_presets={}))
--        except states.MarkupError, detail:
-+        except states.MarkupError as detail:
-             error = self.state_machine.reporter.error(
-                 'Error in "%s" directive:\n%s.' % (self.name, detail),
-                 nodes.literal_block(self.block_text, self.block_text),
-@@ -415,7 +415,7 @@ class Role(Directive):
-         if 'class' not in options:
-             try:
-                 options['class'] = directives.class_option(new_role_name)
--            except ValueError, detail:
-+            except ValueError as detail:
-                 error = self.state_machine.reporter.error(
-                     u'Invalid argument for "%s" directive:\n%s.'
-                     % (self.name, SafeString(detail)), nodes.literal_block(
-diff --git a/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
-index 83b7b53..b0a4eac 100644
---- a/docutils/parsers/rst/directives/tables.py
-+++ b/docutils/parsers/rst/directives/tables.py
-@@ -259,9 +259,9 @@ class CSVTable(Table):
-             col_widths = self.get_column_widths(max_cols)
-             self.extend_short_rows_with_empty_cells(max_cols,
-                                                     (table_head, table_body))
--        except SystemMessagePropagation, detail:
-+        except SystemMessagePropagation as detail:
-             return [detail.args[0]]
--        except csv.Error, detail:
-+        except csv.Error as detail:
-             message = str(detail)
-             if sys.version_info < (3,) and '1-character string' in message:
-                 message += '\nwith Python 2.x this must be an ASCII character.'
-@@ -320,7 +320,7 @@ class CSVTable(Table):
-                                         encoding=encoding,
-                                         error_handler=error_handler)
-                 csv_data = csv_file.read().splitlines()
--            except IOError, error:
-+            except IOError as error:
-                 severe = self.state_machine.reporter.severe(
-                     u'Problems with "%s" directive path:\n%s.'
-                     % (self.name, SafeString(error)),
-@@ -336,7 +336,7 @@ class CSVTable(Table):
-             source = self.options['url']
-             try:
-                 csv_text = urllib2.urlopen(source).read()
--            except (urllib2.URLError, IOError, OSError, ValueError), error:
-+            except (urllib2.URLError, IOError, OSError, ValueError) as error:
-                 severe = self.state_machine.reporter.severe(
-                       'Problems with "%s" directive URL "%s":\n%s.'
-                       % (self.name, self.options['url'], SafeString(error)),
-@@ -424,7 +424,7 @@ class ListTable(Table):
-             header_rows = self.options.get('header-rows', 0)
-             stub_columns = self.options.get('stub-columns', 0)
-             self.check_table_dimensions(table_data, header_rows, stub_columns)
--        except SystemMessagePropagation, detail:
-+        except SystemMessagePropagation as detail:
-             return [detail.args[0]]
-         table_node = self.build_table_from_list(table_data, col_widths,
-                                                 header_rows, stub_columns)
-diff --git a/docutils/parsers/rst/roles.py b/docutils/parsers/rst/roles.py
-index bf786b7..49b61dc 100644
---- a/docutils/parsers/rst/roles.py
-+++ b/docutils/parsers/rst/roles.py
-@@ -109,7 +109,7 @@ def role(role_name, language_module, lineno, reporter):
-         canonicalname = None
-         try:
-             canonicalname = language_module.roles[normname]
--        except AttributeError, error:
-+        except AttributeError as error:
-             msg_text.append('Problem retrieving role entry from language '
-                             'module %r: %s.' % (language_module, error))
-         except KeyError:
-@@ -333,7 +333,7 @@ def code_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
-     try:
-         tokens = Lexer(utils.unescape(text, True), language,
-                        inliner.document.settings.syntax_highlight)
--    except LexerError, error:
-+    except LexerError as error:
-         msg = inliner.reporter.warning(error)
-         prb = inliner.problematic(rawtext, rawtext, msg)
-         return [prb], [msg]
-diff --git a/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py
-index a2970c8..c9b4fa3 100644
---- a/docutils/parsers/rst/states.py
-+++ b/docutils/parsers/rst/states.py
-@@ -1497,7 +1497,7 @@ class Body(RSTState):
-         (optionlist.source, optionlist.line) = self.state_machine.get_source_and_line()
-         try:
-             listitem, blank_finish = self.option_list_item(match)
--        except MarkupError, error:
-+        except MarkupError as error:
-             # This shouldn't happen; pattern won't match.
-             msg = self.reporter.error(u'Invalid option list marker: %s' %
-                                       error)
-@@ -1686,7 +1686,7 @@ class Body(RSTState):
-                              + 1)
-                 table = self.build_table(tabledata, tableline)
-                 nodelist = [table] + messages
--            except tableparser.TableMarkupError, err:
-+            except tableparser.TableMarkupError as err:
-                 nodelist = self.malformed_table(block, ' '.join(err.args),
-                                                 offset=err.offset) + messages
-         else:
-@@ -1698,7 +1698,7 @@ class Body(RSTState):
-         blank_finish = 1
-         try:
-             block = self.state_machine.get_text_block(flush_left=True)
--        except statemachine.UnexpectedIndentationError, err:
-+        except statemachine.UnexpectedIndentationError as err:
-             block, src, srcline = err.args
-             messages.append(self.reporter.error('Unexpected indentation.',
-                                                 source=src, line=srcline))
-@@ -2135,7 +2135,7 @@ class Body(RSTState):
-             arguments, options, content, content_offset = (
-                 self.parse_directive_block(indented, line_offset,
-                                            directive, option_presets))
--        except MarkupError, detail:
-+        except MarkupError as detail:
-             error = self.reporter.error(
-                 'Error in "%s" directive:\n%s.' % (type_name,
-                                                    ' '.join(detail.args)),
-@@ -2146,7 +2146,7 @@ class Body(RSTState):
-             content_offset, block_text, self, self.state_machine)
-         try:
-             result = directive_instance.run()
--        except docutils.parsers.rst.DirectiveError, error:
-+        except docutils.parsers.rst.DirectiveError as error:
-             msg_node = self.reporter.system_message(error.level, error.msg,
-                                                     line=lineno)
-             msg_node += nodes.literal_block(block_text, block_text)
-@@ -2263,11 +2263,11 @@ class Body(RSTState):
-             return 0, 'invalid option block'
-         try:
-             options = utils.extract_extension_options(node, option_spec)
--        except KeyError, detail:
-+        except KeyError as detail:
-             return 0, ('unknown option: "%s"' % detail.args[0])
--        except (ValueError, TypeError), detail:
-+        except (ValueError, TypeError) as detail:
-             return 0, ('invalid option value: %s' % ' '.join(detail.args))
--        except utils.ExtensionOptionError, detail:
-+        except utils.ExtensionOptionError as detail:
-             return 0, ('invalid option data: %s' % ' '.join(detail.args))
-         if blank_finish:
-             return 1, options
-@@ -2354,7 +2354,7 @@ class Body(RSTState):
-             if expmatch:
-                 try:
-                     return method(self, expmatch)
--                except MarkupError, error:
-+                except MarkupError as error:
-                     lineno = self.state_machine.abs_line_number()
-                     message = ' '.join(error.args)
-                     errors.append(self.reporter.warning(message, line=lineno))
-@@ -2777,7 +2777,7 @@ class Text(RSTState):
-         msg = None
-         try:
-             block = self.state_machine.get_text_block(flush_left=True)
--        except statemachine.UnexpectedIndentationError, err:
-+        except statemachine.UnexpectedIndentationError as err:
-             block, src, srcline = err.args
-             msg = self.reporter.error('Unexpected indentation.',
-                                       source=src, line=srcline)
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 6714a04..6a2322c 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -248,7 +248,7 @@ class StateMachine(object):
-                         break
-                     else:
-                         results.extend(result)
--                except TransitionCorrection, exception:
-+                except TransitionCorrection as exception:
-                     self.previous_line() # back up for another try
-                     transitions = (exception.args[0],)
-                     if self.debug:
-@@ -257,7 +257,7 @@ class StateMachine(object):
-                               'state "%s", transition %s.'
-                               % (state.__class__.__name__, transitions[0])), file=self._stderr)
-                     continue
--                except StateCorrection, exception:
-+                except StateCorrection as exception:
-                     self.previous_line() # back up for another try
-                     next_state = exception.args[0]
-                     if len(exception.args) == 1:
-@@ -413,7 +413,7 @@ class StateMachine(object):
-                                                     flush_left)
-             self.next_line(len(block) - 1)
-             return block
--        except UnexpectedIndentationError, err:
-+        except UnexpectedIndentationError as err:
-             block = err.args[0]
-             self.next_line(len(block) - 1) # advance to last line of block
-             raise
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index 692335a..c71d508 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -326,7 +326,7 @@ def assemble_option_dict(option_list, options_spec):
-             raise DuplicateOptionError('duplicate option "%s"' % name)
-         try:
-             options[name] = convertor(value)
--        except (ValueError, TypeError), detail:
-+        except (ValueError, TypeError) as detail:
-             raise detail.__class__('(option: "%s"; value: %r)\n%s'
-                                    % (name, value, ' '.join(detail.args)))
-     return options
-diff --git a/docutils/utils/error_reporting.py b/docutils/utils/error_reporting.py
-index 02e62eb..8ea7108 100644
---- a/docutils/utils/error_reporting.py
-+++ b/docutils/utils/error_reporting.py
-@@ -49,7 +49,7 @@ else:
-         # locale.getpreferredencoding([do_setlocale=True|False])
-         # has side-effects | might return a wrong guess.
-         # (cf. Update 1 in http://stackoverflow.com/questions/4082645/using-python-2-xs-locale-module-to-format-numbers-and-currency)
--    except ValueError, error: # OS X may set UTF-8 without language code
-+    except ValueError as error: # OS X may set UTF-8 without language code
-         # see http://bugs.python.org/issue18378
-         # and https://sourceforge.net/p/docutils/bugs/298/
-         if "unknown locale: UTF-8" in error.args:
-@@ -113,7 +113,7 @@ class SafeString(object):
-             if isinstance(self.data, EnvironmentError):
-                 u = u.replace(": u'", ": '") # normalize filename quoting
-             return u
--        except UnicodeError, error: # catch ..Encode.. and ..Decode.. errors
-+        except UnicodeError as error: # catch ..Encode.. and ..Decode.. errors
-             if isinstance(self.data, EnvironmentError):
-                 return  u"[Errno %s] %s: '%s'" % (self.data.errno,
-                     SafeString(self.data.strerror, self.encoding,
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index fa27911..23efeea 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -302,7 +302,7 @@ class HTMLTranslator(nodes.NodeVisitor):
-                 content = io.FileInput(source_path=path,
-                                        encoding='utf-8').read()
-                 self.settings.record_dependencies.add(path)
--            except IOError, err:
-+            except IOError as err:
-                 msg = u"Cannot embed stylesheet '%s': %s." % (
-                                 path, SafeString(err.strerror))
-                 self.document.reporter.error(msg)
-@@ -1159,7 +1159,7 @@ class HTMLTranslator(nodes.NodeVisitor):
-                     'with math-output "MathML"')
-             except OSError:
-                     raise OSError('is "latexmlmath" in your PATH?')
--            except SyntaxError, err:
-+            except SyntaxError as err:
-                 err_node = self.document.reporter.error(err, base_node=node)
-                 self.visit_system_message(err_node)
-                 self.body.append(self.starttag(node, 'p'))
-diff --git a/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
-index 148041a..e870ee1 100644
---- a/docutils/writers/docutils_xml.py
-+++ b/docutils/writers/docutils_xml.py
-@@ -186,7 +186,7 @@ class XMLTranslator(nodes.GenericNodeVisitor):
-             xml_string = xml_string.encode('utf8')
-         try:
-             self.xmlparser.parse(StringIO(xml_string))
--        except xml.sax._exceptions.SAXParseException, error:
-+        except xml.sax._exceptions.SAXParseException as error:
-             col_num = self.the_handle.locator.getColumnNumber()
-             line_num =  self.the_handle.locator.getLineNumber()
-             srcline = node.line
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 5c33d0a..5eaa7f0 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -1416,7 +1416,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
-                 content = io.FileInput(source_path=path,
-                                        encoding='utf-8').read()
-                 self.settings.record_dependencies.add(path)
--            except IOError, err:
-+            except IOError as err:
-                 msg = u"Cannot embed stylesheet '%s':\n  %s." % (
-                                 path, SafeString(err.strerror))
-                 self.document.reporter.error(msg)
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 25196ec..e77447a 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -230,7 +230,7 @@ class CustomTestCase(StandardTestCase):
-             output = '\n'.join(output.splitlines())
-         try:
-             self.assertEqual(output, expected)
--        except AssertionError, error:
-+        except AssertionError as error:
-             print('\n%s\ninput:' % (self,), file=sys.stderr)
-             print(input, file=sys.stderr)
-             try:
-@@ -543,7 +543,7 @@ class GridTableParserTestCase(CustomTestCase):
-             self.parser.find_head_body_sep()
-             self.parser.parse_table()
-             output = self.parser.cells
--        except Exception, details:
-+        except Exception as details:
-             output = '%s: %s' % (details.__class__.__name__, details)
-         self.compare_output(self.input, pformat(output) + '\n',
-                             pformat(self.expected) + '\n')
-@@ -552,7 +552,7 @@ class GridTableParserTestCase(CustomTestCase):
-         try:
-             output = self.parser.parse(StringList(string2lines(self.input),
-                                                   'test data'))
--        except Exception, details:
-+        except Exception as details:
-             output = '%s: %s' % (details.__class__.__name__, details)
-         self.compare_output(self.input, pformat(output) + '\n',
-                             pformat(self.expected) + '\n')
-@@ -865,7 +865,7 @@ def exception_data(func, *args, **kwds):
-     """
-     try:
-         func(*args, **kwds)
--    except Exception, detail:
-+    except Exception as detail:
-         return (detail, detail.args,
-                 '%s: %s' % (detail.__class__.__name__, detail))
- 
-diff --git a/test/package_unittest.py b/test/package_unittest.py
-index daf11f4..16b00dc 100644
---- a/test/package_unittest.py
-+++ b/test/package_unittest.py
-@@ -64,7 +64,7 @@ def parseArgs(argv=sys.argv):
-                 debug =1
-         if len(args) != 0:
-             usageExit("No command-line arguments supported yet.")
--    except getopt.error, msg:
-+    except getopt.error as msg:
-         usageExit(msg)
- 
- def loadTestModules(path, name='', packages=None):
-diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py
-index c4eae40..bae9db5 100644
---- a/test/test_error_reporting.py
-+++ b/test/test_error_reporting.py
-@@ -19,7 +19,7 @@ instances like, e.g., ::
- 
-   try:
-     something
--  except IOError, error:
-+  except IOError as error:
-     print('Found %s' % error)
- 
- unless the minimal required Python version has this problem fixed.
-@@ -223,29 +223,29 @@ class SafeStringTests_locale(unittest.TestCase):
-     us = u'\xfc'
-     try:
-         open(b'\xfc')
--    except IOError, e: # in Python 3 the name for the exception instance
-+    except IOError as e: # in Python 3 the name for the exception instance
-         bioe = e       # is local to the except clause
-     try:
-         open(u'\xfc')
--    except IOError, e:
-+    except IOError as e:
-         uioe = e
-     except UnicodeEncodeError:
-         try:
-             open(u'\xfc'.encode(sys.getfilesystemencoding(), 'replace'))
--        except IOError, e:
-+        except IOError as e:
-             uioe = e
-     try:
-         os.chdir(b'\xfc')
--    except OSError, e:
-+    except OSError as e:
-         bose = e
-     try:
-         os.chdir(u'\xfc')
--    except OSError, e:
-+    except OSError as e:
-         uose = e
-     except UnicodeEncodeError:
-         try:
-             os.chdir(u'\xfc'.encode(sys.getfilesystemencoding(), 'replace'))
--        except OSError, e:
-+        except OSError as e:
-             uose = e
-     # wrapped test data:
-     wbioe = SafeString(bioe)
-diff --git a/test/test_language.py b/test/test_language.py
-index 70a497e..0e05d44 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -144,7 +144,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-                 func, msg = directives.directive(d, module, None)
-                 if not func:
-                     failures.append('"%s": unknown directive' % d)
--            except Exception, error:
-+            except Exception as error:
-                 failures.append('"%s": %s' % (d, error))
-         inverted = self._invert(module.directives)
-         canonical = directives._directive_registry.keys()
-@@ -179,7 +179,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-                 method = roles._role_registry[d]
-                 #if not method:
-                 #    failures.append('"%s": unknown role' % d)
--            except KeyError, error:
-+            except KeyError as error:
-                 failures.append('"%s": %s' % (d, error))
-         inverted = self._invert(module.roles)
-         canonical = roles._role_registry.keys()
-diff --git a/test/test_publisher.py b/test/test_publisher.py
-index f04ebf7..04d9c71 100755
---- a/test/test_publisher.py
-+++ b/test/test_publisher.py
-@@ -65,7 +65,7 @@ class PublisherTests(DocutilsTestSupport.StandardTestCase):
-         try:
-             core.publish_cmdline(argv=['nonexisting/path'],
-                                        settings_overrides={'traceback': True})
--        except IOError, e:
-+        except IOError as e:
-             self.assertTrue(isinstance(e, io.InputError))
- 
- 
-@@ -74,7 +74,7 @@ class PublisherTests(DocutilsTestSupport.StandardTestCase):
-         try:
-             core.publish_cmdline(argv=['data/include.txt', 'nonexisting/path'],
-                                        settings_overrides={'traceback': True})
--        except IOError, e:
-+        except IOError as e:
-             self.assertTrue(isinstance(e, io.OutputError))
- 
- 
-diff --git a/test/test_utils.py b/test/test_utils.py
-index e1fcc8f..59e29c8 100755
---- a/test/test_utils.py
-+++ b/test/test_utils.py
-@@ -88,7 +88,7 @@ class ReporterTests(unittest.TestCase):
-         and hence fails with unicode message"""
-         try:
-             raise Exception(u'mesidʒ')
--        except Exception, err:
-+        except Exception as err:
-             sw = self.reporter.system_message(0, err)
-             self.assertEqual(sw.pformat(), u"""\
- <system_message level="0" source="test data" type="DEBUG">
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0004-py3-Add-aliases-for-removed-symbols.patch b/srcpkgs/python-docutils/patches/0004-py3-Add-aliases-for-removed-symbols.patch
deleted file mode 100644
index 4d6d9e84f0c..00000000000
--- a/srcpkgs/python-docutils/patches/0004-py3-Add-aliases-for-removed-symbols.patch
+++ /dev/null
@@ -1,599 +0,0 @@
-From 447e4896c9b2487fb28c25f7564ebcb6733d2363 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:50:50 +0700
-Subject: [PATCH 04/26] py3: Add aliases for removed symbols
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add aliases for symbols that have been removed in Python 3.x, namely
-basestring, unicode, unichr and StandardError.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-small fixes by Günter Milde.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8348 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/__init__.py                          |  3 +-
- docutils/frontend.py                          |  3 +
- docutils/io.py                                |  3 +
- docutils/nodes.py                             |  8 ++-
- docutils/parsers/rst/directives/__init__.py   |  3 +
- docutils/statemachine.py                      | 10 +++-
- docutils/transforms/frontmatter.py            |  6 ++
- docutils/transforms/universal.py              |  5 ++
- docutils/utils/__init__.py                    |  3 +
- docutils/utils/error_reporting.py             | 10 +++-
- docutils/utils/math/math2html.py              | 59 ++++---------------
- docutils/writers/_html_base.py                |  4 ++
- docutils/writers/docutils_xml.py              |  3 +
- docutils/writers/latex2e/__init__.py          |  4 ++
- docutils/writers/manpage.py                   |  6 +-
- test/DocutilsTestSupport.py                   |  4 ++
- test/test__init__.py                          |  4 ++
- test/test_error_reporting.py                  |  3 +
- test/test_language.py                         |  7 ++-
- test/test_nodes.py                            |  3 +
- .../test_rst/test_directives/test_include.py  |  5 ++
- .../test_rst/test_directives/test_tables.py   |  5 ++
- .../test_rst/test_directives/test_unicode.py  |  6 ++
- tools/dev/create_unimap.py                    | 10 ++--
- 24 files changed, 115 insertions(+), 62 deletions(-)
-
-diff --git a/docutils/__init__.py b/docutils/__init__.py
-index 7d6a679..8178816 100644
---- a/docutils/__init__.py
-+++ b/docutils/__init__.py
-@@ -88,7 +88,8 @@ __version_details__ = 'release'
- """
- 
- 
--class ApplicationError(StandardError): pass
-+class ApplicationError(Exception): pass
-+
- class DataError(ApplicationError): pass
- 
- 
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 689d904..ebdbd6a 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -43,6 +43,9 @@ import docutils.nodes
- from docutils.utils.error_reporting import (locale_encoding, SafeString,
-                                             ErrorOutput, ErrorString)
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- def store_multiple(option, opt, value, parser, *args, **kwargs):
-     """
-diff --git a/docutils/io.py b/docutils/io.py
-index 4466fdb..3cdf00e 100644
---- a/docutils/io.py
-+++ b/docutils/io.py
-@@ -17,6 +17,9 @@ import codecs
- from docutils import TransformSpec
- from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class InputError(IOError): pass
- class OutputError(IOError): pass
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index 8a5b7bb..fa02c6e 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -30,6 +30,10 @@ import warnings
- import types
- import unicodedata
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+    basestring = str  # noqa
-+
- # ==============================
- #  Functional Node Base Classes
- # ==============================
-@@ -61,7 +65,7 @@ class Node(object):
-         """
-         return True
- 
--    if sys.version_info < (3,):
-+    if sys.version_info < (3, 0):
-         # on 2.x, str(node) will be a byte string with Unicode
-         # characters > 255 escaped; on 3.x this is no longer necessary
-         def __str__(self):
-@@ -301,7 +305,7 @@ class Node(object):
-         except IndexError:
-             return None
- 
--if sys.version_info < (3,):
-+if sys.version_info < (3, 0):
-     class reprunicode(unicode):
-         """
-         A unicode sub-class that removes the initial u from unicode's repr.
-diff --git a/docutils/parsers/rst/directives/__init__.py b/docutils/parsers/rst/directives/__init__.py
-index 8789346..7bccb5b 100644
---- a/docutils/parsers/rst/directives/__init__.py
-+++ b/docutils/parsers/rst/directives/__init__.py
-@@ -16,6 +16,9 @@ from docutils import nodes
- from docutils.utils import split_escaped_whitespace, escape2null, unescape
- from docutils.parsers.rst.languages import en as _fallback_language_module
- 
-+if sys.version_info >= (3, 0):
-+    unichr = chr  # noqa
-+
- 
- _directive_registry = {
-       'attention': ('admonitions', 'Attention'),
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 6a2322c..b56f3c5 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -114,6 +114,9 @@ import unicodedata
- from docutils import utils
- from docutils.utils.error_reporting import ErrorOutput
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class StateMachine(object):
- 
-@@ -1124,7 +1127,12 @@ class ViewList(object):
-     def __ne__(self, other): return self.data != self.__cast(other)
-     def __gt__(self, other): return self.data >  self.__cast(other)
-     def __ge__(self, other): return self.data >= self.__cast(other)
--    def __cmp__(self, other): return cmp(self.data, self.__cast(other))
-+
-+    def __cmp__(self, other):
-+        # from https://docs.python.org/3.0/whatsnew/3.0.html
-+        mine = self.data
-+        yours = self.__cast(other)
-+        return (mine > yours) - (yours < mine)
- 
-     def __cast(self, other):
-         if isinstance(other, ViewList):
-diff --git a/docutils/transforms/frontmatter.py b/docutils/transforms/frontmatter.py
-index f94c9da..1279f50 100644
---- a/docutils/transforms/frontmatter.py
-+++ b/docutils/transforms/frontmatter.py
-@@ -22,10 +22,16 @@ Transforms related to the front matter of a document or a section
- __docformat__ = 'reStructuredText'
- 
- import re
-+import sys
-+
- from docutils import nodes, utils
- from docutils.transforms import TransformError, Transform
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- class TitlePromoter(Transform):
- 
-     """
-diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py
-index 47e1276..49fb2c8 100644
---- a/docutils/transforms/universal.py
-+++ b/docutils/transforms/universal.py
-@@ -17,12 +17,17 @@ Transforms needed by most or all documents:
- __docformat__ = 'reStructuredText'
- 
- import re
-+import sys
- import time
- from docutils import nodes, utils
- from docutils.transforms import TransformError, Transform
- from docutils.utils import smartquotes
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- class Decorations(Transform):
- 
-     """
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index c71d508..77c70f8 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -22,6 +22,9 @@ from docutils.nodes import unescape
- import docutils.io
- from docutils.utils.error_reporting import ErrorOutput, SafeString
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str
-+
- 
- class SystemMessage(ApplicationError):
- 
-diff --git a/docutils/utils/error_reporting.py b/docutils/utils/error_reporting.py
-index 8ea7108..8fcc816 100644
---- a/docutils/utils/error_reporting.py
-+++ b/docutils/utils/error_reporting.py
-@@ -35,7 +35,8 @@ The `SafeString`, `ErrorString` and `ErrorOutput` classes handle
- common exceptions.
- """
- 
--import sys, codecs
-+import codecs
-+import sys
- 
- # Guess the locale's encoding.
- # If no valid guess can be made, locale_encoding is set to `None`:
-@@ -64,6 +65,9 @@ else:
-         locale_encoding = None
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class SafeString(object):
-     """
-@@ -199,9 +203,9 @@ class ErrorOutput(object):
-             self.stream.write(data)
-         except UnicodeEncodeError:
-             self.stream.write(data.encode(self.encoding, self.encoding_errors))
--        except TypeError: 
-+        except TypeError:
-             if isinstance(data, unicode): # passed stream may expect bytes
--                self.stream.write(data.encode(self.encoding, 
-+                self.stream.write(data.encode(self.encoding,
-                                               self.encoding_errors))
-                 return
-             if self.stream in (sys.stderr, sys.stdout):
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index 1f61e23..4967165 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -20,10 +20,21 @@
- # Alex 20101110
- # eLyXer standalone formula conversion to HTML.
- 
-+import codecs
-+import datetime
-+import gettext
-+import io
-+import os.path
-+import sys
-+import unicodedata
-+import urllib
- 
- 
-+if sys.version_info >= (3,0):
-+    unicode = str  #noqa
-+    basestring = str  # noqa
-+    file = io.IOBase  # noqa
- 
--import sys
- 
- class Trace(object):
-   "A tracing class"
-@@ -73,12 +84,6 @@ class Trace(object):
-   show = classmethod(show)
- 
- 
--
--
--import os.path
--import sys
--
--
- class BibStylesConfig(object):
-   "Configuration class from elyxer.config file"
- 
-@@ -1305,17 +1310,6 @@ class BranchOptions(object):
-     return 'options for ' + self.name + ': ' + unicode(self.options)
- 
- 
--
--
--import urllib
--
--
--
--
--
--
--
--
- class Cloner(object):
-   "An object used to clone other objects."
- 
-@@ -1699,15 +1693,6 @@ class StringOutput(ContainerOutput):
-     return [container.string]
- 
- 
--
--
--
--
--
--import sys
--import codecs
--
--
- class LineReader(object):
-   "Reads a file line by line"
- 
-@@ -3094,24 +3079,6 @@ class FormulaFactory(object):
-     return whole
- 
- 
--
--
--import unicodedata
--
--
--
--
--
--
--
--
--
--
--
--
--import gettext
--
--
- class Translator(object):
-   "Reads the configuration file and tries to find a translation."
-   "Otherwise falls back to the messages in the config file."
-@@ -4589,8 +4556,6 @@ class BeginCommand(CommandBit):
- FormulaCommand.types += [BeginCommand]
- 
- 
--import datetime
--
- 
- class CombiningFunction(OneParamFunction):
- 
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index 23efeea..a7f3b53 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -40,6 +40,10 @@ from docutils.utils.math import (unichar2tex, pick_math_environment,
-                                  math2html, latex2mathml, tex2mathml_extern)
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- class Writer(writers.Writer):
- 
-     supported = ('html', 'xhtml') # update in subclass
-diff --git a/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
-index e870ee1..34e810d 100644
---- a/docutils/writers/docutils_xml.py
-+++ b/docutils/writers/docutils_xml.py
-@@ -30,6 +30,9 @@ from StringIO import StringIO
- import docutils
- from docutils import frontend, writers, nodes
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class RawXmlError(docutils.ApplicationError): pass
- 
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 5eaa7f0..e21c74b 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -28,6 +28,10 @@ from docutils.transforms import writer_aux
- from docutils.utils.math import pick_math_environment, unichar2tex
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- class Writer(writers.Writer):
- 
-     supported = ('latex','latex2e')
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index 287c6f2..9c887c7 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -45,6 +45,10 @@ by the command whatis or apropos.
- __docformat__ = 'reStructuredText'
- 
- import re
-+import sys
-+
-+if sys.version_info < (3, 0):
-+    range = xrange
- 
- import docutils
- from docutils import nodes, writers, languages
-@@ -255,7 +259,7 @@ class Translator(nodes.NodeVisitor):
-             # ensure we get a ".TH" as viewers require it.
-             self.append_header()
-         # filter body
--        for i in xrange(len(self.body)-1, 0, -1):
-+        for i in range(len(self.body)-1, 0, -1):
-             # remove superfluous vertical gaps.
-             if self.body[i] == '.sp\n':
-                 if self.body[i - 1][:4] in ('.BI ','.IP '):
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index e77447a..c6f5b9f 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -89,6 +89,10 @@ except:
-     import pdb
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- # Hack to make repr(StringList) look like repr(list):
- StringList.__repr__ = StringList.__str__
- 
-diff --git a/test/test__init__.py b/test/test__init__.py
-index 01a1c59..8f1d749 100644
---- a/test/test__init__.py
-+++ b/test/test__init__.py
-@@ -16,6 +16,10 @@ import docutils
- import docutils.utils
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
-+
- class ApplicationErrorTests(unittest.TestCase):
- 
-     def test_message(self):
-diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py
-index bae9db5..893082c 100644
---- a/test/test_error_reporting.py
-+++ b/test/test_error_reporting.py
-@@ -46,6 +46,9 @@ if sys.version_info < (3,0): # problems solved in py3k
-         print('cannot test error reporting with problematic locales,\n'
-             '`import locale` failed.')
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- # locales confirmed to use non-ASCII chars in the IOError message
- # for a missing file (https://bugs.gentoo.org/show_bug.cgi?id=349101)
-diff --git a/test/test_language.py b/test/test_language.py
-index 0e05d44..30af81a 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -26,6 +26,9 @@ _reporter = docutils.utils.new_reporter('', _settings)
- 
- reference_language = 'en'
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class LanguageTestSuite(DocutilsTestSupport.CustomTestSuite):
- 
-@@ -156,7 +159,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-         if failures:
-             text = ('Module docutils.parsers.rst.languages.%s:\n    %s'
-                     % (self.language, '\n    '.join(failures)))
--            if type(text) is unicode:
-+            if isinstance(text, unicode):
-                 text = text.encode('raw_unicode_escape')
-             self.fail(text)
- 
-@@ -191,7 +194,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-         if failures:
-             text = ('Module docutils.parsers.rst.languages.%s:\n    %s'
-                     % (self.language, '\n    '.join(failures)))
--            if type(text) is unicode:
-+            if isinstance(text, unicode):
-                 text = text.encode('raw_unicode_escape')
-             self.fail(text)
- 
-diff --git a/test/test_nodes.py b/test/test_nodes.py
-index f6bc6b2..924569f 100755
---- a/test/test_nodes.py
-+++ b/test/test_nodes.py
-@@ -17,6 +17,9 @@ from DocutilsTestSupport import nodes, utils
- 
- debug = False
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+
- 
- class TextTests(unittest.TestCase):
- 
-diff --git a/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
-index 2a6e5be..6e9dc84 100755
---- a/test/test_parsers/test_rst/test_directives/test_include.py
-+++ b/test/test_parsers/test_rst/test_directives/test_include.py
-@@ -14,6 +14,11 @@ from __init__ import DocutilsTestSupport
- from docutils.parsers.rst import states
- from docutils.utils.code_analyzer import with_pygments
- 
-+
-+if sys.version_info >= (3, 0):
-+    unichr = chr  # noqa
-+
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     if not with_pygments:
-diff --git a/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
-index f7496ad..2c5f832 100755
---- a/test/test_parsers/test_rst/test_directives/test_tables.py
-+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
-@@ -16,6 +16,11 @@ import platform
- from docutils.parsers.rst.directives import tables
- 
- 
-+if sys.version_info >= (3, 0):
-+    unicode = str  # noqa
-+    unichr = chr  # noqa
-+
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     s.generateTests(totest)
-diff --git a/test/test_parsers/test_rst/test_directives/test_unicode.py b/test/test_parsers/test_rst/test_directives/test_unicode.py
-index b140050..5cdfd5a 100755
---- a/test/test_parsers/test_rst/test_directives/test_unicode.py
-+++ b/test/test_parsers/test_rst/test_directives/test_unicode.py
-@@ -8,9 +8,15 @@
- Tests for misc.py "unicode" directive.
- """
- 
-+import sys
-+
- from __init__ import DocutilsTestSupport
- 
- 
-+if sys.version_info >= (3, 0):
-+    unichr = chr  # noqa
-+
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     s.generateTests(totest)
-diff --git a/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
-index 85ac264..74e8bc7 100755
---- a/tools/dev/create_unimap.py
-+++ b/tools/dev/create_unimap.py
-@@ -14,15 +14,15 @@ from xml.dom import minidom
- import sys
- import pprint
- 
--if sys.version_info >= (3,0):
--    unicode = str
-+if sys.version_info >= (3, 0):
-+    unicode = str  #noqa
- else:
--    bytes = str
--    chr = unichr
-+    bytes = str  # noqa
-+    chr = unichr  # noqa
- 
- 
- def w(s):
--    if sys.version_info >= (3,0) and isinstance(s, unicode):
-+    if sys.version_info >= (3, 0) and isinstance(s, unicode):
-         s = s.encode('utf8')
-     sys.stdout.write(s)
- 
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0005-py3-Resolve-some-additional-undefined-symbols.patch b/srcpkgs/python-docutils/patches/0005-py3-Resolve-some-additional-undefined-symbols.patch
deleted file mode 100644
index 2288a9bc6be..00000000000
--- a/srcpkgs/python-docutils/patches/0005-py3-Resolve-some-additional-undefined-symbols.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 6bd112802f857b32764afe87ce7828db50077086 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:52:14 +0700
-Subject: [PATCH 05/26] py3: Resolve some additional undefined symbols
-
-Found with flake8
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8352 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/utils/math/math2html.py        |  8 ++++----
- tools/dev/generate_punctuation_chars.py | 11 -----------
- 2 files changed, 4 insertions(+), 15 deletions(-)
-
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index 4967165..4a7209d 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -1624,7 +1624,7 @@ class TaggedOutput(ContentsOutput):
- 
-   def open(self, container):
-     "Get opening line."
--    if not self.checktag():
-+    if not self.checktag(container):
-       return ''
-     open = '<' + self.tag + '>'
-     if self.breaklines:
-@@ -1633,7 +1633,7 @@ class TaggedOutput(ContentsOutput):
- 
-   def close(self, container):
-     "Get closing line."
--    if not self.checktag():
-+    if not self.checktag(container):
-       return ''
-     close = '</' + self.tag.split()[0] + '>'
-     if self.breaklines:
-@@ -1642,14 +1642,14 @@ class TaggedOutput(ContentsOutput):
- 
-   def selfclosing(self, container):
-     "Get self-closing line."
--    if not self.checktag():
-+    if not self.checktag(container):
-       return ''
-     selfclosing = '<' + self.tag + '/>'
-     if self.breaklines:
-       return selfclosing + '\n'
-     return selfclosing
- 
--  def checktag(self):
-+  def checktag(self, container):
-     "Check that the tag is valid."
-     if not self.tag:
-       Trace.error('No tag in ' + unicode(container))
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index 5947fe5..a30c5ca 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -319,17 +319,6 @@ def print_differences(old, new, name):
-     else:
-         print('%s unchanged' % name)
- 
--def print_quote_pairs():
--    pairs = [(o,c) for o,c in quote_pairs.items()]
--    for o,c in sorted(pairs):
--        print((u'%s %s' % (o,c)).encode('utf8'))
--
--    # # Test open/close matching:
--    # for i in range(min(len(openers),len(closers))):
--    #     print('%4d    %s    %s' % (i, openers[i].encode('utf8'),
--    #                                closers[i].encode('utf8'))
--
--
- # Output
- # ------
- #
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0006-py3-Replace-deprecated-form-of-raising-exception.patch b/srcpkgs/python-docutils/patches/0006-py3-Replace-deprecated-form-of-raising-exception.patch
deleted file mode 100644
index 2c2defe0593..00000000000
--- a/srcpkgs/python-docutils/patches/0006-py3-Replace-deprecated-form-of-raising-exception.patch
+++ /dev/null
@@ -1,263 +0,0 @@
-From efe0c9a75c5b2a8d094840927e93e0e873e77ece Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:52:58 +0700
-Subject: [PATCH 06/26] py3: Replace deprecated form of raising exception
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8353 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/frontend.py               | 25 ++++++++++---------------
- docutils/nodes.py                  | 12 ++++++------
- docutils/transforms/frontmatter.py |  4 ++--
- docutils/utils/roman.py            |  9 +++++----
- docutils/writers/manpage.py        |  4 ++--
- test/DocutilsTestSupport.py        | 21 ++++-----------------
- test/package_unittest.py           |  2 +-
- 7 files changed, 30 insertions(+), 47 deletions(-)
-
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index ebdbd6a..4b389b0 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -74,9 +74,8 @@ def validate_encoding(setting, value, option_parser,
-     try:
-         codecs.lookup(value)
-     except LookupError:
--        raise (LookupError('setting "%s": unknown encoding: "%s"'
--                           % (setting, value)),
--               None, sys.exc_info()[2])
-+        raise LookupError('setting "%s": unknown encoding: "%s"'
-+                          % (setting, value))
-     return value
- 
- def validate_encoding_error_handler(setting, value, option_parser,
-@@ -84,12 +83,11 @@ def validate_encoding_error_handler(setting, value, option_parser,
-     try:
-         codecs.lookup_error(value)
-     except LookupError:
--        raise (LookupError(
-+        raise LookupError(
-             'unknown encoding error handler: "%s" (choices: '
-             '"strict", "ignore", "replace", "backslashreplace", '
-             '"xmlcharrefreplace", and possibly others; see documentation for '
--            'the Python ``codecs`` module)' % value),
--               None, sys.exc_info()[2])
-+            'the Python ``codecs`` module)' % value)
-     return value
- 
- def validate_encoding_and_error_handler(
-@@ -125,8 +123,7 @@ def validate_boolean(setting, value, option_parser,
-     try:
-         return option_parser.booleans[value.strip().lower()]
-     except KeyError:
--        raise (LookupError('unknown boolean value: "%s"' % value),
--               None, sys.exc_info()[2])
-+        raise LookupError('unknown boolean value: "%s"' % value)
- 
- def validate_ternary(setting, value, option_parser,
-                      config_parser=None, config_section=None):
-@@ -157,8 +154,7 @@ def validate_threshold(setting, value, option_parser,
-         try:
-             return option_parser.thresholds[value.lower()]
-         except (KeyError, AttributeError):
--            raise (LookupError('unknown threshold: %r.' % value),
--                   None, sys.exc_info[2])
-+            raise LookupError('unknown threshold: %r.' % value)
- 
- def validate_colon_separated_string_list(
-     setting, value, option_parser, config_parser=None, config_section=None):
-@@ -350,10 +346,9 @@ class Option(optparse.Option):
-                 try:
-                     new_value = self.validator(setting, value, parser)
-                 except Exception as error:
--                    raise (optparse.OptionValueError(
-+                    raise optparse.OptionValueError(
-                         'Error in option "%s":\n    %s'
--                        % (opt, ErrorString(error))),
--                           None, sys.exc_info()[2])
-+                        % (opt, ErrorString(error)))
-                 setattr(values, setting, new_value)
-             if self.overrides:
-                 setattr(values, self.overrides, None)
-@@ -830,12 +825,12 @@ Skipping "%s" configuration file.
-                             setting, value, option_parser,
-                             config_parser=self, config_section=section)
-                     except Exception as error:
--                        raise (ValueError(
-+                        raise ValueError(
-                             'Error in config file "%s", section "[%s]":\n'
-                             '    %s\n'
-                             '        %s = %s'
-                             % (filename, section, ErrorString(error),
--                               setting, value)), None, sys.exc_info()[2])
-+                               setting, value))
-                     self.set(section, setting, new_value)
-                 if option.overrides:
-                     self.set(section, option.overrides, None)
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index fa02c6e..71189ab 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -594,8 +594,8 @@ class Element(Node):
-             assert key.step in (None, 1), 'cannot handle slice with stride'
-             return self.children[key.start:key.stop]
-         else:
--            raise TypeError, ('element index must be an integer, a slice, or '
--                              'an attribute name string')
-+            raise TypeError('element index must be an integer, a slice, or '
-+                            'an attribute name string')
- 
-     def __setitem__(self, key, item):
-         if isinstance(key, basestring):
-@@ -609,8 +609,8 @@ class Element(Node):
-                 self.setup_child(node)
-             self.children[key.start:key.stop] = item
-         else:
--            raise TypeError, ('element index must be an integer, a slice, or '
--                              'an attribute name string')
-+            raise TypeError('element index must be an integer, a slice, or '
-+                            'an attribute name string')
- 
-     def __delitem__(self, key):
-         if isinstance(key, basestring):
-@@ -621,8 +621,8 @@ class Element(Node):
-             assert key.step in (None, 1), 'cannot handle slice with stride'
-             del self.children[key.start:key.stop]
-         else:
--            raise TypeError, ('element index must be an integer, a simple '
--                              'slice, or an attribute name string')
-+            raise TypeError('element index must be an integer, a simple '
-+                            'slice, or an attribute name string')
- 
-     def __add__(self, other):
-         return self.children + other
-diff --git a/docutils/transforms/frontmatter.py b/docutils/transforms/frontmatter.py
-index 1279f50..23b9c95 100644
---- a/docutils/transforms/frontmatter.py
-+++ b/docutils/transforms/frontmatter.py
-@@ -57,7 +57,7 @@ class TitlePromoter(Transform):
-         """
-         # Type check
-         if not isinstance(node, nodes.Element):
--            raise TypeError, 'node must be of Element-derived type.'
-+            raise TypeError('node must be of Element-derived type.')
- 
-         # `node` must not have a title yet.
-         assert not (len(node) and isinstance(node[0], nodes.title))
-@@ -100,7 +100,7 @@ class TitlePromoter(Transform):
-         """
-         # Type check
-         if not isinstance(node, nodes.Element):
--            raise TypeError, 'node must be of Element-derived type.'
-+            raise TypeError('node must be of Element-derived type.')
- 
-         subsection, index = self.candidate_index(node)
-         if index is None:
-diff --git a/docutils/utils/roman.py b/docutils/utils/roman.py
-index 0335f29..fc4680d 100644
---- a/docutils/utils/roman.py
-+++ b/docutils/utils/roman.py
-@@ -40,9 +40,9 @@ romanNumeralMap = (('M',  1000),
- def toRoman(n):
-     """convert integer to Roman numeral"""
-     if not (0 < n < 5000):
--        raise OutOfRangeError, "number out of range (must be 1..4999)"
-+        raise OutOfRangeError("number out of range (must be 1..4999)")
-     if int(n) != n:
--        raise NotIntegerError, "decimals can not be converted"
-+        raise NotIntegerError("decimals can not be converted")
- 
-     result = ""
-     for numeral, integer in romanNumeralMap:
-@@ -67,9 +67,10 @@ romanNumeralPattern = re.compile("""
- def fromRoman(s):
-     """convert Roman numeral to integer"""
-     if not s:
--        raise InvalidRomanNumeralError, 'Input can not be blank'
-+        raise InvalidRomanNumeralError('Input can not be blank')
-+
-     if not romanNumeralPattern.search(s):
--        raise InvalidRomanNumeralError, 'Invalid Roman numeral: %s' % s
-+        raise InvalidRomanNumeralError('Invalid Roman numeral: %s' % s)
- 
-     result = 0
-     index = 0
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index 9c887c7..cbb8648 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -715,7 +715,7 @@ class Translator(nodes.NodeVisitor):
-         pass
- 
-     def visit_header(self, node):
--        raise NotImplementedError, node.astext()
-+        raise NotImplementedError(node.astext())
- 
-     def depart_header(self, node):
-         pass
-@@ -855,7 +855,7 @@ class Translator(nodes.NodeVisitor):
-         self.depart_literal_block(node)
- 
-     def visit_meta(self, node):
--        raise NotImplementedError, node.astext()
-+        raise NotImplementedError(node.astext())
- 
-     def depart_meta(self, node):
-         pass
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index c6f5b9f..a1fec25 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -123,30 +123,17 @@ class StandardTestCase(unittest.TestCase):
-            operator.
-         """
-         if not first == second:
--            raise self.failureException, (
--                    msg or '%s != %s' % _format_str(first, second))
-+            raise self.failureException(
-+                msg or '%s != %s' % _format_str(first, second))
- 
-     def assertNotEqual(self, first, second, msg=None):
-         """Fail if the two objects are equal as determined by the '=='
-            operator.
-         """
-         if first == second:
--            raise self.failureException, (
--                    msg or '%s == %s' % _format_str(first, second))
-+            raise self.failureException(
-+                msg or '%s == %s' % _format_str(first, second))
- 
--    # assertIn and assertNotIn: new in Python 2.7:
--    if sys.version_info < (2,7):
--    
--        def assertIn(self, a, b, msg=None):
--            if a not in b:
--                raise self.failureException, (
--                        msg or '%s not in %s' % _format_str(a, b))
--    
--        def assertNotIn(self, a, b, msg=None):
--            if a in b:
--                raise self.failureException, (
--                        msg or '%s in %s' % _format_str(a, b))
--    
-     # aliases for assertion methods, deprecated since Python 2.7
- 
-     failUnlessEqual = assertEquals = assertEqual
-diff --git a/test/package_unittest.py b/test/package_unittest.py
-index 16b00dc..4db826b 100644
---- a/test/package_unittest.py
-+++ b/test/package_unittest.py
-@@ -120,7 +120,7 @@ def loadTestModules(path, name='', packages=None):
-             elif isinstance(suite, unittest.TestSuite):
-                 testSuite.addTest(suite)
-             else:
--                raise AssertionError, "don't understand suite (%s)" % mod
-+                raise AssertionError("don't understand suite (%s)" % mod)
-     sys.path.pop(0)
-     return testSuite
- 
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0007-py3-Replace-sys.maxint-with-sys.maxsize.patch b/srcpkgs/python-docutils/patches/0007-py3-Replace-sys.maxint-with-sys.maxsize.patch
deleted file mode 100644
index eb0c40f7a1f..00000000000
--- a/srcpkgs/python-docutils/patches/0007-py3-Replace-sys.maxint-with-sys.maxsize.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From d6f8634004aa679d2d71037bd63af82052f08fee Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:53:54 +0700
-Subject: [PATCH 07/26] py3: Replace 'sys.maxint' with 'sys.maxsize'
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From the Python 3 release docs [1]:
-
-  The sys.maxint constant was removed, since there is no longer a limit
-  to the value of integers. However, sys.maxsize can be used as an
-  integer larger than any practical list or string index. It conforms to
-  the implementation’s “natural” integer size and is typically the
-  same as sys.maxint in previous releases on the same platform (assuming
-  the same build options).
-
-[1] https://docs.python.org/3.1/whatsnew/3.0.html#integers
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8354 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/nodes.py                   | 4 ++--
- docutils/parsers/rst/tableparser.py | 2 +-
- docutils/statemachine.py            | 2 +-
- docutils/transforms/parts.py        | 4 ++--
- 4 files changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index 71189ab..c524373 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -977,7 +977,7 @@ class Element(Node):
-                        'Losing "%s" attribute: %s' % (att, self[att])
-         self.parent.replace(self, new)
- 
--    def first_child_matching_class(self, childclass, start=0, end=sys.maxint):
-+    def first_child_matching_class(self, childclass, start=0, end=sys.maxsize):
-         """
-         Return the index of the first child whose class exactly matches.
- 
-@@ -997,7 +997,7 @@ class Element(Node):
-         return None
- 
-     def first_child_not_matching_class(self, childclass, start=0,
--                                       end=sys.maxint):
-+                                       end=sys.maxsize):
-         """
-         Return the index of the first child whose class does *not* match.
- 
-diff --git a/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
-index 45af72f..2760ea0 100644
---- a/docutils/parsers/rst/tableparser.py
-+++ b/docutils/parsers/rst/tableparser.py
-@@ -498,7 +498,7 @@ class SimpleTableParser(TableParser):
-         """
-         # "Infinite" value for a dummy last column's beginning, used to
-         # check for text overflow:
--        columns.append((sys.maxint, None))
-+        columns.append((sys.maxsize, None))
-         lastcol = len(columns) - 2
-         # combining characters do not contribute to the column width
-         lines = [strip_combining_chars(line) for line in lines]
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index b56f3c5..5d7fe77 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -1341,7 +1341,7 @@ class StringList(ViewList):
- 
-     """A `ViewList` with string-specific methods."""
- 
--    def trim_left(self, length, start=0, end=sys.maxint):
-+    def trim_left(self, length, start=0, end=sys.maxsize):
-         """
-         Trim `length` characters off the beginning of each item, in-place,
-         from index `start` to `end`.  No whitespace-checking is done on the
-diff --git a/docutils/transforms/parts.py b/docutils/transforms/parts.py
-index 11b1b23..7a2fa0f 100644
---- a/docutils/transforms/parts.py
-+++ b/docutils/transforms/parts.py
-@@ -37,7 +37,7 @@ class SectNum(Transform):
-         self.startnode.parent.remove(self.startnode)
-         if self.document.settings.sectnum_xform:
-             if self.maxdepth is None:
--                self.maxdepth = sys.maxint
-+                self.maxdepth = sys.maxsize
-             self.update_section_numbers(self.document)
-         else: # store details for eventual section numbering by the writer
-             self.document.settings.sectnum_depth = self.maxdepth
-@@ -120,7 +120,7 @@ class Contents(Transform):
-         sections = [sect for sect in node if isinstance(sect, nodes.section)]
-         entries = []
-         autonum = 0
--        depth = self.startnode.details.get('depth', sys.maxint)
-+        depth = self.startnode.details.get('depth', sys.maxsize)
-         for section in sections:
-             title = section[0]
-             auto = title.get('auto')    # May be set by SectNum.
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0008-py3-Replace-types.SliceType-with-slice-remove-types..patch b/srcpkgs/python-docutils/patches/0008-py3-Replace-types.SliceType-with-slice-remove-types..patch
deleted file mode 100644
index 571c6fa7d6b..00000000000
--- a/srcpkgs/python-docutils/patches/0008-py3-Replace-types.SliceType-with-slice-remove-types..patch
+++ /dev/null
@@ -1,128 +0,0 @@
-From a46f2bdec20068cf79ff182ae024fc1989d45c74 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 16:42:50 +0000
-Subject: [PATCH 08/26] py3: Replace 'types.SliceType' with slice, remove
- 'types.ClassType'.
-
-These types have been removed in Python 3,
-`SliceType` is an alias for `slice` already in Python 2.7,
-`ClassType` is for user-defined old-style classes (we now use only new style classes).
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8355 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/nodes.py        | 11 +++++------
- docutils/statemachine.py |  5 ++---
- test/test_nodes.py       |  4 ++--
- 3 files changed, 9 insertions(+), 11 deletions(-)
-
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index c524373..a8c0478 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -27,7 +27,6 @@ import sys
- import os
- import re
- import warnings
--import types
- import unicodedata
- 
- if sys.version_info >= (3, 0):
-@@ -257,11 +256,11 @@ class Node(object):
-         if include_self and descend and not siblings:
-             if condition is None:
-                 return self._all_traverse()
--            elif isinstance(condition, (types.ClassType, type)):
-+            elif isinstance(condition, type):
-                 return self._fast_traverse(condition)
-         # Check if `condition` is a class (check for TypeType for Python
-         # implementations that use only new-style classes, like PyPy).
--        if isinstance(condition, (types.ClassType, type)):
-+        if isinstance(condition, type):
-             node_class = condition
-             def condition(node, node_class=node_class):
-                 return isinstance(node, node_class)
-@@ -590,7 +589,7 @@ class Element(Node):
-             return self.attributes[key]
-         elif isinstance(key, int):
-             return self.children[key]
--        elif isinstance(key, types.SliceType):
-+        elif isinstance(key, slice):
-             assert key.step in (None, 1), 'cannot handle slice with stride'
-             return self.children[key.start:key.stop]
-         else:
-@@ -603,7 +602,7 @@ class Element(Node):
-         elif isinstance(key, int):
-             self.setup_child(item)
-             self.children[key] = item
--        elif isinstance(key, types.SliceType):
-+        elif isinstance(key, slice):
-             assert key.step in (None, 1), 'cannot handle slice with stride'
-             for node in item:
-                 self.setup_child(node)
-@@ -617,7 +616,7 @@ class Element(Node):
-             del self.attributes[key]
-         elif isinstance(key, int):
-             del self.children[key]
--        elif isinstance(key, types.SliceType):
-+        elif isinstance(key, slice):
-             assert key.step in (None, 1), 'cannot handle slice with stride'
-             del self.children[key.start:key.stop]
-         else:
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 5d7fe77..068083a 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -109,7 +109,6 @@ __docformat__ = 'restructuredtext'
- 
- import sys
- import re
--import types
- import unicodedata
- from docutils import utils
- from docutils.utils.error_reporting import ErrorOutput
-@@ -1148,7 +1147,7 @@ class ViewList(object):
-     # just works.
- 
-     def __getitem__(self, i):
--        if isinstance(i, types.SliceType):
-+        if isinstance(i, slice):
-             assert i.step in (None, 1),  'cannot handle slice with stride'
-             return self.__class__(self.data[i.start:i.stop],
-                                   items=self.items[i.start:i.stop],
-@@ -1157,7 +1156,7 @@ class ViewList(object):
-             return self.data[i]
- 
-     def __setitem__(self, i, item):
--        if isinstance(i, types.SliceType):
-+        if isinstance(i, slice):
-             assert i.step in (None, 1), 'cannot handle slice with stride'
-             if not isinstance(item, ViewList):
-                 raise TypeError('assigning non-ViewList to ViewList slice')
-diff --git a/test/test_nodes.py b/test/test_nodes.py
-index 924569f..679c98e 100755
---- a/test/test_nodes.py
-+++ b/test/test_nodes.py
-@@ -11,7 +11,7 @@ Test module for nodes.py.
- 
- import sys
- import unittest
--import types
-+
- import DocutilsTestSupport              # must be imported before docutils
- from DocutilsTestSupport import nodes, utils
- 
-@@ -359,7 +359,7 @@ class MiscTests(unittest.TestCase):
-         node_class_names = []
-         for x in dir(nodes):
-             c = getattr(nodes, x)
--            if isinstance(c, (type, types.ClassType)) and \
-+            if isinstance(c, type) and \
-                    issubclass(c, nodes.Node) and len(c.__bases__) > 1:
-                 node_class_names.append(x)
-         node_class_names.sort()
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0009-py3-Use-absolute_import-future.patch b/srcpkgs/python-docutils/patches/0009-py3-Use-absolute_import-future.patch
deleted file mode 100644
index 2e7d31c2f83..00000000000
--- a/srcpkgs/python-docutils/patches/0009-py3-Use-absolute_import-future.patch
+++ /dev/null
@@ -1,1699 +0,0 @@
-From 2384d685b2b38e30a0dbb60594c190f36ad7e3a7 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 19 Nov 2019 23:57:43 +0700
-Subject: [PATCH 09/26] py3: Use 'absolute_import' future
-
-This mostly applies to tests.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8356 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/writers/odf_odt/__init__.py                      | 3 ++-
- test/test_parsers/test_get_parser_class.py                | 3 ++-
- test/test_parsers/test_rst/test_SimpleTableParser.py      | 3 ++-
- test/test_parsers/test_rst/test_TableParser.py            | 3 ++-
- test/test_parsers/test_rst/test_block_quotes.py           | 3 ++-
- test/test_parsers/test_rst/test_bullet_lists.py           | 3 ++-
- .../test_rst/test_character_level_inline_markup.py        | 3 ++-
- test/test_parsers/test_rst/test_citations.py              | 3 ++-
- test/test_parsers/test_rst/test_comments.py               | 3 ++-
- test/test_parsers/test_rst/test_definition_lists.py       | 3 ++-
- .../test_rst/test_directives/test_admonitions.py          | 3 ++-
- .../test_rst/test_directives/test_block_quotes.py         | 3 ++-
- test/test_parsers/test_rst/test_directives/test_class.py  | 3 ++-
- test/test_parsers/test_rst/test_directives/test_code.py   | 3 ++-
- .../test_rst/test_directives/test_code_long.py            | 3 ++-
- .../test_rst/test_directives/test_code_none.py            | 3 ++-
- .../test_rst/test_directives/test_compound.py             | 3 ++-
- .../test_rst/test_directives/test_container.py            | 3 ++-
- .../test_rst/test_directives/test_contents.py             | 3 ++-
- test/test_parsers/test_rst/test_directives/test_date.py   | 3 ++-
- .../test_rst/test_directives/test_decorations.py          | 4 +++-
- .../test_rst/test_directives/test_default_role.py         | 3 ++-
- .../test_parsers/test_rst/test_directives/test_figures.py | 4 +++-
- test/test_parsers/test_rst/test_directives/test_images.py | 4 +++-
- .../test_parsers/test_rst/test_directives/test_include.py | 3 ++-
- .../test_rst/test_directives/test_line_blocks.py          | 4 +++-
- test/test_parsers/test_rst/test_directives/test_math.py   | 4 +++-
- test/test_parsers/test_rst/test_directives/test_meta.py   | 4 +++-
- .../test_rst/test_directives/test_parsed_literals.py      | 4 +++-
- test/test_parsers/test_rst/test_directives/test_raw.py    | 5 ++++-
- .../test_parsers/test_rst/test_directives/test_replace.py | 3 ++-
- .../test_rst/test_directives/test_replace_fr.py           | 3 ++-
- test/test_parsers/test_rst/test_directives/test_role.py   | 3 ++-
- .../test_parsers/test_rst/test_directives/test_rubrics.py | 3 ++-
- .../test_parsers/test_rst/test_directives/test_sectnum.py | 4 +++-
- .../test_rst/test_directives/test_sidebars.py             | 4 +++-
- test/test_parsers/test_rst/test_directives/test_tables.py | 4 +++-
- .../test_rst/test_directives/test_target_notes.py         | 4 +++-
- .../test_rst/test_directives/test_test_directives.py      | 4 +++-
- test/test_parsers/test_rst/test_directives/test_title.py  | 4 +++-
- test/test_parsers/test_rst/test_directives/test_topics.py | 4 +++-
- .../test_parsers/test_rst/test_directives/test_unicode.py | 3 ++-
- .../test_parsers/test_rst/test_directives/test_unknown.py | 4 +++-
- test/test_parsers/test_rst/test_doctest_blocks.py         | 4 +++-
- test/test_parsers/test_rst/test_east_asian_text.py        | 5 ++++-
- test/test_parsers/test_rst/test_enumerated_lists.py       | 4 +++-
- test/test_parsers/test_rst/test_field_lists.py            | 4 +++-
- test/test_parsers/test_rst/test_footnotes.py              | 4 +++-
- test/test_parsers/test_rst/test_inline_markup.py          | 4 +++-
- test/test_parsers/test_rst/test_interpreted.py            | 4 +++-
- test/test_parsers/test_rst/test_interpreted_fr.py         | 4 +++-
- test/test_parsers/test_rst/test_line_blocks.py            | 4 +++-
- test/test_parsers/test_rst/test_literal_blocks.py         | 4 +++-
- test/test_parsers/test_rst/test_option_lists.py           | 4 +++-
- test/test_parsers/test_rst/test_outdenting.py             | 4 +++-
- test/test_parsers/test_rst/test_paragraphs.py             | 4 +++-
- test/test_parsers/test_rst/test_section_headers.py        | 8 ++++++--
- test/test_parsers/test_rst/test_substitutions.py          | 4 +++-
- test/test_parsers/test_rst/test_tables.py                 | 5 ++++-
- test/test_parsers/test_rst/test_targets.py                | 4 +++-
- test/test_parsers/test_rst/test_transitions.py            | 4 +++-
- test/test_readers/test_get_reader_class.py                | 5 +++--
- test/test_readers/test_pep/test_inline_markup.py          | 3 ++-
- test/test_readers/test_pep/test_rfc2822.py                | 4 +++-
- test/test_transforms/test___init__.py                     | 6 ++++--
- test/test_transforms/test_class.py                        | 3 ++-
- test/test_transforms/test_contents.py                     | 3 ++-
- test/test_transforms/test_docinfo.py                      | 3 ++-
- test/test_transforms/test_doctitle.py                     | 4 +++-
- test/test_transforms/test_expose_internals.py             | 4 +++-
- test/test_transforms/test_filter.py                       | 3 ++-
- test/test_transforms/test_footnotes.py                    | 3 ++-
- test/test_transforms/test_hyperlinks.py                   | 4 ++--
- test/test_transforms/test_messages.py                     | 3 ++-
- test/test_transforms/test_peps.py                         | 3 ++-
- test/test_transforms/test_sectnum.py                      | 3 ++-
- test/test_transforms/test_smartquotes.py                  | 5 +++--
- test/test_transforms/test_strip_comments.py               | 3 ++-
- test/test_transforms/test_strip_elements_with_class.py    | 3 ++-
- test/test_transforms/test_substitutions.py                | 3 ++-
- test/test_transforms/test_target_notes.py                 | 3 ++-
- test/test_transforms/test_transitions.py                  | 4 +++-
- test/test_transforms/test_writer_aux.py                   | 3 ++-
- test/test_writers/test_docutils_xml.py                    | 3 ++-
- test/test_writers/test_get_writer_class.py                | 4 +++-
- test/test_writers/test_html4css1_misc.py                  | 7 +++++--
- test/test_writers/test_html4css1_parts.py                 | 4 +++-
- test/test_writers/test_html4css1_template.py              | 3 ++-
- test/test_writers/test_html5_polyglot_misc.py             | 7 +++++--
- test/test_writers/test_html5_polyglot_parts.py            | 3 ++-
- test/test_writers/test_latex2e.py                         | 5 ++++-
- test/test_writers/test_manpage.py                         | 4 +++-
- test/test_writers/test_null.py                            | 4 +++-
- test/test_writers/test_odt.py                             | 3 ++-
- test/test_writers/test_pseudoxml.py                       | 4 +++-
- test/test_writers/test_s5.py                              | 3 ++-
- 96 files changed, 253 insertions(+), 103 deletions(-)
-
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index 5f62605..c0f43a5 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -6,6 +6,7 @@
- Open Document Format (ODF) Writer.
- 
- """
-+from __future__ import absolute_import
- 
- __docformat__ = 'reStructuredText'
- 
-@@ -71,7 +72,7 @@ try:
-         from .pygmentsformatter import OdtPygmentsProgFormatter, \
-             OdtPygmentsLaTeXFormatter
-     else:
--        from pygmentsformatter import OdtPygmentsProgFormatter, \
-+        from .pygmentsformatter import OdtPygmentsProgFormatter, \
-             OdtPygmentsLaTeXFormatter
- except (ImportError, SyntaxError):
-     pygments = None
-diff --git a/test/test_parsers/test_get_parser_class.py b/test/test_parsers/test_get_parser_class.py
-index 4de05cc..ca809d0 100644
---- a/test/test_parsers/test_get_parser_class.py
-+++ b/test/test_parsers/test_get_parser_class.py
-@@ -8,8 +8,9 @@
- """
- test get_parser_class
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.parsers import get_parser_class
- 
- class GetParserClassTestCase(DocutilsTestSupport.StandardTestCase):
-diff --git a/test/test_parsers/test_rst/test_SimpleTableParser.py b/test/test_parsers/test_rst/test_SimpleTableParser.py
-index 864c545..2942e01 100755
---- a/test/test_parsers/test_rst/test_SimpleTableParser.py
-+++ b/test/test_parsers/test_rst/test_SimpleTableParser.py
-@@ -8,8 +8,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.SimpleTableParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_TableParser.py b/test/test_parsers/test_rst/test_TableParser.py
-index 189ef2a..ecafe8f 100755
---- a/test/test_parsers/test_rst/test_TableParser.py
-+++ b/test/test_parsers/test_rst/test_TableParser.py
-@@ -8,8 +8,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.GridTableParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_block_quotes.py b/test/test_parsers/test_rst/test_block_quotes.py
-index 171c784..2aee3c6 100755
---- a/test/test_parsers/test_rst/test_block_quotes.py
-+++ b/test/test_parsers/test_rst/test_block_quotes.py
-@@ -7,8 +7,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_bullet_lists.py b/test/test_parsers/test_rst/test_bullet_lists.py
-index 246cdbd..4fe963d 100755
---- a/test/test_parsers/test_rst/test_bullet_lists.py
-+++ b/test/test_parsers/test_rst/test_bullet_lists.py
-@@ -7,8 +7,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_character_level_inline_markup.py b/test/test_parsers/test_rst/test_character_level_inline_markup.py
-index b1d1885..6b42ed6 100644
---- a/test/test_parsers/test_rst/test_character_level_inline_markup.py
-+++ b/test/test_parsers/test_rst/test_character_level_inline_markup.py
-@@ -11,8 +11,9 @@ with the "character-level-inline-markup" setting.
- 
- Experimental.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite(suite_settings={'character_level_inline_markup': True})
-diff --git a/test/test_parsers/test_rst/test_citations.py b/test/test_parsers/test_rst/test_citations.py
-index 03370a6..ead2b98 100755
---- a/test/test_parsers/test_rst/test_citations.py
-+++ b/test/test_parsers/test_rst/test_citations.py
-@@ -7,8 +7,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_comments.py b/test/test_parsers/test_rst/test_comments.py
-index 34f62e1..10cca78 100755
---- a/test/test_parsers/test_rst/test_comments.py
-+++ b/test/test_parsers/test_rst/test_comments.py
-@@ -7,8 +7,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_definition_lists.py b/test/test_parsers/test_rst/test_definition_lists.py
-index 1a80360..40c633c 100755
---- a/test/test_parsers/test_rst/test_definition_lists.py
-+++ b/test/test_parsers/test_rst/test_definition_lists.py
-@@ -7,8 +7,9 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_admonitions.py b/test/test_parsers/test_rst/test_directives/test_admonitions.py
-index faf5f66..3724131 100755
---- a/test/test_parsers/test_rst/test_directives/test_admonitions.py
-+++ b/test/test_parsers/test_rst/test_directives/test_admonitions.py
-@@ -7,8 +7,9 @@
- """
- Tests for admonitions.py directives.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_block_quotes.py b/test/test_parsers/test_rst/test_directives/test_block_quotes.py
-index 93bae9e..87a99d7 100755
---- a/test/test_parsers/test_rst/test_directives/test_block_quotes.py
-+++ b/test/test_parsers/test_rst/test_directives/test_block_quotes.py
-@@ -8,8 +8,9 @@
- Tests for the block quote directives "epigraph", "highlights", and
- "pull-quote".
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_class.py b/test/test_parsers/test_rst/test_directives/test_class.py
-index 544946d..d65c8b4 100755
---- a/test/test_parsers/test_rst/test_directives/test_class.py
-+++ b/test/test_parsers/test_rst/test_directives/test_class.py
-@@ -7,8 +7,9 @@
- """
- Tests for the 'class' directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_code.py b/test/test_parsers/test_rst/test_directives/test_code.py
-index 51c1558..bf7ebba 100644
---- a/test/test_parsers/test_rst/test_directives/test_code.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code.py
-@@ -7,8 +7,9 @@
- """
- Test the 'code' directive in parsers/rst/directives/body.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.utils.code_analyzer import with_pygments
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_code_long.py b/test/test_parsers/test_rst/test_directives/test_code_long.py
-index 74f16d5..1a55c97 100644
---- a/test/test_parsers/test_rst/test_directives/test_code_long.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code_long.py
-@@ -7,8 +7,9 @@
- """
- Test the 'code' directive in body.py with syntax_highlight = 'long'.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.utils.code_analyzer import with_pygments
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_code_none.py b/test/test_parsers/test_rst/test_directives/test_code_none.py
-index 515772c..23ae3d2 100644
---- a/test/test_parsers/test_rst/test_directives/test_code_none.py
-+++ b/test/test_parsers/test_rst/test_directives/test_code_none.py
-@@ -7,8 +7,9 @@
- """
- Test the 'code' directive in body.py with syntax_highlight = 'none'.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite(suite_settings={'syntax_highlight':'none'})
-diff --git a/test/test_parsers/test_rst/test_directives/test_compound.py b/test/test_parsers/test_rst/test_directives/test_compound.py
-index c0ef4b8..6bbab9c 100755
---- a/test/test_parsers/test_rst/test_directives/test_compound.py
-+++ b/test/test_parsers/test_rst/test_directives/test_compound.py
-@@ -7,8 +7,9 @@
- """
- Tests for the 'compound' directive from body.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_container.py b/test/test_parsers/test_rst/test_directives/test_container.py
-index 6b7b022..9ec5afc 100755
---- a/test/test_parsers/test_rst/test_directives/test_container.py
-+++ b/test/test_parsers/test_rst/test_directives/test_container.py
-@@ -7,8 +7,9 @@
- """
- Tests for the 'container' directive from body.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_contents.py b/test/test_parsers/test_rst/test_directives/test_contents.py
-index e1ef47f..a07ddd2 100755
---- a/test/test_parsers/test_rst/test_directives/test_contents.py
-+++ b/test/test_parsers/test_rst/test_directives/test_contents.py
-@@ -7,8 +7,9 @@
- """
- Tests for parts.py contents directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_date.py b/test/test_parsers/test_rst/test_directives/test_date.py
-index 87dc186..1f30128 100755
---- a/test/test_parsers/test_rst/test_directives/test_date.py
-+++ b/test/test_parsers/test_rst/test_directives/test_date.py
-@@ -7,8 +7,9 @@
- """
- Tests for the misc.py "date" directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- import time
- 
- from docutils.utils.error_reporting import locale_encoding
-diff --git a/test/test_parsers/test_rst/test_directives/test_decorations.py b/test/test_parsers/test_rst/test_directives/test_decorations.py
-index b66f68d..63be131 100755
---- a/test/test_parsers/test_rst/test_directives/test_decorations.py
-+++ b/test/test_parsers/test_rst/test_directives/test_decorations.py
-@@ -7,8 +7,10 @@
- """
- Tests for the "header" & "footer" directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_default_role.py b/test/test_parsers/test_rst/test_directives/test_default_role.py
-index 15b0f56..f81c30b 100755
---- a/test/test_parsers/test_rst/test_directives/test_default_role.py
-+++ b/test/test_parsers/test_rst/test_directives/test_default_role.py
-@@ -7,8 +7,9 @@
- """
- Tests for misc.py "default-role" directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_figures.py b/test/test_parsers/test_rst/test_directives/test_figures.py
-index de54190..09ced3f 100755
---- a/test/test_parsers/test_rst/test_directives/test_figures.py
-+++ b/test/test_parsers/test_rst/test_directives/test_figures.py
-@@ -7,8 +7,10 @@
- """
- Tests for images.py figure directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_images.py b/test/test_parsers/test_rst/test_directives/test_images.py
-index c52793c..e78caed 100755
---- a/test/test_parsers/test_rst/test_directives/test_images.py
-+++ b/test/test_parsers/test_rst/test_directives/test_images.py
-@@ -7,11 +7,13 @@
- """
- Tests for images.py image directives.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- from docutils.nodes import reprunicode
- 
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     s.generateTests(totest)
-diff --git a/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
-index 6e9dc84..d848262 100755
---- a/test/test_parsers/test_rst/test_directives/test_include.py
-+++ b/test/test_parsers/test_rst/test_directives/test_include.py
-@@ -7,10 +7,11 @@
- """
- Tests for misc.py "include" directive.
- """
-+from __future__ import absolute_import
- 
- import os.path
- import sys
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.parsers.rst import states
- from docutils.utils.code_analyzer import with_pygments
- 
-diff --git a/test/test_parsers/test_rst/test_directives/test_line_blocks.py b/test/test_parsers/test_rst/test_directives/test_line_blocks.py
-index 0fdfaba..d6bf31b 100755
---- a/test/test_parsers/test_rst/test_directives/test_line_blocks.py
-+++ b/test/test_parsers/test_rst/test_directives/test_line_blocks.py
-@@ -7,8 +7,10 @@
- """
- Tests for the body.py 'line-block' directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_math.py b/test/test_parsers/test_rst/test_directives/test_math.py
-index e8dfe27..2bac077 100644
---- a/test/test_parsers/test_rst/test_directives/test_math.py
-+++ b/test/test_parsers/test_rst/test_directives/test_math.py
-@@ -7,8 +7,10 @@
- """
- Tests for the 'math' directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_meta.py b/test/test_parsers/test_rst/test_directives/test_meta.py
-index bd7906d..8b15dde 100755
---- a/test/test_parsers/test_rst/test_directives/test_meta.py
-+++ b/test/test_parsers/test_rst/test_directives/test_meta.py
-@@ -7,8 +7,10 @@
- """
- Tests for html meta directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_parsed_literals.py b/test/test_parsers/test_rst/test_directives/test_parsed_literals.py
-index 6bf2cb1..4ea09e1 100755
---- a/test/test_parsers/test_rst/test_directives/test_parsed_literals.py
-+++ b/test/test_parsers/test_rst/test_directives/test_parsed_literals.py
-@@ -7,8 +7,10 @@
- """
- Tests for the body.py 'parsed-literal' directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_raw.py b/test/test_parsers/test_rst/test_directives/test_raw.py
-index f366f92..2da962a 100755
---- a/test/test_parsers/test_rst/test_directives/test_raw.py
-+++ b/test/test_parsers/test_rst/test_directives/test_raw.py
-@@ -7,10 +7,13 @@
- """
- Tests for misc.py "raw" directive.
- """
-+from __future__ import absolute_import
- 
- import os.path
- import sys
--from __init__ import DocutilsTestSupport
-+
-+from . import DocutilsTestSupport
-+
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_replace.py b/test/test_parsers/test_rst/test_directives/test_replace.py
-index d2d3d8a..75e580b 100755
---- a/test/test_parsers/test_rst/test_directives/test_replace.py
-+++ b/test/test_parsers/test_rst/test_directives/test_replace.py
-@@ -7,8 +7,9 @@
- """
- Tests for misc.py "replace" directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_replace_fr.py b/test/test_parsers/test_rst/test_directives/test_replace_fr.py
-index 6847c1c..78e4a45 100644
---- a/test/test_parsers/test_rst/test_directives/test_replace_fr.py
-+++ b/test/test_parsers/test_rst/test_directives/test_replace_fr.py
-@@ -8,8 +8,9 @@
- Tests for misc.py "replace" directive.
- Test in french (not default/fallback language).
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_role.py b/test/test_parsers/test_rst/test_directives/test_role.py
-index 3f728f0..60d65e6 100755
---- a/test/test_parsers/test_rst/test_directives/test_role.py
-+++ b/test/test_parsers/test_rst/test_directives/test_role.py
-@@ -7,8 +7,9 @@
- """
- Tests for misc.py "role" directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_parsers/test_rst/test_directives/test_rubrics.py b/test/test_parsers/test_rst/test_directives/test_rubrics.py
-index 70b6b00..52dcd5c 100755
---- a/test/test_parsers/test_rst/test_directives/test_rubrics.py
-+++ b/test/test_parsers/test_rst/test_directives/test_rubrics.py
-@@ -7,8 +7,9 @@
- """
- Tests for the "rubric" directive.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_sectnum.py b/test/test_parsers/test_rst/test_directives/test_sectnum.py
-index 7ab0486..4119607 100755
---- a/test/test_parsers/test_rst/test_directives/test_sectnum.py
-+++ b/test/test_parsers/test_rst/test_directives/test_sectnum.py
-@@ -7,8 +7,10 @@
- """
- Tests for the 'sectnum' directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_sidebars.py b/test/test_parsers/test_rst/test_directives/test_sidebars.py
-index 7c61dac..ef501ce 100755
---- a/test/test_parsers/test_rst/test_directives/test_sidebars.py
-+++ b/test/test_parsers/test_rst/test_directives/test_sidebars.py
-@@ -7,8 +7,10 @@
- """
- Tests for the "sidebar" directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
-index 2c5f832..ee930c8 100755
---- a/test/test_parsers/test_rst/test_directives/test_tables.py
-+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
-@@ -8,13 +8,15 @@
- Tests for tables.py directives.
- """
- 
--from __init__ import DocutilsTestSupport
-+from __future__ import absolute_import
- 
- import os, sys
- import csv
- import platform
- from docutils.parsers.rst.directives import tables
- 
-+from . import DocutilsTestSupport
-+
- 
- if sys.version_info >= (3, 0):
-     unicode = str  # noqa
-diff --git a/test/test_parsers/test_rst/test_directives/test_target_notes.py b/test/test_parsers/test_rst/test_directives/test_target_notes.py
-index 37a63f5..167cd8a 100755
---- a/test/test_parsers/test_rst/test_directives/test_target_notes.py
-+++ b/test/test_parsers/test_rst/test_directives/test_target_notes.py
-@@ -7,8 +7,10 @@
- """
- Tests for the target-notes directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_test_directives.py b/test/test_parsers/test_rst/test_directives/test_test_directives.py
-index 07e9bd2..65cffed 100755
---- a/test/test_parsers/test_rst/test_directives/test_test_directives.py
-+++ b/test/test_parsers/test_rst/test_directives/test_test_directives.py
-@@ -7,8 +7,10 @@
- """
- Tests for misc.py test directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_title.py b/test/test_parsers/test_rst/test_directives/test_title.py
-index 4a7cfd6..c24309c 100755
---- a/test/test_parsers/test_rst/test_directives/test_title.py
-+++ b/test/test_parsers/test_rst/test_directives/test_title.py
-@@ -7,8 +7,10 @@
- """
- Tests for the 'title' directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_topics.py b/test/test_parsers/test_rst/test_directives/test_topics.py
-index 9588599..fdd4bc3 100755
---- a/test/test_parsers/test_rst/test_directives/test_topics.py
-+++ b/test/test_parsers/test_rst/test_directives/test_topics.py
-@@ -7,8 +7,10 @@
- """
- Tests for the "topic" directive.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_directives/test_unicode.py b/test/test_parsers/test_rst/test_directives/test_unicode.py
-index 5cdfd5a..b99b5d0 100755
---- a/test/test_parsers/test_rst/test_directives/test_unicode.py
-+++ b/test/test_parsers/test_rst/test_directives/test_unicode.py
-@@ -7,10 +7,11 @@
- """
- Tests for misc.py "unicode" directive.
- """
-+from __future__ import absolute_import
- 
- import sys
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- if sys.version_info >= (3, 0):
-diff --git a/test/test_parsers/test_rst/test_directives/test_unknown.py b/test/test_parsers/test_rst/test_directives/test_unknown.py
-index 69e2c01..98cb6b9 100755
---- a/test/test_parsers/test_rst/test_directives/test_unknown.py
-+++ b/test/test_parsers/test_rst/test_directives/test_unknown.py
-@@ -7,8 +7,10 @@
- """
- Tests for unknown directives.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_doctest_blocks.py b/test/test_parsers/test_rst/test_doctest_blocks.py
-index 4f367db..d7787d7 100755
---- a/test/test_parsers/test_rst/test_doctest_blocks.py
-+++ b/test/test_parsers/test_rst/test_doctest_blocks.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_east_asian_text.py b/test/test_parsers/test_rst/test_east_asian_text.py
-index e29ea82..d819ef8 100755
---- a/test/test_parsers/test_rst/test_east_asian_text.py
-+++ b/test/test_parsers/test_rst/test_east_asian_text.py
-@@ -8,15 +8,18 @@
- """
- Tests for East Asian text with double-width characters.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- import unicodedata
-+
- try:
-     east_asian_width = unicodedata.east_asian_width
- except AttributeError:
-     east_asian_width = None
- 
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     s.generateTests(totest)
-diff --git a/test/test_parsers/test_rst/test_enumerated_lists.py b/test/test_parsers/test_rst/test_enumerated_lists.py
-index 09ea238..09bc005 100755
---- a/test/test_parsers/test_rst/test_enumerated_lists.py
-+++ b/test/test_parsers/test_rst/test_enumerated_lists.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_field_lists.py b/test/test_parsers/test_rst/test_field_lists.py
-index c51dd7c..34073aa 100755
---- a/test/test_parsers/test_rst/test_field_lists.py
-+++ b/test/test_parsers/test_rst/test_field_lists.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_footnotes.py b/test/test_parsers/test_rst/test_footnotes.py
-index fabfaf0..ba157d9 100755
---- a/test/test_parsers/test_rst/test_footnotes.py
-+++ b/test/test_parsers/test_rst/test_footnotes.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_inline_markup.py b/test/test_parsers/test_rst/test_inline_markup.py
-index d6fdac7..1762880 100755
---- a/test/test_parsers/test_rst/test_inline_markup.py
-+++ b/test/test_parsers/test_rst/test_inline_markup.py
-@@ -9,8 +9,10 @@
- Tests for inline markup in docutils/parsers/rst/states.py.
- Interpreted text tests are in a separate module, test_interpreted.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_interpreted.py b/test/test_parsers/test_rst/test_interpreted.py
-index 6dce09c..48b4ebe 100755
---- a/test/test_parsers/test_rst/test_interpreted.py
-+++ b/test/test_parsers/test_rst/test_interpreted.py
-@@ -7,10 +7,12 @@
- """
- Tests for interpreted text in docutils/parsers/rst/states.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.utils.code_analyzer import with_pygments
- 
-+
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-     if not with_pygments:
-diff --git a/test/test_parsers/test_rst/test_interpreted_fr.py b/test/test_parsers/test_rst/test_interpreted_fr.py
-index a0e1d78..046ab15 100644
---- a/test/test_parsers/test_rst/test_interpreted_fr.py
-+++ b/test/test_parsers/test_rst/test_interpreted_fr.py
-@@ -8,8 +8,10 @@
- Tests for interpreted text in docutils/parsers/rst/states.py.
- Test not default/fallback language french.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite(suite_settings={'language_code':'fr'})
-diff --git a/test/test_parsers/test_rst/test_line_blocks.py b/test/test_parsers/test_rst/test_line_blocks.py
-index d0a2776..3ab1764 100755
---- a/test/test_parsers/test_rst/test_line_blocks.py
-+++ b/test/test_parsers/test_rst/test_line_blocks.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_literal_blocks.py b/test/test_parsers/test_rst/test_literal_blocks.py
-index 62c9f40..172c438 100755
---- a/test/test_parsers/test_rst/test_literal_blocks.py
-+++ b/test/test_parsers/test_rst/test_literal_blocks.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_option_lists.py b/test/test_parsers/test_rst/test_option_lists.py
-index aa23e3e..740248f 100755
---- a/test/test_parsers/test_rst/test_option_lists.py
-+++ b/test/test_parsers/test_rst/test_option_lists.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_outdenting.py b/test/test_parsers/test_rst/test_outdenting.py
-index 1403ab7..5685767 100755
---- a/test/test_parsers/test_rst/test_outdenting.py
-+++ b/test/test_parsers/test_rst/test_outdenting.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_paragraphs.py b/test/test_parsers/test_rst/test_paragraphs.py
-index e4860e3..933c07b 100755
---- a/test/test_parsers/test_rst/test_paragraphs.py
-+++ b/test/test_parsers/test_rst/test_paragraphs.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_section_headers.py b/test/test_parsers/test_rst/test_section_headers.py
-index 0c8cd64..af3749c 100755
---- a/test/test_parsers/test_rst/test_section_headers.py
-+++ b/test/test_parsers/test_rst/test_section_headers.py
-@@ -5,9 +5,13 @@
- # Author: David Goodger <goodger@python.org>
- # Copyright: This module has been placed in the public domain.
- 
--"""Tests for states.py."""
-+"""
-+Tests for states.py.
-+"""
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_substitutions.py b/test/test_parsers/test_rst/test_substitutions.py
-index e992cb2..774d71b 100755
---- a/test/test_parsers/test_rst/test_substitutions.py
-+++ b/test/test_parsers/test_rst/test_substitutions.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_tables.py b/test/test_parsers/test_rst/test_tables.py
-index ca249bb..4a690ff 100755
---- a/test/test_parsers/test_rst/test_tables.py
-+++ b/test/test_parsers/test_rst/test_tables.py
-@@ -7,9 +7,12 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
- 
- import os
--from __init__ import DocutilsTestSupport
-+
-+from . import DocutilsTestSupport
-+
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_targets.py b/test/test_parsers/test_rst/test_targets.py
-index f7ab8c0..6785ac3 100755
---- a/test/test_parsers/test_rst/test_targets.py
-+++ b/test/test_parsers/test_rst/test_targets.py
-@@ -7,8 +7,10 @@
- """
- Tests for states.py.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_parsers/test_rst/test_transitions.py b/test/test_parsers/test_rst/test_transitions.py
-index b21411c..d3a622a 100755
---- a/test/test_parsers/test_rst/test_transitions.py
-+++ b/test/test_parsers/test_rst/test_transitions.py
-@@ -7,8 +7,10 @@
- """
- Tests for transition markers.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.ParserTestSuite()
-diff --git a/test/test_readers/test_get_reader_class.py b/test/test_readers/test_get_reader_class.py
-index b84dfb9..f177223 100644
---- a/test/test_readers/test_get_reader_class.py
-+++ b/test/test_readers/test_get_reader_class.py
-@@ -8,10 +8,12 @@
- """
- test get_reader_class
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.readers import get_reader_class
- 
-+
- class GetReaderClassTestCase(DocutilsTestSupport.StandardTestCase):
- 
-     def test_registered_reader(self):
-@@ -29,4 +31,3 @@ class GetReaderClassTestCase(DocutilsTestSupport.StandardTestCase):
- if __name__ == '__main__':
-     import unittest
-     unittest.main()
--
-diff --git a/test/test_readers/test_pep/test_inline_markup.py b/test/test_readers/test_pep/test_inline_markup.py
-index 3bfd294..29074d8 100755
---- a/test/test_readers/test_pep/test_inline_markup.py
-+++ b/test/test_readers/test_pep/test_inline_markup.py
-@@ -7,8 +7,9 @@
- """
- Tests for inline markup in PEPs (readers/pep.py).
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_readers/test_pep/test_rfc2822.py b/test/test_readers/test_pep/test_rfc2822.py
-index 7c1b26b..1123ee9 100755
---- a/test/test_readers/test_pep/test_rfc2822.py
-+++ b/test/test_readers/test_pep/test_rfc2822.py
-@@ -7,8 +7,10 @@
- """
- Tests for RFC-2822 headers in PEPs (readers/pep.py).
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.PEPParserTestSuite()
-diff --git a/test/test_transforms/test___init__.py b/test/test_transforms/test___init__.py
-index 366701b..fded179 100755
---- a/test/test_transforms/test___init__.py
-+++ b/test/test_transforms/test___init__.py
-@@ -7,11 +7,13 @@
- """
- Test module for transforms/__init__.py.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
--from docutils import transforms, utils
- import unittest
- 
-+from . import DocutilsTestSupport # must be imported before docutils
-+from docutils import transforms, utils
-+
- 
- class TestTransform(transforms.Transform):
- 
-diff --git a/test/test_transforms/test_class.py b/test/test_transforms/test_class.py
-index 9ee0484..ebd6c5a 100755
---- a/test/test_transforms/test_class.py
-+++ b/test/test_transforms/test_class.py
-@@ -7,8 +7,9 @@
- """
- Tests for `docutils.transforms.misc.ClassAttribute`.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.parsers.rst import Parser
- 
- 
-diff --git a/test/test_transforms/test_contents.py b/test/test_transforms/test_contents.py
-index 1caa593..de05af7 100755
---- a/test/test_transforms/test_contents.py
-+++ b/test/test_transforms/test_contents.py
-@@ -8,8 +8,9 @@
- Tests for `docutils.transforms.parts.Contents` (via
- `docutils.transforms.universal.LastReaderPending`).
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import Substitutions
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_docinfo.py b/test/test_transforms/test_docinfo.py
-index 8b543df..1f0a4a8 100755
---- a/test/test_transforms/test_docinfo.py
-+++ b/test/test_transforms/test_docinfo.py
-@@ -8,8 +8,9 @@
- """
- Tests for docutils.transforms.frontmatter.DocInfo.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.frontmatter import DocInfo
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_doctitle.py b/test/test_transforms/test_doctitle.py
-index 6b354ab..7073e6a 100755
---- a/test/test_transforms/test_doctitle.py
-+++ b/test/test_transforms/test_doctitle.py
-@@ -7,12 +7,14 @@
- """
- Tests for docutils.transforms.frontmatter.DocTitle.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.frontmatter import DocTitle, SectionSubTitle
- from docutils.parsers.rst import Parser, Directive
- from docutils.parsers.rst.directives import register_directive
- 
-+
- # dummy directive to test attribute merging:
- class AddNameToDocumentTitle(Directive):
-     required_arguments = 0
-diff --git a/test/test_transforms/test_expose_internals.py b/test/test_transforms/test_expose_internals.py
-index 15d1d8a..9949d51 100755
---- a/test/test_transforms/test_expose_internals.py
-+++ b/test/test_transforms/test_expose_internals.py
-@@ -7,12 +7,14 @@
- """
- Test module for universal.ExposeInternals transform.
- """
-+from __future__ import absolute_import
- 
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
-+from . import DocutilsTestSupport # must be imported before docutils
- from docutils.transforms.universal import ExposeInternals
- from docutils.parsers.rst import Parser
- 
-+
- def suite():
-     parser = Parser()
-     s = DocutilsTestSupport.TransformTestSuite(
-diff --git a/test/test_transforms/test_filter.py b/test/test_transforms/test_filter.py
-index ad82c2b..240e375 100755
---- a/test/test_transforms/test_filter.py
-+++ b/test/test_transforms/test_filter.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.components.Filter.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.parsers.rst import Parser
- 
- 
-diff --git a/test/test_transforms/test_footnotes.py b/test/test_transforms/test_footnotes.py
-index ae01edf..0213e71 100755
---- a/test/test_transforms/test_footnotes.py
-+++ b/test/test_transforms/test_footnotes.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.references.Footnotes.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import Footnotes
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_hyperlinks.py b/test/test_transforms/test_hyperlinks.py
-index df4d790..349c810 100755
---- a/test/test_transforms/test_hyperlinks.py
-+++ b/test/test_transforms/test_hyperlinks.py
-@@ -7,12 +7,12 @@
- """
- Tests for docutils.transforms.references.Hyperlinks.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import PropagateTargets, \
-      AnonymousHyperlinks, IndirectHyperlinks, ExternalTargets, \
-      InternalTargets, DanglingReferences
--
- from docutils.parsers.rst import Parser
- 
- 
-diff --git a/test/test_transforms/test_messages.py b/test/test_transforms/test_messages.py
-index 296fe98..8949c63 100755
---- a/test/test_transforms/test_messages.py
-+++ b/test/test_transforms/test_messages.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.universal.Messages.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.universal import Messages
- from docutils.transforms.references import Substitutions
- from docutils.parsers.rst import Parser
-diff --git a/test/test_transforms/test_peps.py b/test/test_transforms/test_peps.py
-index 5505572..16c4bbb 100755
---- a/test/test_transforms/test_peps.py
-+++ b/test/test_transforms/test_peps.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.peps.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.peps import TargetNotes
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_sectnum.py b/test/test_transforms/test_sectnum.py
-index 525a727..e389aee 100755
---- a/test/test_transforms/test_sectnum.py
-+++ b/test/test_transforms/test_sectnum.py
-@@ -8,8 +8,9 @@
- Tests for `docutils.transforms.parts.SectNum` (via
- `docutils.transforms.universal.LastReaderPending`).
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import Substitutions
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_smartquotes.py b/test/test_transforms/test_smartquotes.py
-index e2874c0..eb5c401 100644
---- a/test/test_transforms/test_smartquotes.py
-+++ b/test/test_transforms/test_smartquotes.py
-@@ -16,12 +16,13 @@
- """
- Test module for universal.SmartQuotes transform.
- """
-+from __future__ import absolute_import
- 
--
--from __init__ import DocutilsTestSupport  # must be imported before docutils
-+from . import DocutilsTestSupport  # must be imported before docutils
- from docutils.transforms.universal import SmartQuotes
- from docutils.parsers.rst import Parser
- 
-+
- def suite():
-     parser = Parser()
-     settings = {'smart_quotes': True}
-diff --git a/test/test_transforms/test_strip_comments.py b/test/test_transforms/test_strip_comments.py
-index f58404f..a03457b 100755
---- a/test/test_transforms/test_strip_comments.py
-+++ b/test/test_transforms/test_strip_comments.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.universal.StripComments.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.universal import StripComments
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_strip_elements_with_class.py b/test/test_transforms/test_strip_elements_with_class.py
-index 6503586..11e6aa6 100644
---- a/test/test_transforms/test_strip_elements_with_class.py
-+++ b/test/test_transforms/test_strip_elements_with_class.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.universal.StripComments.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.parsers.rst import Parser
- from docutils.transforms.universal import StripClassesAndElements
- 
-diff --git a/test/test_transforms/test_substitutions.py b/test/test_transforms/test_substitutions.py
-index 7ea3e8a..1ec9bf1 100755
---- a/test/test_transforms/test_substitutions.py
-+++ b/test/test_transforms/test_substitutions.py
-@@ -7,8 +7,9 @@
- """
- Tests for docutils.transforms.references.Substitutions.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import Substitutions
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_transforms/test_target_notes.py b/test/test_transforms/test_target_notes.py
-index 3be4001..dcfb411 100755
---- a/test/test_transforms/test_target_notes.py
-+++ b/test/test_transforms/test_target_notes.py
-@@ -8,8 +8,9 @@
- Tests for `docutils.transforms.references.TargetNotes` (via
- `docutils.transforms.universal.LastReaderPending`).
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.transforms.references import PropagateTargets, \
-      AnonymousHyperlinks, IndirectHyperlinks, ExternalTargets, \
-      InternalTargets, DanglingReferences, Footnotes
-diff --git a/test/test_transforms/test_transitions.py b/test/test_transforms/test_transitions.py
-index c8ecaff..71347a2 100755
---- a/test/test_transforms/test_transitions.py
-+++ b/test/test_transforms/test_transitions.py
-@@ -7,11 +7,13 @@
- """
- Test module for misc.Transitions transform.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
-+from . import DocutilsTestSupport # must be imported before docutils
- from docutils.transforms.misc import Transitions
- from docutils.parsers.rst import Parser
- 
-+
- def suite():
-     parser = Parser()
-     s = DocutilsTestSupport.TransformTestSuite(parser)
-diff --git a/test/test_transforms/test_writer_aux.py b/test/test_transforms/test_writer_aux.py
-index fc2e0d3..7272115 100755
---- a/test/test_transforms/test_writer_aux.py
-+++ b/test/test_transforms/test_writer_aux.py
-@@ -7,8 +7,9 @@
- """
- Test module for writer_aux transforms.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
-+from . import DocutilsTestSupport # must be imported before docutils
- from docutils.transforms import writer_aux
- from docutils.parsers.rst import Parser
- 
-diff --git a/test/test_writers/test_docutils_xml.py b/test/test_writers/test_docutils_xml.py
-index 98541cf..5a6cda3 100755
---- a/test/test_writers/test_docutils_xml.py
-+++ b/test/test_writers/test_docutils_xml.py
-@@ -13,10 +13,11 @@ Test for docutils XML writer.
-    ``<empty></empty>`` vs. ``<empty/>``. The sample strings in this test
-    module mirrors the current behaviour of the docutils_xml writer.
- """
-+from __future__ import absolute_import
- 
- from StringIO import StringIO
- 
--from __init__ import DocutilsTestSupport # must be imported before docutils
-+from . import DocutilsTestSupport # must be imported before docutils
- import docutils
- import docutils.core
- 
-diff --git a/test/test_writers/test_get_writer_class.py b/test/test_writers/test_get_writer_class.py
-index 78e6e8a..6af7097 100644
---- a/test/test_writers/test_get_writer_class.py
-+++ b/test/test_writers/test_get_writer_class.py
-@@ -8,10 +8,12 @@
- """
- test get_writer_class
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils.writers import get_writer_class
- 
-+
- class GetWriterClassTestCase(DocutilsTestSupport.StandardTestCase):
-     #tests = ( ('manpage', 1), ('nope', 0), ('dummy-writer', 1))
- 
-diff --git a/test/test_writers/test_html4css1_misc.py b/test/test_writers/test_html4css1_misc.py
-index 7df0176..534ebce 100755
---- a/test/test_writers/test_html4css1_misc.py
-+++ b/test/test_writers/test_html4css1_misc.py
-@@ -9,11 +9,14 @@
- """
- Miscellaneous HTML writer tests.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
--from docutils import core
- import os
- 
-+from .__init__ import DocutilsTestSupport
-+from docutils import core
-+
-+
- class EncodingTestCase(DocutilsTestSupport.StandardTestCase):
- 
-     def test_xmlcharrefreplace(self):
-diff --git a/test/test_writers/test_html4css1_parts.py b/test/test_writers/test_html4css1_parts.py
-index 64ac2ac..9140cba 100755
---- a/test/test_writers/test_html4css1_parts.py
-+++ b/test/test_writers/test_html4css1_parts.py
-@@ -11,10 +11,12 @@ Note: the 'body' and 'whole' entries have been removed from the parts
- dictionaries (redundant), along with 'meta' and 'stylesheet' entries with
- standard values, and any entries with empty values.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from docutils import core
- 
-+
- def suite():
-     s = DocutilsTestSupport.HtmlPublishPartsTestSuite()
-     s.generateTests(totest)
-diff --git a/test/test_writers/test_html4css1_template.py b/test/test_writers/test_html4css1_template.py
-index 954f319..88eff36 100755
---- a/test/test_writers/test_html4css1_template.py
-+++ b/test/test_writers/test_html4css1_template.py
-@@ -7,11 +7,12 @@
- """
- Tests for the HTML writer.
- """
-+from __future__ import absolute_import
- 
- import os
- import platform
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
-diff --git a/test/test_writers/test_html5_polyglot_misc.py b/test/test_writers/test_html5_polyglot_misc.py
-index 7f14133..9fec65f 100644
---- a/test/test_writers/test_html5_polyglot_misc.py
-+++ b/test/test_writers/test_html5_polyglot_misc.py
-@@ -9,11 +9,14 @@
- """
- Miscellaneous HTML writer tests.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
--from docutils import core
- import os
- 
-+from . import DocutilsTestSupport
-+from docutils import core
-+
-+
- class EncodingTestCase(DocutilsTestSupport.StandardTestCase):
- 
-     def test_xmlcharrefreplace(self):
-diff --git a/test/test_writers/test_html5_polyglot_parts.py b/test/test_writers/test_html5_polyglot_parts.py
-index cb323b7..60ff689 100644
---- a/test/test_writers/test_html5_polyglot_parts.py
-+++ b/test/test_writers/test_html5_polyglot_parts.py
-@@ -11,8 +11,9 @@ Note: the 'body' and 'whole' entries have been removed from the parts
- dictionaries (redundant), along with 'meta' and 'stylesheet' entries with
- standard values, and any entries with empty values.
- """
-+from __future__ import absolute_import
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- from DocutilsTestSupport import (HtmlWriterPublishPartsTestCase,
-                                  HtmlPublishPartsTestSuite)
- from docutils import core, __version__
-diff --git a/test/test_writers/test_latex2e.py b/test/test_writers/test_latex2e.py
-index 88ba1a7..e9defeb 100755
---- a/test/test_writers/test_latex2e.py
-+++ b/test/test_writers/test_latex2e.py
-@@ -8,9 +8,12 @@
- """
- Tests for latex2e writer.
- """
-+from __future__ import absolute_import
- 
- import string
--from __init__ import DocutilsTestSupport
-+
-+from . import DocutilsTestSupport
-+
- 
- def suite():
-     settings = {'use_latex_toc': False}
-diff --git a/test/test_writers/test_manpage.py b/test/test_writers/test_manpage.py
-index eec5400..a220444 100644
---- a/test/test_writers/test_manpage.py
-+++ b/test/test_writers/test_manpage.py
-@@ -7,8 +7,10 @@
- """
- Tests for manpage writer.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     settings = {}
-diff --git a/test/test_writers/test_null.py b/test/test_writers/test_null.py
-index c75f8a9..3cc8f37 100755
---- a/test/test_writers/test_null.py
-+++ b/test/test_writers/test_null.py
-@@ -7,8 +7,10 @@
- """
- Test for Null writer.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.PublishTestSuite('null')
-diff --git a/test/test_writers/test_odt.py b/test/test_writers/test_odt.py
-index 0efeae6..a47b7fb 100755
---- a/test/test_writers/test_odt.py
-+++ b/test/test_writers/test_odt.py
-@@ -29,6 +29,7 @@ Instructions for adding a new test:
- 5. If any other tests fail, that's a possible regression.
- 
- """
-+from __future__ import absolute_import
- 
- import sys
- import os
-@@ -36,7 +37,7 @@ import zipfile
- from xml.dom import minidom
- import tempfile
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- import docutils
- import docutils.core
-diff --git a/test/test_writers/test_pseudoxml.py b/test/test_writers/test_pseudoxml.py
-index 9dfa714..187dde9 100755
---- a/test/test_writers/test_pseudoxml.py
-+++ b/test/test_writers/test_pseudoxml.py
-@@ -7,8 +7,10 @@
- """
- Test for pseudo-XML writer.
- """
-+from __future__ import absolute_import
-+
-+from . import DocutilsTestSupport
- 
--from __init__ import DocutilsTestSupport
- 
- def suite():
-     s = DocutilsTestSupport.PublishTestSuite('pseudoxml')
-diff --git a/test/test_writers/test_s5.py b/test/test_writers/test_s5.py
-index 51972f3..1e955d3 100755
---- a/test/test_writers/test_s5.py
-+++ b/test/test_writers/test_s5.py
-@@ -7,11 +7,12 @@
- """
- Tests for the S5/HTML writer.
- """
-+from __future__ import absolute_import
- 
- import os
- import platform
- 
--from __init__ import DocutilsTestSupport
-+from . import DocutilsTestSupport
- 
- 
- def suite():
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0010-py3-Use-sorted-foo-instead-of-foo.sort.patch b/srcpkgs/python-docutils/patches/0010-py3-Use-sorted-foo-instead-of-foo.sort.patch
deleted file mode 100644
index deec162c377..00000000000
--- a/srcpkgs/python-docutils/patches/0010-py3-Use-sorted-foo-instead-of-foo.sort.patch
+++ /dev/null
@@ -1,236 +0,0 @@
-From 46d71ef146d5fe74b0186693f91a5f47585b1d79 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 16:44:51 +0000
-Subject: [PATCH 10/26] py3: Use 'sorted(foo)' instead of 'foo.sort()'
-
-This works with iterators also (like 'dict.keys()' in Python 3)
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8357 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/nodes.py                       | 6 ++----
- docutils/parsers/rst/tableparser.py     | 3 +--
- docutils/transforms/__init__.py         | 3 +--
- docutils/utils/math/math2html.py        | 3 +--
- docutils/writers/_html_base.py          | 3 +--
- docutils/writers/latex2e/__init__.py    | 3 +--
- test/DocutilsTestSupport.py             | 3 +--
- test/test_dependencies.py               | 9 +++------
- test/test_language.py                   | 6 ++----
- tools/dev/generate_punctuation_chars.py | 3 +--
- tools/dev/unicode2rstsubs.py            | 6 ++----
- 11 files changed, 16 insertions(+), 32 deletions(-)
-
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index a8c0478..e29b887 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -649,8 +649,7 @@ class Element(Node):
-         return atts
- 
-     def attlist(self):
--        attlist = self.non_default_attributes().items()
--        attlist.sort()
-+        attlist = sorted(self.non_default_attributes().items())
-         return attlist
- 
-     def get(self, key, failobj=None):
-@@ -1782,8 +1781,7 @@ class pending(Special, Invisible, Element):
-               '     .transform: %s.%s' % (self.transform.__module__,
-                                           self.transform.__name__),
-               '     .details:']
--        details = self.details.items()
--        details.sort()
-+        details = sorted(self.details.items())
-         for key, value in details:
-             if isinstance(value, Node):
-                 internals.append('%7s%s:' % ('', key))
-diff --git a/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
-index 2760ea0..937aec8 100644
---- a/docutils/parsers/rst/tableparser.py
-+++ b/docutils/parsers/rst/tableparser.py
-@@ -286,8 +286,7 @@ class GridTableParser(TableParser):
-         From the data collected by `scan_cell()`, convert to the final data
-         structure.
-         """
--        rowseps = self.rowseps.keys()   # list of row boundaries
--        rowseps.sort()
-+        rowseps = sorted(self.rowseps.keys())   # list of row boundaries
-         rowindex = {}
-         for i in range(len(rowseps)):
-             rowindex[rowseps[i]] = i    # row boundary -> row number mapping
-diff --git a/docutils/transforms/__init__.py b/docutils/transforms/__init__.py
-index 9271133..d444fce 100644
---- a/docutils/transforms/__init__.py
-+++ b/docutils/transforms/__init__.py
-@@ -153,8 +153,7 @@ class Transformer(TransformSpec):
-         unknown_reference_resolvers = []
-         for i in components:
-             unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
--        decorated_list = [(f.priority, f) for f in unknown_reference_resolvers]
--        decorated_list.sort()
-+        decorated_list = sorted([(f.priority, f) for f in unknown_reference_resolvers])
-         self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
- 
-     def apply_transforms(self):
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index 4a7209d..adcb1cc 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -2193,9 +2193,8 @@ class Container(object):
- 
-   def escape(self, line, replacements = EscapeConfig.entities):
-     "Escape a line with replacements from elyxer.a map"
--    pieces = replacements.keys()
-+    pieces = sorted(replacements.keys())
-     # do them in order
--    pieces.sort()
-     for piece in pieces:
-       if piece in line:
-         line = line.replace(piece, replacements[piece])
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index a7f3b53..a957311 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -366,8 +366,7 @@ class HTMLTranslator(nodes.NodeVisitor):
-                     # Non-empty tag.  Place the auxiliary <span> tag
-                     # *inside* the element, as the first child.
-                     suffix += '<span id="%s"></span>' % id
--        attlist = atts.items()
--        attlist.sort()
-+        attlist = sorted(atts.items())
-         parts = [tagname]
-         for name, value in attlist:
-             # value=None was used for boolean attributes without
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index e21c74b..249ec4a 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -457,8 +457,7 @@ class SortableDict(dict):
-     """
-     def sortedkeys(self):
-         """Return sorted list of keys"""
--        keys = self.keys()
--        keys.sort()
-+        keys = sorted(self.keys())
-         return keys
- 
-     def sortedvalues(self):
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index a1fec25..21ea982 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -815,8 +815,7 @@ class HtmlWriterPublishPartsTestCase(WriterPublishTestCase):
-             if not parts[key]:
-                 del parts[key]
-         # standard output format:
--        keys = parts.keys()
--        keys.sort()
-+        keys = sorted(parts.keys())
-         output = []
-         for key in keys:
-             output.append("%r: '''%s'''"
-diff --git a/test/test_dependencies.py b/test/test_dependencies.py
-index 298e8a4..0939b6d 100755
---- a/test/test_dependencies.py
-+++ b/test/test_dependencies.py
-@@ -54,9 +54,8 @@ class RecordDependenciesTests(unittest.TestCase):
-         if PIL:
-             keys += ['figure-image']
-         expected = [paths[key] for key in keys]
--        record = self.get_record(writer_name='xml')
-+        record = sorted(self.get_record(writer_name='xml'))
-         # the order of the files is arbitrary
--        record.sort()
-         expected.sort()
-         self.assertEqual(record, expected)
- 
-@@ -67,9 +66,8 @@ class RecordDependenciesTests(unittest.TestCase):
-         expected = [paths[key] for key in keys]
-         # stylesheets are tested separately in test_stylesheet_dependencies():
-         so = {'stylesheet_path': None, 'stylesheet': None}
--        record = self.get_record(writer_name='html', settings_overrides=so)
-+        record = sorted(self.get_record(writer_name='html', settings_overrides=so))
-         # the order of the files is arbitrary
--        record.sort()
-         expected.sort()
-         self.assertEqual(record, expected)
- 
-@@ -82,9 +80,8 @@ class RecordDependenciesTests(unittest.TestCase):
-         if PIL:
-             keys += ['figure-image']
-         expected = [paths[key] for key in keys]
--        record = self.get_record(writer_name='latex')
-+        record = sorted(self.get_record(writer_name='latex'))
-         # the order of the files is arbitrary
--        record.sort()
-         expected.sort()
-         self.assertEqual(record, expected)
- 
-diff --git a/test/test_language.py b/test/test_language.py
-index 30af81a..31ac613 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -150,8 +150,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-             except Exception as error:
-                 failures.append('"%s": %s' % (d, error))
-         inverted = self._invert(module.directives)
--        canonical = directives._directive_registry.keys()
--        canonical.sort()
-+        canonical = sorted(directives._directive_registry.keys())
-         canonical.remove('restructuredtext-test-directive')
-         for name in canonical:
-             if name not in inverted:
-@@ -185,8 +184,7 @@ class LanguageTestCase(DocutilsTestSupport.CustomTestCase):
-             except KeyError as error:
-                 failures.append('"%s": %s' % (d, error))
-         inverted = self._invert(module.roles)
--        canonical = roles._role_registry.keys()
--        canonical.sort()
-+        canonical = sorted(roles._role_registry.keys())
-         canonical.remove('restructuredtext-unimplemented-role')
-         for name in canonical:
-             if name not in inverted:
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index a30c5ca..b718f78 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -269,8 +269,7 @@ def mark_intervals(s):
-     Sort string and replace 'cdef' by 'c-f' and similar.
-     """
-     l =[]
--    s = [ord(ch) for ch in s]
--    s.sort()
-+    s = sorted([ord(ch) for ch in s])
-     for n in s:
-         try:
-             if l[-1][-1]+1 == n:
-diff --git a/tools/dev/unicode2rstsubs.py b/tools/dev/unicode2rstsubs.py
-index b51eec4..ac38bf4 100755
---- a/tools/dev/unicode2rstsubs.py
-+++ b/tools/dev/unicode2rstsubs.py
-@@ -163,8 +163,7 @@ class CharacterEntitySetExtractor(object):
-         return name
- 
-     def write_sets(self):
--        sets = list(self.sets.keys())
--        sets.sort()
-+        sets = sorted(self.sets.keys())
-         for set_name in sets:
-             self.write_set(set_name)
- 
-@@ -177,8 +176,7 @@ class CharacterEntitySetExtractor(object):
-         print('writing file "%s"' % outname)
-         outfile.write(self.header + '\n')
-         set = self.sets[set_name]
--        entities = [(e.lower(), e) for e in set.keys()]
--        entities.sort()
-+        entities = sorted([(e.lower(), e) for e in set.keys()])
-         longest = 0
-         for _, entity_name in entities:
-             longest = max(longest, len(entity_name))
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0011-Cleanup-simplify-code-following-recent-changes.patch b/srcpkgs/python-docutils/patches/0011-Cleanup-simplify-code-following-recent-changes.patch
deleted file mode 100644
index 1db728871ae..00000000000
--- a/srcpkgs/python-docutils/patches/0011-Cleanup-simplify-code-following-recent-changes.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 792080ad1d8ac28483c9c147b0cb79f108b40571 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 16:45:09 +0000
-Subject: [PATCH 11/26] Cleanup/simplify code following recent changes.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8358 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/transforms/__init__.py      | 4 ++--
- docutils/writers/odf_odt/__init__.py | 8 ++------
- 2 files changed, 4 insertions(+), 8 deletions(-)
-
-diff --git a/docutils/transforms/__init__.py b/docutils/transforms/__init__.py
-index d444fce..12bf6f9 100644
---- a/docutils/transforms/__init__.py
-+++ b/docutils/transforms/__init__.py
-@@ -153,8 +153,8 @@ class Transformer(TransformSpec):
-         unknown_reference_resolvers = []
-         for i in components:
-             unknown_reference_resolvers.extend(i.unknown_reference_resolvers)
--        decorated_list = sorted([(f.priority, f) for f in unknown_reference_resolvers])
--        self.unknown_reference_resolvers.extend([f[1] for f in decorated_list])
-+        decorated_list = sorted((f.priority, f) for f in unknown_reference_resolvers)
-+        self.unknown_reference_resolvers.extend(f[1] for f in decorated_list)
- 
-     def apply_transforms(self):
-         """Apply all of the stored transforms, in priority order."""
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index c0f43a5..417dc34 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -68,12 +68,8 @@ except ImportError:
- try:
-     import pygments
-     import pygments.lexers
--    if sys.version_info.major >= 3:
--        from .pygmentsformatter import OdtPygmentsProgFormatter, \
--            OdtPygmentsLaTeXFormatter
--    else:
--        from .pygmentsformatter import OdtPygmentsProgFormatter, \
--            OdtPygmentsLaTeXFormatter
-+    from .pygmentsformatter import (OdtPygmentsProgFormatter,
-+                                    OdtPygmentsLaTeXFormatter)
- except (ImportError, SyntaxError):
-     pygments = None
- 
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0012-Use-isinstance-foo-bar-instead-of-type-foo-is-bar.patch b/srcpkgs/python-docutils/patches/0012-Use-isinstance-foo-bar-instead-of-type-foo-is-bar.patch
deleted file mode 100644
index 0e1bb5ac093..00000000000
--- a/srcpkgs/python-docutils/patches/0012-Use-isinstance-foo-bar-instead-of-type-foo-is-bar.patch
+++ /dev/null
@@ -1,120 +0,0 @@
-From 88fdde83419b6c532948a64d2824f6a663ad33c3 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 16:45:33 +0000
-Subject: [PATCH 12/26] Use 'isinstance(foo, bar)' instead of 'type(foo) is
- bar'
-
-This one is more stylistic than anything.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8359 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/parsers/rst/directives/tables.py | 4 ++--
- docutils/parsers/rst/states.py            | 2 +-
- docutils/statemachine.py                  | 2 +-
- docutils/utils/math/latex2mathml.py       | 2 +-
- test/package_unittest.py                  | 4 ++--
- test/test_nodes.py                        | 2 +-
- 6 files changed, 8 insertions(+), 8 deletions(-)
-
-diff --git a/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
-index b0a4eac..bf97e26 100644
---- a/docutils/parsers/rst/directives/tables.py
-+++ b/docutils/parsers/rst/directives/tables.py
-@@ -104,7 +104,7 @@ class Table(Directive):
-         return self.options.get('widths', '')
- 
-     def get_column_widths(self, max_cols):
--        if type(self.widths) == list:
-+        if isinstance(self.widths, list):
-             if len(self.widths) != max_cols:
-                 error = self.state_machine.reporter.error(
-                     '"%s" widths do not match the number of columns in table '
-@@ -152,7 +152,7 @@ class RSTTable(Table):
-         if 'align' in self.options:
-             table_node['align'] = self.options.get('align')
-         tgroup = table_node[0]
--        if type(self.widths) == list:
-+        if isinstance(self.widths, list):
-             colspecs = [child for child in tgroup.children
-                         if child.tagname == 'colspec']
-             for colspec, col_width in zip(colspecs, self.widths):
-diff --git a/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py
-index c9b4fa3..2a2e33a 100644
---- a/docutils/parsers/rst/states.py
-+++ b/docutils/parsers/rst/states.py
-@@ -447,7 +447,7 @@ def build_regexp(definition, compile=True):
-     name, prefix, suffix, parts = definition
-     part_strings = []
-     for part in parts:
--        if type(part) is tuple:
-+        if isinstance(part, tuple):
-             part_strings.append(build_regexp(part, None))
-         else:
-             part_strings.append(part)
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 068083a..6bc03f5 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -737,7 +737,7 @@ class State(object):
-         names = []
-         transitions = {}
-         for namestate in name_list:
--            if type(namestate) is stringtype:
-+            if isinstance(namestate, stringtype):
-                 transitions[namestate] = self.make_transition(namestate)
-                 names.append(namestate)
-             else:
-diff --git a/docutils/utils/math/latex2mathml.py b/docutils/utils/math/latex2mathml.py
-index 255e96f..b7ba048 100644
---- a/docutils/utils/math/latex2mathml.py
-+++ b/docutils/utils/math/latex2mathml.py
-@@ -168,7 +168,7 @@ class math(object):
- 
-         self.children = []
-         if children is not None:
--            if type(children) is list:
-+            if isinstance(children, list):
-                 for child in children:
-                     self.append(child)
-             else:
-diff --git a/test/package_unittest.py b/test/package_unittest.py
-index 4db826b..1c0f077 100644
---- a/test/package_unittest.py
-+++ b/test/package_unittest.py
-@@ -115,7 +115,7 @@ def loadTestModules(path, name='', packages=None):
-                 # to cheat:
-                 testSuite.addTest(moduleTests)
-                 continue
--            if type(suite) == types.FunctionType:
-+            if isinstance(suite, types.FunctionType):
-                 testSuite.addTest(suite())
-             elif isinstance(suite, unittest.TestSuite):
-                 testSuite.addTest(suite)
-@@ -152,7 +152,7 @@ def main(suite=None):
-         print("Debug: Suite=%s" % suite, file=sys.stderr)
-     testRunner = unittest.TextTestRunner(verbosity=verbosity)
-     # run suites (if we were called from test_all) or suite...
--    if type(suite) == type([]):
-+    if isinstance(suite, type([])):
-         for s in suite:
-             testRunner.run(s)
-     else:
-diff --git a/test/test_nodes.py b/test/test_nodes.py
-index 679c98e..af04e86 100755
---- a/test/test_nodes.py
-+++ b/test/test_nodes.py
-@@ -121,7 +121,7 @@ class ElementTests(unittest.TestCase):
-             self.assertEqual(repr(uelement), "<Element: <#text: 'gr\\xfcn'>>")
-         else:
-             self.assertEqual(repr(uelement), u"<Element: <#text: 'grün'>>")
--        self.assertTrue(isinstance(repr(uelement),str))
-+        self.assertTrue(isinstance(repr(uelement), str))
-         self.assertEqual(str(element), '<Element>text\nmore</Element>')
-         self.assertEqual(str(uelement), '<Element>gr\xfcn</Element>')
-         dom = element.asdom()
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0013-Consistent-Python-3-checks.patch b/srcpkgs/python-docutils/patches/0013-Consistent-Python-3-checks.patch
deleted file mode 100644
index a0643ded4f1..00000000000
--- a/srcpkgs/python-docutils/patches/0013-Consistent-Python-3-checks.patch
+++ /dev/null
@@ -1,594 +0,0 @@
-From 7e79a539c426bbbb2932286b2efa2cf03a467e46 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Wed, 20 Nov 2019 00:02:34 +0700
-Subject: [PATCH 13/26] Consistent Python 3 checks.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8360 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/frontend.py                             |  2 +-
- docutils/io.py                                   |  4 ++--
- docutils/nodes.py                                | 12 ++++++------
- docutils/parsers/rst/directives/__init__.py      |  2 +-
- docutils/parsers/rst/directives/misc.py          |  4 ++--
- docutils/parsers/rst/directives/tables.py        |  4 ++--
- docutils/statemachine.py                         |  2 +-
- docutils/transforms/frontmatter.py               |  2 +-
- docutils/transforms/universal.py                 |  2 +-
- docutils/utils/__init__.py                       |  2 +-
- docutils/utils/error_reporting.py                |  2 +-
- docutils/writers/_html_base.py                   |  2 +-
- docutils/writers/docutils_xml.py                 |  4 ++--
- docutils/writers/latex2e/__init__.py             |  2 +-
- docutils/writers/manpage.py                      |  2 +-
- docutils/writers/odf_odt/__init__.py             |  2 +-
- setup.py                                         |  6 +++---
- test/DocutilsTestSupport.py                      |  4 ++--
- test/test__init__.py                             |  2 +-
- test/test_error_reporting.py                     |  2 +-
- test/test_language.py                            |  2 +-
- test/test_nodes.py                               | 16 ++++++++--------
- test/test_parsers/test_parser.py                 |  2 +-
- .../test_rst/test_directives/test_include.py     |  2 +-
- .../test_rst/test_directives/test_tables.py      |  2 +-
- .../test_rst/test_directives/test_unicode.py     |  2 +-
- tools/dev/create_unimap.py                       |  4 ++--
- tools/dev/generate_punctuation_chars.py          |  4 ++--
- 28 files changed, 49 insertions(+), 49 deletions(-)
-
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 4b389b0..627f603 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -43,7 +43,7 @@ import docutils.nodes
- from docutils.utils.error_reporting import (locale_encoding, SafeString,
-                                             ErrorOutput, ErrorString)
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/io.py b/docutils/io.py
-index 3cdf00e..fb354fd 100644
---- a/docutils/io.py
-+++ b/docutils/io.py
-@@ -17,7 +17,7 @@ import codecs
- from docutils import TransformSpec
- from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-@@ -208,7 +208,7 @@ class FileInput(Input):
-     def __init__(self, source=None, source_path=None,
-                  encoding=None, error_handler='strict',
-                  autoclose=True,
--                 mode='r' if sys.version_info >= (3, 4) else 'rU', **kwargs):
-+                 mode='r' if sys.version_info >= (3,0) else 'rU', **kwargs):
-         """
-         :Parameters:
-             - `source`: either a file-like object (which is read directly), or
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index e29b887..3d714a2 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -29,7 +29,7 @@ import re
- import warnings
- import unicodedata
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
-     basestring = str  # noqa
- 
-@@ -64,7 +64,7 @@ class Node(object):
-         """
-         return True
- 
--    if sys.version_info < (3, 0):
-+    if sys.version_info < (3,0):
-         # on 2.x, str(node) will be a byte string with Unicode
-         # characters > 255 escaped; on 3.x this is no longer necessary
-         def __str__(self):
-@@ -304,7 +304,7 @@ class Node(object):
-         except IndexError:
-             return None
- 
--if sys.version_info < (3, 0):
-+if sys.version_info < (3,0):
-     class reprunicode(unicode):
-         """
-         A unicode sub-class that removes the initial u from unicode's repr.
-@@ -320,7 +320,7 @@ def ensure_str(s):
-     """
-     Failsave conversion of `unicode` to `str`.
-     """
--    if sys.version_info < (3,) and isinstance(s, unicode):
-+    if sys.version_info < (3,0) and isinstance(s, unicode):
-         return s.encode('ascii', 'backslashreplace')
-     return s
- 
-@@ -352,7 +352,7 @@ class Text(Node, reprunicode):
-     children = ()
-     """Text nodes have no children, and cannot have children."""
- 
--    if sys.version_info > (3,):
-+    if sys.version_info > (3,0):
-         def __new__(cls, data, rawsource=None):
-             """Prevent the rawsource argument from propagating to str."""
-             if isinstance(data, bytes):
-@@ -544,7 +544,7 @@ class Element(Node):
-         else:
-             return self.emptytag()
- 
--    if sys.version_info > (3,):
-+    if sys.version_info > (3,0):
-         # 2to3 doesn't convert __unicode__ to __str__
-         __str__ = __unicode__
- 
-diff --git a/docutils/parsers/rst/directives/__init__.py b/docutils/parsers/rst/directives/__init__.py
-index 7bccb5b..14fe1ff 100644
---- a/docutils/parsers/rst/directives/__init__.py
-+++ b/docutils/parsers/rst/directives/__init__.py
-@@ -16,7 +16,7 @@ from docutils import nodes
- from docutils.utils import split_escaped_whitespace, escape2null, unescape
- from docutils.parsers.rst.languages import en as _fallback_language_module
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unichr = chr  # noqa
- 
- 
-diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
-index 0fc3610..3b9b9de 100644
---- a/docutils/parsers/rst/directives/misc.py
-+++ b/docutils/parsers/rst/directives/misc.py
-@@ -473,7 +473,7 @@ class Date(Directive):
-                 'Invalid context: the "%s" directive can only be used within '
-                 'a substitution definition.' % self.name)
-         format_str = '\n'.join(self.content) or '%Y-%m-%d'
--        if sys.version_info< (3, 0):
-+        if sys.version_info< (3,0):
-             try:
-                 format_str = format_str.encode(locale_encoding or 'utf-8')
-             except UnicodeEncodeError:
-@@ -498,7 +498,7 @@ class Date(Directive):
-         #                          time.gmtime(int(source_date_epoch)))
-         # else:
-         text = time.strftime(format_str)
--        if sys.version_info< (3, 0):
-+        if sys.version_info< (3,0):
-             # `text` is a byte string that may contain non-ASCII characters:
-             try:
-                 text = text.decode(locale_encoding or 'utf-8')
-diff --git a/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
-index bf97e26..36a52e7 100644
---- a/docutils/parsers/rst/directives/tables.py
-+++ b/docutils/parsers/rst/directives/tables.py
-@@ -263,7 +263,7 @@ class CSVTable(Table):
-             return [detail.args[0]]
-         except csv.Error as detail:
-             message = str(detail)
--            if sys.version_info < (3,) and '1-character string' in message:
-+            if sys.version_info < (3,0) and '1-character string' in message:
-                 message += '\nwith Python 2.x this must be an ASCII character.'
-             error = self.state_machine.reporter.error(
-                 'Error with CSV data in "%s" directive:\n%s'
-@@ -356,7 +356,7 @@ class CSVTable(Table):
-             raise SystemMessagePropagation(error)
-         return csv_data, source
- 
--    if sys.version_info < (3,):
-+    if sys.version_info < (3,0):
-         # 2.x csv module doesn't do Unicode
-         def decode_from_csv(s):
-             return s.decode('utf-8')
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 6bc03f5..16252bb 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -113,7 +113,7 @@ import unicodedata
- from docutils import utils
- from docutils.utils.error_reporting import ErrorOutput
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/transforms/frontmatter.py b/docutils/transforms/frontmatter.py
-index 23b9c95..345e290 100644
---- a/docutils/transforms/frontmatter.py
-+++ b/docutils/transforms/frontmatter.py
-@@ -28,7 +28,7 @@ from docutils import nodes, utils
- from docutils.transforms import TransformError, Transform
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py
-index 49fb2c8..770ec71 100644
---- a/docutils/transforms/universal.py
-+++ b/docutils/transforms/universal.py
-@@ -24,7 +24,7 @@ from docutils.transforms import TransformError, Transform
- from docutils.utils import smartquotes
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index 77c70f8..de39247 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -22,7 +22,7 @@ from docutils.nodes import unescape
- import docutils.io
- from docutils.utils.error_reporting import ErrorOutput, SafeString
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str
- 
- 
-diff --git a/docutils/utils/error_reporting.py b/docutils/utils/error_reporting.py
-index 8fcc816..21bc55b 100644
---- a/docutils/utils/error_reporting.py
-+++ b/docutils/utils/error_reporting.py
-@@ -65,7 +65,7 @@ else:
-         locale_encoding = None
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index a957311..63d5a5b 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -40,7 +40,7 @@ from docutils.utils.math import (unichar2tex, pick_math_environment,
-                                  math2html, latex2mathml, tex2mathml_extern)
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
-index 34e810d..12306b6 100644
---- a/docutils/writers/docutils_xml.py
-+++ b/docutils/writers/docutils_xml.py
-@@ -30,7 +30,7 @@ from StringIO import StringIO
- import docutils
- from docutils import frontend, writers, nodes
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-@@ -185,7 +185,7 @@ class XMLTranslator(nodes.GenericNodeVisitor):
-         self.output.append(xml_string)
-         self.default_departure(node)  # or not?
-         # Check validity of raw XML:
--        if isinstance(xml_string, unicode) and sys.version_info < (3,):
-+        if isinstance(xml_string, unicode) and sys.version_info < (3,0):
-             xml_string = xml_string.encode('utf8')
-         try:
-             self.xmlparser.parse(StringIO(xml_string))
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 249ec4a..2c76b0f 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -28,7 +28,7 @@ from docutils.transforms import writer_aux
- from docutils.utils.math import pick_math_environment, unichar2tex
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index cbb8648..52cd49c 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -47,7 +47,7 @@ __docformat__ = 'reStructuredText'
- import re
- import sys
- 
--if sys.version_info < (3, 0):
-+if sys.version_info < (3,0):
-     range = xrange
- 
- import docutils
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index 417dc34..75f846c 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -947,7 +947,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
-                     self.document.reporter.warning(
-                         'Style "%s" is not a style used by odtwriter.' % (
-                             rststyle, ))
--                if sys.version_info.major >= 3:
-+                if sys.version_info >= (3,0):
-                     self.format_map[rststyle] = format
-                 else:
-                     self.format_map[rststyle] = format.decode('utf-8')
-diff --git a/setup.py b/setup.py
-index 4280b98..12c398b 100755
---- a/setup.py
-+++ b/setup.py
-@@ -13,7 +13,7 @@ try:
-     from distutils.core import setup, Command
-     from distutils.command.build import build
-     from distutils.command.build_py import build_py
--    if sys.version_info >= (3,):
-+    if sys.version_info >= (3,0):
-         from distutils.command.build_py import build_py_2to3
-         from distutils.util import copydir_run_2to3
-     from distutils.command.install_data import install_data
-@@ -27,7 +27,7 @@ except ImportError:
-     sys.exit(1)
- 
- 
--if sys.version_info >= (3,):
-+if sys.version_info >= (3,0):
-     # copy-convert auxiliary python sources
-     class copy_build_py_2to3(build_py_2to3):
-         """Copy/convert Python source files in given directories recursively.
-@@ -97,7 +97,7 @@ def do_setup():
-     kwargs['cmdclass'] = {'build_data': build_data,
-                           'install_data': smart_install_data}
-     # Auto-convert source code for Python 3
--    if sys.version_info >= (3,):
-+    if sys.version_info >= (3,0):
-         kwargs['cmdclass']['build_py'] = copy_build_py_2to3
-     else:
-         kwargs['cmdclass']['build_py'] = build_py
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 21ea982..390df5b 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -89,7 +89,7 @@ except:
-     import pdb
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-@@ -202,7 +202,7 @@ class CustomTestCase(StandardTestCase):
-         """`input`, `output`, and `expected` should all be strings."""
-         if isinstance(input, unicode):
-             input = input.encode('raw_unicode_escape')
--        if sys.version_info > (3,):
-+        if sys.version_info > (3,0):
-             # API difference: Python 3's node.__str__ doesn't escape
-             #assert expected is None or isinstance(expected, unicode)
-             if isinstance(expected, bytes):
-diff --git a/test/test__init__.py b/test/test__init__.py
-index 8f1d749..87ec14f 100644
---- a/test/test__init__.py
-+++ b/test/test__init__.py
-@@ -16,7 +16,7 @@ import docutils
- import docutils.utils
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py
-index 893082c..4b337e3 100644
---- a/test/test_error_reporting.py
-+++ b/test/test_error_reporting.py
-@@ -46,7 +46,7 @@ if sys.version_info < (3,0): # problems solved in py3k
-         print('cannot test error reporting with problematic locales,\n'
-             '`import locale` failed.')
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_language.py b/test/test_language.py
-index 31ac613..455357a 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -26,7 +26,7 @@ _reporter = docutils.utils.new_reporter('', _settings)
- 
- reference_language = 'en'
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_nodes.py b/test/test_nodes.py
-index af04e86..6805799 100755
---- a/test/test_nodes.py
-+++ b/test/test_nodes.py
-@@ -17,7 +17,7 @@ from DocutilsTestSupport import nodes, utils
- 
- debug = False
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
- 
- 
-@@ -36,7 +36,7 @@ class TextTests(unittest.TestCase):
-         self.assertEqual(self.text.shortrepr(),
-                           r"<#text: 'Line 1.\nLine 2.'>")
-         self.assertEqual(nodes.reprunicode('foo'), u'foo')
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             self.assertEqual(repr(self.unicode_text), r"<#text: 'M\xf6hren'>")
-         else:
-             self.assertEqual(repr(self.unicode_text), u"<#text: 'Möhren'>")
-@@ -65,7 +65,7 @@ class TextTests(unittest.TestCase):
-         self.assertEqual(stripped2, u's noc')
- 
-     def test_asciirestriction(self):
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             self.assertRaises(UnicodeDecodeError, nodes.Text,
-                               b'hol%s' % chr(224))
-         else:
-@@ -98,7 +98,7 @@ class ElementTests(unittest.TestCase):
-         del element['attr']
-         element['mark'] = u'\u2022'
-         self.assertEqual(repr(element), '<Element: >')
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             self.assertEqual(str(element), '<Element mark="\\u2022"/>')
-         else:
-             self.assertEqual(str(element), u'<Element mark="\u2022"/>')
-@@ -106,7 +106,7 @@ class ElementTests(unittest.TestCase):
-         self.assertEqual(dom.toxml(), u'<Element mark="\u2022"/>')
-         dom.unlink()
-         element['names'] = ['nobody', u'имя', u'näs']
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             self.assertEqual(repr(element),
-                 '<Element "nobody; \\u0438\\u043c\\u044f; n\\xe4s": >')
-         else:
-@@ -117,7 +117,7 @@ class ElementTests(unittest.TestCase):
-         element = nodes.Element('text\nmore', nodes.Text('text\nmore'))
-         uelement = nodes.Element(u'grün', nodes.Text(u'grün'))
-         self.assertEqual(repr(element), r"<Element: <#text: 'text\nmore'>>")
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             self.assertEqual(repr(uelement), "<Element: <#text: 'gr\\xfcn'>>")
-         else:
-             self.assertEqual(repr(uelement), u"<Element: <#text: 'grün'>>")
-@@ -341,7 +341,7 @@ class MiscTests(unittest.TestCase):
-         self.assertTrue(isinstance(nodes.reprunicode('foo'), unicode))
-         self.assertEqual(nodes.reprunicode('foo'), u'foo')
-         self.assertEqual(nodes.reprunicode(u'Möhre'), u'Möhre')
--        if sys.version_info < (3,): # strip leading "u" from representation
-+        if sys.version_info < (3,0): # strip leading "u" from representation
-             self.assertEqual(repr(nodes.reprunicode(u'Möhre')),
-                              repr(u'Möhre')[1:])
-         else: # no change to `unicode` under Python 3k
-@@ -350,7 +350,7 @@ class MiscTests(unittest.TestCase):
-     def test_ensure_str(self):
-         self.assertTrue(isinstance(nodes.ensure_str(u'über'), str))
-         self.assertEqual(nodes.ensure_str('over'), 'over')
--        if sys.version_info < (3,): # strip leading "u" from representation
-+        if sys.version_info < (3,0): # strip leading "u" from representation
-             self.assertEqual(nodes.ensure_str(u'über'), r'\xfcber')
-         else:
-             self.assertEqual(nodes.ensure_str(u'über'), r'über')
-diff --git a/test/test_parsers/test_parser.py b/test/test_parsers/test_parser.py
-index 6faecc7..6c57963 100644
---- a/test/test_parsers/test_parser.py
-+++ b/test/test_parsers/test_parser.py
-@@ -23,7 +23,7 @@ class RstParserTests(unittest.TestCase):
-         document = utils.new_document('test data', frontend.OptionParser(
-                     components=(parser, )).get_default_values())
- 
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             # supplying string input is supported, but only if ascii-decodable
-             self.assertRaises(UnicodeDecodeError,
-                               parser.parse, b'hol%s' % chr(224), document)
-diff --git a/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
-index d848262..92d0193 100755
---- a/test/test_parsers/test_rst/test_directives/test_include.py
-+++ b/test/test_parsers/test_rst/test_directives/test_include.py
-@@ -16,7 +16,7 @@ from docutils.parsers.rst import states
- from docutils.utils.code_analyzer import with_pygments
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unichr = chr  # noqa
- 
- 
-diff --git a/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
-index ee930c8..9d417e8 100755
---- a/test/test_parsers/test_rst/test_directives/test_tables.py
-+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
-@@ -18,7 +18,7 @@ from docutils.parsers.rst.directives import tables
- from . import DocutilsTestSupport
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  # noqa
-     unichr = chr  # noqa
- 
-diff --git a/test/test_parsers/test_rst/test_directives/test_unicode.py b/test/test_parsers/test_rst/test_directives/test_unicode.py
-index b99b5d0..576bc1d 100755
---- a/test/test_parsers/test_rst/test_directives/test_unicode.py
-+++ b/test/test_parsers/test_rst/test_directives/test_unicode.py
-@@ -14,7 +14,7 @@ import sys
- from . import DocutilsTestSupport
- 
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unichr = chr  # noqa
- 
- 
-diff --git a/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
-index 74e8bc7..808861d 100755
---- a/tools/dev/create_unimap.py
-+++ b/tools/dev/create_unimap.py
-@@ -14,7 +14,7 @@ from xml.dom import minidom
- import sys
- import pprint
- 
--if sys.version_info >= (3, 0):
-+if sys.version_info >= (3,0):
-     unicode = str  #noqa
- else:
-     bytes = str  # noqa
-@@ -22,7 +22,7 @@ else:
- 
- 
- def w(s):
--    if sys.version_info >= (3, 0) and isinstance(s, unicode):
-+    if sys.version_info >= (3,0) and isinstance(s, unicode):
-         s = s.encode('utf8')
-     sys.stdout.write(s)
- 
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index b718f78..fbb72c0 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -38,7 +38,7 @@ from __future__ import print_function
- import sys
- import unicodedata
- 
--if sys.version_info >= (3,):
-+if sys.version_info >= (3,0):
-     unichr = chr  # unichr not available in Py3k
- else:
-     import codecs
-@@ -361,7 +361,7 @@ if __name__ == '__main__':
- # Import the punctuation_chars module from the source
- # or Py3k build path for local Python modules::
- 
--        if sys.version_info < (3,):
-+        if sys.version_info < (3,0):
-             sys.path.insert(0, '../../docutils')
-         else:
-             sys.path.insert(0, '../../build/lib')
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0014-py3-Replace-foo.next-with-next-foo.patch b/srcpkgs/python-docutils/patches/0014-py3-Replace-foo.next-with-next-foo.patch
deleted file mode 100644
index 54dff2a159a..00000000000
--- a/srcpkgs/python-docutils/patches/0014-py3-Replace-foo.next-with-next-foo.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From cfef74f567498f1e097761bc3cae7c0bde2451cc Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 16:46:50 +0000
-Subject: [PATCH 14/26] py3: Replace 'foo.next()' with 'next(foo)'
-
-The former only works in Python 2, while the latter works in Python 2.7
-and 3.x.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8361 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/utils/code_analyzer.py                           | 2 +-
- docutils/utils/math/math2html.py                          | 2 +-
- docutils/writers/manpage.py                               | 2 +-
- test/test_parsers/test_rst/test_directives/test_tables.py | 2 +-
- 4 files changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/docutils/utils/code_analyzer.py b/docutils/utils/code_analyzer.py
-index 6dc2e15..87a4584 100644
---- a/docutils/utils/code_analyzer.py
-+++ b/docutils/utils/code_analyzer.py
-@@ -83,7 +83,7 @@ class Lexer(object):
-            Also strip the final newline (added by pygments).
-         """
-         tokens = iter(tokens)
--        (lasttype, lastval) = tokens.next()
-+        (lasttype, lastval) = next(tokens)
-         for ttype, value in tokens:
-             if ttype is lasttype:
-                 lastval += value
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index adcb1cc..ddaca48 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -2208,7 +2208,7 @@ class Container(object):
-       if ord(pos.current()) > 128:
-         codepoint = hex(ord(pos.current()))
-         if codepoint == '0xd835':
--          codepoint = hex(ord(pos.next()) + 0xf800)
-+          codepoint = hex(ord(next(pos)) + 0xf800)
-         result += '&#' + codepoint[1:] + ';'
-       else:
-         result += pos.current()
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index 52cd49c..b39cf25 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -812,7 +812,7 @@ class Translator(nodes.NodeVisitor):
-     def visit_list_item(self, node):
-         # man 7 man argues to use ".IP" instead of ".TP"
-         self.body.append('.IP %s %d\n' % (
--                self._list_char[-1].next(),
-+                next(self._list_char[-1]),
-                 self._list_char[-1].get_width(),))
- 
-     def depart_list_item(self, node):
-diff --git a/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
-index 9d417e8..cc450f3 100755
---- a/test/test_parsers/test_rst/test_directives/test_tables.py
-+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
-@@ -59,7 +59,7 @@ def null_bytes():
-     csv_data = unicode(csv_data, 'latin1').splitlines()
-     reader = csv.reader([tables.CSVTable.encode_for_csv(line + '\n')
-                          for line in csv_data])
--    reader.next()
-+    next(reader)
- 
- null_bytes_exception = DocutilsTestSupport.exception_data(null_bytes)[0]
- 
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0015-py3-Replace-foo.has_key-bar-with-bar-in-foo.patch b/srcpkgs/python-docutils/patches/0015-py3-Replace-foo.has_key-bar-with-bar-in-foo.patch
deleted file mode 100644
index e53b109ee77..00000000000
--- a/srcpkgs/python-docutils/patches/0015-py3-Replace-foo.has_key-bar-with-bar-in-foo.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 006366f7baaf84baf0158ccd9036c9a53d27c965 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 23:12:56 +0000
-Subject: [PATCH 15/26] py3: Replace 'foo.has_key(bar)' with 'bar in foo'
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8362 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/writers/manpage.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index b39cf25..8bb025c 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -312,7 +312,7 @@ class Translator(nodes.NodeVisitor):
- 
-             def __init__(self, style):
-                 self._style = style
--                if node.has_key('start'):
-+                if 'start' in node:
-                     self._cnt = node['start'] - 1
-                 else:
-                     self._cnt = 0
-@@ -354,7 +354,7 @@ class Translator(nodes.NodeVisitor):
-             def __repr__(self):
-                 return 'enum_style-%s' % list(self._style)
- 
--        if node.has_key('enumtype'):
-+        if 'enumtype' in node:
-             self._list_char.append(enum_char(node['enumtype']))
-         else:
-             self._list_char.append(enum_char('bullet'))
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0016-Remove-duplicate-definition-of-nodes.Element.__conta.patch b/srcpkgs/python-docutils/patches/0016-Remove-duplicate-definition-of-nodes.Element.__conta.patch
deleted file mode 100644
index bc71ea6e4e8..00000000000
--- a/srcpkgs/python-docutils/patches/0016-Remove-duplicate-definition-of-nodes.Element.__conta.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From bf370651321ed721777fe0bb1c4bd4652eea354c Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Mon, 26 Aug 2019 23:13:04 +0000
-Subject: [PATCH 16/26] Remove duplicate definition of
- `nodes.Element.__contains__`.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8363 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/nodes.py | 14 ++++++--------
- 1 file changed, 6 insertions(+), 8 deletions(-)
-
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index 3d714a2..f8da02b 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -577,13 +577,6 @@ class Element(Node):
-     def __len__(self):
-         return len(self.children)
- 
--    def __contains__(self, key):
--        # support both membership test for children and attributes
--        # (has_key is translated to "in" by 2to3)
--        if isinstance(key, basestring):
--            return key in self.attributes
--        return key in self.children
--
-     def __getitem__(self, key):
-         if isinstance(key, basestring):
-             return self.attributes[key]
-@@ -668,7 +661,12 @@ class Element(Node):
-     has_key = hasattr
- 
-     # support operator ``in``
--    __contains__ = hasattr
-+    def __contains__(self, key):
-+        # support both membership test for children and attributes
-+        # (has_key is translated to "in" by 2to3)
-+        if isinstance(key, basestring):
-+            return key in self.attributes
-+        return key in self.children
- 
-     def get_language_code(self, fallback=''):
-         """Return node's language tag.
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0017-Handle-ConfigParser-to-configparser-rename.patch b/srcpkgs/python-docutils/patches/0017-Handle-ConfigParser-to-configparser-rename.patch
deleted file mode 100644
index 809c7341906..00000000000
--- a/srcpkgs/python-docutils/patches/0017-Handle-ConfigParser-to-configparser-rename.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From bcc08592dd85f2e7805ab3528659a4396f109b30 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Wed, 20 Nov 2019 00:05:43 +0700
-Subject: [PATCH 17/26] Handle 'ConfigParser' to 'configparser' rename.
-
-Based on a patch by Stephen Finucane.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8364 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/frontend.py                 | 14 +++++++++-----
- docutils/writers/odf_odt/__init__.py |  4 ++--
- 2 files changed, 11 insertions(+), 7 deletions(-)
-
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 627f603..815343d 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -33,10 +33,14 @@ import os
- import os.path
- import sys
- import warnings
--import ConfigParser as CP
- import codecs
- import optparse
- from optparse import SUPPRESS_HELP
-+if sys.version_info >= (3,0):
-+    from configparser import RawConfigParser
-+else:
-+    from ConfigParser import RawConfigParser
-+
- import docutils
- import docutils.utils
- import docutils.nodes
-@@ -735,7 +739,7 @@ class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
-         raise KeyError('No option with dest == %r.' % dest)
- 
- 
--class ConfigParser(CP.RawConfigParser):
-+class ConfigParser(RawConfigParser):
- 
-     old_settings = {
-         'pep_stylesheet': ('pep_html writer', 'stylesheet'),
-@@ -757,7 +761,7 @@ Skipping "%s" configuration file.
- """
- 
-     def __init__(self, *args, **kwargs):
--        CP.RawConfigParser.__init__(self, *args, **kwargs)
-+        RawConfigParser.__init__(self, *args, **kwargs)
- 
-         self._files = []
-         """List of paths of configuration files read."""
-@@ -776,9 +780,9 @@ Skipping "%s" configuration file.
-                 continue
-             try:
-                 if sys.version_info < (3,2):
--                    CP.RawConfigParser.readfp(self, fp, filename)
-+                    RawConfigParser.readfp(self, fp, filename)
-                 else:
--                    CP.RawConfigParser.read_file(self, fp, filename)
-+                    RawConfigParser.read_file(self, fp, filename)
-             except UnicodeDecodeError:
-                 self._stderr.write(self.not_utf8_error % (filename, filename))
-                 fp.close()
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index 75f846c..f36980f 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -30,10 +30,12 @@ from docutils import frontend, nodes, utils, writers, languages
- from docutils.readers import standalone
- from docutils.transforms import references
- if type(sys.version_info)!=type((0,)) and sys.version_info.major >= 3:
-+    from configparser import ConfigParser
-     from io import StringIO
-     from urllib.request import urlopen
-     from urllib.error import HTTPError
- else:
-+    from ConfigParser import ConfigParser
-     from StringIO import StringIO
-     from urllib2 import urlopen, HTTPError
- 
-@@ -938,8 +940,6 @@ class ODFTranslator(nodes.GenericNodeVisitor):
-             document.reporter)
-         self.format_map = {}
-         if self.settings.odf_config_file:
--            from configparser import ConfigParser
--
-             parser = ConfigParser()
-             parser.read(self.settings.odf_config_file)
-             for rststyle, format in parser.items("Formats"):
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0018-py3-Replace-ur-prefix.patch b/srcpkgs/python-docutils/patches/0018-py3-Replace-ur-prefix.patch
deleted file mode 100644
index c401c4aebbc..00000000000
--- a/srcpkgs/python-docutils/patches/0018-py3-Replace-ur-prefix.patch
+++ /dev/null
@@ -1,599 +0,0 @@
-From ac408c7ed04500c83a47861c5ac88aee246d178c Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:09:19 +0000
-Subject: [PATCH 18/26] py3: Replace 'ur' prefix
-
-While the 'u' prefix was backported to Python 3.3 or thereabouts, 'ur'
-remains invalid in Python 3. Just escape all backslashes and use plain
-old 'u'.
-
-Based on patch by Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8366 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/utils/math/latex2mathml.py           |  28 +-
- docutils/utils/math/tex2mathml_extern.py      |   3 +-
- docutils/utils/smartquotes.py                 |  24 +-
- docutils/writers/latex2e/__init__.py          | 280 +++++++++---------
- docutils/writers/manpage.py                   |   8 +-
- .../test_rst/test_east_asian_text.py          |   4 +-
- tools/dev/generate_punctuation_chars.py       |  10 +-
- 7 files changed, 182 insertions(+), 175 deletions(-)
-
-diff --git a/docutils/utils/math/latex2mathml.py b/docutils/utils/math/latex2mathml.py
-index b7ba048..1f3bc18 100644
---- a/docutils/utils/math/latex2mathml.py
-+++ b/docutils/utils/math/latex2mathml.py
-@@ -6,12 +6,12 @@
- #             Based on rst2mathml.py from the latex_math sandbox project
- #             © 2005 Jens Jørgen Mortensen
- # :License: Released under the terms of the `2-Clause BSD license`_, in short:
--# 
-+#
- #    Copying and distribution of this file, with or without modification,
- #    are permitted in any medium without royalty provided the copyright
- #    notice and this notice are preserved.
- #    This file is offered as-is, without any warranty.
--# 
-+#
- # .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
- 
- 
-@@ -412,7 +412,7 @@ def parse_latex_math(string, inline=True):
-                 node = entry
-                 skip = 2
-             else:
--                raise SyntaxError(ur'Syntax error: "%s%s"' % (c, c2))
-+                raise SyntaxError(u'Syntax error: "%s%s"' % (c, c2))
-         elif c.isalpha():
-             node = node.append(mi(c))
-         elif c.isdigit():
-@@ -453,7 +453,7 @@ def parse_latex_math(string, inline=True):
-             node.close().append(entry)
-             node = entry
-         else:
--            raise SyntaxError(ur'Illegal character: "%s"' % c)
-+            raise SyntaxError(u'Illegal character: "%s"' % c)
-         string = string[skip:]
-     return tree
- 
-@@ -474,15 +474,15 @@ def handle_keyword(name, node, string):
-         node = entry
-     elif name == 'end':
-         if not string.startswith('{matrix}'):
--            raise SyntaxError(ur'Expected "\end{matrix}"!')
-+            raise SyntaxError(u'Expected "\\end{matrix}"!')
-         skip += 8
-         node = node.close().close().close()
-     elif name in ('text', 'mathrm'):
-         if string[0] != '{':
--            raise SyntaxError(ur'Expected "\text{...}"!')
-+            raise SyntaxError(u'Expected "\\text{...}"!')
-         i = string.find('}')
-         if i == -1:
--            raise SyntaxError(ur'Expected "\text{...}"!')
-+            raise SyntaxError(u'Expected "\\text{...}"!')
-         node = node.append(mtext(string[1:i]))
-         skip += i + 1
-     elif name == 'sqrt':
-@@ -520,7 +520,7 @@ def handle_keyword(name, node, string):
-             if string.startswith(operator):
-                 break
-         else:
--            raise SyntaxError(ur'Expected something to negate: "\not ..."!')
-+            raise SyntaxError(u'Expected something to negate: "\\not ..."!')
-         node = node.append(mo(negatables[operator]))
-         skip += len(operator)
-     elif name == 'mathbf':
-@@ -529,12 +529,12 @@ def handle_keyword(name, node, string):
-         node = style
-     elif name == 'mathbb':
-         if string[0] != '{' or not string[1].isupper() or string[2] != '}':
--            raise SyntaxError(ur'Expected something like "\mathbb{A}"!')
-+            raise SyntaxError(u'Expected something like "\\mathbb{A}"!')
-         node = node.append(mi(mathbb[string[1]]))
-         skip += 3
-     elif name in ('mathscr', 'mathcal'):
-         if string[0] != '{' or string[2] != '}':
--            raise SyntaxError(ur'Expected something like "\mathscr{A}"!')
-+            raise SyntaxError(u'Expected something like "\\mathscr{A}"!')
-         node = node.append(mi(mathscr[string[1]]))
-         skip += 3
-     elif name == 'colon': # "normal" colon, not binary operator
-@@ -559,12 +559,10 @@ def handle_keyword(name, node, string):
-     return node, skip
- 
- def tex2mathml(tex_math, inline=True):
--    """Return string with MathML code corresponding to `tex_math`. 
--    
-+    """Return string with MathML code corresponding to `tex_math`.
-+
-     `inline`=True is for inline math and `inline`=False for displayed math.
-     """
--    
-+
-     mathml_tree = parse_latex_math(tex_math, inline=inline)
-     return ''.join(mathml_tree.xml())
--
--    
-diff --git a/docutils/utils/math/tex2mathml_extern.py b/docutils/utils/math/tex2mathml_extern.py
-index 3e7f158..ab82a78 100644
---- a/docutils/utils/math/tex2mathml_extern.py
-+++ b/docutils/utils/math/tex2mathml_extern.py
-@@ -141,7 +141,8 @@ def blahtexml(math_code, inline=True, reporter=None):
- # self-test
- 
- if __name__ == "__main__":
--    example = ur'\frac{\partial \sin^2(\alpha)}{\partial \vec r} \varpi \, \text{Grüße}'
-+    example = (u'\\frac{\\partial \\sin^2(\\alpha)}{\\partial \\vec r}'
-+               u'\\varpi \\, \\text{Grüße}')
-     # print(latexml(example).encode('utf8'))
-     # print(ttm(example))
-     print(blahtexml(example).encode('utf8'))
-diff --git a/docutils/utils/smartquotes.py b/docutils/utils/smartquotes.py
-index 148a4c9..b38fa47 100644
---- a/docutils/utils/smartquotes.py
-+++ b/docutils/utils/smartquotes.py
-@@ -658,20 +658,21 @@ def educateQuotes(text, language='en'):
-         text = re.sub(r"'(?=\d{2}s)", smart.apostrophe, text)
- 
-     # Get most opening single quotes:
--    opening_single_quotes_regex = re.compile(ur"""
-+    opening_single_quotes_regex = re.compile(u"""
-                     (# ?<=  # look behind fails: requires fixed-width pattern
--                            \s          |   # a whitespace char, or
-+                            \\s         |   # a whitespace char, or
-                             %s          |   # another separating char, or
-                             &nbsp;      |   # a non-breaking space entity, or
--                            [–—]        |   # literal dashes, or
-+                            [\u2013 \u2014 ]        |   # literal dashes, or
-                             --          |   # dumb dashes, or
-                             &[mn]dash;  |   # dash entities (named or
-                             %s          |   # decimal or
--                            &\#x201[34];    # hex)
-+                            &\\#x201[34];    # hex)
-                     )
-                     '                 # the quote
--                    (?=\w)            # followed by a word character
--                    """ % (open_class,dec_dashes), re.VERBOSE | re.UNICODE)
-+                    (?=\\w)           # followed by a word character
-+                    """ % (open_class, dec_dashes), re.VERBOSE | re.UNICODE)
-+
-     text = opening_single_quotes_regex.sub(r'\1'+smart.osquote, text)
- 
-     # In many locales, single closing quotes are different from apostrophe:
-@@ -691,20 +692,21 @@ def educateQuotes(text, language='en'):
-     text = re.sub(r"""'""", smart.osquote, text)
- 
-     # Get most opening double quotes:
--    opening_double_quotes_regex = re.compile(ur"""
-+    opening_double_quotes_regex = re.compile(u"""
-                     (
--                            \s          |   # a whitespace char, or
-+                            \\s         |   # a whitespace char, or
-                             %s          |   # another separating char, or
-                             &nbsp;      |   # a non-breaking space entity, or
--                            [–—]        |   # literal dashes, or
-+                            [\u2013 \u2014 ]        |   # literal dashes, or
-                             --          |   # dumb dashes, or
-                             &[mn]dash;  |   # dash entities (named or
-                             %s          |   # decimal or
--                            &\#x201[34];    # hex)
-+                            &\\#x201[34];    # hex)
-                     )
-                     "                 # the quote
--                    (?=\w)            # followed by a word character
-+                    (?=\\w)            # followed by a word character
-                     """ % (open_class,dec_dashes), re.VERBOSE | re.UNICODE)
-+
-     text = opening_double_quotes_regex.sub(r'\1'+smart.opquote, text)
- 
-     # Double closing quotes:
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 2c76b0f..636d477 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -704,165 +704,165 @@ class CharMaps(object):
- 
-     # characters that need escaping even in `alltt` environments:
-     alltt = {
--        ord('\\'): ur'\textbackslash{}',
--        ord('{'): ur'\{',
--        ord('}'): ur'\}',
-+        ord('\\'): u'\\textbackslash{}',
-+        ord('{'): u'\\{',
-+        ord('}'): u'\\}',
-     }
-     # characters that normally need escaping:
-     special = {
--        ord('#'): ur'\#',
--        ord('$'): ur'\$',
--        ord('%'): ur'\%',
--        ord('&'): ur'\&',
--        ord('~'): ur'\textasciitilde{}',
--        ord('_'): ur'\_',
--        ord('^'): ur'\textasciicircum{}',
-+        ord('#'): u'\\#',
-+        ord('$'): u'\\$',
-+        ord('%'): u'\\%',
-+        ord('&'): u'\\&',
-+        ord('~'): u'\\textasciitilde{}',
-+        ord('_'): u'\\_',
-+        ord('^'): u'\\textasciicircum{}',
-         # straight double quotes are 'active' in many languages
--        ord('"'): ur'\textquotedbl{}',
-+        ord('"'): u'\\textquotedbl{}',
-         # Square brackets are ordinary chars and cannot be escaped with '\',
-         # so we put them in a group '{[}'. (Alternative: ensure that all
-         # macros with optional arguments are terminated with {} and text
-         # inside any optional argument is put in a group ``[{text}]``).
-         # Commands with optional args inside an optional arg must be put in a
-         # group, e.g. ``\item[{\hyperref[label]{text}}]``.
--        ord('['): ur'{[}',
--        ord(']'): ur'{]}',
-+        ord('['): u'{[}',
-+        ord(']'): u'{]}',
-         # the soft hyphen is unknown in 8-bit text
-         # and not properly handled by XeTeX
--        0x00AD: ur'\-', # SOFT HYPHEN
-+        0x00AD: u'\\-', # SOFT HYPHEN
-     }
-     # Unicode chars that are not recognized by LaTeX's utf8 encoding
-     unsupported_unicode = {
-         # TODO: ensure white space also at the beginning of a line?
--        # 0x00A0: ur'\leavevmode\nobreak\vadjust{}~'
--        0x2000: ur'\enskip', # EN QUAD
--        0x2001: ur'\quad', # EM QUAD
--        0x2002: ur'\enskip', # EN SPACE
--        0x2003: ur'\quad', # EM SPACE
--        0x2008: ur'\,', # PUNCTUATION SPACE   
--        0x200b: ur'\hspace{0pt}', # ZERO WIDTH SPACE
--        0x202F: ur'\,', # NARROW NO-BREAK SPACE
--        # 0x02d8: ur'\\u{ }', # BREVE
--        0x2011: ur'\hbox{-}', # NON-BREAKING HYPHEN
--        0x212b: ur'\AA', # ANGSTROM SIGN
--        0x21d4: ur'\ensuremath{\Leftrightarrow}',
-+        # 0x00A0: u'\\leavevmode\\nobreak\\vadjust{}~'
-+        0x2000: u'\\enskip', # EN QUAD
-+        0x2001: u'\\quad', # EM QUAD
-+        0x2002: u'\\enskip', # EN SPACE
-+        0x2003: u'\\quad', # EM SPACE
-+        0x2008: u'\\,', # PUNCTUATION SPACE   
-+        0x200b: u'\\hspace{0pt}', # ZERO WIDTH SPACE
-+        0x202F: u'\\,', # NARROW NO-BREAK SPACE
-+        # 0x02d8: u'\\\u{ }', # BREVE
-+        0x2011: u'\\hbox{-}', # NON-BREAKING HYPHEN
-+        0x212b: u'\\AA', # ANGSTROM SIGN
-+        0x21d4: u'\\ensuremath{\\Leftrightarrow}',
-         # Docutils footnote symbols:
--        0x2660: ur'\ensuremath{\spadesuit}',
--        0x2663: ur'\ensuremath{\clubsuit}',
--        0xfb00: ur'ff', # LATIN SMALL LIGATURE FF
--        0xfb01: ur'fi', # LATIN SMALL LIGATURE FI
--        0xfb02: ur'fl', # LATIN SMALL LIGATURE FL
--        0xfb03: ur'ffi', # LATIN SMALL LIGATURE FFI
--        0xfb04: ur'ffl', # LATIN SMALL LIGATURE FFL
-+        0x2660: u'\\ensuremath{\\spadesuit}',
-+        0x2663: u'\\ensuremath{\\clubsuit}',
-+        0xfb00: u'ff', # LATIN SMALL LIGATURE FF
-+        0xfb01: u'fi', # LATIN SMALL LIGATURE FI
-+        0xfb02: u'fl', # LATIN SMALL LIGATURE FL
-+        0xfb03: u'ffi', # LATIN SMALL LIGATURE FFI
-+        0xfb04: u'ffl', # LATIN SMALL LIGATURE FFL
-     }
-     # Unicode chars that are recognized by LaTeX's utf8 encoding
-     utf8_supported_unicode = {
--        0x00A0: ur'~', # NO-BREAK SPACE
--        0x00AB: ur'\guillemotleft{}', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
--        0x00bb: ur'\guillemotright{}', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
--        0x200C: ur'\textcompwordmark{}', # ZERO WIDTH NON-JOINER
--        0x2013: ur'\textendash{}',
--        0x2014: ur'\textemdash{}',
--        0x2018: ur'\textquoteleft{}',
--        0x2019: ur'\textquoteright{}',
--        0x201A: ur'\quotesinglbase{}', # SINGLE LOW-9 QUOTATION MARK
--        0x201C: ur'\textquotedblleft{}',
--        0x201D: ur'\textquotedblright{}',
--        0x201E: ur'\quotedblbase{}', # DOUBLE LOW-9 QUOTATION MARK
--        0x2030: ur'\textperthousand{}',   # PER MILLE SIGN
--        0x2031: ur'\textpertenthousand{}', # PER TEN THOUSAND SIGN
--        0x2039: ur'\guilsinglleft{}',
--        0x203A: ur'\guilsinglright{}',
--        0x2423: ur'\textvisiblespace{}',  # OPEN BOX
--        0x2020: ur'\dag{}',
--        0x2021: ur'\ddag{}',
--        0x2026: ur'\dots{}',
--        0x2122: ur'\texttrademark{}',
-+        0x00A0: u'~', # NO-BREAK SPACE
-+        0x00AB: u'\\guillemotleft{}', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-+        0x00bb: u'\\guillemotright{}', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-+        0x200C: u'\\textcompwordmark{}', # ZERO WIDTH NON-JOINER
-+        0x2013: u'\\textendash{}',
-+        0x2014: u'\\textemdash{}',
-+        0x2018: u'\\textquoteleft{}',
-+        0x2019: u'\\textquoteright{}',
-+        0x201A: u'\\quotesinglbase{}', # SINGLE LOW-9 QUOTATION MARK
-+        0x201C: u'\\textquotedblleft{}',
-+        0x201D: u'\\textquotedblright{}',
-+        0x201E: u'\\quotedblbase{}', # DOUBLE LOW-9 QUOTATION MARK
-+        0x2030: u'\\textperthousand{}',   # PER MILLE SIGN
-+        0x2031: u'\\textpertenthousand{}', # PER TEN THOUSAND SIGN
-+        0x2039: u'\\guilsinglleft{}',
-+        0x203A: u'\\guilsinglright{}',
-+        0x2423: u'\\textvisiblespace{}',  # OPEN BOX
-+        0x2020: u'\\dag{}',
-+        0x2021: u'\\ddag{}',
-+        0x2026: u'\\dots{}',
-+        0x2122: u'\\texttrademark{}',
-     }
-     # recognized with 'utf8', if textcomp is loaded
-     textcomp = {
-         # Latin-1 Supplement
--        0x00a2: ur'\textcent{}',          # ¢ CENT SIGN
--        0x00a4: ur'\textcurrency{}',      # ¤ CURRENCY SYMBOL
--        0x00a5: ur'\textyen{}',           # ¥ YEN SIGN
--        0x00a6: ur'\textbrokenbar{}',     # ¦ BROKEN BAR
--        0x00a7: ur'\textsection{}',       # § SECTION SIGN
--        0x00a8: ur'\textasciidieresis{}', # ¨ DIAERESIS
--        0x00a9: ur'\textcopyright{}',     # © COPYRIGHT SIGN
--        0x00aa: ur'\textordfeminine{}',   # ª FEMININE ORDINAL INDICATOR
--        0x00ac: ur'\textlnot{}',          # ¬ NOT SIGN
--        0x00ae: ur'\textregistered{}',    # ® REGISTERED SIGN
--        0x00af: ur'\textasciimacron{}',   # ¯ MACRON
--        0x00b0: ur'\textdegree{}',        # ° DEGREE SIGN
--        0x00b1: ur'\textpm{}',            # ± PLUS-MINUS SIGN
--        0x00b2: ur'\texttwosuperior{}',   # ² SUPERSCRIPT TWO
--        0x00b3: ur'\textthreesuperior{}', # ³ SUPERSCRIPT THREE
--        0x00b4: ur'\textasciiacute{}',    # ´ ACUTE ACCENT
--        0x00b5: ur'\textmu{}',            # µ MICRO SIGN
--        0x00b6: ur'\textparagraph{}',     # ¶ PILCROW SIGN # != \textpilcrow
--        0x00b9: ur'\textonesuperior{}',   # ¹ SUPERSCRIPT ONE
--        0x00ba: ur'\textordmasculine{}',  # º MASCULINE ORDINAL INDICATOR
--        0x00bc: ur'\textonequarter{}',    # 1/4 FRACTION
--        0x00bd: ur'\textonehalf{}',       # 1/2 FRACTION
--        0x00be: ur'\textthreequarters{}', # 3/4 FRACTION
--        0x00d7: ur'\texttimes{}',         # × MULTIPLICATION SIGN
--        0x00f7: ur'\textdiv{}',           # ÷ DIVISION SIGN
-+        0x00a2: u'\\textcent{}',          # ¢ CENT SIGN
-+        0x00a4: u'\\textcurrency{}',      # ¤ CURRENCY SYMBOL
-+        0x00a5: u'\\textyen{}',           # ¥ YEN SIGN
-+        0x00a6: u'\\textbrokenbar{}',     # ¦ BROKEN BAR
-+        0x00a7: u'\\textsection{}',       # § SECTION SIGN
-+        0x00a8: u'\\textasciidieresis{}', # ¨ DIAERESIS
-+        0x00a9: u'\\textcopyright{}',     # © COPYRIGHT SIGN
-+        0x00aa: u'\\textordfeminine{}',   # ª FEMININE ORDINAL INDICATOR
-+        0x00ac: u'\\textlnot{}',          # ¬ NOT SIGN
-+        0x00ae: u'\\textregistered{}',    # ® REGISTERED SIGN
-+        0x00af: u'\\textasciimacron{}',   # ¯ MACRON
-+        0x00b0: u'\\textdegree{}',        # ° DEGREE SIGN
-+        0x00b1: u'\\textpm{}',            # ± PLUS-MINUS SIGN
-+        0x00b2: u'\\texttwosuperior{}',   # ² SUPERSCRIPT TWO
-+        0x00b3: u'\\textthreesuperior{}', # ³ SUPERSCRIPT THREE
-+        0x00b4: u'\\textasciiacute{}',    # ´ ACUTE ACCENT
-+        0x00b5: u'\\textmu{}',            # µ MICRO SIGN
-+        0x00b6: u'\\textparagraph{}',     # ¶ PILCROW SIGN # != \textpilcrow
-+        0x00b9: u'\\textonesuperior{}',   # ¹ SUPERSCRIPT ONE
-+        0x00ba: u'\\textordmasculine{}',  # º MASCULINE ORDINAL INDICATOR
-+        0x00bc: u'\\textonequarter{}',    # 1/4 FRACTION
-+        0x00bd: u'\\textonehalf{}',       # 1/2 FRACTION
-+        0x00be: u'\\textthreequarters{}', # 3/4 FRACTION
-+        0x00d7: u'\\texttimes{}',         # × MULTIPLICATION SIGN
-+        0x00f7: u'\\textdiv{}',           # ÷ DIVISION SIGN
-         # others
--        0x0192: ur'\textflorin{}',        # LATIN SMALL LETTER F WITH HOOK
--        0x02b9: ur'\textasciiacute{}',    # MODIFIER LETTER PRIME
--        0x02ba: ur'\textacutedbl{}',      # MODIFIER LETTER DOUBLE PRIME
--        0x2016: ur'\textbardbl{}',        # DOUBLE VERTICAL LINE
--        0x2022: ur'\textbullet{}',        # BULLET
--        0x2032: ur'\textasciiacute{}',    # PRIME
--        0x2033: ur'\textacutedbl{}',      # DOUBLE PRIME
--        0x2035: ur'\textasciigrave{}',    # REVERSED PRIME
--        0x2036: ur'\textgravedbl{}',      # REVERSED DOUBLE PRIME
--        0x203b: ur'\textreferencemark{}', # REFERENCE MARK
--        0x203d: ur'\textinterrobang{}',   # INTERROBANG
--        0x2044: ur'\textfractionsolidus{}', # FRACTION SLASH
--        0x2045: ur'\textlquill{}',        # LEFT SQUARE BRACKET WITH QUILL
--        0x2046: ur'\textrquill{}',        # RIGHT SQUARE BRACKET WITH QUILL
--        0x2052: ur'\textdiscount{}',      # COMMERCIAL MINUS SIGN
--        0x20a1: ur'\textcolonmonetary{}', # COLON SIGN
--        0x20a3: ur'\textfrenchfranc{}',   # FRENCH FRANC SIGN
--        0x20a4: ur'\textlira{}',          # LIRA SIGN
--        0x20a6: ur'\textnaira{}',         # NAIRA SIGN
--        0x20a9: ur'\textwon{}',           # WON SIGN
--        0x20ab: ur'\textdong{}',          # DONG SIGN
--        0x20ac: ur'\texteuro{}',          # EURO SIGN
--        0x20b1: ur'\textpeso{}',          # PESO SIGN
--        0x20b2: ur'\textguarani{}',       # GUARANI SIGN
--        0x2103: ur'\textcelsius{}',       # DEGREE CELSIUS
--        0x2116: ur'\textnumero{}',        # NUMERO SIGN
--        0x2117: ur'\textcircledP{}',      # SOUND RECORDING COYRIGHT
--        0x211e: ur'\textrecipe{}',        # PRESCRIPTION TAKE
--        0x2120: ur'\textservicemark{}',   # SERVICE MARK
--        0x2122: ur'\texttrademark{}',     # TRADE MARK SIGN
--        0x2126: ur'\textohm{}',           # OHM SIGN
--        0x2127: ur'\textmho{}',           # INVERTED OHM SIGN
--        0x212e: ur'\textestimated{}',     # ESTIMATED SYMBOL
--        0x2190: ur'\textleftarrow{}',     # LEFTWARDS ARROW
--        0x2191: ur'\textuparrow{}',       # UPWARDS ARROW
--        0x2192: ur'\textrightarrow{}',    # RIGHTWARDS ARROW
--        0x2193: ur'\textdownarrow{}',     # DOWNWARDS ARROW
--        0x2212: ur'\textminus{}',         # MINUS SIGN
--        0x2217: ur'\textasteriskcentered{}', # ASTERISK OPERATOR
--        0x221a: ur'\textsurd{}',          # SQUARE ROOT
--        0x2422: ur'\textblank{}',         # BLANK SYMBOL
--        0x25e6: ur'\textopenbullet{}',    # WHITE BULLET
--        0x25ef: ur'\textbigcircle{}',     # LARGE CIRCLE
--        0x266a: ur'\textmusicalnote{}',   # EIGHTH NOTE
--        0x26ad: ur'\textmarried{}',       # MARRIAGE SYMBOL
--        0x26ae: ur'\textdivorced{}',      # DIVORCE SYMBOL
--        0x27e8: ur'\textlangle{}',        # MATHEMATICAL LEFT ANGLE BRACKET
--        0x27e9: ur'\textrangle{}',        # MATHEMATICAL RIGHT ANGLE BRACKET
-+        0x0192: u'\\textflorin{}',        # LATIN SMALL LETTER F WITH HOOK
-+        0x02b9: u'\\textasciiacute{}',    # MODIFIER LETTER PRIME
-+        0x02ba: u'\\textacutedbl{}',      # MODIFIER LETTER DOUBLE PRIME
-+        0x2016: u'\\textbardbl{}',        # DOUBLE VERTICAL LINE
-+        0x2022: u'\\textbullet{}',        # BULLET
-+        0x2032: u'\\textasciiacute{}',    # PRIME
-+        0x2033: u'\\textacutedbl{}',      # DOUBLE PRIME
-+        0x2035: u'\\textasciigrave{}',    # REVERSED PRIME
-+        0x2036: u'\\textgravedbl{}',      # REVERSED DOUBLE PRIME
-+        0x203b: u'\\textreferencemark{}', # REFERENCE MARK
-+        0x203d: u'\\textinterrobang{}',   # INTERROBANG
-+        0x2044: u'\\textfractionsolidus{}', # FRACTION SLASH
-+        0x2045: u'\\textlquill{}',        # LEFT SQUARE BRACKET WITH QUILL
-+        0x2046: u'\\textrquill{}',        # RIGHT SQUARE BRACKET WITH QUILL
-+        0x2052: u'\\textdiscount{}',      # COMMERCIAL MINUS SIGN
-+        0x20a1: u'\\textcolonmonetary{}', # COLON SIGN
-+        0x20a3: u'\\textfrenchfranc{}',   # FRENCH FRANC SIGN
-+        0x20a4: u'\\textlira{}',          # LIRA SIGN
-+        0x20a6: u'\\textnaira{}',         # NAIRA SIGN
-+        0x20a9: u'\\textwon{}',           # WON SIGN
-+        0x20ab: u'\\textdong{}',          # DONG SIGN
-+        0x20ac: u'\\texteuro{}',          # EURO SIGN
-+        0x20b1: u'\\textpeso{}',          # PESO SIGN
-+        0x20b2: u'\\textguarani{}',       # GUARANI SIGN
-+        0x2103: u'\\textcelsius{}',       # DEGREE CELSIUS
-+        0x2116: u'\\textnumero{}',        # NUMERO SIGN
-+        0x2117: u'\\textcircledP{}',      # SOUND RECORDING COYRIGHT
-+        0x211e: u'\\textrecipe{}',        # PRESCRIPTION TAKE
-+        0x2120: u'\\textservicemark{}',   # SERVICE MARK
-+        0x2122: u'\\texttrademark{}',     # TRADE MARK SIGN
-+        0x2126: u'\\textohm{}',           # OHM SIGN
-+        0x2127: u'\\textmho{}',           # INVERTED OHM SIGN
-+        0x212e: u'\\textestimated{}',     # ESTIMATED SYMBOL
-+        0x2190: u'\\textleftarrow{}',     # LEFTWARDS ARROW
-+        0x2191: u'\\textuparrow{}',       # UPWARDS ARROW
-+        0x2192: u'\\textrightarrow{}',    # RIGHTWARDS ARROW
-+        0x2193: u'\\textdownarrow{}',     # DOWNWARDS ARROW
-+        0x2212: u'\\textminus{}',         # MINUS SIGN
-+        0x2217: u'\\textasteriskcentered{}', # ASTERISK OPERATOR
-+        0x221a: u'\\textsurd{}',          # SQUARE ROOT
-+        0x2422: u'\\textblank{}',         # BLANK SYMBOL
-+        0x25e6: u'\\textopenbullet{}',    # WHITE BULLET
-+        0x25ef: u'\\textbigcircle{}',     # LARGE CIRCLE
-+        0x266a: u'\\textmusicalnote{}',   # EIGHTH NOTE
-+        0x26ad: u'\\textmarried{}',       # MARRIAGE SYMBOL
-+        0x26ae: u'\\textdivorced{}',      # DIVORCE SYMBOL
-+        0x27e8: u'\\textlangle{}',        # MATHEMATICAL LEFT ANGLE BRACKET
-+        0x27e9: u'\\textrangle{}',        # MATHEMATICAL RIGHT ANGLE BRACKET
-     }
-     # Unicode chars that require a feature/package to render
-     pifont = {
--        0x2665: ur'\ding{170}',     # black heartsuit
--        0x2666: ur'\ding{169}',     # black diamondsuit
--        0x2713: ur'\ding{51}',      # check mark
--        0x2717: ur'\ding{55}',      # check mark
-+        0x2665: u'\\ding{170}',     # black heartsuit
-+        0x2666: u'\\ding{169}',     # black diamondsuit
-+        0x2713: u'\\ding{51}',      # check mark
-+        0x2717: u'\\ding{55}',      # check mark
-     }
-     # TODO: greek alphabet ... ?
-     # see also LaTeX codec
-@@ -1511,14 +1511,14 @@ class LaTeXTranslator(nodes.NodeVisitor):
-                 # the backslash doesn't work, so we use a mirrored slash.
-                 # \reflectbox is provided by graphicx:
-                 self.requirements['graphicx'] = self.graphicx_package
--                table[ord('\\')] = ur'\reflectbox{/}'
-+                table[ord('\\')] = u'\\reflectbox{/}'
-             # * ``< | >`` come out as different chars (except for cmtt):
-             else:
--                table[ord('|')] = ur'\textbar{}'
--                table[ord('<')] = ur'\textless{}'
--                table[ord('>')] = ur'\textgreater{}'
-+                table[ord('|')] = u'\\textbar{}'
-+                table[ord('<')] = u'\\textless{}'
-+                table[ord('>')] = u'\\textgreater{}'
-         if self.insert_non_breaking_blanks:
--            table[ord(' ')] = ur'~'
-+            table[ord(' ')] = u'~'
-             # tab chars may occur in included files (literal or code)
-             # quick-and-dirty replacement with spaces
-             # (for better results use `--literal-block-env=lstlisting`)
-@@ -2618,7 +2618,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
-             math_code = '\n'.join([math_code] + self.ids_to_labels(node))
-         if math_env == '$':
-             if self.alltt:
--                wrapper = ur'\(%s\)'
-+                wrapper = u'\\(%s\\)'
-             else:
-                 wrapper = u'$%s$'
-         else:
-@@ -2769,9 +2769,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
- 
-     def visit_reference(self, node):
-         # We need to escape #, \, and % if we use the URL in a command.
--        special_chars = {ord('#'): ur'\#',
--                         ord('%'): ur'\%',
--                         ord('\\'): ur'\\',
-+        special_chars = {ord('#'): u'\\#',
-+                         ord('%'): u'\\%',
-+                         ord('\\'): u'\\\\',
-                         }
-         # external reference (URL)
-         if 'refuri' in node:
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index 8bb025c..ed163de 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -284,10 +284,10 @@ class Translator(nodes.NodeVisitor):
-         text = node.astext()
-         text = text.replace('\\','\\e')
-         replace_pairs = [
--            (u'-', ur'\-'),
--            (u'\'', ur'\(aq'),
--            (u'´', ur'\''),
--            (u'`', ur'\(ga'),
-+            (u'-', u'\\-'),
-+            (u'\'', u'\\(aq'),
-+            (u'´', u"\\'"),
-+            (u'`', u'\\(ga'),
-             ]
-         for (in_char, out_markup) in replace_pairs:
-             text = text.replace(in_char, out_markup)
-diff --git a/test/test_parsers/test_rst/test_east_asian_text.py b/test/test_parsers/test_rst/test_east_asian_text.py
-index d819ef8..a13c969 100755
---- a/test/test_parsers/test_rst/test_east_asian_text.py
-+++ b/test/test_parsers/test_rst/test_east_asian_text.py
-@@ -50,12 +50,12 @@ u"""\
-                 タイトル2
-                 ========
- """],
--[ur"""
-+[u"""
- +-----------------------+
- | * ヒョウ:ダイ1ギョウ  |
- | * ダイ2ギョウ         |
- +-----------------------+
--| \* ダイ1ギョウ        |
-+| \\* ダイ1ギョウ        |
- | * ダイ2ギョウ         |
- +-----------------------+
- """,
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index fbb72c0..cfe97df 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -375,10 +375,16 @@ if __name__ == '__main__':
- 
-         print_differences(openers, o, 'openers')
-         if o_wide:
--            print('+ openers-wide = ur"""%s"""' % o_wide.encode('utf8'))
-+            if sys.version_info < (3, 0):
-+                print('+ openers-wide = ur"""%s"""' % o_wide.encode('utf8'))
-+            else:
-+                print('+ openers-wide = r"""%s"""' % o_wide.encode('utf8'))
-         print_differences(closers, c, 'closers')
-         if c_wide:
--            print('+ closers-wide = ur"""%s"""' % c_wide.encode('utf8'))
-+            if sys.version_info < (3, 0):
-+                print('+ closers-wide = ur"""%s"""' % c_wide.encode('utf8'))
-+            else:
-+                print('+ closers-wide = r"""%s"""' % c_wide.encode('utf8'))
- 
-         print_differences(delimiters, d + d_wide, 'delimiters')
-         print_differences(closing_delimiters, cd, 'closing_delimiters')
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0019-Formatting-changes-to-facilitate-integration-of-py3-.patch b/srcpkgs/python-docutils/patches/0019-Formatting-changes-to-facilitate-integration-of-py3-.patch
deleted file mode 100644
index 5acf6e90dbc..00000000000
--- a/srcpkgs/python-docutils/patches/0019-Formatting-changes-to-facilitate-integration-of-py3-.patch
+++ /dev/null
@@ -1,920 +0,0 @@
-From 2e6a65d93d4616f702bbc1f0f5b18c562e403956 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Wed, 20 Nov 2019 00:08:33 +0700
-Subject: [PATCH 19/26] Formatting changes to facilitate integration of "py3"
- patchset.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8367 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/_compat.py                            |  2 +-
- docutils/core.py                               |  2 +-
- docutils/frontend.py                           |  4 ++--
- docutils/io.py                                 | 18 +++++++++---------
- docutils/nodes.py                              | 12 ++++++------
- docutils/parsers/rst/directives/__init__.py    |  2 +-
- docutils/parsers/rst/directives/misc.py        |  4 ++--
- docutils/parsers/rst/directives/tables.py      |  4 ++--
- docutils/statemachine.py                       |  2 +-
- docutils/transforms/frontmatter.py             |  2 +-
- docutils/transforms/universal.py               |  2 +-
- docutils/utils/__init__.py                     |  8 ++++----
- docutils/utils/error_reporting.py              |  4 ++--
- docutils/utils/math/math2html.py               |  6 +++---
- docutils/writers/_html_base.py                 |  2 +-
- docutils/writers/docutils_xml.py               |  4 ++--
- docutils/writers/latex2e/__init__.py           |  2 +-
- docutils/writers/manpage.py                    |  2 +-
- docutils/writers/odf_odt/__init__.py           |  5 +++--
- setup.py                                       |  6 +++---
- test/DocutilsTestSupport.py                    |  6 +++---
- test/test__init__.py                           |  2 +-
- test/test_command_line.py                      |  2 +-
- test/test_error_reporting.py                   |  4 ++--
- test/test_functional.py                        |  8 ++++----
- test/test_io.py                                |  8 ++++----
- test/test_language.py                          |  2 +-
- test/test_nodes.py                             | 16 ++++++++--------
- test/test_parsers/test_parser.py               |  2 +-
- .../test_rst/test_directives/test_include.py   |  4 ++--
- .../test_rst/test_directives/test_raw.py       |  2 +-
- .../test_rst/test_directives/test_tables.py    |  2 +-
- .../test_rst/test_directives/test_unicode.py   |  2 +-
- tools/dev/create_unimap.py                     |  4 ++--
- tools/dev/generate_punctuation_chars.py        |  4 ++--
- tools/dev/unicode2rstsubs.py                   |  2 +-
- 36 files changed, 82 insertions(+), 81 deletions(-)
-
-diff --git a/docutils/_compat.py b/docutils/_compat.py
-index c9de633..1ff959c 100644
---- a/docutils/_compat.py
-+++ b/docutils/_compat.py
-@@ -14,7 +14,7 @@ This module currently provides the following helper symbols:
- 
- import sys
- 
--if sys.version_info < (3,0):
-+if sys.version_info < (3, 0):
-     u_prefix = 'u'
-     from StringIO import StringIO as BytesIO
- else:
-diff --git a/docutils/core.py b/docutils/core.py
-index 12a0c93..d0db093 100644
---- a/docutils/core.py
-+++ b/docutils/core.py
-@@ -155,7 +155,7 @@ class Publisher(object):
-         if argv is None:
-             argv = sys.argv[1:]
-             # converting to Unicode (Python 3 does this automatically):
--            if sys.version_info < (3,0):
-+            if sys.version_info < (3, 0):
-                 # TODO: make this failsafe and reversible?
-                 argv_encoding = (frontend.locale_encoding or 'ascii')
-                 argv = [a.decode(argv_encoding) for a in argv]
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 815343d..7bfff6a 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -36,7 +36,7 @@ import warnings
- import codecs
- import optparse
- from optparse import SUPPRESS_HELP
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     from configparser import RawConfigParser
- else:
-     from ConfigParser import RawConfigParser
-@@ -47,7 +47,7 @@ import docutils.nodes
- from docutils.utils.error_reporting import (locale_encoding, SafeString,
-                                             ErrorOutput, ErrorString)
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/io.py b/docutils/io.py
-index fb354fd..9c70f10 100644
---- a/docutils/io.py
-+++ b/docutils/io.py
-@@ -17,7 +17,7 @@ import codecs
- from docutils import TransformSpec
- from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-@@ -208,7 +208,7 @@ class FileInput(Input):
-     def __init__(self, source=None, source_path=None,
-                  encoding=None, error_handler='strict',
-                  autoclose=True,
--                 mode='r' if sys.version_info >= (3,0) else 'rU', **kwargs):
-+                 mode='r' if sys.version_info >= (3, 0) else 'rU', **kwargs):
-         """
-         :Parameters:
-             - `source`: either a file-like object (which is read directly), or
-@@ -239,7 +239,7 @@ class FileInput(Input):
-         if source is None:
-             if source_path:
-                 # Specify encoding in Python 3
--                if sys.version_info >= (3,0):
-+                if sys.version_info >= (3, 0):
-                     kwargs = {'encoding': self.encoding,
-                               'errors': self.error_handler}
-                 else:
-@@ -251,7 +251,7 @@ class FileInput(Input):
-                     raise InputError(error.errno, error.strerror, source_path)
-             else:
-                 self.source = sys.stdin
--        elif (sys.version_info >= (3,0) and
-+        elif (sys.version_info >= (3, 0) and
-               check_encoding(self.source, self.encoding) is False):
-             # TODO: re-open, warn or raise error?
-             raise UnicodeError('Encoding clash: encoding given is "%s" '
-@@ -268,7 +268,7 @@ class FileInput(Input):
-         Read and decode a single file and return the data (Unicode string).
-         """
-         try:
--            if self.source is sys.stdin and sys.version_info >= (3,0):
-+            if self.source is sys.stdin and sys.version_info >= (3, 0):
-                 # read as binary data to circumvent auto-decoding
-                 data = self.source.buffer.read()
-                 # normalize newlines
-@@ -358,7 +358,7 @@ class FileOutput(Output):
- 
-     def open(self):
-         # Specify encoding in Python 3.
--        if sys.version_info >= (3,0) and 'b' not in self.mode:
-+        if sys.version_info >= (3, 0) and 'b' not in self.mode:
-             kwargs = {'encoding': self.encoding,
-                       'errors': self.error_handler}
-         else:
-@@ -378,17 +378,17 @@ class FileOutput(Output):
-         """
-         if not self.opened:
-             self.open()
--        if ('b' not in self.mode and sys.version_info < (3,0)
-+        if ('b' not in self.mode and sys.version_info < (3, 0)
-             or check_encoding(self.destination, self.encoding) is False
-            ):
-             data = self.encode(data)
--            if sys.version_info >= (3,0) and os.linesep != '\n':
-+            if sys.version_info >= (3, 0) and os.linesep != '\n':
-                 data = data.replace(b'\n', bytes(os.linesep, 'ascii')) # fix endings
- 
-         try:
-             self.destination.write(data)
-         except TypeError as e:
--            if sys.version_info >= (3,0) and isinstance(data, bytes):
-+            if sys.version_info >= (3, 0) and isinstance(data, bytes):
-                 try:
-                     self.destination.buffer.write(data)
-                 except AttributeError:
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index f8da02b..dd9c4b6 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -29,7 +29,7 @@ import re
- import warnings
- import unicodedata
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
-     basestring = str  # noqa
- 
-@@ -64,7 +64,7 @@ class Node(object):
-         """
-         return True
- 
--    if sys.version_info < (3,0):
-+    if sys.version_info < (3, 0):
-         # on 2.x, str(node) will be a byte string with Unicode
-         # characters > 255 escaped; on 3.x this is no longer necessary
-         def __str__(self):
-@@ -304,7 +304,7 @@ class Node(object):
-         except IndexError:
-             return None
- 
--if sys.version_info < (3,0):
-+if sys.version_info < (3, 0):
-     class reprunicode(unicode):
-         """
-         A unicode sub-class that removes the initial u from unicode's repr.
-@@ -320,7 +320,7 @@ def ensure_str(s):
-     """
-     Failsave conversion of `unicode` to `str`.
-     """
--    if sys.version_info < (3,0) and isinstance(s, unicode):
-+    if sys.version_info < (3, 0) and isinstance(s, unicode):
-         return s.encode('ascii', 'backslashreplace')
-     return s
- 
-@@ -352,7 +352,7 @@ class Text(Node, reprunicode):
-     children = ()
-     """Text nodes have no children, and cannot have children."""
- 
--    if sys.version_info > (3,0):
-+    if sys.version_info > (3, 0):
-         def __new__(cls, data, rawsource=None):
-             """Prevent the rawsource argument from propagating to str."""
-             if isinstance(data, bytes):
-@@ -544,7 +544,7 @@ class Element(Node):
-         else:
-             return self.emptytag()
- 
--    if sys.version_info > (3,0):
-+    if sys.version_info > (3, 0):
-         # 2to3 doesn't convert __unicode__ to __str__
-         __str__ = __unicode__
- 
-diff --git a/docutils/parsers/rst/directives/__init__.py b/docutils/parsers/rst/directives/__init__.py
-index 14fe1ff..7bccb5b 100644
---- a/docutils/parsers/rst/directives/__init__.py
-+++ b/docutils/parsers/rst/directives/__init__.py
-@@ -16,7 +16,7 @@ from docutils import nodes
- from docutils.utils import split_escaped_whitespace, escape2null, unescape
- from docutils.parsers.rst.languages import en as _fallback_language_module
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unichr = chr  # noqa
- 
- 
-diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
-index 3b9b9de..0fc3610 100644
---- a/docutils/parsers/rst/directives/misc.py
-+++ b/docutils/parsers/rst/directives/misc.py
-@@ -473,7 +473,7 @@ class Date(Directive):
-                 'Invalid context: the "%s" directive can only be used within '
-                 'a substitution definition.' % self.name)
-         format_str = '\n'.join(self.content) or '%Y-%m-%d'
--        if sys.version_info< (3,0):
-+        if sys.version_info< (3, 0):
-             try:
-                 format_str = format_str.encode(locale_encoding or 'utf-8')
-             except UnicodeEncodeError:
-@@ -498,7 +498,7 @@ class Date(Directive):
-         #                          time.gmtime(int(source_date_epoch)))
-         # else:
-         text = time.strftime(format_str)
--        if sys.version_info< (3,0):
-+        if sys.version_info< (3, 0):
-             # `text` is a byte string that may contain non-ASCII characters:
-             try:
-                 text = text.decode(locale_encoding or 'utf-8')
-diff --git a/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
-index 36a52e7..b698e08 100644
---- a/docutils/parsers/rst/directives/tables.py
-+++ b/docutils/parsers/rst/directives/tables.py
-@@ -263,7 +263,7 @@ class CSVTable(Table):
-             return [detail.args[0]]
-         except csv.Error as detail:
-             message = str(detail)
--            if sys.version_info < (3,0) and '1-character string' in message:
-+            if sys.version_info < (3, 0) and '1-character string' in message:
-                 message += '\nwith Python 2.x this must be an ASCII character.'
-             error = self.state_machine.reporter.error(
-                 'Error with CSV data in "%s" directive:\n%s'
-@@ -356,7 +356,7 @@ class CSVTable(Table):
-             raise SystemMessagePropagation(error)
-         return csv_data, source
- 
--    if sys.version_info < (3,0):
-+    if sys.version_info < (3, 0):
-         # 2.x csv module doesn't do Unicode
-         def decode_from_csv(s):
-             return s.decode('utf-8')
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 16252bb..6bc03f5 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -113,7 +113,7 @@ import unicodedata
- from docutils import utils
- from docutils.utils.error_reporting import ErrorOutput
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/transforms/frontmatter.py b/docutils/transforms/frontmatter.py
-index 345e290..23b9c95 100644
---- a/docutils/transforms/frontmatter.py
-+++ b/docutils/transforms/frontmatter.py
-@@ -28,7 +28,7 @@ from docutils import nodes, utils
- from docutils.transforms import TransformError, Transform
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py
-index 770ec71..49fb2c8 100644
---- a/docutils/transforms/universal.py
-+++ b/docutils/transforms/universal.py
-@@ -24,7 +24,7 @@ from docutils.transforms import TransformError, Transform
- from docutils.utils import smartquotes
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index de39247..cc1fd1a 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -22,7 +22,7 @@ from docutils.nodes import unescape
- import docutils.io
- from docutils.utils.error_reporting import ErrorOutput, SafeString
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str
- 
- 
-@@ -592,7 +592,7 @@ def split_escaped_whitespace(text):
-     return list(itertools.chain(*strings))
- 
- def strip_combining_chars(text):
--    if isinstance(text, str) and sys.version_info < (3,0):
-+    if isinstance(text, str) and sys.version_info < (3, 0):
-         return text
-     return u''.join([c for c in text if not unicodedata.combining(c)])
- 
-@@ -604,7 +604,7 @@ def find_combining_chars(text):
-     [3, 6, 9]
- 
-     """
--    if isinstance(text, str) and sys.version_info < (3,0):
-+    if isinstance(text, str) and sys.version_info < (3, 0):
-         return []
-     return [i for i,c in enumerate(text) if unicodedata.combining(c)]
- 
-@@ -638,7 +638,7 @@ def column_width(text):
- 
-     Correct ``len(text)`` for wide East Asian and combining Unicode chars.
-     """
--    if isinstance(text, str) and sys.version_info < (3,0):
-+    if isinstance(text, str) and sys.version_info < (3, 0):
-         return len(text)
-     width = sum([east_asian_widths[unicodedata.east_asian_width(c)]
-                  for c in text])
-diff --git a/docutils/utils/error_reporting.py b/docutils/utils/error_reporting.py
-index 21bc55b..02a1dab 100644
---- a/docutils/utils/error_reporting.py
-+++ b/docutils/utils/error_reporting.py
-@@ -65,7 +65,7 @@ else:
-         locale_encoding = None
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-@@ -93,7 +93,7 @@ class SafeString(object):
-                         for arg in self.data.args]
-                 return ', '.join(args)
-             if isinstance(self.data, unicode):
--                if sys.version_info > (3,0):
-+                if sys.version_info > (3, 0):
-                     return self.data
-                 else:
-                     return self.data.encode(self.encoding,
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index ddaca48..475519f 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -30,7 +30,7 @@ import unicodedata
- import urllib
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  #noqa
-     basestring = str  # noqa
-     file = io.IOBase  # noqa
-@@ -73,7 +73,7 @@ class Trace(object):
- 
-   def show(cls, message, channel):
-     "Show a message out of a channel"
--    if sys.version_info < (3,0):
-+    if sys.version_info < (3, 0):
-       message = message.encode('utf-8')
-     channel.write(message + '\n')
- 
-@@ -1785,7 +1785,7 @@ class LineWriter(object):
-     "Write a string"
-     if not self.file:
-       self.file = codecs.open(self.filename, 'w', "utf-8")
--    if self.file == sys.stdout and sys.version_info < (3,0):
-+    if self.file == sys.stdout and sys.version_info < (3, 0):
-       string = string.encode('utf-8')
-     self.file.write(string)
- 
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index 63d5a5b..a957311 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -40,7 +40,7 @@ from docutils.utils.math import (unichar2tex, pick_math_environment,
-                                  math2html, latex2mathml, tex2mathml_extern)
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
-index 12306b6..60ee07b 100644
---- a/docutils/writers/docutils_xml.py
-+++ b/docutils/writers/docutils_xml.py
-@@ -30,7 +30,7 @@ from StringIO import StringIO
- import docutils
- from docutils import frontend, writers, nodes
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-@@ -185,7 +185,7 @@ class XMLTranslator(nodes.GenericNodeVisitor):
-         self.output.append(xml_string)
-         self.default_departure(node)  # or not?
-         # Check validity of raw XML:
--        if isinstance(xml_string, unicode) and sys.version_info < (3,0):
-+        if isinstance(xml_string, unicode) and sys.version_info < (3, 0):
-             xml_string = xml_string.encode('utf8')
-         try:
-             self.xmlparser.parse(StringIO(xml_string))
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 636d477..05b55eb 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -28,7 +28,7 @@ from docutils.transforms import writer_aux
- from docutils.utils.math import pick_math_environment, unichar2tex
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index ed163de..df4f1a3 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -47,7 +47,7 @@ __docformat__ = 'reStructuredText'
- import re
- import sys
- 
--if sys.version_info < (3,0):
-+if sys.version_info < (3, 0):
-     range = xrange
- 
- import docutils
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index f36980f..c79d4c1 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -37,7 +37,8 @@ if type(sys.version_info)!=type((0,)) and sys.version_info.major >= 3:
- else:
-     from ConfigParser import ConfigParser
-     from StringIO import StringIO
--    from urllib2 import urlopen, HTTPError
-+    from urllib2 import HTTPError
-+    from urllib2 import urlopen
- 
- 
- VERSION = '1.0a'
-@@ -947,7 +948,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
-                     self.document.reporter.warning(
-                         'Style "%s" is not a style used by odtwriter.' % (
-                             rststyle, ))
--                if sys.version_info >= (3,0):
-+                if sys.version_info >= (3, 0):
-                     self.format_map[rststyle] = format
-                 else:
-                     self.format_map[rststyle] = format.decode('utf-8')
-diff --git a/setup.py b/setup.py
-index 12c398b..d636f46 100755
---- a/setup.py
-+++ b/setup.py
-@@ -13,7 +13,7 @@ try:
-     from distutils.core import setup, Command
-     from distutils.command.build import build
-     from distutils.command.build_py import build_py
--    if sys.version_info >= (3,0):
-+    if sys.version_info >= (3, 0):
-         from distutils.command.build_py import build_py_2to3
-         from distutils.util import copydir_run_2to3
-     from distutils.command.install_data import install_data
-@@ -27,7 +27,7 @@ except ImportError:
-     sys.exit(1)
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     # copy-convert auxiliary python sources
-     class copy_build_py_2to3(build_py_2to3):
-         """Copy/convert Python source files in given directories recursively.
-@@ -97,7 +97,7 @@ def do_setup():
-     kwargs['cmdclass'] = {'build_data': build_data,
-                           'install_data': smart_install_data}
-     # Auto-convert source code for Python 3
--    if sys.version_info >= (3,0):
-+    if sys.version_info >= (3, 0):
-         kwargs['cmdclass']['build_py'] = copy_build_py_2to3
-     else:
-         kwargs['cmdclass']['build_py'] = build_py
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 390df5b..47ba83c 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -51,7 +51,7 @@ from pprint import pformat
- 
- testroot = os.path.abspath(os.path.dirname(__file__) or os.curdir)
- os.chdir(testroot)
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     sys.path.insert(0, os.path.normpath(os.path.join(testroot,
-                                                      '..', 'build', 'lib')))
-     sys.path.append(os.path.normpath(os.path.join(testroot, '..',
-@@ -89,7 +89,7 @@ except:
-     import pdb
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-@@ -202,7 +202,7 @@ class CustomTestCase(StandardTestCase):
-         """`input`, `output`, and `expected` should all be strings."""
-         if isinstance(input, unicode):
-             input = input.encode('raw_unicode_escape')
--        if sys.version_info > (3,0):
-+        if sys.version_info > (3, 0):
-             # API difference: Python 3's node.__str__ doesn't escape
-             #assert expected is None or isinstance(expected, unicode)
-             if isinstance(expected, bytes):
-diff --git a/test/test__init__.py b/test/test__init__.py
-index 87ec14f..8f1d749 100644
---- a/test/test__init__.py
-+++ b/test/test__init__.py
-@@ -16,7 +16,7 @@ import docutils
- import docutils.utils
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_command_line.py b/test/test_command_line.py
-index eb6ca8a..d9e0850 100644
---- a/test/test_command_line.py
-+++ b/test/test_command_line.py
-@@ -33,7 +33,7 @@ class CommandLineEncodingTests(unittest.TestCase):
-         if argv_encoding == 'ascii': # cannot test
-             return
-         sys.argv.append('--source-url=test.txt') # pure ASCII argument
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             sys.argv.append(u'--title=Dornröschen'.encode(argv_encoding))
-         else:
-             sys.argv.append(u'--title=Dornröschen')
-diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py
-index 4b337e3..d1509c6 100644
---- a/test/test_error_reporting.py
-+++ b/test/test_error_reporting.py
-@@ -25,10 +25,10 @@ instances like, e.g., ::
- unless the minimal required Python version has this problem fixed.
- """
- 
--import unittest
- import sys
- import os
- import codecs
-+import unittest
- from io import StringIO, BytesIO
- 
- import DocutilsTestSupport              # must be imported before docutils
-@@ -46,7 +46,7 @@ if sys.version_info < (3,0): # problems solved in py3k
-         print('cannot test error reporting with problematic locales,\n'
-             '`import locale` failed.')
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_functional.py b/test/test_functional.py
-index 5d3beb9..cdc75a0 100755
---- a/test/test_functional.py
-+++ b/test/test_functional.py
-@@ -160,7 +160,7 @@ expected output and check it in:
-         output = docutils.core.publish_file(**params)
-         # ensure output is unicode
-         output_encoding = params.get('output_encoding', 'utf-8')
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             try:
-                 output = output.decode(output_encoding)
-             except UnicodeDecodeError:
-@@ -172,14 +172,14 @@ expected output and check it in:
-         no_expected = self.no_expected_template % {
-             'exp': expected_path, 'out': params['destination_path']}
-         self.assertTrue(os.access(expected_path, os.R_OK), no_expected)
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             f = open(expected_path, 'r')
-         else: # samples are UTF8 encoded. 'rb' leads to errors with Python 3!
-             f = open(expected_path, 'r', encoding='utf-8')
-         # Normalize line endings:
-         expected = '\n'.join(f.read().splitlines())
-         f.close()
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             try:
-                 expected = expected.decode(output_encoding)
-             except UnicodeDecodeError:
-@@ -193,7 +193,7 @@ expected output and check it in:
-             diff = ''.join(difflib.unified_diff(
-                 expected.splitlines(True), output.splitlines(True),
-                 expected_path, params['destination_path']))
--            if sys.version_info < (3,0):
-+            if sys.version_info < (3, 0):
-                 diff = diff.encode(sys.stderr.encoding or 'ascii', 'replace')
-             print('\n%s:' % (self,), file=sys.stderr)
-             print(diff, file=sys.stderr)
-diff --git a/test/test_io.py b/test/test_io.py
-index 737a19d..6294613 100755
---- a/test/test_io.py
-+++ b/test/test_io.py
-@@ -103,7 +103,7 @@ print("hello world")
-         # if no encoding is given, try decoding with utf8:
-         input = io.FileInput(source_path='functional/input/cyrillic.txt')
-         data = input.read()
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             # in Py3k, the locale encoding is used without --input-encoding
-             # skipping the heuristic
-             self.assertEqual(input.successful_encoding, 'utf-8')
-@@ -111,7 +111,7 @@ print("hello world")
-     def test_heuristics_no_utf8(self):
-         # if no encoding is given and decoding with utf8 fails,
-         # use either the locale encoding (if specified) or latin-1:
--        if sys.version_info >= (3,0) and locale_encoding != "utf8":
-+        if sys.version_info >= (3, 0) and locale_encoding != "utf8":
-             # in Py3k, the locale encoding is used without --input-encoding
-             # skipping the heuristic unless decoding fails.
-             return
-@@ -169,7 +169,7 @@ class OutputTests(unittest.TestCase):
-         self.assertEqual(self.udrain.getvalue(), self.udata)
- 
-     def test_write_utf8(self):
--        if sys.version_info >= (3,0):
-+        if sys.version_info >= (3, 0):
-             fo = io.FileOutput(destination=self.udrain, encoding='utf8',
-                                autoclose=False)
-             fo.write(self.udata)
-@@ -189,7 +189,7 @@ class OutputTests(unittest.TestCase):
-         self.assertEqual(self.bdrain.getvalue(), self.bdata)
- 
-     # Test for Python 3 features:
--    if sys.version_info >= (3,0):
-+    if sys.version_info >= (3, 0):
-         def test_write_bytes_to_stdout(self):
-             # try writing data to `destination.buffer`, if data is
-             # instance of `bytes` and writing to `destination` fails:
-diff --git a/test/test_language.py b/test/test_language.py
-index 455357a..31ac613 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -26,7 +26,7 @@ _reporter = docutils.utils.new_reporter('', _settings)
- 
- reference_language = 'en'
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-diff --git a/test/test_nodes.py b/test/test_nodes.py
-index 6805799..ec8824e 100755
---- a/test/test_nodes.py
-+++ b/test/test_nodes.py
-@@ -17,7 +17,7 @@ from DocutilsTestSupport import nodes, utils
- 
- debug = False
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
- 
-@@ -36,7 +36,7 @@ class TextTests(unittest.TestCase):
-         self.assertEqual(self.text.shortrepr(),
-                           r"<#text: 'Line 1.\nLine 2.'>")
-         self.assertEqual(nodes.reprunicode('foo'), u'foo')
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             self.assertEqual(repr(self.unicode_text), r"<#text: 'M\xf6hren'>")
-         else:
-             self.assertEqual(repr(self.unicode_text), u"<#text: 'Möhren'>")
-@@ -65,7 +65,7 @@ class TextTests(unittest.TestCase):
-         self.assertEqual(stripped2, u's noc')
- 
-     def test_asciirestriction(self):
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             self.assertRaises(UnicodeDecodeError, nodes.Text,
-                               b'hol%s' % chr(224))
-         else:
-@@ -98,7 +98,7 @@ class ElementTests(unittest.TestCase):
-         del element['attr']
-         element['mark'] = u'\u2022'
-         self.assertEqual(repr(element), '<Element: >')
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             self.assertEqual(str(element), '<Element mark="\\u2022"/>')
-         else:
-             self.assertEqual(str(element), u'<Element mark="\u2022"/>')
-@@ -106,7 +106,7 @@ class ElementTests(unittest.TestCase):
-         self.assertEqual(dom.toxml(), u'<Element mark="\u2022"/>')
-         dom.unlink()
-         element['names'] = ['nobody', u'имя', u'näs']
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             self.assertEqual(repr(element),
-                 '<Element "nobody; \\u0438\\u043c\\u044f; n\\xe4s": >')
-         else:
-@@ -117,7 +117,7 @@ class ElementTests(unittest.TestCase):
-         element = nodes.Element('text\nmore', nodes.Text('text\nmore'))
-         uelement = nodes.Element(u'grün', nodes.Text(u'grün'))
-         self.assertEqual(repr(element), r"<Element: <#text: 'text\nmore'>>")
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             self.assertEqual(repr(uelement), "<Element: <#text: 'gr\\xfcn'>>")
-         else:
-             self.assertEqual(repr(uelement), u"<Element: <#text: 'grün'>>")
-@@ -341,7 +341,7 @@ class MiscTests(unittest.TestCase):
-         self.assertTrue(isinstance(nodes.reprunicode('foo'), unicode))
-         self.assertEqual(nodes.reprunicode('foo'), u'foo')
-         self.assertEqual(nodes.reprunicode(u'Möhre'), u'Möhre')
--        if sys.version_info < (3,0): # strip leading "u" from representation
-+        if sys.version_info < (3, 0): # strip leading "u" from representation
-             self.assertEqual(repr(nodes.reprunicode(u'Möhre')),
-                              repr(u'Möhre')[1:])
-         else: # no change to `unicode` under Python 3k
-@@ -350,7 +350,7 @@ class MiscTests(unittest.TestCase):
-     def test_ensure_str(self):
-         self.assertTrue(isinstance(nodes.ensure_str(u'über'), str))
-         self.assertEqual(nodes.ensure_str('over'), 'over')
--        if sys.version_info < (3,0): # strip leading "u" from representation
-+        if sys.version_info < (3, 0): # strip leading "u" from representation
-             self.assertEqual(nodes.ensure_str(u'über'), r'\xfcber')
-         else:
-             self.assertEqual(nodes.ensure_str(u'über'), r'über')
-diff --git a/test/test_parsers/test_parser.py b/test/test_parsers/test_parser.py
-index 6c57963..d2142b4 100644
---- a/test/test_parsers/test_parser.py
-+++ b/test/test_parsers/test_parser.py
-@@ -23,7 +23,7 @@ class RstParserTests(unittest.TestCase):
-         document = utils.new_document('test data', frontend.OptionParser(
-                     components=(parser, )).get_default_values())
- 
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             # supplying string input is supported, but only if ascii-decodable
-             self.assertRaises(UnicodeDecodeError,
-                               parser.parse, b'hol%s' % chr(224), document)
-diff --git a/test/test_parsers/test_rst/test_directives/test_include.py b/test/test_parsers/test_rst/test_directives/test_include.py
-index 92d0193..31a5c02 100755
---- a/test/test_parsers/test_rst/test_directives/test_include.py
-+++ b/test/test_parsers/test_rst/test_directives/test_include.py
-@@ -16,7 +16,7 @@ from docutils.parsers.rst import states
- from docutils.utils.code_analyzer import with_pygments
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unichr = chr  # noqa
- 
- 
-@@ -48,7 +48,7 @@ include_literal = mydir('include_literal.txt')
- utf_16_file = mydir('utf-16.csv')
- utf_16_error_str = ("UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe "
-                     "in position 0: ordinal not in range(128)")
--if sys.version_info < (3,0):
-+if sys.version_info < (3, 0):
-     utf_16_error_str = ("UnicodeError: Unable to decode input data.  "
-                         "Tried the following encodings: 'ascii'.\n"
-                         "            (%s)" % utf_16_error_str)
-diff --git a/test/test_parsers/test_rst/test_directives/test_raw.py b/test/test_parsers/test_rst/test_directives/test_raw.py
-index 2da962a..b86b23f 100755
---- a/test/test_parsers/test_rst/test_directives/test_raw.py
-+++ b/test/test_parsers/test_rst/test_directives/test_raw.py
-@@ -26,7 +26,7 @@ utf_16_file = os.path.join(mydir, 'utf-16.csv')
- utf_16_file_rel = DocutilsTestSupport.utils.relative_path(None, utf_16_file)
- utf_16_error_str = ("UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe "
-                     "in position 0: ordinal not in range(128)")
--if sys.version_info < (3,0):
-+if sys.version_info < (3, 0):
-     utf_16_error_str = ("UnicodeError: Unable to decode input data.  "
-                         "Tried the following encodings: 'ascii'.\n"
-                         "            (%s)" % utf_16_error_str)
-diff --git a/test/test_parsers/test_rst/test_directives/test_tables.py b/test/test_parsers/test_rst/test_directives/test_tables.py
-index cc450f3..ca27f9a 100755
---- a/test/test_parsers/test_rst/test_directives/test_tables.py
-+++ b/test/test_parsers/test_rst/test_directives/test_tables.py
-@@ -18,7 +18,7 @@ from docutils.parsers.rst.directives import tables
- from . import DocutilsTestSupport
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  # noqa
-     unichr = chr  # noqa
- 
-diff --git a/test/test_parsers/test_rst/test_directives/test_unicode.py b/test/test_parsers/test_rst/test_directives/test_unicode.py
-index 576bc1d..b99b5d0 100755
---- a/test/test_parsers/test_rst/test_directives/test_unicode.py
-+++ b/test/test_parsers/test_rst/test_directives/test_unicode.py
-@@ -14,7 +14,7 @@ import sys
- from . import DocutilsTestSupport
- 
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unichr = chr  # noqa
- 
- 
-diff --git a/tools/dev/create_unimap.py b/tools/dev/create_unimap.py
-index 808861d..74e8bc7 100755
---- a/tools/dev/create_unimap.py
-+++ b/tools/dev/create_unimap.py
-@@ -14,7 +14,7 @@ from xml.dom import minidom
- import sys
- import pprint
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unicode = str  #noqa
- else:
-     bytes = str  # noqa
-@@ -22,7 +22,7 @@ else:
- 
- 
- def w(s):
--    if sys.version_info >= (3,0) and isinstance(s, unicode):
-+    if sys.version_info >= (3, 0) and isinstance(s, unicode):
-         s = s.encode('utf8')
-     sys.stdout.write(s)
- 
-diff --git a/tools/dev/generate_punctuation_chars.py b/tools/dev/generate_punctuation_chars.py
-index cfe97df..9f211b9 100644
---- a/tools/dev/generate_punctuation_chars.py
-+++ b/tools/dev/generate_punctuation_chars.py
-@@ -38,7 +38,7 @@ from __future__ import print_function
- import sys
- import unicodedata
- 
--if sys.version_info >= (3,0):
-+if sys.version_info >= (3, 0):
-     unichr = chr  # unichr not available in Py3k
- else:
-     import codecs
-@@ -361,7 +361,7 @@ if __name__ == '__main__':
- # Import the punctuation_chars module from the source
- # or Py3k build path for local Python modules::
- 
--        if sys.version_info < (3,0):
-+        if sys.version_info < (3, 0):
-             sys.path.insert(0, '../../docutils')
-         else:
-             sys.path.insert(0, '../../build/lib')
-diff --git a/tools/dev/unicode2rstsubs.py b/tools/dev/unicode2rstsubs.py
-index ac38bf4..028af78 100755
---- a/tools/dev/unicode2rstsubs.py
-+++ b/tools/dev/unicode2rstsubs.py
-@@ -48,7 +48,7 @@ def main(argv=None):
-         inpath = 'unicode.xml'
-     if not os.path.isfile(inpath):
-         usage(argv[0], 1, 'No such file: "%s".' % inpath)
--    if sys.version_info >= (3,0):
-+    if sys.version_info >= (3, 0):
-         infile = open(inpath, mode='rb')
-     else:
-         infile = open(inpath)
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0020-py3-Handle-StringIO-to-io-transition.patch b/srcpkgs/python-docutils/patches/0020-py3-Handle-StringIO-to-io-transition.patch
deleted file mode 100644
index 164063dd5c3..00000000000
--- a/srcpkgs/python-docutils/patches/0020-py3-Handle-StringIO-to-io-transition.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 035c67105f3cbd12ccf6a708f38f1f7f5a17c699 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Wed, 20 Nov 2019 00:11:04 +0700
-Subject: [PATCH 20/26] py3: Handle 'StringIO' to 'io' transition.
-
-This isn't so much a rename as a migration, since things don't do the
-same thing.
-
-Based on patch by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8368 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/writers/docutils_xml.py       | 7 ++++++-
- test/test_utils.py                     | 1 +
- test/test_writers/test_docutils_xml.py | 7 ++++++-
- 3 files changed, 13 insertions(+), 2 deletions(-)
-
-diff --git a/docutils/writers/docutils_xml.py b/docutils/writers/docutils_xml.py
-index 60ee07b..51ad6bd 100644
---- a/docutils/writers/docutils_xml.py
-+++ b/docutils/writers/docutils_xml.py
-@@ -25,11 +25,16 @@ if "_xmlplus" in xml.__path__[0]: # PyXML sub-module
-     xml.__path__.reverse() # If both are available, prefer stdlib over PyXML
- 
- import xml.sax.saxutils
--from StringIO import StringIO
- 
- import docutils
- from docutils import frontend, writers, nodes
- 
-+if sys.version_info >= (3, 0):
-+    from io import StringIO  # noqa
-+else:
-+    from StringIO import StringIO  # noqa
-+
-+
- if sys.version_info >= (3, 0):
-     unicode = str  # noqa
- 
-diff --git a/test/test_utils.py b/test/test_utils.py
-index 59e29c8..cb1ec9e 100755
---- a/test/test_utils.py
-+++ b/test/test_utils.py
-@@ -13,6 +13,7 @@ import unittest
- import sys
- import os
- from DocutilsTestSupport import docutils, utils, nodes
-+
- try:
-     from io import StringIO
- except ImportError:    # io is new in Python 2.6
-diff --git a/test/test_writers/test_docutils_xml.py b/test/test_writers/test_docutils_xml.py
-index 5a6cda3..ced3473 100755
---- a/test/test_writers/test_docutils_xml.py
-+++ b/test/test_writers/test_docutils_xml.py
-@@ -15,12 +15,17 @@ Test for docutils XML writer.
- """
- from __future__ import absolute_import
- 
--from StringIO import StringIO
-+import sys
- 
- from . import DocutilsTestSupport # must be imported before docutils
- import docutils
- import docutils.core
- 
-+if sys.version_info >= (3, 0):
-+    from io import StringIO
-+else:
-+    from StringIO import StringIO
-+
- # sample strings
- # --------------
- 
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0021-Remove-auxiliary-Python-2-3-compatibility-definition.patch b/srcpkgs/python-docutils/patches/0021-Remove-auxiliary-Python-2-3-compatibility-definition.patch
deleted file mode 100644
index cea269b1b69..00000000000
--- a/srcpkgs/python-docutils/patches/0021-Remove-auxiliary-Python-2-3-compatibility-definition.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 3a610d205259bcf7f22fd8c33c78ffb70829989d Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Wed, 20 Nov 2019 00:14:11 +0700
-Subject: [PATCH 21/26] Remove auxiliary Python 2/3 compatibility definition
- module.
-
-No longer required since setting minimal supported version to 2.7.
-The remaining issues are now handled directly in the affected modules.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8369 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/_compat.py           | 24 ------------------------
- test/test_publisher.py        |  8 +++++++-
- test/test_writers/test_odt.py |  3 +--
- 3 files changed, 8 insertions(+), 27 deletions(-)
- delete mode 100644 docutils/_compat.py
-
-diff --git a/docutils/_compat.py b/docutils/_compat.py
-deleted file mode 100644
-index 1ff959c..0000000
---- a/docutils/_compat.py
-+++ /dev/null
-@@ -1,24 +0,0 @@
--# $Id: _compat.py 8164 2017-08-14 11:28:48Z milde $
--# Author: Georg Brandl <georg@python.org>
--# Copyright: This module has been placed in the public domain.
--
--"""
--Python 2/3 compatibility definitions.
--
--This module currently provides the following helper symbols:
--
--* u_prefix (unicode repr prefix: 'u' in 2.x, '' in 3.x)
--  (Required in docutils/test/test_publisher.py)
--* BytesIO (a StringIO class that works with bytestrings)
--"""
--
--import sys
--
--if sys.version_info < (3, 0):
--    u_prefix = 'u'
--    from StringIO import StringIO as BytesIO
--else:
--    u_prefix = b''
--    # using this hack since 2to3 "fixes" the relative import
--    # when using ``from io import BytesIO``
--    BytesIO = __import__('io').BytesIO
-diff --git a/test/test_publisher.py b/test/test_publisher.py
-index 04d9c71..2c3845c 100755
---- a/test/test_publisher.py
-+++ b/test/test_publisher.py
-@@ -9,10 +9,16 @@ Test the `Publisher` facade and the ``publish_*`` convenience functions.
- """
- 
- import pickle
-+import sys
-+
- import DocutilsTestSupport              # must be imported before docutils
- import docutils
- from docutils import core, nodes, io
--from docutils._compat import u_prefix
-+
-+if sys.version_info < (3, 0):
-+    u_prefix = 'u'
-+else:
-+    u_prefix = b''
- 
- 
- test_document = """\
-diff --git a/test/test_writers/test_odt.py b/test/test_writers/test_odt.py
-index a47b7fb..6ec3ef2 100755
---- a/test/test_writers/test_odt.py
-+++ b/test/test_writers/test_odt.py
-@@ -36,12 +36,11 @@ import os
- import zipfile
- from xml.dom import minidom
- import tempfile
-+from io import BytesIO
- 
- from . import DocutilsTestSupport
--
- import docutils
- import docutils.core
--from docutils._compat import BytesIO
- 
- #
- # Globals
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0022-py3-Handle-urllib-urllib2-to-urlib.-rename.patch b/srcpkgs/python-docutils/patches/0022-py3-Handle-urllib-urllib2-to-urlib.-rename.patch
deleted file mode 100644
index 0fa629ec2e9..00000000000
--- a/srcpkgs/python-docutils/patches/0022-py3-Handle-urllib-urllib2-to-urlib.-rename.patch
+++ /dev/null
@@ -1,202 +0,0 @@
-From 5ee24817411d9057c738dc1cd7cda8fc5fe03dd6 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:10:39 +0000
-Subject: [PATCH 22/26] py3: Handle 'urllib', 'urllib2' to 'urlib.*' rename
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8370 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/parsers/rst/directives/images.py | 11 +++++++++--
- docutils/parsers/rst/directives/misc.py   | 10 +++++++---
- docutils/parsers/rst/directives/tables.py | 11 ++++++++---
- docutils/utils/math/math2html.py          |  8 ++++++--
- docutils/writers/_html_base.py            |  7 +++++--
- docutils/writers/latex2e/__init__.py      |  9 +++++++--
- 6 files changed, 42 insertions(+), 14 deletions(-)
-
-diff --git a/docutils/parsers/rst/directives/images.py b/docutils/parsers/rst/directives/images.py
-index c813fa3..383075b 100644
---- a/docutils/parsers/rst/directives/images.py
-+++ b/docutils/parsers/rst/directives/images.py
-@@ -10,12 +10,13 @@ __docformat__ = 'reStructuredText'
- 
- 
- import sys
--import urllib
-+
- from docutils import nodes, utils
- from docutils.parsers.rst import Directive
- from docutils.parsers.rst import directives, states
- from docutils.nodes import fully_normalize_name, whitespace_normalize_name
- from docutils.parsers.rst.roles import set_classes
-+
- try: # check for the Python Imaging Library
-     import PIL.Image
- except ImportError:
-@@ -26,6 +27,12 @@ except ImportError:
-     except ImportError:
-         PIL = None
- 
-+if sys.version_info >= (3, 0):
-+    from urllib.request import url2pathname
-+else:
-+    from urllib import url2pathname
-+
-+
- class Image(Directive):
- 
-     align_h_values = ('left', 'center', 'right')
-@@ -125,7 +132,7 @@ class Figure(Image):
-         figure_node = nodes.figure('', image_node)
-         if figwidth == 'image':
-             if PIL and self.state.document.settings.file_insertion_enabled:
--                imagepath = urllib.url2pathname(image_node['uri'])
-+                imagepath = url2pathname(image_node['uri'])
-                 try:
-                     img = PIL.Image.open(
-                             imagepath.encode(sys.getfilesystemencoding()))
-diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py
-index 0fc3610..f22dae2 100644
---- a/docutils/parsers/rst/directives/misc.py
-+++ b/docutils/parsers/rst/directives/misc.py
-@@ -227,10 +227,14 @@ class Raw(Directive):
-             # Do not import urllib2 at the top of the module because
-             # it may fail due to broken SSL dependencies, and it takes
-             # about 0.15 seconds to load.
--            import urllib2
-+            if sys.version_info >= (3, 0):
-+                from urllib.request import urlopen
-+                from urllib.error import URLError
-+            else:
-+                from urllib2 import urlopen, URLError
-             try:
--                raw_text = urllib2.urlopen(source).read()
--            except (urllib2.URLError, IOError, OSError) as error:
-+                raw_text = urlopen(source).read()
-+            except (URLError, IOError, OSError) as error:
-                 raise self.severe(u'Problems with "%s" directive URL "%s":\n%s.'
-                     % (self.name, self.options['url'], ErrorString(error)))
-             raw_file = io.StringInput(source=raw_text, source_path=source,
-diff --git a/docutils/parsers/rst/directives/tables.py b/docutils/parsers/rst/directives/tables.py
-index b698e08..6284ab7 100644
---- a/docutils/parsers/rst/directives/tables.py
-+++ b/docutils/parsers/rst/directives/tables.py
-@@ -332,11 +332,16 @@ class CSVTable(Table):
-             # Do not import urllib2 at the top of the module because
-             # it may fail due to broken SSL dependencies, and it takes
-             # about 0.15 seconds to load.
--            import urllib2
-+            if sys.version_info >= (3, 0):
-+                from urllib.request import urlopen
-+                from urllib.error import URLError
-+            else:
-+                from urllib2 import urlopen, URLError
-+
-             source = self.options['url']
-             try:
--                csv_text = urllib2.urlopen(source).read()
--            except (urllib2.URLError, IOError, OSError, ValueError) as error:
-+                csv_text = urlopen(source).read()
-+            except (URLError, IOError, OSError, ValueError) as error:
-                 severe = self.state_machine.reporter.severe(
-                       'Problems with "%s" directive URL "%s":\n%s.'
-                       % (self.name, self.options['url'], SafeString(error)),
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index 475519f..757dec0 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -27,7 +27,11 @@ import io
- import os.path
- import sys
- import unicodedata
--import urllib
-+
-+if sys.version_info >= (3, 0):
-+    from urllib.parse import quote_plus
-+else:
-+    from urllib import quote_plus
- 
- 
- if sys.version_info >= (3, 0):
-@@ -2927,7 +2931,7 @@ class Formula(Container):
- 
-   def googlecharts(self):
-     "Make the contents using Google Charts http://code.google.com/apis/chart/."
--    url = FormulaConfig.urls['googlecharts'] + urllib.quote_plus(self.parsed)
-+    url = FormulaConfig.urls['googlecharts'] + quote_plus(self.parsed)
-     img = '<img class="chart" src="' + url + '" alt="' + self.parsed + '"/>'
-     self.contents = [Constant(img)]
- 
-diff --git a/docutils/writers/_html_base.py b/docutils/writers/_html_base.py
-index a957311..f91b06c 100644
---- a/docutils/writers/_html_base.py
-+++ b/docutils/writers/_html_base.py
-@@ -20,7 +20,6 @@
- import sys
- import os.path
- import re
--import urllib
- 
- try: # check for the Python Imaging Library
-     import PIL.Image
-@@ -39,6 +38,10 @@ from docutils.transforms import writer_aux
- from docutils.utils.math import (unichar2tex, pick_math_environment,
-                                  math2html, latex2mathml, tex2mathml_extern)
- 
-+if sys.version_info >= (3, 0):
-+    from urllib.request import url2pathname
-+else:
-+    from urllib import url2pathname
- 
- if sys.version_info >= (3, 0):
-     unicode = str  # noqa
-@@ -923,7 +926,7 @@ class HTMLTranslator(nodes.NodeVisitor):
-         if 'scale' in node:
-             if (PIL and not ('width' in node and 'height' in node)
-                 and self.settings.file_insertion_enabled):
--                imagepath = urllib.url2pathname(uri)
-+                imagepath = url2pathname(uri)
-                 try:
-                     img = PIL.Image.open(
-                             imagepath.encode(sys.getfilesystemencoding()))
-diff --git a/docutils/writers/latex2e/__init__.py b/docutils/writers/latex2e/__init__.py
-index 05b55eb..a60de48 100644
---- a/docutils/writers/latex2e/__init__.py
-+++ b/docutils/writers/latex2e/__init__.py
-@@ -17,16 +17,21 @@ import sys
- import os
- import re
- import string
--import urllib
-+
- try:
-     import roman
- except ImportError:
-     import docutils.utils.roman as roman
-+
- from docutils import frontend, nodes, languages, writers, utils, io
- from docutils.utils.error_reporting import SafeString
- from docutils.transforms import writer_aux
- from docutils.utils.math import pick_math_environment, unichar2tex
- 
-+if sys.version_info >= (3, 0):
-+    from urllib.request import url2pathname
-+else:
-+    from urllib import url2pathname
- 
- if sys.version_info >= (3, 0):
-     unicode = str  # noqa
-@@ -2369,7 +2374,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
-         self.requirements['graphicx'] = self.graphicx_package
-         attrs = node.attributes
-         # Convert image URI to a local file path
--        imagepath = urllib.url2pathname(attrs['uri']).replace('\\', '/')
-+        imagepath = url2pathname(attrs['uri']).replace('\\', '/')
-         # alignment defaults:
-         if not 'align' in attrs:
-             # Set default align of image in a figure to 'center'
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0023-py3-Fix-magic-methods.patch b/srcpkgs/python-docutils/patches/0023-py3-Fix-magic-methods.patch
deleted file mode 100644
index c8aae35ae7a..00000000000
--- a/srcpkgs/python-docutils/patches/0023-py3-Fix-magic-methods.patch
+++ /dev/null
@@ -1,352 +0,0 @@
-From 0a68965b7f5880aeb8642a081ff5ebd86a0d1c4e Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:10:52 +0000
-Subject: [PATCH 23/26] py3: Fix magic methods
-
-Python 3 uses '__bool__' and '__next__', where Python 2 used
-'__nonzero__' and 'next'. Use the new names but add aliases.
-
-Based on patch by Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8371 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/nodes.py                |  8 +--
- docutils/utils/math/math2html.py | 93 +++++++++++++++++++++++++++-----
- docutils/writers/manpage.py      |  6 ++-
- 3 files changed, 89 insertions(+), 18 deletions(-)
-
-diff --git a/docutils/nodes.py b/docutils/nodes.py
-index dd9c4b6..6fffa56 100644
---- a/docutils/nodes.py
-+++ b/docutils/nodes.py
-@@ -53,7 +53,7 @@ class Node(object):
-     line = None
-     """The line number (1-based) of the beginning of this Node in `source`."""
- 
--    def __nonzero__(self):
-+    def __bool__(self):
-         """
-         Node instances are always true, even if they're empty.  A node is more
-         than a simple container.  Its boolean "truth" does not depend on
-@@ -64,6 +64,9 @@ class Node(object):
-         """
-         return True
- 
-+    if sys.version_info < (3, 0):
-+        __nonzero__ = __bool__
-+
-     if sys.version_info < (3, 0):
-         # on 2.x, str(node) will be a byte string with Unicode
-         # characters > 255 escaped; on 3.x this is no longer necessary
-@@ -544,8 +547,7 @@ class Element(Node):
-         else:
-             return self.emptytag()
- 
--    if sys.version_info > (3, 0):
--        # 2to3 doesn't convert __unicode__ to __str__
-+    if sys.version_info >= (3, 0):
-         __str__ = __unicode__
- 
-     def starttag(self, quoteattr=None):
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index 757dec0..a7e2aed 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -1313,6 +1313,9 @@ class BranchOptions(object):
-     "String representation"
-     return 'options for ' + self.name + ': ' + unicode(self.options)
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
- 
- class Cloner(object):
-   "An object used to clone other objects."
-@@ -1453,6 +1456,10 @@ class Parser(object):
-     "Return a description"
-     return self.__class__.__name__ + ' (' + unicode(self.begin) + ')'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class LoneCommand(Parser):
-   "A parser for just one command line"
- 
-@@ -1986,6 +1993,10 @@ class EndingList(object):
-       string = string[:-1]
-     return string + ']'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class PositionEnding(object):
-   "An ending for a parsing position"
- 
-@@ -2004,6 +2015,8 @@ class PositionEnding(object):
-       string += ' (optional)'
-     return string
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
- 
- 
- class Position(Globable):
-@@ -2046,11 +2059,14 @@ class Position(Globable):
-     self.skip(current)
-     return current
- 
--  def next(self):
-+  def __next__(self):
-     "Advance the position and return the next character."
-     self.skipcurrent()
-     return self.current()
- 
-+  if sys.version_info < (3, 0):
-+      next = __next__
-+
-   def checkskip(self, string):
-     "Check for a string at the given position; if there, skip it"
-     if not self.checkfor(string):
-@@ -2312,6 +2328,10 @@ class Container(object):
-       return self.__class__.__name__
-     return self.__class__.__name__ + '@' + unicode(self.begin)
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class BlackBox(Container):
-   "A container that does not output anything"
- 
-@@ -2370,7 +2390,7 @@ class StringContainer(Container):
-   def extracttext(self):
-     "Return all text."
-     return self.string
--  
-+
-   def __unicode__(self):
-     "Return a printable representation."
-     result = 'StringContainer'
-@@ -2381,6 +2401,10 @@ class StringContainer(Container):
-       ellipsis = ''
-     return result + ' (' + self.string.strip()[:15] + ellipsis + ')'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class Constant(StringContainer):
-   "A constant string"
- 
-@@ -2392,6 +2416,10 @@ class Constant(StringContainer):
-   def __unicode__(self):
-     return 'Constant: ' + self.string
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class TaggedText(Container):
-   "Text inside a tag"
- 
-@@ -2421,9 +2449,8 @@ class TaggedText(Container):
-       return 'Tagged <unknown tag>'
-     return 'Tagged <' + self.output.tag + '>'
- 
--
--
--
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
- 
- 
- class DocumentParameters(object):
-@@ -2555,19 +2582,12 @@ class MacroParser(FormulaParser):
-     "See if the formula is inlined"
-     self.begin = reader.linenumber + 1
-     return ['inline']
--  
-+
-   def parse(self, reader):
-     "Parse the formula until the end"
-     formula = self.parsemultiliner(reader, self.parent.start, self.ending)
-     reader.nextline()
-     return formula
--  
--
--
--
--
--
--
- 
- 
- class FormulaBit(Container):
-@@ -2614,6 +2634,10 @@ class FormulaBit(Container):
-     "Get a string representation"
-     return self.__class__.__name__ + ' read in ' + self.original
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class TaggedBit(FormulaBit):
-   "A tagged string in a formula"
- 
-@@ -2656,6 +2680,10 @@ class FormulaConstant(Constant):
-     "Return a printable representation."
-     return 'Formula constant: ' + self.string
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class RawText(FormulaBit):
-   "A bit of text inside a formula"
- 
-@@ -2739,6 +2767,10 @@ class WhiteSpace(FormulaBit):
-     "Return a printable representation."
-     return 'Whitespace: *' + self.original + '*'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class Bracket(FormulaBit):
-   "A {} bracket inside a formula"
- 
-@@ -2822,7 +2854,6 @@ class SquareBracket(Bracket):
-     return bracket
- 
- 
--
- class MathsProcessor(object):
-   "A processor for a maths construction inside the FormulaProcessor."
- 
-@@ -2834,6 +2865,10 @@ class MathsProcessor(object):
-     "Return a printable description."
-     return 'Maths processor ' + self.__class__.__name__
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class FormulaProcessor(object):
-   "A processor specifically for formulas."
- 
-@@ -2997,6 +3032,10 @@ class Formula(Container):
-       return 'Formula (' + self.partkey.number + ')'
-     return 'Unnumbered formula'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class WholeFormula(FormulaBit):
-   "Parse a whole formula"
- 
-@@ -3229,6 +3268,10 @@ class NumberCounter(object):
-       result += ' in mode ' + self.mode
-     return result
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class DependentCounter(NumberCounter):
-   "A counter which depends on another one (the master)."
- 
-@@ -3780,6 +3823,10 @@ class Link(Container):
-       result += ' to ' + self.url
-     return result
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class URL(Link):
-   "A clickable URL"
- 
-@@ -3948,6 +3995,10 @@ class Label(Link):
-       return 'Unnamed label'
-     return 'Label ' + self.key
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class Reference(Link):
-   "A reference to a label."
- 
-@@ -4008,6 +4059,8 @@ class Reference(Link):
-     "Return a printable representation."
-     return 'Reference ' + self.key
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
- 
- 
- class FormulaCommand(FormulaBit):
-@@ -4630,6 +4683,10 @@ class LimitPreviousCommand(LimitCommand):
-     "Return a printable representation."
-     return 'Limit previous command'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class LimitsProcessor(MathsProcessor):
-   "A processor for limits inside an element."
- 
-@@ -4854,6 +4911,10 @@ class ParameterDefinition(object):
-       result += ' (empty)'
-     return result
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- class ParameterFunction(CommandBit):
-   "A function with a variable number of parameters defined in a template."
-   "The parameters are defined as a parameter definition."
-@@ -5306,6 +5367,10 @@ class FormulaMacro(Formula):
-     "Return a printable representation."
-     return 'Math macro'
- 
-+  if sys.version_info >= (3, 0):
-+    __str__ = __unicode__
-+
-+
- FormulaFactory.types += [ MacroParameter ]
- 
- FormulaCommand.types += [
-diff --git a/docutils/writers/manpage.py b/docutils/writers/manpage.py
-index df4f1a3..9809dd4 100644
---- a/docutils/writers/manpage.py
-+++ b/docutils/writers/manpage.py
-@@ -331,7 +331,7 @@ class Translator(nodes.NodeVisitor):
-                 elif style.endswith('roman'):
-                     self._indent = 5
- 
--            def next(self):
-+            def __next__(self):
-                 if self._style == 'bullet':
-                     return self.enum_style[self._style]
-                 elif self._style == 'emdash':
-@@ -349,6 +349,10 @@ class Translator(nodes.NodeVisitor):
-                     return res.lower()
-                 else:
-                     return "%d." % self._cnt
-+
-+            if sys.version_info < (3, 0):
-+                next = __next__
-+
-             def get_width(self):
-                 return self._indent
-             def __repr__(self):
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0024-py3-Wrap-foo.keys-zip-foo-bar-in-list.patch b/srcpkgs/python-docutils/patches/0024-py3-Wrap-foo.keys-zip-foo-bar-in-list.patch
deleted file mode 100644
index b84a9dc6e5b..00000000000
--- a/srcpkgs/python-docutils/patches/0024-py3-Wrap-foo.keys-zip-foo-bar-in-list.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-From 7e601f5444051a78c0dc3fd6e3676193e7a30076 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:11:15 +0000
-Subject: [PATCH 24/26] py3: Wrap 'foo.keys()', 'zip(foo, bar') in 'list'
-
-In Python 3, 'dict.keys()', 'zip' and 'map' no longer return a list but
-rather types 'dict_keys', 'zip' and 'map', respectively. You can't
-append to these types nor can you delete from them while in a loop.  The
-simple solution to both issues is to wrap things in 'list'.
-
-Signed-off-by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8372 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/parsers/rst/tableparser.py  | 2 +-
- docutils/statemachine.py             | 2 +-
- docutils/utils/__init__.py           | 2 +-
- docutils/utils/math/math2html.py     | 2 +-
- docutils/writers/odf_odt/__init__.py | 3 +--
- test/DocutilsTestSupport.py          | 2 +-
- test/test_functional.py              | 2 +-
- test/test_language.py                | 2 +-
- test/test_statemachine.py            | 2 +-
- 9 files changed, 9 insertions(+), 10 deletions(-)
-
-diff --git a/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
-index 937aec8..408d6d8 100644
---- a/docutils/parsers/rst/tableparser.py
-+++ b/docutils/parsers/rst/tableparser.py
-@@ -290,7 +290,7 @@ class GridTableParser(TableParser):
-         rowindex = {}
-         for i in range(len(rowseps)):
-             rowindex[rowseps[i]] = i    # row boundary -> row number mapping
--        colseps = self.colseps.keys()   # list of column boundaries
-+        colseps = list(self.colseps.keys())   # list of column boundaries
-         colseps.sort()
-         colindex = {}
-         for i in range(len(colseps)):
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 6bc03f5..0cbf9d3 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -1297,7 +1297,7 @@ class ViewList(object):
-         self.parent = None
- 
-     def sort(self, *args):
--        tmp = zip(self.data, self.items)
-+        tmp = list(zip(self.data, self.items))
-         tmp.sort(*args)
-         self.data = [entry[0] for entry in tmp]
-         self.items = [entry[1] for entry in tmp]
-diff --git a/docutils/utils/__init__.py b/docutils/utils/__init__.py
-index cc1fd1a..437456b 100644
---- a/docutils/utils/__init__.py
-+++ b/docutils/utils/__init__.py
-@@ -618,7 +618,7 @@ def column_indices(text):
-     """
-     # TODO: account for asian wide chars here instead of using dummy
-     # replacements in the tableparser?
--    string_indices = range(len(text))
-+    string_indices = list(range(len(text)))
-     for index in find_combining_chars(text):
-         string_indices[index] = None
-     return [i for i in string_indices if i is not None]
-diff --git a/docutils/utils/math/math2html.py b/docutils/utils/math/math2html.py
-index a7e2aed..53dd836 100644
---- a/docutils/utils/math/math2html.py
-+++ b/docutils/utils/math/math2html.py
-@@ -2819,7 +2819,7 @@ class Bracket(FormulaBit):
- 
-   def innertext(self, pos):
-     "Parse some text inside the bracket, following textual rules."
--    specialchars = FormulaConfig.symbolfunctions.keys()
-+    specialchars = list(FormulaConfig.symbolfunctions.keys())
-     specialchars.append(FormulaConfig.starts['command'])
-     specialchars.append(FormulaConfig.starts['bracket'])
-     specialchars.append(Comment.start)
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index c79d4c1..ad32613 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -1169,8 +1169,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
-             fin = os.popen("paperconf -s 2> /dev/null")
-             content = fin.read()
-             content = content.split()
--            content = map(float, content)
--            content = list(content)
-+            content = list(map(float, content))
-             w, h = content
-         except (IOError, ValueError):
-             w, h = 612, 792     # default to Letter
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 47ba83c..222c202 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -811,7 +811,7 @@ class HtmlWriterPublishPartsTestCase(WriterPublishTestCase):
-         parts['html_prolog'] = parts['html_prolog'].replace(
-             self.standard_html_prolog, '')
-         # remove empty values:
--        for key in parts.keys():
-+        for key in list(parts.keys()):
-             if not parts[key]:
-                 del parts[key]
-         # standard output format:
-diff --git a/test/test_functional.py b/test/test_functional.py
-index cdc75a0..b02c250 100755
---- a/test/test_functional.py
-+++ b/test/test_functional.py
-@@ -152,7 +152,7 @@ expected output and check it in:
-         del params['test_source']
-         del params['test_destination']
-         # Delete private stuff like params['__builtins__']:
--        for key in params.keys():
-+        for key in list(params.keys()):
-             if key.startswith('_'):
-                 del params[key]
-         # Get output (automatically written to the output/ directory
-diff --git a/test/test_language.py b/test/test_language.py
-index 31ac613..48cd06b 100755
---- a/test/test_language.py
-+++ b/test/test_language.py
-@@ -52,7 +52,7 @@ class LanguageTestSuite(DocutilsTestSupport.CustomTestSuite):
-             match = self.language_module_pattern.match(mod)
-             if match:
-                 languages[match.group(1)] = 1
--        self.languages = languages.keys()
-+        self.languages = list(languages.keys())
-         # test language tag normalization:
-         self.languages += ['en_gb', 'en_US', 'en-CA', 'de-DE', 'de-AT-1901',
-                            'pt-BR', 'pt-foo-BR']
-diff --git a/test/test_statemachine.py b/test/test_statemachine.py
-index 6352ca4..87f5710 100755
---- a/test/test_statemachine.py
-+++ b/test/test_statemachine.py
-@@ -152,7 +152,7 @@ class SMWSTests(unittest.TestCase):
-         self.sm.unlink()
- 
-     def test___init__(self):
--        self.assertEqual(self.sm.states.keys(), ['MockState'])
-+        self.assertEqual(list(self.sm.states.keys()), ['MockState'])
-         self.assertEqual(len(self.sm.states['MockState'].transitions), 4)
- 
-     def test_get_indented(self):
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0025-Simplify-code.patch b/srcpkgs/python-docutils/patches/0025-Simplify-code.patch
deleted file mode 100644
index 05092a8f4e1..00000000000
--- a/srcpkgs/python-docutils/patches/0025-Simplify-code.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From 1d4c3d48fd9a5606925562c1c97e67332578cc65 Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:11:30 +0000
-Subject: [PATCH 25/26] Simplify code.
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8373 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/parsers/rst/tableparser.py  |  3 +--
- docutils/statemachine.py             |  3 +--
- docutils/writers/odf_odt/__init__.py |  6 ++----
- test/DocutilsTestSupport.py          | 10 +++-------
- 4 files changed, 7 insertions(+), 15 deletions(-)
-
-diff --git a/docutils/parsers/rst/tableparser.py b/docutils/parsers/rst/tableparser.py
-index 408d6d8..64a192f 100644
---- a/docutils/parsers/rst/tableparser.py
-+++ b/docutils/parsers/rst/tableparser.py
-@@ -290,8 +290,7 @@ class GridTableParser(TableParser):
-         rowindex = {}
-         for i in range(len(rowseps)):
-             rowindex[rowseps[i]] = i    # row boundary -> row number mapping
--        colseps = list(self.colseps.keys())   # list of column boundaries
--        colseps.sort()
-+        colseps = sorted(self.colseps.keys())   # list of column boundaries
-         colindex = {}
-         for i in range(len(colseps)):
-             colindex[colseps[i]] = i    # column boundary -> col number map
-diff --git a/docutils/statemachine.py b/docutils/statemachine.py
-index 0cbf9d3..ebb52ad 100644
---- a/docutils/statemachine.py
-+++ b/docutils/statemachine.py
-@@ -1297,8 +1297,7 @@ class ViewList(object):
-         self.parent = None
- 
-     def sort(self, *args):
--        tmp = list(zip(self.data, self.items))
--        tmp.sort(*args)
-+        tmp = sorted(zip(self.data, self.items), *args)
-         self.data = [entry[0] for entry in tmp]
-         self.items = [entry[1] for entry in tmp]
-         self.parent = None
-diff --git a/docutils/writers/odf_odt/__init__.py b/docutils/writers/odf_odt/__init__.py
-index ad32613..d03f8e0 100644
---- a/docutils/writers/odf_odt/__init__.py
-+++ b/docutils/writers/odf_odt/__init__.py
-@@ -1167,10 +1167,8 @@ class ODFTranslator(nodes.GenericNodeVisitor):
-     def setup_paper(self, root_el):
-         try:
-             fin = os.popen("paperconf -s 2> /dev/null")
--            content = fin.read()
--            content = content.split()
--            content = list(map(float, content))
--            w, h = content
-+            dimensions = fin.read().split()
-+            w, h = (float(s) for s in dimensions)
-         except (IOError, ValueError):
-             w, h = 612, 792     # default to Letter
-         finally:
-diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py
-index 222c202..5e9fed9 100644
---- a/test/DocutilsTestSupport.py
-+++ b/test/DocutilsTestSupport.py
-@@ -810,14 +810,10 @@ class HtmlWriterPublishPartsTestCase(WriterPublishTestCase):
-             self.standard_html_meta_value, '...')
-         parts['html_prolog'] = parts['html_prolog'].replace(
-             self.standard_html_prolog, '')
--        # remove empty values:
--        for key in list(parts.keys()):
--            if not parts[key]:
--                del parts[key]
--        # standard output format:
--        keys = sorted(parts.keys())
-         output = []
--        for key in keys:
-+        for key in sorted(parts.keys()):
-+            if not parts[key]:
-+                continue
-             output.append("%r: '''%s'''"
-                           % (key, parts[key]))
-             if output[-1].endswith("\n'''"):
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/0026-py3-Handle-os.getcwdu-to-os.getcwd-rename.patch b/srcpkgs/python-docutils/patches/0026-py3-Handle-os.getcwdu-to-os.getcwd-rename.patch
deleted file mode 100644
index fd46368beb2..00000000000
--- a/srcpkgs/python-docutils/patches/0026-py3-Handle-os.getcwdu-to-os.getcwd-rename.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From e90cfe945193ac99cc9ac7a439d1ccc2ad857a6c Mon Sep 17 00:00:00 2001
-From: Stephen Finucane <stephen@that.guru>
-Date: Tue, 27 Aug 2019 12:11:40 +0000
-Subject: [PATCH 26/26] py3: Handle 'os.getcwdu' to 'os.getcwd' rename
-
-We don't need to do the reverse since none of the callers seems to care.
-
-Based on patch by: Stephen Finucane <stephen@that.guru>
-
-git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8374 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-Signed-off-by: Doan Tran Cong Danh <congdanhqx@gmail.com>
----
- docutils/frontend.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/docutils/frontend.py b/docutils/frontend.py
-index 7bfff6a..372ca44 100644
---- a/docutils/frontend.py
-+++ b/docutils/frontend.py
-@@ -38,8 +38,10 @@ import optparse
- from optparse import SUPPRESS_HELP
- if sys.version_info >= (3, 0):
-     from configparser import RawConfigParser
-+    from os import getcwd
- else:
-     from ConfigParser import RawConfigParser
-+    from os import getcwdu as getcwd
- 
- import docutils
- import docutils.utils
-@@ -256,7 +258,7 @@ def make_paths_absolute(pathdict, keys, base_path=None):
-     `OptionParser.relative_path_settings`.
-     """
-     if base_path is None:
--        base_path = os.getcwdu() # type(base_path) == unicode
-+        base_path = os.getcwd() # type(base_path) == unicode
-         # to allow combining non-ASCII cwd with unicode values in `pathdict`
-     for key in keys:
-         if key in pathdict:
--- 
-2.24.0.375.geb5ae68d41
-
diff --git a/srcpkgs/python-docutils/patches/test-import.patch b/srcpkgs/python-docutils/patches/test-import.patch
new file mode 100644
index 00000000000..12c22971680
--- /dev/null
+++ b/srcpkgs/python-docutils/patches/test-import.patch
@@ -0,0 +1,20 @@
+--- test/DocutilsTestSupport.py
++++ test/DocutilsTestSupport.py
+@@ -51,14 +51,9 @@
+ 
+ testroot = os.path.abspath(os.path.dirname(__file__) or os.curdir)
+ os.chdir(testroot)
+-if sys.version_info >= (3, 0):
+-    sys.path.insert(0, os.path.normpath(os.path.join(testroot,
+-                                                     '..', 'build', 'lib')))
+-    sys.path.append(os.path.normpath(os.path.join(testroot, '..',
+-                                                  'build', 'lib', 'extras')))
+-else:
+-    sys.path.insert(0, os.path.normpath(os.path.join(testroot, '..')))
+-    sys.path.append(os.path.normpath(os.path.join(testroot, '..', 'extras')))
++builddir = 'build-%d.%d' % (sys.version_info.major, sys.version_info.minor)
++sys.path.insert(0, os.path.normpath(os.path.join(testroot, '..', builddir, 'lib')))
++sys.path.append(os.path.normpath(os.path.join(testroot, '..', builddir, 'lib', 'extras')))
+ sys.path.insert(0, testroot)
+ 
+ try:
diff --git a/srcpkgs/python-docutils/template b/srcpkgs/python-docutils/template
index a4c0bb915e0..c775fd19973 100644
--- a/srcpkgs/python-docutils/template
+++ b/srcpkgs/python-docutils/template
@@ -1,7 +1,7 @@
 # Template file for 'python-docutils'
 pkgname=python-docutils
-version=0.15.2
-revision=3
+version=0.16rc1
+revision=1
 archs=noarch
 wrksrc="docutils-${version}"
 build_style=python-module
@@ -14,9 +14,8 @@ maintainer="Alessio Sergi <al3hex@gmail.com>"
 license="custom:Public Domain, BSD-2-Clause, GPL-3.0-or-later, Python-2.0"
 homepage="http://docutils.sourceforge.net"
 distfiles="${PYPI_SITE}/d/docutils/docutils-${version}.tar.gz"
-checksum=a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99
+checksum=d33b326920f238f2149951e0f2ca0513ea660217b07fe63cb8c5e74e78b3114f
 checkdepends+="$depends python3-Pygments"
-patch_args="-Np1"
 
 alternatives="
  docutils:rst2html:/usr/bin/rst2html.py2
@@ -32,6 +31,11 @@ alternatives="
  docutils:rst2xml:/usr/bin/rst2xml.py2
  docutils:rstpep2html:/usr/bin/rstpep2html.py2"
 
+do_check() {
+	cd test
+	python3 alltests.py
+}
+
 post_install() {
 	vlicense COPYING.txt COPYING
 }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PR PATCH] [Closed]: python-docutils: update to 0.16rc1.
  2019-12-25  6:09 [PR PATCH] python-docutils: update to 0.16rc1 voidlinux-github
@ 2020-01-18  9:10 ` voidlinux-github
  0 siblings, 0 replies; 2+ messages in thread
From: voidlinux-github @ 2020-01-18  9:10 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 235 bytes --]

There's a closed pull request on the void-packages repository

python-docutils: update to 0.16rc1.
https://github.com/void-linux/void-packages/pull/17768

Description:
- python3 check passed
- python 2 check failed for some testcases

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-01-18  9:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-25  6:09 [PR PATCH] python-docutils: update to 0.16rc1 voidlinux-github
2020-01-18  9:10 ` [PR PATCH] [Closed]: " voidlinux-github

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).