diff --git a/README.rst b/README.rst index 94833bc..25fdc64 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ mwparserfromhell that provides an easy-to-use and outrageously powerful parser for MediaWiki_ wikicode. It supports Python 2 and Python 3. -Developed by Earwig_ and named by `Σ`_. +Developed by Earwig_ with help from `Σ`_. Installation ------------ diff --git a/mwparserfromhell/compat.py b/mwparserfromhell/compat.py index 8b3b611..aa5a007 100755 --- a/mwparserfromhell/compat.py +++ b/mwparserfromhell/compat.py @@ -1,16 +1,25 @@ # -*- coding: utf-8 -*- +""" +Implements support for both Python 2 and Python 3. +""" + import sys -v = sys.version_info[0] +py3k = sys.version_info.major == 3 -if v >= 3: +if py3k: bytes = bytes str = str - basestring = (str, bytes) - import html.entities as htmlentitydefs + basestring = str + maxsize = sys.maxsize + import html.entities as htmlentities + else: bytes = str str = unicode basestring = basestring - import htmlentitydefs \ No newline at end of file + maxsize = sys.maxint + import htmlentitydefs as htmlentities + +del sys diff --git a/mwparserfromhell/smart_list.py b/mwparserfromhell/smart_list.py index c6b484f..d510fa0 100644 --- a/mwparserfromhell/smart_list.py +++ b/mwparserfromhell/smart_list.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import sys +from .compat import maxsize, py3k __all__ = ["SmartList"] @@ -50,7 +50,7 @@ class SmartList(list): for child, (start, stop, step) in self._children.itervalues(): if start >= key.stop: self._children[id(child)][1][0] += diff - if stop >= key.stop and stop != sys.maxint: + if stop >= key.stop and stop != maxsize: self._children[id(child)][1][1] += diff def __delitem__(self, key): @@ -64,14 +64,15 @@ class SmartList(list): if stop >= key.stop: self._children[id(child)][1][1] -= diff - def __getslice__(self, start, stop): - return self.__getitem__(slice(start, stop)) + if not py3k: + def __getslice__(self, start, stop): + return self.__getitem__(slice(start, stop)) - def __setslice__(self, start, stop, iterable): - self.__setitem__(slice(start, stop), iterable) + def __setslice__(self, start, stop, iterable): + self.__setitem__(slice(start, stop), iterable) - def __delslice__(self, start, stop): - self.__delitem__(slice(start, stop)) + def __delslice__(self, start, stop): + self.__delitem__(slice(start, stop)) def __add__(self, other): return SmartList(list(self) + other) @@ -165,8 +166,12 @@ class _ListProxy(list): return self._render() >= list(other) return self._render() >= other - def __nonzero__(self): - return bool(self._render()) + if py3k: + def __bool__(self): + return bool(self._render()) + else: + def __nonzero__(self): + return bool(self._render()) def __len__(self): return (self._stop - self._start) / self._step @@ -205,14 +210,15 @@ class _ListProxy(list): def __contains__(self, item): return item in self._render() - def __getslice__(self, start, stop): - return self.__getitem__(slice(start, stop)) + if not py3k: + def __getslice__(self, start, stop): + return self.__getitem__(slice(start, stop)) - def __setslice__(self, start, stop, iterable): - self.__setitem__(slice(start, stop), iterable) + def __setslice__(self, start, stop, iterable): + self.__setitem__(slice(start, stop), iterable) - def __delslice__(self, start, stop): - self.__delitem__(slice(start, stop)) + def __delslice__(self, start, stop): + self.__delitem__(slice(start, stop)) def __add__(self, other): return SmartList(list(self) + other) diff --git a/mwparserfromhell/string_mixin.py b/mwparserfromhell/string_mixin.py index 99981ae..da83d2f 100644 --- a/mwparserfromhell/string_mixin.py +++ b/mwparserfromhell/string_mixin.py @@ -21,26 +21,30 @@ # SOFTWARE. from __future__ import unicode_literals -from .compat import str, bytes, v + +from .compat import py3k, str __all__ = ["StringMixIn"] def inheritdoc(method): - try: - method.__doc__ = getattr(str, method.__name__).__doc__ - except AttributeError: - method.__doc__ = "This feature is only available on Python 2." + method.__doc__ = getattr(str, method.__name__).__doc__ return method class StringMixIn(object): - if v >= 3: - def __str__(self): - return self.__unicode__() + if py3k: + def __str__(self): + return self.__unicode__() + + def __bytes__(self): + return self.__unicode__().encode("utf8") else: def __str__(self): return self.__unicode__().encode("utf8") + def __unicode__(self): + raise NotImplementedError() + def __repr__(self): return repr(self.__unicode__()) @@ -74,11 +78,12 @@ class StringMixIn(object): return self.__unicode__() >= other.__unicode__() return self.__unicode__() >= other - def __nonzero__(self): - return bool(self.__unicode__()) - - def __unicode__(self): - raise NotImplementedError() + if py3k: + def __bool__(self): + return bool(self.__unicode__()) + else: + def __nonzero__(self): + return bool(self.__unicode__()) def __len__(self): return len(self.__unicode__()) @@ -92,7 +97,7 @@ class StringMixIn(object): def __contains__(self, item): if isinstance(item, StringMixIn): - return unicode(item) in self.__unicode__() + return str(item) in self.__unicode__() return item in self.__unicode__() @inheritdoc @@ -107,9 +112,10 @@ class StringMixIn(object): def count(self, sub=None, start=None, end=None): return self.__unicode__().count(sub, start, end) - @inheritdoc - def decode(self, encoding=None, errors=None): - return self.__unicode__().decode(encoding, errors) + if not py3k: + @inheritdoc + def decode(self, encoding=None, errors=None): + return self.__unicode__().decode(encoding, errors) @inheritdoc def encode(self, encoding=None, errors=None): diff --git a/mwparserfromhell/utils.py b/mwparserfromhell/utils.py index b92609a..9793f4f 100644 --- a/mwparserfromhell/utils.py +++ b/mwparserfromhell/utils.py @@ -23,21 +23,24 @@ from __future__ import unicode_literals import mwparserfromhell +from .compat import basestring, bytes, str from .nodes import Node from .smart_list import SmartList -from .compat import str, bytes, basestring def parse_anything(value): wikicode = mwparserfromhell.wikicode.Wikicode if isinstance(value, wikicode): return value - if isinstance(value, Node): + elif isinstance(value, Node): return wikicode(SmartList([value])) - if isinstance(value, basestring): + elif isinstance(value, basestring): return mwparserfromhell.parse(value) - if isinstance(value, int): + elif isinstance(value, bytes): + # This should only happen in py3k when bytes is not in basestring: + return mwparserfromhell.parse(value.decode("utf8")) + elif isinstance(value, int): return mwparserfromhell.parse(str(value)) - if value is None: + elif value is None: return wikicode(SmartList()) try: nodelist = SmartList()