Adding Python 3 support experimentally (#1)tags/v0.1
| @@ -2,5 +2,6 @@ | |||||
| *.egg | *.egg | ||||
| *.egg-info | *.egg-info | ||||
| .DS_Store | .DS_Store | ||||
| __pycache__ | |||||
| build | build | ||||
| docs/_build | docs/_build | ||||
| @@ -20,7 +20,10 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from ...string_mixin import StringMixIn | from ...string_mixin import StringMixIn | ||||
| from ...compat import str, bytes | |||||
| __all__ = ["Attribute"] | __all__ = ["Attribute"] | ||||
| @@ -34,9 +37,9 @@ class Attribute(StringMixIn): | |||||
| def __unicode__(self): | def __unicode__(self): | ||||
| if self.value: | if self.value: | ||||
| if self.quoted: | if self.quoted: | ||||
| return unicode(self.name) + '="' + unicode(self.value) + '"' | |||||
| return unicode(self.name) + "=" + unicode(self.value) | |||||
| return unicode(self.name) | |||||
| return str(self.name) + '="' + str(self.value) + '"' | |||||
| return str(self.name) + "=" + str(self.value) | |||||
| return str(self.name) | |||||
| @property | @property | ||||
| def name(self): | def name(self): | ||||
| @@ -20,8 +20,11 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from ...string_mixin import StringMixIn | from ...string_mixin import StringMixIn | ||||
| from ...utils import parse_anything | from ...utils import parse_anything | ||||
| from ...compat import str, bytes | |||||
| __all__ = ["Parameter"] | __all__ = ["Parameter"] | ||||
| @@ -34,8 +37,8 @@ class Parameter(StringMixIn): | |||||
| def __unicode__(self): | def __unicode__(self): | ||||
| if self.showkey: | if self.showkey: | ||||
| return unicode(self.name) + "=" + unicode(self.value) | |||||
| return unicode(self.value) | |||||
| return str(self.name) + "=" + str(self.value) | |||||
| return str(self.value) | |||||
| @property | @property | ||||
| def name(self): | def name(self): | ||||
| @@ -20,9 +20,10 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| import htmlentitydefs | |||||
| from __future__ import unicode_literals | |||||
| from . import Node | from . import Node | ||||
| from ..compat import str, bytes, htmlentitydefs | |||||
| __all__ = ["HTMLEntity"] | __all__ = ["HTMLEntity"] | ||||
| @@ -50,10 +51,10 @@ class HTMLEntity(Node): | |||||
| def __unicode__(self): | def __unicode__(self): | ||||
| if self.named: | if self.named: | ||||
| return u"&{0};".format(self.value) | |||||
| return "&{0};".format(self.value) | |||||
| if self.hexadecimal: | if self.hexadecimal: | ||||
| return u"&#{0}{1};".format(self.hex_char, self.value) | |||||
| return u"&#{0};".format(self.value) | |||||
| return "&#{0}{1};".format(self.hex_char, self.value) | |||||
| return "&#{0};".format(self.value) | |||||
| def __strip__(self, normalize, collapse): | def __strip__(self, normalize, collapse): | ||||
| if normalize: | if normalize: | ||||
| @@ -71,7 +72,7 @@ class HTMLEntity(Node): | |||||
| except ValueError: | except ValueError: | ||||
| # Test whether we're on the wide or narrow Python build. Check the | # Test whether we're on the wide or narrow Python build. Check the | ||||
| # length of a non-BMP code point (U+1F64A, SPEAK-NO-EVIL MONKEY): | # length of a non-BMP code point (U+1F64A, SPEAK-NO-EVIL MONKEY): | ||||
| if len(u"\U0001F64A") == 2: | |||||
| if len("\U0001F64A") == 2: | |||||
| # Ensure this is within the range we can encode: | # Ensure this is within the range we can encode: | ||||
| if value > 0x10FFFF: | if value > 0x10FFFF: | ||||
| raise ValueError("unichr() arg not in range(0x110000)") | raise ValueError("unichr() arg not in range(0x110000)") | ||||
| @@ -20,7 +20,10 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from . import Node, Text | from . import Node, Text | ||||
| from ..compat import str, bytes | |||||
| __all__ = ["Tag"] | __all__ = ["Tag"] | ||||
| @@ -92,7 +95,7 @@ class Tag(Node): | |||||
| result = "<" + unicode(self.tag) | result = "<" + unicode(self.tag) | ||||
| if self.attrs: | if self.attrs: | ||||
| result += " " + u" ".join([unicode(attr) for attr in self.attrs]) | |||||
| result += " " + " ".join([unicode(attr) for attr in self.attrs]) | |||||
| if self.self_closing: | if self.self_closing: | ||||
| result += " " * self.open_padding + "/>" | result += " " * self.open_padding + "/>" | ||||
| else: | else: | ||||
| @@ -20,12 +20,14 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from collections import defaultdict | from collections import defaultdict | ||||
| import re | import re | ||||
| from . import HTMLEntity, Node, Text | from . import HTMLEntity, Node, Text | ||||
| from .extras import Parameter | from .extras import Parameter | ||||
| from ..utils import parse_anything | from ..utils import parse_anything | ||||
| from ..compat import str, bytes, basestring | |||||
| __all__ = ["Template"] | __all__ = ["Template"] | ||||
| @@ -42,10 +44,10 @@ class Template(Node): | |||||
| def __unicode__(self): | def __unicode__(self): | ||||
| if self.params: | if self.params: | ||||
| params = u"|".join([unicode(param) for param in self.params]) | |||||
| return "{{" + unicode(self.name) + "|" + params + "}}" | |||||
| params = "|".join([str(param) for param in self.params]) | |||||
| return "{{" + str(self.name) + "|" + params + "}}" | |||||
| else: | else: | ||||
| return "{{" + unicode(self.name) + "}}" | |||||
| return "{{" + str(self.name) + "}}" | |||||
| def __iternodes__(self, getter): | def __iternodes__(self, getter): | ||||
| yield None, self | yield None, self | ||||
| @@ -77,7 +79,7 @@ class Template(Node): | |||||
| code.replace(node, node.replace(char, replacement)) | code.replace(node, node.replace(char, replacement)) | ||||
| def _blank_param_value(self, value): | def _blank_param_value(self, value): | ||||
| match = re.search(r"^(\s*).*?(\s*)$", unicode(value), FLAGS) | |||||
| match = re.search(r"^(\s*).*?(\s*)$", str(value), FLAGS) | |||||
| value.nodes = [Text(match.group(1)), Text(match.group(2))] | value.nodes = [Text(match.group(1)), Text(match.group(2))] | ||||
| def _select_theory(self, theories): | def _select_theory(self, theories): | ||||
| @@ -85,13 +87,13 @@ class Template(Node): | |||||
| best = max(theories.values()) | best = max(theories.values()) | ||||
| confidence = float(best) / sum(theories.values()) | confidence = float(best) / sum(theories.values()) | ||||
| if confidence > 0.75: | if confidence > 0.75: | ||||
| return theories.keys()[theories.values().index(best)] | |||||
| return tuple(theories.keys())[tuple(theories.values()).index(best)] | |||||
| def _get_spacing_conventions(self): | def _get_spacing_conventions(self): | ||||
| before_theories = defaultdict(lambda: 0) | before_theories = defaultdict(lambda: 0) | ||||
| after_theories = defaultdict(lambda: 0) | after_theories = defaultdict(lambda: 0) | ||||
| for param in self.params: | for param in self.params: | ||||
| match = re.search(r"^(\s*).*?(\s*)$", unicode(param.value), FLAGS) | |||||
| match = re.search(r"^(\s*).*?(\s*)$", str(param.value), FLAGS) | |||||
| before, after = match.group(1), match.group(2) | before, after = match.group(1), match.group(2) | ||||
| before_theories[before] += 1 | before_theories[before] += 1 | ||||
| after_theories[after] += 1 | after_theories[after] += 1 | ||||
| @@ -128,7 +130,7 @@ class Template(Node): | |||||
| self._name = parse_anything(value) | self._name = parse_anything(value) | ||||
| def has_param(self, name, ignore_empty=True): | def has_param(self, name, ignore_empty=True): | ||||
| name = name.strip() if isinstance(name, basestring) else unicode(name) | |||||
| name = name.strip() if isinstance(name, basestring) else str(name) | |||||
| for param in self.params: | for param in self.params: | ||||
| if param.name.strip() == name: | if param.name.strip() == name: | ||||
| if ignore_empty and not param.value.strip(): | if ignore_empty and not param.value.strip(): | ||||
| @@ -137,7 +139,7 @@ class Template(Node): | |||||
| return False | return False | ||||
| def get(self, name): | def get(self, name): | ||||
| name = name.strip() if isinstance(name, basestring) else unicode(name) | |||||
| name = name.strip() if isinstance(name, basestring) else str(name) | |||||
| for param in reversed(self.params): | for param in reversed(self.params): | ||||
| if param.name.strip() == name: | if param.name.strip() == name: | ||||
| return param | return param | ||||
| @@ -163,7 +165,7 @@ class Template(Node): | |||||
| if showkey is None: | if showkey is None: | ||||
| try: | try: | ||||
| int_name = int(unicode(name)) | |||||
| int_name = int(str(name)) | |||||
| except ValueError: | except ValueError: | ||||
| showkey = True | showkey = True | ||||
| else: | else: | ||||
| @@ -171,7 +173,7 @@ class Template(Node): | |||||
| for param in self.params: | for param in self.params: | ||||
| if not param.showkey: | if not param.showkey: | ||||
| if re.match(r"[1-9][0-9]*$", param.name.strip()): | if re.match(r"[1-9][0-9]*$", param.name.strip()): | ||||
| int_keys.add(int(unicode(param.name))) | |||||
| int_keys.add(int(str(param.name))) | |||||
| expected = min(set(range(1, len(int_keys) + 2)) - int_keys) | expected = min(set(range(1, len(int_keys) + 2)) - int_keys) | ||||
| if expected == int_name: | if expected == int_name: | ||||
| showkey = False | showkey = False | ||||
| @@ -192,7 +194,7 @@ class Template(Node): | |||||
| return param | return param | ||||
| def remove(self, name, keep_field=False, force_no_field=False): | def remove(self, name, keep_field=False, force_no_field=False): | ||||
| name = name.strip() if isinstance(name, basestring) else unicode(name) | |||||
| name = name.strip() if isinstance(name, basestring) else str(name) | |||||
| removed = False | removed = False | ||||
| for i, param in enumerate(self.params): | for i, param in enumerate(self.params): | ||||
| if param.name.strip() == name: | if param.name.strip() == name: | ||||
| @@ -20,7 +20,10 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from . import Node | from . import Node | ||||
| from ..compat import str, bytes, basestring | |||||
| __all__ = ["Text"] | __all__ = ["Text"] | ||||
| @@ -30,7 +33,7 @@ class Text(Node): | |||||
| self._value = value | self._value = value | ||||
| def __unicode__(self): | def __unicode__(self): | ||||
| return unicode(self.value) | |||||
| return str(self.value) | |||||
| def __strip__(self, normalize, collapse): | def __strip__(self, normalize, collapse): | ||||
| return self | return self | ||||
| @@ -20,11 +20,14 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from . import tokens | from . import tokens | ||||
| from ..nodes import Heading, HTMLEntity, Tag, Template, Text | from ..nodes import Heading, HTMLEntity, Tag, Template, Text | ||||
| from ..nodes.extras import Attribute, Parameter | from ..nodes.extras import Attribute, Parameter | ||||
| from ..smart_list import SmartList | from ..smart_list import SmartList | ||||
| from ..wikicode import Wikicode | from ..wikicode import Wikicode | ||||
| from ..compat import str, bytes | |||||
| __all__ = ["Builder"] | __all__ = ["Builder"] | ||||
| @@ -62,7 +65,7 @@ class Builder(object): | |||||
| self._tokens.append(token) | self._tokens.append(token) | ||||
| value = self._pop() | value = self._pop() | ||||
| if not key: | if not key: | ||||
| key = self._wrap([Text(unicode(default))]) | |||||
| key = self._wrap([Text(str(default))]) | |||||
| return Parameter(key, value, showkey) | return Parameter(key, value, showkey) | ||||
| else: | else: | ||||
| self._write(self._handle_token(token)) | self._write(self._handle_token(token)) | ||||
| @@ -20,13 +20,14 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| import htmlentitydefs | |||||
| from __future__ import unicode_literals | |||||
| from math import log | from math import log | ||||
| import re | import re | ||||
| import string | import string | ||||
| from . import contexts | from . import contexts | ||||
| from . import tokens | from . import tokens | ||||
| from ..compat import htmlentitydefs | |||||
| __all__ = ["Tokenizer"] | __all__ = ["Tokenizer"] | ||||
| @@ -20,6 +20,9 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from ..compat import str, bytes, v | |||||
| __all__ = ["Token"] | __all__ = ["Token"] | ||||
| class Token(object): | class Token(object): | ||||
| @@ -33,7 +36,7 @@ class Token(object): | |||||
| args.append(key + "=" + repr(value[:97] + "...")) | args.append(key + "=" + repr(value[:97] + "...")) | ||||
| else: | else: | ||||
| args.append(key + "=" + repr(value)) | args.append(key + "=" + repr(value)) | ||||
| return u"{0}({1})".format(type(self).__name__, u", ".join(args)) | |||||
| return "{0}({1})".format(type(self).__name__, ", ".join(args)) | |||||
| def __eq__(self, other): | def __eq__(self, other): | ||||
| if isinstance(other, type(self)): | if isinstance(other, type(self)): | ||||
| @@ -49,10 +52,15 @@ class Token(object): | |||||
| def __delattr__(self, key): | def __delattr__(self, key): | ||||
| del self._kwargs[key] | del self._kwargs[key] | ||||
| def make(name): | |||||
| __all__.append(name) | |||||
| return type(name, (Token,), {}) | |||||
| if v >= 3: | |||||
| def make(name): | |||||
| __all__.append(name) | |||||
| return type(name, (Token,), {}) | |||||
| else: | |||||
| def make(name): | |||||
| name = name.encode("utf-8") | |||||
| __all__.append(name) | |||||
| return type(name, (Token,), {}) | |||||
| Text = make("Text") | Text = make("Text") | ||||
| @@ -20,230 +20,240 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| from .compat import str, bytes, v | |||||
| __all__ = ["StringMixIn"] | __all__ = ["StringMixIn"] | ||||
| def inheritdoc(method): | def inheritdoc(method): | ||||
| method.__doc__ = getattr(unicode, method.func_name).__doc__ | |||||
| try: | |||||
| method.__doc__ = getattr(str, method.__name__).__doc__ | |||||
| except AttributeError: | |||||
| method.__doc__ = "This feature is only available on Python 2." | |||||
| return method | return method | ||||
| class StringMixIn(object): | class StringMixIn(object): | ||||
| def __str__(self): | |||||
| return unicode(self).encode("utf8") | |||||
| if v >= 3: | |||||
| def __str__(self): | |||||
| return self.__unicode__() | |||||
| else: | |||||
| def __str__(self): | |||||
| return self.__unicode__().encode("utf8") | |||||
| def __repr__(self): | def __repr__(self): | ||||
| return repr(unicode(self)) | |||||
| return repr(self.__unicode__()) | |||||
| def __lt__(self, other): | def __lt__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) < unicode(other) | |||||
| return unicode(self) < other | |||||
| return self.__unicode__() < other.__unicode__() | |||||
| return self.__unicode__() < other | |||||
| def __le__(self, other): | def __le__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) <= unicode(other) | |||||
| return unicode(self) <= other | |||||
| return self.__unicode__() <= other.__unicode__() | |||||
| return self.__unicode__() <= other | |||||
| def __eq__(self, other): | def __eq__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) == unicode(other) | |||||
| return unicode(self) == other | |||||
| return self.__unicode__() == other.__unicode__() | |||||
| return self.__unicode__() == other | |||||
| def __ne__(self, other): | def __ne__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) != unicode(other) | |||||
| return unicode(self) != other | |||||
| return self.__unicode__() != other.__unicode__() | |||||
| return self.__unicode__() != other | |||||
| def __gt__(self, other): | def __gt__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) > unicode(other) | |||||
| return unicode(self) > other | |||||
| return self.__unicode__() > other.__unicode__() | |||||
| return self.__unicode__() > other | |||||
| def __ge__(self, other): | def __ge__(self, other): | ||||
| if isinstance(other, StringMixIn): | if isinstance(other, StringMixIn): | ||||
| return unicode(self) >= unicode(other) | |||||
| return unicode(self) >= other | |||||
| return self.__unicode__() >= other.__unicode__() | |||||
| return self.__unicode__() >= other | |||||
| def __nonzero__(self): | def __nonzero__(self): | ||||
| return bool(unicode(self)) | |||||
| return bool(self.__unicode__()) | |||||
| def __unicode__(self): | def __unicode__(self): | ||||
| raise NotImplementedError() | raise NotImplementedError() | ||||
| def __len__(self): | def __len__(self): | ||||
| return len(unicode(self)) | |||||
| return len(self.__unicode__()) | |||||
| def __iter__(self): | def __iter__(self): | ||||
| for char in unicode(self): | |||||
| for char in self.__unicode__(): | |||||
| yield char | yield char | ||||
| def __getitem__(self, key): | def __getitem__(self, key): | ||||
| return unicode(self)[key] | |||||
| return self.__unicode__()[key] | |||||
| def __contains__(self, item): | def __contains__(self, item): | ||||
| if isinstance(item, StringMixIn): | if isinstance(item, StringMixIn): | ||||
| return unicode(item) in unicode(self) | |||||
| return item in unicode(self) | |||||
| return unicode(item) in self.__unicode__() | |||||
| return item in self.__unicode__() | |||||
| @inheritdoc | @inheritdoc | ||||
| def capitalize(self): | def capitalize(self): | ||||
| return unicode(self).capitalize() | |||||
| return self.__unicode__().capitalize() | |||||
| @inheritdoc | @inheritdoc | ||||
| def center(self, width, fillchar=None): | def center(self, width, fillchar=None): | ||||
| return unicode(self).center(width, fillchar) | |||||
| return self.__unicode__().center(width, fillchar) | |||||
| @inheritdoc | @inheritdoc | ||||
| def count(self, sub=None, start=None, end=None): | def count(self, sub=None, start=None, end=None): | ||||
| return unicode(self).count(sub, start, end) | |||||
| return self.__unicode__().count(sub, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def decode(self, encoding=None, errors=None): | def decode(self, encoding=None, errors=None): | ||||
| return unicode(self).decode(encoding, errors) | |||||
| return self.__unicode__().decode(encoding, errors) | |||||
| @inheritdoc | @inheritdoc | ||||
| def encode(self, encoding=None, errors=None): | def encode(self, encoding=None, errors=None): | ||||
| return unicode(self).encode(encoding, errors) | |||||
| return self.__unicode__().encode(encoding, errors) | |||||
| @inheritdoc | @inheritdoc | ||||
| def endswith(self, prefix, start=None, end=None): | def endswith(self, prefix, start=None, end=None): | ||||
| return unicode(self).endswith(prefix, start, end) | |||||
| return self.__unicode__().endswith(prefix, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def expandtabs(self, tabsize=None): | def expandtabs(self, tabsize=None): | ||||
| return unicode(self).expandtabs(tabsize) | |||||
| return self.__unicode__().expandtabs(tabsize) | |||||
| @inheritdoc | @inheritdoc | ||||
| def find(self, sub=None, start=None, end=None): | def find(self, sub=None, start=None, end=None): | ||||
| return unicode(self).find(sub, start, end) | |||||
| return self.__unicode__().find(sub, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def format(self, *args, **kwargs): | def format(self, *args, **kwargs): | ||||
| return unicode(self).format(*args, **kwargs) | |||||
| return self.__unicode__().format(*args, **kwargs) | |||||
| @inheritdoc | @inheritdoc | ||||
| def index(self, sub=None, start=None, end=None): | def index(self, sub=None, start=None, end=None): | ||||
| return unicode(self).index(sub, start, end) | |||||
| return self.__unicode__().index(sub, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def isalnum(self): | def isalnum(self): | ||||
| return unicode(self).isalnum() | |||||
| return self.__unicode__().isalnum() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isalpha(self): | def isalpha(self): | ||||
| return unicode(self).isalpha() | |||||
| return self.__unicode__().isalpha() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isdecimal(self): | def isdecimal(self): | ||||
| return unicode(self).isdecimal() | |||||
| return self.__unicode__().isdecimal() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isdigit(self): | def isdigit(self): | ||||
| return unicode(self).isdigit() | |||||
| return self.__unicode__().isdigit() | |||||
| @inheritdoc | @inheritdoc | ||||
| def islower(self): | def islower(self): | ||||
| return unicode(self).islower() | |||||
| return self.__unicode__().islower() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isnumeric(self): | def isnumeric(self): | ||||
| return unicode(self).isnumeric() | |||||
| return self.__unicode__().isnumeric() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isspace(self): | def isspace(self): | ||||
| return unicode(self).isspace() | |||||
| return self.__unicode__().isspace() | |||||
| @inheritdoc | @inheritdoc | ||||
| def istitle(self): | def istitle(self): | ||||
| return unicode(self).istitle() | |||||
| return self.__unicode__().istitle() | |||||
| @inheritdoc | @inheritdoc | ||||
| def isupper(self): | def isupper(self): | ||||
| return unicode(self).isupper() | |||||
| return self.__unicode__().isupper() | |||||
| @inheritdoc | @inheritdoc | ||||
| def join(self, iterable): | def join(self, iterable): | ||||
| return unicode(self).join(iterable) | |||||
| return self.__unicode__().join(iterable) | |||||
| @inheritdoc | @inheritdoc | ||||
| def ljust(self, width, fillchar=None): | def ljust(self, width, fillchar=None): | ||||
| return unicode(self).ljust(width, fillchar) | |||||
| return self.__unicode__().ljust(width, fillchar) | |||||
| @inheritdoc | @inheritdoc | ||||
| def lower(self): | def lower(self): | ||||
| return unicode(self).lower() | |||||
| return self.__unicode__().lower() | |||||
| @inheritdoc | @inheritdoc | ||||
| def lstrip(self, chars=None): | def lstrip(self, chars=None): | ||||
| return unicode(self).lstrip(chars) | |||||
| return self.__unicode__().lstrip(chars) | |||||
| @inheritdoc | @inheritdoc | ||||
| def partition(self, sep): | def partition(self, sep): | ||||
| return unicode(self).partition(sep) | |||||
| return self.__unicode__().partition(sep) | |||||
| @inheritdoc | @inheritdoc | ||||
| def replace(self, old, new, count): | def replace(self, old, new, count): | ||||
| return unicode(self).replace(old, new, count) | |||||
| return self.__unicode__().replace(old, new, count) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rfind(self, sub=None, start=None, end=None): | def rfind(self, sub=None, start=None, end=None): | ||||
| return unicode(self).rfind(sub, start, end) | |||||
| return self.__unicode__().rfind(sub, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rindex(self, sub=None, start=None, end=None): | def rindex(self, sub=None, start=None, end=None): | ||||
| return unicode(self).rindex(sub, start, end) | |||||
| return self.__unicode__().rindex(sub, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rjust(self, width, fillchar=None): | def rjust(self, width, fillchar=None): | ||||
| return unicode(self).rjust(width, fillchar) | |||||
| return self.__unicode__().rjust(width, fillchar) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rpartition(self, sep): | def rpartition(self, sep): | ||||
| return unicode(self).rpartition(sep) | |||||
| return self.__unicode__().rpartition(sep) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rsplit(self, sep=None, maxsplit=None): | def rsplit(self, sep=None, maxsplit=None): | ||||
| return unicode(self).rsplit(sep, maxsplit) | |||||
| return self.__unicode__().rsplit(sep, maxsplit) | |||||
| @inheritdoc | @inheritdoc | ||||
| def rstrip(self, chars=None): | def rstrip(self, chars=None): | ||||
| return unicode(self).rstrip(chars) | |||||
| return self.__unicode__().rstrip(chars) | |||||
| @inheritdoc | @inheritdoc | ||||
| def split(self, sep=None, maxsplit=None): | def split(self, sep=None, maxsplit=None): | ||||
| return unicode(self).split(sep, maxsplit) | |||||
| return self.__unicode__().split(sep, maxsplit) | |||||
| @inheritdoc | @inheritdoc | ||||
| def splitlines(self, keepends=None): | def splitlines(self, keepends=None): | ||||
| return unicode(self).splitlines(keepends) | |||||
| return self.__unicode__().splitlines(keepends) | |||||
| @inheritdoc | @inheritdoc | ||||
| def startswith(self, prefix, start=None, end=None): | def startswith(self, prefix, start=None, end=None): | ||||
| return unicode(self).startswith(prefix, start, end) | |||||
| return self.__unicode__().startswith(prefix, start, end) | |||||
| @inheritdoc | @inheritdoc | ||||
| def strip(self, chars=None): | def strip(self, chars=None): | ||||
| return unicode(self).strip(chars) | |||||
| return self.__unicode__().strip(chars) | |||||
| @inheritdoc | @inheritdoc | ||||
| def swapcase(self): | def swapcase(self): | ||||
| return unicode(self).swapcase() | |||||
| return self.__unicode__().swapcase() | |||||
| @inheritdoc | @inheritdoc | ||||
| def title(self): | def title(self): | ||||
| return unicode(self).title() | |||||
| return self.__unicode__().title() | |||||
| @inheritdoc | @inheritdoc | ||||
| def translate(self, table, deletechars=None): | def translate(self, table, deletechars=None): | ||||
| return unicode(self).translate(table, deletechars) | |||||
| return self.__unicode__().translate(table, deletechars) | |||||
| @inheritdoc | @inheritdoc | ||||
| def upper(self): | def upper(self): | ||||
| return unicode(self).upper() | |||||
| return self.__unicode__().upper() | |||||
| @inheritdoc | @inheritdoc | ||||
| def zfill(self, width): | def zfill(self, width): | ||||
| return unicode(self).zfill(width) | |||||
| return self.__unicode__().zfill(width) | |||||
| del inheritdoc | del inheritdoc | ||||
| @@ -20,9 +20,12 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| import mwparserfromhell | import mwparserfromhell | ||||
| from .nodes import Node | from .nodes import Node | ||||
| from .smart_list import SmartList | from .smart_list import SmartList | ||||
| from .compat import str, bytes, basestring | |||||
| def parse_anything(value): | def parse_anything(value): | ||||
| wikicode = mwparserfromhell.wikicode.Wikicode | wikicode = mwparserfromhell.wikicode.Wikicode | ||||
| @@ -33,7 +36,7 @@ def parse_anything(value): | |||||
| if isinstance(value, basestring): | if isinstance(value, basestring): | ||||
| return mwparserfromhell.parse(value) | return mwparserfromhell.parse(value) | ||||
| if isinstance(value, int): | if isinstance(value, int): | ||||
| return mwparserfromhell.parse(unicode(value)) | |||||
| return mwparserfromhell.parse(str(value)) | |||||
| if value is None: | if value is None: | ||||
| return wikicode(SmartList()) | return wikicode(SmartList()) | ||||
| try: | try: | ||||
| @@ -20,12 +20,14 @@ | |||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | # SOFTWARE. | ||||
| from __future__ import unicode_literals | |||||
| import re | import re | ||||
| import sys | import sys | ||||
| from .nodes import Heading, Node, Tag, Template, Text | from .nodes import Heading, Node, Tag, Template, Text | ||||
| from .string_mixin import StringMixIn | from .string_mixin import StringMixIn | ||||
| from .utils import parse_anything | from .utils import parse_anything | ||||
| from .compat import str, bytes | |||||
| __all__ = ["Wikicode"] | __all__ = ["Wikicode"] | ||||
| @@ -40,7 +42,7 @@ class Wikicode(StringMixIn): | |||||
| self._nodes = nodes | self._nodes = nodes | ||||
| def __unicode__(self): | def __unicode__(self): | ||||
| return "".join([unicode(node) for node in self.nodes]) | |||||
| return "".join([str(node) for node in self.nodes]) | |||||
| def _get_children(self, node): | def _get_children(self, node): | ||||
| """Iterate over all descendants of a given node, including itself. | """Iterate over all descendants of a given node, including itself. | ||||
| @@ -193,7 +195,7 @@ class Wikicode(StringMixIn): | |||||
| nodes = self.nodes | nodes = self.nodes | ||||
| for node in nodes: | for node in nodes: | ||||
| if not forcetype or isinstance(node, forcetype): | if not forcetype or isinstance(node, forcetype): | ||||
| if not matches or re.search(matches, unicode(node), flags): | |||||
| if not matches or re.search(matches, str(node), flags): | |||||
| yield node | yield node | ||||
| def ifilter_templates(self, recursive=False, matches=None, flags=FLAGS): | def ifilter_templates(self, recursive=False, matches=None, flags=FLAGS): | ||||
| @@ -251,15 +253,15 @@ class Wikicode(StringMixIn): | |||||
| for node in self.nodes: | for node in self.nodes: | ||||
| stripped = node.__strip__(normalize, collapse) | stripped = node.__strip__(normalize, collapse) | ||||
| if stripped: | if stripped: | ||||
| nodes.append(unicode(stripped)) | |||||
| nodes.append(str(stripped)) | |||||
| if collapse: | if collapse: | ||||
| stripped = u"".join(nodes).strip("\n") | |||||
| stripped = "".join(nodes).strip("\n") | |||||
| while "\n\n\n" in stripped: | while "\n\n\n" in stripped: | ||||
| stripped = stripped.replace("\n\n\n", "\n\n") | stripped = stripped.replace("\n\n\n", "\n\n") | ||||
| return stripped | return stripped | ||||
| else: | else: | ||||
| return u"".join(nodes) | |||||
| return "".join(nodes) | |||||
| def get_tree(self): | def get_tree(self): | ||||
| marker = object() # Random object we can find with certainty in a list | marker = object() # Random object we can find with certainty in a list | ||||