forked from pool/python-Genshi
(gh#edgewall/genshi!92). OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-Genshi?expand=0&rev=39
1176 lines
47 KiB
Diff
1176 lines
47 KiB
Diff
---
|
||
genshi/builder.py | 12 ++++------
|
||
genshi/compat.py | 5 +---
|
||
genshi/core.py | 33 ++++++++++++++---------------
|
||
genshi/filters/html.py | 15 ++++++-------
|
||
genshi/filters/i18n.py | 23 +++++++++-----------
|
||
genshi/filters/tests/i18n.py | 5 +---
|
||
genshi/filters/tests/test_html.py | 43 ++++++++++++++++++--------------------
|
||
genshi/filters/tests/transform.py | 17 +++++++--------
|
||
genshi/filters/transform.py | 10 +++-----
|
||
genshi/input.py | 26 +++++++++++-----------
|
||
genshi/output.py | 7 ++----
|
||
genshi/path.py | 3 --
|
||
genshi/template/base.py | 16 ++++++--------
|
||
genshi/template/directives.py | 6 +----
|
||
genshi/template/eval.py | 20 +++++++----------
|
||
genshi/template/loader.py | 5 +---
|
||
genshi/template/plugin.py | 5 +---
|
||
genshi/template/tests/markup.py | 5 +---
|
||
genshi/template/text.py | 5 +---
|
||
genshi/util.py | 7 ++----
|
||
setup.cfg | 2 -
|
||
21 files changed, 122 insertions(+), 148 deletions(-)
|
||
|
||
Index: Genshi-0.7.9/genshi/builder.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/builder.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/builder.py 2025-05-09 08:47:55.639423560 +0200
|
||
@@ -68,8 +68,6 @@
|
||
Hello, <em>world</em>!
|
||
"""
|
||
|
||
-import six
|
||
-
|
||
from genshi.compat import numeric_types
|
||
from genshi.core import Attrs, Markup, Namespace, QName, Stream, \
|
||
START, END, TEXT
|
||
@@ -110,7 +108,7 @@
|
||
return str(self.generate())
|
||
|
||
def __unicode__(self):
|
||
- return six.text_type(self.generate())
|
||
+ return str(self.generate())
|
||
|
||
def __html__(self):
|
||
return Markup(self.generate())
|
||
@@ -121,7 +119,7 @@
|
||
:param node: the node to append; can be an `Element`, `Fragment`, or a
|
||
`Stream`, or a Python string or number
|
||
"""
|
||
- simple_types = (Stream, Element) + six.string_types + numeric_types
|
||
+ simple_types = (Stream, Element, str) + numeric_types
|
||
if isinstance(node, simple_types):
|
||
# For objects of a known/primitive type, we avoid the check for
|
||
# whether it is iterable for better performance
|
||
@@ -144,8 +142,8 @@
|
||
for event in child:
|
||
yield event
|
||
else:
|
||
- if not isinstance(child, six.string_types):
|
||
- child = six.text_type(child)
|
||
+ if not isinstance(child, str):
|
||
+ child = str(child)
|
||
yield TEXT, child, (None, -1, -1)
|
||
|
||
def generate(self):
|
||
@@ -162,7 +160,7 @@
|
||
for name, value in kwargs.items():
|
||
name = name.rstrip('_').replace('_', '-')
|
||
if value is not None and name not in names:
|
||
- attrs.append((QName(name), six.text_type(value)))
|
||
+ attrs.append((QName(name), str(value)))
|
||
names.add(name)
|
||
return Attrs(attrs)
|
||
|
||
Index: Genshi-0.7.9/genshi/compat.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/compat.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/compat.py 2025-05-09 08:33:55.950025453 +0200
|
||
@@ -23,11 +23,10 @@
|
||
import warnings
|
||
from types import CodeType
|
||
|
||
-import six
|
||
|
||
IS_PYTHON2 = (sys.version_info[0] == 2)
|
||
|
||
-numeric_types = (float, ) + six.integer_types
|
||
+numeric_types = (float, int)
|
||
|
||
# This function should only be called in Python 2, and will fail in Python 3
|
||
|
||
@@ -47,7 +46,7 @@
|
||
# We need to test if an object is an instance of a string type in places
|
||
|
||
def isstring(obj):
|
||
- return isinstance(obj, six.string_types)
|
||
+ return isinstance(obj, str)
|
||
|
||
# We need to differentiate between StringIO and BytesIO in places
|
||
|
||
Index: Genshi-0.7.9/genshi/core.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/core.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/core.py 2025-05-09 08:30:16.089149971 +0200
|
||
@@ -18,7 +18,6 @@
|
||
from itertools import chain
|
||
import operator
|
||
|
||
-import six
|
||
|
||
from genshi.compat import stringrepr
|
||
from genshi.util import stripentities, striptags
|
||
@@ -282,7 +281,7 @@
|
||
if hasattr(event, 'totuple'):
|
||
event = event.totuple()
|
||
else:
|
||
- event = TEXT, six.text_type(event), (None, -1, -1)
|
||
+ event = TEXT, str(event), (None, -1, -1)
|
||
yield event
|
||
return
|
||
|
||
@@ -411,7 +410,7 @@
|
||
:return: a new instance with the attribute removed
|
||
:rtype: `Attrs`
|
||
"""
|
||
- if isinstance(names, six.string_types):
|
||
+ if isinstance(names, str):
|
||
names = (names,)
|
||
return Attrs([(name, val) for name, val in self if name not in names])
|
||
|
||
@@ -445,17 +444,17 @@
|
||
return TEXT, ''.join([x[1] for x in self]), (None, -1, -1)
|
||
|
||
|
||
-class Markup(six.text_type):
|
||
+class Markup(str):
|
||
"""Marks a string as being safe for inclusion in HTML/XML output without
|
||
needing to be escaped.
|
||
"""
|
||
__slots__ = []
|
||
|
||
def __add__(self, other):
|
||
- return Markup(six.text_type.__add__(self, escape(other)))
|
||
+ return Markup(str.__add__(self, escape(other)))
|
||
|
||
def __radd__(self, other):
|
||
- return Markup(six.text_type.__add__(escape(other), self))
|
||
+ return Markup(str.__add__(escape(other), self))
|
||
|
||
def __mod__(self, args):
|
||
if isinstance(args, dict):
|
||
@@ -464,14 +463,14 @@
|
||
args = tuple(map(escape, args))
|
||
else:
|
||
args = escape(args)
|
||
- return Markup(six.text_type.__mod__(self, args))
|
||
+ return Markup(str.__mod__(self, args))
|
||
|
||
def __mul__(self, num):
|
||
- return Markup(six.text_type.__mul__(self, num))
|
||
+ return Markup(str.__mul__(self, num))
|
||
__rmul__ = __mul__
|
||
|
||
def __repr__(self):
|
||
- return "<%s %s>" % (type(self).__name__, six.text_type.__repr__(self))
|
||
+ return "<%s %s>" % (type(self).__name__, str.__repr__(self))
|
||
|
||
def join(self, seq, escape_quotes=True):
|
||
"""Return a `Markup` object which is the concatenation of the strings
|
||
@@ -489,7 +488,7 @@
|
||
:see: `escape`
|
||
"""
|
||
escaped_items = [escape(item, quotes=escape_quotes) for item in seq]
|
||
- return Markup(six.text_type.join(self, escaped_items))
|
||
+ return Markup(str.join(self, escaped_items))
|
||
|
||
@classmethod
|
||
def escape(cls, text, quotes=True):
|
||
@@ -538,7 +537,7 @@
|
||
"""
|
||
if not self:
|
||
return ''
|
||
- return six.text_type(self).replace('"', '"') \
|
||
+ return str(self).replace('"', '"') \
|
||
.replace('>', '>') \
|
||
.replace('<', '<') \
|
||
.replace('&', '&')
|
||
@@ -652,7 +651,7 @@
|
||
self.uri = uri
|
||
|
||
def __init__(self, uri):
|
||
- self.uri = six.text_type(uri)
|
||
+ self.uri = str(uri)
|
||
|
||
def __contains__(self, qname):
|
||
return qname.namespace == self.uri
|
||
@@ -691,7 +690,7 @@
|
||
XML_NAMESPACE = Namespace('http://www.w3.org/XML/1998/namespace')
|
||
|
||
|
||
-class QName(six.text_type):
|
||
+class QName(str):
|
||
"""A qualified element or attribute name.
|
||
|
||
The unicode value of instances of this class contains the qualified name of
|
||
@@ -729,11 +728,11 @@
|
||
qname = qname.lstrip('{')
|
||
parts = qname.split('}', 1)
|
||
if len(parts) > 1:
|
||
- self = six.text_type.__new__(cls, '{%s' % qname)
|
||
- self.namespace, self.localname = map(six.text_type, parts)
|
||
+ self = str.__new__(cls, '{%s' % qname)
|
||
+ self.namespace, self.localname = map(str, parts)
|
||
else:
|
||
- self = six.text_type.__new__(cls, qname)
|
||
- self.namespace, self.localname = None, six.text_type(qname)
|
||
+ self = str.__new__(cls, qname)
|
||
+ self.namespace, self.localname = None, str(qname)
|
||
return self
|
||
|
||
def __getnewargs__(self):
|
||
Index: Genshi-0.7.9/genshi/filters/html.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/html.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/html.py 2025-05-09 08:30:16.089433034 +0200
|
||
@@ -15,7 +15,6 @@
|
||
|
||
import re
|
||
|
||
-import six
|
||
|
||
from genshi.core import Attrs, QName, stripentities
|
||
from genshi.core import END, START, TEXT, COMMENT
|
||
@@ -99,13 +98,13 @@
|
||
checked = False
|
||
if isinstance(value, (list, tuple)):
|
||
if declval is not None:
|
||
- u_vals = [six.text_type(v) for v in value]
|
||
+ u_vals = [str(v) for v in value]
|
||
checked = declval in u_vals
|
||
else:
|
||
checked = any(value)
|
||
else:
|
||
if declval is not None:
|
||
- checked = declval == six.text_type(value)
|
||
+ checked = declval == str(value)
|
||
elif type == 'checkbox':
|
||
checked = bool(value)
|
||
if checked:
|
||
@@ -121,7 +120,7 @@
|
||
value = value[0]
|
||
if value is not None:
|
||
attrs |= [
|
||
- (QName('value'), six.text_type(value))
|
||
+ (QName('value'), str(value))
|
||
]
|
||
elif tagname == 'select':
|
||
name = attrs.get('name')
|
||
@@ -164,10 +163,10 @@
|
||
select_value = None
|
||
elif in_select and tagname == 'option':
|
||
if isinstance(select_value, (tuple, list)):
|
||
- selected = option_value in [six.text_type(v) for v
|
||
+ selected = option_value in [str(v) for v
|
||
in select_value]
|
||
else:
|
||
- selected = option_value == six.text_type(select_value)
|
||
+ selected = option_value == str(select_value)
|
||
okind, (tag, attrs), opos = option_start
|
||
if selected:
|
||
attrs |= [(QName('selected'), 'selected')]
|
||
@@ -183,7 +182,7 @@
|
||
option_text = []
|
||
elif in_textarea and tagname == 'textarea':
|
||
if textarea_value:
|
||
- yield TEXT, six.text_type(textarea_value), pos
|
||
+ yield TEXT, str(textarea_value), pos
|
||
textarea_value = None
|
||
in_textarea = False
|
||
yield kind, data, pos
|
||
@@ -526,7 +525,7 @@
|
||
def _repl(match):
|
||
t = match.group(1)
|
||
if t:
|
||
- return six.unichr(int(t, 16))
|
||
+ return chr(int(t, 16))
|
||
t = match.group(2)
|
||
if t == '\\':
|
||
return r'\\'
|
||
Index: Genshi-0.7.9/genshi/filters/i18n.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/i18n.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/i18n.py 2025-05-09 08:30:16.089768807 +0200
|
||
@@ -24,7 +24,6 @@
|
||
from functools import partial
|
||
from types import FunctionType
|
||
|
||
-import six
|
||
|
||
from genshi.core import Attrs, Namespace, QName, START, END, TEXT, \
|
||
XML_NAMESPACE, _ensure, StreamEventKind
|
||
@@ -801,7 +800,7 @@
|
||
if kind is START:
|
||
tag, attrs = data
|
||
if tag in self.ignore_tags or \
|
||
- isinstance(attrs.get(xml_lang), six.string_types):
|
||
+ isinstance(attrs.get(xml_lang), str):
|
||
skip += 1
|
||
yield kind, data, pos
|
||
continue
|
||
@@ -811,7 +810,7 @@
|
||
|
||
for name, value in attrs:
|
||
newval = value
|
||
- if isinstance(value, six.string_types):
|
||
+ if isinstance(value, str):
|
||
text = value.strip()
|
||
if translate_attrs and name in include_attrs and text:
|
||
newval = gettext(text)
|
||
@@ -831,7 +830,7 @@
|
||
elif translate_text and kind is TEXT:
|
||
text = data.strip()
|
||
if text:
|
||
- data = data.replace(text, six.text_type(gettext(text)))
|
||
+ data = data.replace(text, str(gettext(text)))
|
||
yield kind, data, pos
|
||
|
||
elif kind is SUB:
|
||
@@ -944,7 +943,7 @@
|
||
if kind is START and not skip:
|
||
tag, attrs = data
|
||
if tag in self.ignore_tags or \
|
||
- isinstance(attrs.get(xml_lang), six.string_types):
|
||
+ isinstance(attrs.get(xml_lang), str):
|
||
skip += 1
|
||
continue
|
||
|
||
@@ -1050,7 +1049,7 @@
|
||
|
||
def _extract_attrs(self, event, gettext_functions, search_text):
|
||
for name, value in event[1][1]:
|
||
- if search_text and isinstance(value, six.string_types):
|
||
+ if search_text and isinstance(value, str):
|
||
if name in self.include_attrs:
|
||
text = value.strip()
|
||
if text:
|
||
@@ -1321,10 +1320,10 @@
|
||
strings = []
|
||
def _add(arg):
|
||
if isinstance(arg, _ast_Str) \
|
||
- and isinstance(_ast_Str_value(arg), six.text_type):
|
||
+ and isinstance(_ast_Str_value(arg), str):
|
||
strings.append(_ast_Str_value(arg))
|
||
elif isinstance(arg, _ast_Str):
|
||
- strings.append(six.text_type(_ast_Str_value(arg), 'utf-8'))
|
||
+ strings.append(str(_ast_Str_value(arg), 'utf-8'))
|
||
elif arg:
|
||
strings.append(None)
|
||
[_add(arg) for arg in node.args]
|
||
@@ -1365,22 +1364,22 @@
|
||
:rtype: ``iterator``
|
||
"""
|
||
template_class = options.get('template_class', MarkupTemplate)
|
||
- if isinstance(template_class, six.string_types):
|
||
+ if isinstance(template_class, str):
|
||
module, clsname = template_class.split(':', 1)
|
||
template_class = getattr(__import__(module, {}, {}, [clsname]), clsname)
|
||
encoding = options.get('encoding', None)
|
||
|
||
extract_text = options.get('extract_text', True)
|
||
- if isinstance(extract_text, six.string_types):
|
||
+ if isinstance(extract_text, str):
|
||
extract_text = extract_text.lower() in ('1', 'on', 'yes', 'true')
|
||
|
||
ignore_tags = options.get('ignore_tags', Translator.IGNORE_TAGS)
|
||
- if isinstance(ignore_tags, six.string_types):
|
||
+ if isinstance(ignore_tags, str):
|
||
ignore_tags = ignore_tags.split()
|
||
ignore_tags = [QName(tag) for tag in ignore_tags]
|
||
|
||
include_attrs = options.get('include_attrs', Translator.INCLUDE_ATTRS)
|
||
- if isinstance(include_attrs, six.string_types):
|
||
+ if isinstance(include_attrs, str):
|
||
include_attrs = include_attrs.split()
|
||
include_attrs = [QName(attr) for attr in include_attrs]
|
||
|
||
Index: Genshi-0.7.9/genshi/filters/tests/i18n.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/tests/i18n.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/tests/i18n.py 2025-05-09 08:30:16.090147309 +0200
|
||
@@ -15,7 +15,6 @@
|
||
from gettext import NullTranslations
|
||
import unittest
|
||
|
||
-import six
|
||
|
||
from genshi.core import Attrs
|
||
from genshi.template import MarkupTemplate, Context
|
||
@@ -48,7 +47,7 @@
|
||
if tmsg is missing:
|
||
if self._fallback:
|
||
return self._fallback.ugettext(message)
|
||
- return six.text_type(message)
|
||
+ return str(message)
|
||
return tmsg
|
||
else:
|
||
def gettext(self, message):
|
||
@@ -57,7 +56,7 @@
|
||
if tmsg is missing:
|
||
if self._fallback:
|
||
return self._fallback.gettext(message)
|
||
- return six.text_type(message)
|
||
+ return str(message)
|
||
return tmsg
|
||
|
||
if IS_PYTHON2:
|
||
Index: Genshi-0.7.9/genshi/filters/tests/test_html.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/tests/test_html.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/tests/test_html.py 2025-05-09 08:30:16.090568412 +0200
|
||
@@ -13,7 +13,6 @@
|
||
|
||
import unittest
|
||
|
||
-import six
|
||
|
||
from genshi.input import HTML, ParseError
|
||
from genshi.filters.html import HTMLFormFiller, HTMLSanitizer
|
||
@@ -524,91 +523,91 @@
|
||
|
||
def test_sanitize_expression(self):
|
||
html = HTML(u'<div style="top:expression(alert())">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_capital_expression(self):
|
||
html = HTML(u'<div style="top:EXPRESSION(alert())">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_url_with_javascript(self):
|
||
html = HTML(u'<div style="background-image:url(javascript:alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_capital_url_with_javascript(self):
|
||
html = HTML(u'<div style="background-image:URL(javascript:alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_unicode_escapes(self):
|
||
html = HTML(u'<div style="top:exp\\72 ess\\000069 on(alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_backslash_without_hex(self):
|
||
html = HTML(u'<div style="top:e\\xp\\ression(alert())">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
input_str = u'<div style="top:e\\\\xp\\\\ression(alert())">XSS</div>'
|
||
html = HTML(input_str)
|
||
- self.assertEqual(input_str, six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual(input_str, str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_unsafe_props(self):
|
||
html = HTML(u'<div style="POSITION:RELATIVE">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
html = HTML(u'<div style="behavior:url(test.htc)">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
html = HTML(u'<div style="-ms-behavior:url(test.htc) url(#obj)">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
html = HTML(u"""<div style="-o-link:'javascript:alert(1)';"""
|
||
u"""-o-link-source:current">XSS</div>""")
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
html = HTML(u"""<div style="-moz-binding:url(xss.xbl)">XSS</div>""")
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_negative_margin(self):
|
||
html = HTML(u'<div style="margin-top:-9999px">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
html = HTML(u'<div style="margin:0 -9999px">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_css_hack(self):
|
||
html = HTML(u'<div style="*position:static">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
html = HTML(u'<div style="_margin:-10px">XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_property_name(self):
|
||
html = HTML(u'<div style="display:none;border-left-color:red;'
|
||
u'user_defined:1;-moz-user-selct:-moz-all">prop</div>')
|
||
self.assertEqual('<div style="display:none; border-left-color:red'
|
||
'">prop</div>',
|
||
- six.text_type(html | StyleSanitizer()))
|
||
+ str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_unicode_expression(self):
|
||
# Fullwidth small letters
|
||
html = HTML(u'<div style="top:expression(alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
# Fullwidth capital letters
|
||
html = HTML(u'<div style="top:EXPRESSION(alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
# IPA extensions
|
||
html = HTML(u'<div style="top:expʀessɪoɴ(alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
def test_sanitize_unicode_url(self):
|
||
# IPA extensions
|
||
html = HTML(u'<div style="background-image:uʀʟ(javascript:alert())">'
|
||
u'XSS</div>')
|
||
- self.assertEqual('<div>XSS</div>', six.text_type(html | StyleSanitizer()))
|
||
+ self.assertEqual('<div>XSS</div>', str(html | StyleSanitizer()))
|
||
|
||
|
||
def suite():
|
||
Index: Genshi-0.7.9/genshi/filters/tests/transform.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/tests/transform.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/tests/transform.py 2025-05-09 08:30:16.090861554 +0200
|
||
@@ -14,7 +14,6 @@
|
||
import doctest
|
||
import unittest
|
||
|
||
-import six
|
||
|
||
from genshi import HTML
|
||
from genshi.builder import Element
|
||
@@ -36,22 +35,22 @@
|
||
for mark, (kind, data, pos) in stream:
|
||
if kind is START:
|
||
if with_attrs:
|
||
- kv_attrs = dict((six.text_type(k), v) for k, v in data[1])
|
||
- data = (six.text_type(data[0]), kv_attrs)
|
||
+ kv_attrs = dict((str(k), v) for k, v in data[1])
|
||
+ data = (str(data[0]), kv_attrs)
|
||
else:
|
||
- data = six.text_type(data[0])
|
||
+ data = str(data[0])
|
||
elif kind is END:
|
||
- data = six.text_type(data)
|
||
+ data = str(data)
|
||
elif kind is ATTR:
|
||
kind = ATTR
|
||
- data = dict((six.text_type(k), v) for k, v in data[1])
|
||
+ data = dict((str(k), v) for k, v in data[1])
|
||
yield mark, kind, data
|
||
return list(_generate())
|
||
|
||
|
||
def _transform(html, transformer, with_attrs=False):
|
||
"""Apply transformation returning simplified marked stream."""
|
||
- if isinstance(html, six.string_types):
|
||
+ if isinstance(html, str):
|
||
html = HTML(html, encoding='utf-8')
|
||
stream = transformer(html, keep_marks=True)
|
||
return _simplify(stream, with_attrs)
|
||
@@ -61,7 +60,7 @@
|
||
"""Test .select()"""
|
||
def _select(self, select):
|
||
html = HTML(FOOBAR, encoding='utf-8')
|
||
- if isinstance(select, six.string_types):
|
||
+ if isinstance(select, str):
|
||
select = [select]
|
||
transformer = Transformer(select[0])
|
||
for sel in select[1:]:
|
||
@@ -668,7 +667,7 @@
|
||
html = HTML(html)
|
||
if content is None:
|
||
content = Injector()
|
||
- elif isinstance(content, six.string_types):
|
||
+ elif isinstance(content, str):
|
||
content = HTML(content)
|
||
return _transform(html, getattr(Transformer(select), self.operation)
|
||
(content))
|
||
Index: Genshi-0.7.9/genshi/filters/transform.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/filters/transform.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/filters/transform.py 2025-05-09 08:30:16.091146631 +0200
|
||
@@ -33,7 +33,7 @@
|
||
... </body>
|
||
... </html>''',
|
||
... encoding='utf-8')
|
||
->>> print(html | Transformer('body/em').map(six.text_type.upper, TEXT)
|
||
+>>> print(html | Transformer('body/em').map(str.upper, TEXT)
|
||
... .unwrap().wrap(tag.u))
|
||
<html>
|
||
<head><title>Some Title</title></head>
|
||
@@ -51,7 +51,6 @@
|
||
import re
|
||
import sys
|
||
|
||
-import six
|
||
|
||
from genshi.builder import Element
|
||
from genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure, Markup
|
||
@@ -627,11 +626,10 @@
|
||
"""Applies a function to the ``data`` element of events of ``kind`` in
|
||
the selection.
|
||
|
||
- >>> import six
|
||
>>> html = HTML('<html><head><title>Some Title</title></head>'
|
||
... '<body>Some <em>body</em> text.</body></html>',
|
||
... encoding='utf-8')
|
||
- >>> print(html | Transformer('head/title').map(six.text_type.upper, TEXT))
|
||
+ >>> print(html | Transformer('head/title').map(str.upper, TEXT))
|
||
<html><head><title>SOME TITLE</title></head><body>Some <em>body</em>
|
||
text.</body></html>
|
||
|
||
@@ -767,7 +765,7 @@
|
||
yield OUTSIDE, result
|
||
elif result:
|
||
# XXX Assume everything else is "text"?
|
||
- yield None, (TEXT, six.text_type(result), (None, -1, -1))
|
||
+ yield None, (TEXT, str(result), (None, -1, -1))
|
||
else:
|
||
yield None, event
|
||
|
||
@@ -993,7 +991,7 @@
|
||
:param replace: Replacement pattern.
|
||
:param count: Number of replacements to make in each text fragment.
|
||
"""
|
||
- if isinstance(pattern, six.string_types):
|
||
+ if isinstance(pattern, str):
|
||
self.pattern = re.compile(pattern)
|
||
else:
|
||
self.pattern = pattern
|
||
Index: Genshi-0.7.9/genshi/input.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/input.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/input.py 2025-05-09 08:30:16.091399898 +0200
|
||
@@ -19,8 +19,8 @@
|
||
import codecs
|
||
from xml.parsers import expat
|
||
|
||
-import six
|
||
-from six.moves import html_entities as entities, html_parser as html
|
||
+import html.entities
|
||
+import html.parser
|
||
|
||
from genshi.core import Attrs, QName, Stream, stripentities
|
||
from genshi.core import START, END, XML_DECL, DOCTYPE, TEXT, START_NS, \
|
||
@@ -92,7 +92,7 @@
|
||
"""
|
||
|
||
_entitydefs = ['<!ENTITY %s "&#%d;">' % (name, value) for name, value in
|
||
- entities.name2codepoint.items()]
|
||
+ html.entities.name2codepoint.items()]
|
||
_external_dtd = u'\n'.join(_entitydefs).encode('utf-8')
|
||
|
||
def __init__(self, source, filename=None, encoding=None):
|
||
@@ -157,7 +157,7 @@
|
||
del self.expat # get rid of circular references
|
||
done = True
|
||
else:
|
||
- if isinstance(data, six.text_type):
|
||
+ if isinstance(data, str):
|
||
data = data.encode('utf-8')
|
||
self.expat.Parse(data, False)
|
||
for event in self._queue:
|
||
@@ -243,7 +243,7 @@
|
||
if text.startswith('&'):
|
||
# deal with undefined entities
|
||
try:
|
||
- text = six.unichr(entities.name2codepoint[text[1:-1]])
|
||
+ text = chr(html.entities.name2codepoint[text[1:-1]])
|
||
self._enqueue(TEXT, text)
|
||
except KeyError:
|
||
filename, lineno, offset = self._getpos()
|
||
@@ -276,7 +276,7 @@
|
||
return Stream(list(XMLParser(StringIO(text))))
|
||
|
||
|
||
-class HTMLParser(html.HTMLParser, object):
|
||
+class HTMLParser(html.parser.HTMLParser, object):
|
||
"""Parser for HTML input based on the Python `HTMLParser` module.
|
||
|
||
This class provides the same interface for generating stream events as
|
||
@@ -305,7 +305,7 @@
|
||
:param filename: the name of the file, if known
|
||
:param filename: encoding of the file; ignored if the input is unicode
|
||
"""
|
||
- html.HTMLParser.__init__(self)
|
||
+ html.parser.HTMLParser.__init__(self)
|
||
self.source = source
|
||
self.filename = filename
|
||
self.encoding = encoding
|
||
@@ -334,7 +334,7 @@
|
||
self.close()
|
||
done = True
|
||
else:
|
||
- if not isinstance(data, six.text_type):
|
||
+ if not isinstance(data, str):
|
||
raise UnicodeError("source returned bytes, but no encoding specified")
|
||
self.feed(data)
|
||
for kind, data, pos in self._queue:
|
||
@@ -346,7 +346,7 @@
|
||
for tag in open_tags:
|
||
yield END, QName(tag), pos
|
||
break
|
||
- except html.HTMLParseError as e:
|
||
+ except html.parser.HTMLParseError as e:
|
||
msg = '%s: line %d, column %d' % (e.msg, e.lineno, e.offset)
|
||
raise ParseError(msg, self.filename, e.lineno, e.offset)
|
||
return Stream(_generate()).filter(_coalesce)
|
||
@@ -389,14 +389,14 @@
|
||
|
||
def handle_charref(self, name):
|
||
if name.lower().startswith('x'):
|
||
- text = six.unichr(int(name[1:], 16))
|
||
+ text = chr(int(name[1:], 16))
|
||
else:
|
||
- text = six.unichr(int(name))
|
||
+ text = chr(int(name))
|
||
self._enqueue(TEXT, text)
|
||
|
||
def handle_entityref(self, name):
|
||
try:
|
||
- text = six.unichr(entities.name2codepoint[name])
|
||
+ text = chr(html.entities.name2codepoint[name])
|
||
except KeyError:
|
||
text = '&%s;' % name
|
||
self._enqueue(TEXT, text)
|
||
@@ -435,7 +435,7 @@
|
||
:raises ParseError: if the HTML text is not well-formed, and error recovery
|
||
fails
|
||
"""
|
||
- if isinstance(text, six.text_type):
|
||
+ if isinstance(text, str):
|
||
# If it's unicode text the encoding should be set to None.
|
||
# The option to pass in an incorrect encoding is for ease
|
||
# of writing doctests that work in both Python 2.x and 3.x.
|
||
Index: Genshi-0.7.9/genshi/output.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/output.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/output.py 2025-05-09 08:30:16.091646863 +0200
|
||
@@ -18,7 +18,6 @@
|
||
from itertools import chain
|
||
import re
|
||
|
||
-import six
|
||
|
||
from genshi.core import escape, Attrs, Markup, QName, StreamEventKind
|
||
from genshi.core import START, END, TEXT, XML_DECL, DOCTYPE, START_NS, END_NS, \
|
||
@@ -73,7 +72,7 @@
|
||
:see: `XMLSerializer`, `XHTMLSerializer`, `HTMLSerializer`, `TextSerializer`
|
||
:since: version 0.4.1
|
||
"""
|
||
- if isinstance(method, six.string_types):
|
||
+ if isinstance(method, str):
|
||
method = {'xml': XMLSerializer,
|
||
'xhtml': XHTMLSerializer,
|
||
'html': HTMLSerializer,
|
||
@@ -583,7 +582,7 @@
|
||
data = event[1]
|
||
if strip_markup and type(data) is Markup:
|
||
data = data.striptags().stripentities()
|
||
- yield six.text_type(data)
|
||
+ yield str(data)
|
||
|
||
|
||
class EmptyTagFilter(object):
|
||
@@ -825,7 +824,7 @@
|
||
|
||
:param doctype: DOCTYPE as a string or DocType object.
|
||
"""
|
||
- if isinstance(doctype, six.string_types):
|
||
+ if isinstance(doctype, str):
|
||
doctype = DocType.get(doctype)
|
||
self.doctype_event = (DOCTYPE, doctype, (None, -1, -1))
|
||
|
||
Index: Genshi-0.7.9/genshi/path.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/path.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/path.py 2025-05-09 08:30:16.092083005 +0200
|
||
@@ -45,7 +45,6 @@
|
||
import re
|
||
from itertools import chain
|
||
|
||
-import six
|
||
|
||
from genshi.compat import IS_PYTHON2
|
||
from genshi.core import Stream, Attrs, Namespace, QName
|
||
@@ -939,7 +938,7 @@
|
||
value = as_scalar(value)
|
||
if value is False:
|
||
return ''
|
||
- return six.text_type(value)
|
||
+ return str(value)
|
||
|
||
def as_bool(value):
|
||
return bool(as_scalar(value))
|
||
Index: Genshi-0.7.9/genshi/template/base.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/base.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/base.py 2025-05-09 08:30:16.092500501 +0200
|
||
@@ -16,7 +16,6 @@
|
||
from collections import deque
|
||
import os
|
||
|
||
-import six
|
||
|
||
from genshi.compat import numeric_types, StringIO, BytesIO
|
||
from genshi.core import Attrs, Stream, StreamEventKind, START, TEXT, _ensure
|
||
@@ -322,8 +321,7 @@
|
||
return type.__new__(cls, name, bases, d)
|
||
|
||
|
||
-@six.add_metaclass(DirectiveFactoryMeta)
|
||
-class DirectiveFactory(object):
|
||
+class DirectiveFactory(metaclass=DirectiveFactoryMeta):
|
||
"""Base for classes that provide a set of template directives.
|
||
|
||
:since: version 0.6
|
||
@@ -380,7 +378,7 @@
|
||
"""
|
||
|
||
serializer = None
|
||
- _number_conv = six.text_type # function used to convert numbers to event data
|
||
+ _number_conv = str # function used to convert numbers to event data
|
||
|
||
def __init__(self, source, filepath=None, filename=None, loader=None,
|
||
encoding=None, lookup='strict', allow_exec=True):
|
||
@@ -412,7 +410,7 @@
|
||
self._prepared = False
|
||
|
||
if not isinstance(source, Stream) and not hasattr(source, 'read'):
|
||
- if isinstance(source, six.text_type):
|
||
+ if isinstance(source, str):
|
||
source = StringIO(source)
|
||
else:
|
||
source = BytesIO(source)
|
||
@@ -504,7 +502,7 @@
|
||
if kind is INCLUDE:
|
||
href, cls, fallback = data
|
||
tmpl_inlined = False
|
||
- if (isinstance(href, six.string_types) and
|
||
+ if (isinstance(href, str) and
|
||
not getattr(self.loader, 'auto_reload', True)):
|
||
# If the path to the included template is static, and
|
||
# auto-reloading is disabled on the template loader,
|
||
@@ -603,7 +601,7 @@
|
||
# First check for a string, otherwise the iterable test
|
||
# below succeeds, and the string will be chopped up into
|
||
# individual characters
|
||
- if isinstance(result, six.string_types):
|
||
+ if isinstance(result, str):
|
||
yield TEXT, result, pos
|
||
elif isinstance(result, numeric_types):
|
||
yield TEXT, number_conv(result), pos
|
||
@@ -612,7 +610,7 @@
|
||
stream = _ensure(result)
|
||
break
|
||
else:
|
||
- yield TEXT, six.text_type(result), pos
|
||
+ yield TEXT, str(result), pos
|
||
|
||
elif kind is SUB:
|
||
# This event is a list of directives and a list of nested
|
||
@@ -641,7 +639,7 @@
|
||
for event in stream:
|
||
if event[0] is INCLUDE:
|
||
href, cls, fallback = event[1]
|
||
- if not isinstance(href, six.string_types):
|
||
+ if not isinstance(href, str):
|
||
parts = []
|
||
for subkind, subdata, subpos in self._flatten(href, ctxt,
|
||
**vars):
|
||
Index: Genshi-0.7.9/genshi/template/directives.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/directives.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/directives.py 2025-05-09 08:30:16.092811998 +0200
|
||
@@ -13,7 +13,6 @@
|
||
|
||
"""Implementation of the various template directives."""
|
||
|
||
-import six
|
||
|
||
from genshi.core import QName, Stream
|
||
from genshi.path import Path
|
||
@@ -36,8 +35,7 @@
|
||
return type.__new__(cls, name, bases, d)
|
||
|
||
|
||
-@six.add_metaclass(DirectiveMeta)
|
||
-class Directive(object):
|
||
+class Directive(metaclass=DirectiveMeta):
|
||
"""Abstract base class for template directives.
|
||
|
||
A directive is basically a callable that takes three positional arguments:
|
||
@@ -177,7 +175,7 @@
|
||
elif not isinstance(attrs, list): # assume it's a dict
|
||
attrs = attrs.items()
|
||
attrib |= [
|
||
- (QName(n), v is not None and six.text_type(v).strip() or None)
|
||
+ (QName(n), v is not None and str(v).strip() or None)
|
||
for n, v in attrs
|
||
]
|
||
yield kind, (tag, attrib), pos
|
||
Index: Genshi-0.7.9/genshi/template/eval.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/eval.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/eval.py 2025-05-09 08:46:35.444265640 +0200
|
||
@@ -13,12 +13,10 @@
|
||
|
||
"""Support for "safe" evaluation of Python expressions."""
|
||
|
||
+import builtins
|
||
from textwrap import dedent
|
||
from types import CodeType
|
||
|
||
-import six
|
||
-from six.moves import builtins
|
||
-
|
||
from genshi.core import Markup
|
||
from genshi.template.astutil import ASTTransformer, ASTCodeGenerator, parse
|
||
from genshi.template.base import TemplateRuntimeError
|
||
@@ -53,7 +51,7 @@
|
||
if `None`, the appropriate transformation is chosen
|
||
depending on the mode
|
||
"""
|
||
- if isinstance(source, six.string_types):
|
||
+ if isinstance(source, str):
|
||
self.source = source
|
||
node = _parse(source, mode=self.mode)
|
||
else:
|
||
@@ -72,7 +70,7 @@
|
||
filename=filename, lineno=lineno, xform=xform)
|
||
if lookup is None:
|
||
lookup = LenientLookup
|
||
- elif isinstance(lookup, six.string_types):
|
||
+ elif isinstance(lookup, str):
|
||
lookup = {'lenient': LenientLookup, 'strict': StrictLookup}[lookup]
|
||
self._globals = lookup.globals
|
||
|
||
@@ -178,7 +176,7 @@
|
||
"""
|
||
__traceback_hide__ = 'before_and_this'
|
||
_globals = self._globals(data)
|
||
- six.exec_(self.code, _globals, data)
|
||
+ exec(self.code, _globals, data)
|
||
|
||
|
||
UNDEFINED = object()
|
||
@@ -317,7 +315,7 @@
|
||
try:
|
||
return obj[key]
|
||
except (AttributeError, KeyError, IndexError, TypeError) as e:
|
||
- if isinstance(key, six.string_types):
|
||
+ if isinstance(key, str):
|
||
val = getattr(obj, key, UNDEFINED)
|
||
if val is UNDEFINED:
|
||
val = cls.undefined(key, owner=obj)
|
||
@@ -407,7 +405,7 @@
|
||
if first.rstrip().endswith(':') and not rest[0].isspace():
|
||
rest = '\n'.join([' %s' % line for line in rest.splitlines()])
|
||
source = '\n'.join([first, rest])
|
||
- if isinstance(source, six.text_type):
|
||
+ if isinstance(source, str):
|
||
source = (u'\ufeff' + source).encode('utf-8')
|
||
return parse(source, mode)
|
||
|
||
@@ -418,11 +416,11 @@
|
||
filename = '<string>'
|
||
if IS_PYTHON2:
|
||
# Python 2 requires non-unicode filenames
|
||
- if isinstance(filename, six.text_type):
|
||
+ if isinstance(filename, str):
|
||
filename = filename.encode('utf-8', 'replace')
|
||
else:
|
||
# Python 3 requires unicode filenames
|
||
- if not isinstance(filename, six.text_type):
|
||
+ if not isinstance(filename, str):
|
||
filename = filename.decode('utf-8', 'replace')
|
||
if lineno <= 0:
|
||
lineno = 1
|
||
@@ -510,7 +508,7 @@
|
||
return names
|
||
|
||
def visit_Str(self, node):
|
||
- if not isinstance(node.s, six.text_type):
|
||
+ if not isinstance(node.s, str):
|
||
try: # If the string is ASCII, return a `str` object
|
||
node.s.decode('ascii')
|
||
except ValueError: # Otherwise return a `unicode` object
|
||
Index: Genshi-0.7.9/genshi/template/loader.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/loader.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/loader.py 2025-05-09 08:30:16.093319313 +0200
|
||
@@ -19,7 +19,6 @@
|
||
except ImportError:
|
||
import dummy_threading as threading
|
||
|
||
-import six
|
||
|
||
from genshi.template.base import TemplateError
|
||
from genshi.util import LRUCache
|
||
@@ -219,7 +218,7 @@
|
||
raise TemplateError('Search path for templates not configured')
|
||
|
||
for loadfunc in search_path:
|
||
- if isinstance(loadfunc, six.string_types):
|
||
+ if isinstance(loadfunc, str):
|
||
loadfunc = directory(loadfunc)
|
||
try:
|
||
filepath, filename, fileobj, uptodate = loadfunc(filename)
|
||
@@ -331,7 +330,7 @@
|
||
def _dispatch_by_prefix(filename):
|
||
for prefix, delegate in delegates.items():
|
||
if filename.startswith(prefix):
|
||
- if isinstance(delegate, six.string_types):
|
||
+ if isinstance(delegate, str):
|
||
delegate = directory(delegate)
|
||
filepath, _, fileobj, uptodate = delegate(
|
||
filename[len(prefix):].lstrip('/\\')
|
||
Index: Genshi-0.7.9/genshi/template/plugin.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/plugin.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/plugin.py 2025-05-09 08:30:16.093507047 +0200
|
||
@@ -16,7 +16,6 @@
|
||
CherryPy/Buffet.
|
||
"""
|
||
|
||
-import six
|
||
|
||
from genshi.input import ET, HTML, XML
|
||
from genshi.output import DocType
|
||
@@ -48,7 +47,7 @@
|
||
|
||
self.default_encoding = options.get('genshi.default_encoding', None)
|
||
auto_reload = options.get('genshi.auto_reload', '1')
|
||
- if isinstance(auto_reload, six.string_types):
|
||
+ if isinstance(auto_reload, str):
|
||
auto_reload = auto_reload.lower() in ('1', 'on', 'yes', 'true')
|
||
search_path = [p for p in
|
||
options.get('genshi.search_path', '').split(':') if p]
|
||
@@ -170,7 +169,7 @@
|
||
options = {}
|
||
|
||
new_syntax = options.get('genshi.new_text_syntax')
|
||
- if isinstance(new_syntax, six.string_types):
|
||
+ if isinstance(new_syntax, str):
|
||
new_syntax = new_syntax.lower() in ('1', 'on', 'yes', 'true')
|
||
if new_syntax:
|
||
self.template_class = NewTextTemplate
|
||
Index: Genshi-0.7.9/genshi/template/tests/markup.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/tests/markup.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/tests/markup.py 2025-05-09 08:30:16.093698697 +0200
|
||
@@ -19,7 +19,6 @@
|
||
import tempfile
|
||
import unittest
|
||
|
||
-import six
|
||
|
||
from genshi.compat import BytesIO, StringIO
|
||
from genshi.core import Markup
|
||
@@ -199,7 +198,7 @@
|
||
</div>""".encode('iso-8859-1'), encoding='iso-8859-1')
|
||
self.assertEqual(u"""<?xml version="1.0" encoding="iso-8859-1"?>\n<div>
|
||
\xf6
|
||
- </div>""", six.text_type(tmpl.generate()))
|
||
+ </div>""", str(tmpl.generate()))
|
||
|
||
def test_latin1_encoded_explicit_encoding(self):
|
||
tmpl = MarkupTemplate(u"""<div xmlns:py="http://genshi.edgewall.org/">
|
||
@@ -207,7 +206,7 @@
|
||
</div>""".encode('iso-8859-1'), encoding='iso-8859-1')
|
||
self.assertEqual(u"""<div>
|
||
\xf6
|
||
- </div>""", six.text_type(tmpl.generate()))
|
||
+ </div>""", str(tmpl.generate()))
|
||
|
||
def test_exec_with_trailing_space(self):
|
||
"""
|
||
Index: Genshi-0.7.9/genshi/template/text.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/template/text.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/template/text.py 2025-05-09 08:30:16.093948257 +0200
|
||
@@ -28,7 +28,6 @@
|
||
|
||
import re
|
||
|
||
-import six
|
||
|
||
from genshi.core import TEXT
|
||
from genshi.template.base import BadDirectiveError, Template, \
|
||
@@ -163,7 +162,7 @@
|
||
depth = 0
|
||
|
||
source = source.read()
|
||
- if not isinstance(source, six.text_type):
|
||
+ if not isinstance(source, str):
|
||
source = source.decode(encoding or 'utf-8', 'replace')
|
||
offset = 0
|
||
lineno = 1
|
||
@@ -280,7 +279,7 @@
|
||
depth = 0
|
||
|
||
source = source.read()
|
||
- if not isinstance(source, six.text_type):
|
||
+ if not isinstance(source, str):
|
||
source = source.decode(encoding or 'utf-8', 'replace')
|
||
offset = 0
|
||
lineno = 1
|
||
Index: Genshi-0.7.9/genshi/util.py
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/genshi/util.py 2024-06-16 01:52:43.000000000 +0200
|
||
+++ Genshi-0.7.9/genshi/util.py 2025-05-09 08:30:16.094135209 +0200
|
||
@@ -15,9 +15,8 @@
|
||
|
||
import re
|
||
|
||
-from six.moves import html_entities as entities
|
||
+import html.entities
|
||
|
||
-import six
|
||
|
||
__docformat__ = 'restructuredtext en'
|
||
|
||
@@ -212,13 +211,13 @@
|
||
ref = int(ref[1:], 16)
|
||
else:
|
||
ref = int(ref, 10)
|
||
- return six.unichr(ref)
|
||
+ return chr(ref)
|
||
else: # character entity
|
||
ref = match.group(2)
|
||
if keepxmlentities and ref in ('amp', 'apos', 'gt', 'lt', 'quot'):
|
||
return '&%s;' % ref
|
||
try:
|
||
- return six.unichr(entities.name2codepoint[ref])
|
||
+ return chr(html.entities.name2codepoint[ref])
|
||
except KeyError:
|
||
if keepxmlentities:
|
||
return '&%s;' % ref
|
||
Index: Genshi-0.7.9/setup.cfg
|
||
===================================================================
|
||
--- Genshi-0.7.9.orig/setup.cfg 2024-06-16 01:52:56.000000000 +0200
|
||
+++ Genshi-0.7.9/setup.cfg 2025-05-09 08:30:26.396346827 +0200
|
||
@@ -39,8 +39,6 @@
|
||
genshi.filters.tests
|
||
genshi.template.tests
|
||
genshi.template.tests.templates
|
||
-install_requires =
|
||
- six
|
||
setup_requires =
|
||
setuptools
|
||
|