Edgewall Software

Changeset 1141


Ignore:
Timestamp:
Oct 25, 2010, 12:21:28 AM (13 years ago)
Author:
hodgestar
Message:

add support for python 3 to genshi.filters:

  • minor changes to track encoding=None API change in core genshi modules.
  • renamed genshi/filters/tests/html.py to test_html.py to avoid clashes with Python 3 top-level html module when running tests subset.
  • did not rename genshi/filters/html.py.
  • i18n filters:
    • ugettext and friends are gone in Python 3 (and only gettext and friends exist and they now handle unicode)
    • Some \ line continuations inside doctests confused 2to3 and so were removed them.
    • Testing picked up a problem (already present in trunk) where Translator.call could end up defining gettext as an endlessly recursive function. Noted with a TODO.
Location:
branches/experimental/py3k/genshi/filters
Files:
1 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • branches/experimental/py3k/genshi/filters/html.py

    r1134 r1141  
    3333    >>> html = HTML('''<form>
    3434    ...   <p><input type="text" name="foo" /></p>
    35     ... </form>''')
     35    ... </form>''', encoding='utf-8')
    3636    >>> filler = HTMLFormFiller(data={'foo': 'bar'})
    3737    >>> print(html | filler)
     
    200200   
    201201    >>> from genshi import HTML
    202     >>> html = HTML('<div><script>alert(document.cookie)</script></div>')
     202    >>> html = HTML('<div><script>alert(document.cookie)</script></div>', encoding='utf-8')
    203203    >>> print(html | HTMLSanitizer())
    204204    <div/>
     
    208208    following instantation would work:
    209209   
    210     >>> html = HTML('<div style="background: #000"></div>')
     210    >>> html = HTML('<div style="background: #000"></div>', encoding='utf-8')
    211211    >>> sanitizer = HTMLSanitizer(safe_attrs=HTMLSanitizer.SAFE_ATTRS | set(['style']))
    212212    >>> print(html | sanitizer)
     
    216216    constructs from style attributes:
    217217
    218     >>> html = HTML('<div style="background: url(javascript:void); color: #000"></div>')
     218    >>> html = HTML('<div style="background: url(javascript:void); color: #000"></div>', encoding='utf-8')
    219219    >>> print(html | sanitizer)
    220220    <div style="color: #000"/>
  • branches/experimental/py3k/genshi/filters/i18n.py

    r1120 r1141  
    3434from genshi.template.directives import Directive, StripDirective
    3535from genshi.template.markup import MarkupTemplate, EXEC
     36from genshi.compat import IS_PYTHON2
    3637
    3738__all__ = ['Translator', 'extract']
     
    289290    examples:
    290291   
    291     >>> tmpl = MarkupTemplate('''\
    292         <html xmlns:i18n="http://genshi.edgewall.org/i18n">
     292    >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n">
    293293    ...   <div i18n:choose="num; num">
    294294    ...     <p i18n:singular="">There is $num coin</p>
     
    302302                      u'There are %(num)s coins'), [])]
    303303
    304     >>> tmpl = MarkupTemplate('''\
    305         <html xmlns:i18n="http://genshi.edgewall.org/i18n">
     304    >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n">
    306305    ...   <div i18n:choose="num; num">
    307306    ...     <p i18n:singular="">There is $num coin</p>
     
    325324    When used as a element and not as an attribute:
    326325
    327     >>> tmpl = MarkupTemplate('''\
    328         <html xmlns:i18n="http://genshi.edgewall.org/i18n">
     326    >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n">
    329327    ...   <i18n:choose numeral="num" params="num">
    330328    ...     <p i18n:singular="">There is $num coin</p>
     
    493491   
    494492    >>> from genshi.filters.tests.i18n import DummyTranslations
    495     >>> tmpl = MarkupTemplate('''\
    496         <html xmlns:i18n="http://genshi.edgewall.org/i18n">
     493    >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n">
    497494    ...   <p i18n:msg="">Bar</p>
    498495    ...   <div i18n:domain="foo">
     
    664661                ctxt['_i18n.gettext'] = gettext
    665662        else:
    666             gettext = self.translate.ugettext
    667             ngettext = self.translate.ungettext
     663            if IS_PYTHON2:
     664                gettext = self.translate.ugettext
     665                ngettext = self.translate.ungettext
     666            else:
     667                gettext = self.translate.gettext
     668                ngettext = self.translate.ngettext
    668669            try:
    669                 dgettext = self.translate.dugettext
    670                 dngettext = self.translate.dungettext
     670                if IS_PYTHON2:
     671                    dgettext = self.translate.dugettext
     672                    dngettext = self.translate.dungettext
     673                else:
     674                    dgettext = self.translate.dgettext
     675                    dngettext = self.translate.dngettext
    671676            except AttributeError:
    672677                dgettext = lambda _, y: gettext(y)
     
    679684
    680685        if ctxt and ctxt.get('_i18n.domain'):
     686            # TODO: This can cause infinite recursion if dgettext is defined
     687            #       via the AttributeError case above!
    681688            gettext = lambda msg: dgettext(ctxt.get('_i18n.domain'), msg)
    682689
     
    11691176            strings = []
    11701177            def _add(arg):
    1171                 if isinstance(arg, _ast.Str) and isinstance(arg.s, basestring):
     1178                if isinstance(arg, _ast.Str) and isinstance(arg.s, unicode):
     1179                    strings.append(arg.s)
     1180                elif isinstance(arg, _ast.Str):
    11721181                    strings.append(unicode(arg.s, 'utf-8'))
    11731182                elif arg:
  • branches/experimental/py3k/genshi/filters/tests/__init__.py

    r835 r1141  
    1616
    1717def suite():
    18     from genshi.filters.tests import html, i18n, transform
     18    from genshi.filters.tests import test_html, i18n, transform
    1919    suite = unittest.TestSuite()
    20     suite.addTest(html.suite())
     20    suite.addTest(test_html.suite())
    2121    suite.addTest(i18n.suite())
    2222    if hasattr(doctest, 'NORMALIZE_WHITESPACE'):
  • branches/experimental/py3k/genshi/filters/tests/i18n.py

    r1120 r1141  
    1515import doctest
    1616from gettext import NullTranslations
    17 from StringIO import StringIO
    1817import unittest
    1918
     
    2221from genshi.filters.i18n import Translator, extract
    2322from genshi.input import HTML
     23from genshi.compat import IS_PYTHON2, StringIO
    2424
    2525
     
    4040        return getattr(self._domains.get(domain, self), func)(*args, **kwargs)
    4141
    42     def ugettext(self, message):
    43         missing = object()
    44         tmsg = self._catalog.get(message, missing)
    45         if tmsg is missing:
    46             if self._fallback:
    47                 return self._fallback.ugettext(message)
    48             return unicode(message)
    49         return tmsg
    50 
    51     def dugettext(self, domain, message):
    52         return self._domain_call('ugettext', domain, message)
     42    if IS_PYTHON2:
     43        def ugettext(self, message):
     44            missing = object()
     45            tmsg = self._catalog.get(message, missing)
     46            if tmsg is missing:
     47                if self._fallback:
     48                    return self._fallback.ugettext(message)
     49                return unicode(message)
     50            return tmsg
     51    else:
     52        def gettext(self, message):
     53            missing = object()
     54            tmsg = self._catalog.get(message, missing)
     55            if tmsg is missing:
     56                if self._fallback:
     57                    return self._fallback.gettext(message)
     58                return unicode(message)
     59            return tmsg
     60
     61    if IS_PYTHON2:
     62        def dugettext(self, domain, message):
     63            return self._domain_call('ugettext', domain, message)
     64    else:
     65        def dgettext(self, domain, message):
     66            return self._domain_call('gettext', domain, message)
    5367
    5468    def ungettext(self, msgid1, msgid2, n):
     
    6377                return msgid2
    6478
    65     def dungettext(self, domain, singular, plural, numeral):
    66         return self._domain_call('ungettext', domain, singular, plural, numeral)
     79    if not IS_PYTHON2:
     80        ngettext = ungettext
     81        del ungettext
     82
     83    if IS_PYTHON2:
     84        def dungettext(self, domain, singular, plural, numeral):
     85            return self._domain_call('ungettext', domain, singular, plural, numeral)
     86    else:
     87        def dngettext(self, domain, singular, plural, numeral):
     88            return self._domain_call('ngettext', domain, singular, plural, numeral)
    6789
    6890
     
    7395        Verify that translated attributes end up in a proper `Attrs` instance.
    7496        """
    75         html = HTML("""<html>
     97        html = HTML(u"""<html>
    7698          <span title="Foo"></span>
    7799        </html>""")
     
    219241        translator = Translator(gettext)
    220242        translator.setup(tmpl)
    221         self.assertEqual("""<html>
     243        self.assertEqual(u"""<html>
    222244          <p>Für Details siehe bitte <a href="help.html">Hilfe</a>.</p>
    223         </html>""", tmpl.generate().render())
     245        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
    224246
    225247    def test_extract_i18n_msg_nonewline(self):
     
    242264        translator = Translator(gettext)
    243265        translator.setup(tmpl)
    244         self.assertEqual("""<html>
     266        self.assertEqual(u"""<html>
    245267          <p>Für Details siehe bitte <a href="help.html">Hilfe</a></p>
    246268        </html>""", tmpl.generate().render())
     
    265287        translator = Translator(gettext)
    266288        translator.setup(tmpl)
    267         self.assertEqual("""<html>
     289        self.assertEqual(u"""<html>
    268290          Für Details siehe bitte <a href="help.html">Hilfe</a>
    269         </html>""", tmpl.generate().render())
     291        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
    270292
    271293    def test_extract_i18n_msg_with_attributes(self):
     
    395417        translator = Translator(gettext)
    396418        translator.setup(tmpl)
    397         self.assertEqual("""<html>
     419        self.assertEqual(u"""<html>
    398420          <p>Für Details siehe bitte <a href="help.html"><em>Hilfeseite</em></a>.</p>
    399421        </html>""", tmpl.generate().render())
     
    450472        translator = Translator(gettext)
    451473        translator.setup(tmpl)
    452         self.assertEqual("""<html>
     474        self.assertEqual(u"""<html>
    453475          <p><input type="text" name="num"/> Einträge pro Seite anzeigen.</p>
    454476        </html>""", tmpl.generate().render())
     
    477499        translator = Translator(gettext)
    478500        translator.setup(tmpl)
    479         self.assertEqual("""<html>
     501        self.assertEqual(u"""<html>
    480502          <p>Für <em>Details</em> siehe bitte <a href="help.html">Hilfe</a>.</p>
    481503        </html>""", tmpl.generate().render())
     
    501523            Show me <input type="text" name="num" /> entries per page, starting at page <input type="text" name="num" />.
    502524          </p>
    503         </html>""")
     525        </html>""", encoding='utf-8')
    504526        gettext = lambda s: u"[1:] Einträge pro Seite, beginnend auf Seite [2:]."
    505527        translator = Translator(gettext)
    506528        translator.setup(tmpl)
    507         self.assertEqual("""<html>
    508           <p><input type="text" name="num"/> Eintr\xc3\xa4ge pro Seite, beginnend auf Seite <input type="text" name="num"/>.</p>
    509         </html>""", tmpl.generate().render())
     529        self.assertEqual(u"""<html>
     530          <p><input type="text" name="num"/> Eintr\u00E4ge pro Seite, beginnend auf Seite <input type="text" name="num"/>.</p>
     531        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
    510532
    511533    def test_extract_i18n_msg_with_param(self):
     
    546568        translator = Translator(gettext)
    547569        translator.setup(tmpl)
    548         self.assertEqual("""<html>
     570        self.assertEqual(u"""<html>
    549571          <p>Jim, sei gegrüßt!</p>
    550572        </html>""", tmpl.generate(user=dict(name='Jim')).render())
     
    560582        translator = Translator(gettext)
    561583        translator.setup(tmpl)
    562         self.assertEqual("""<html>
     584        self.assertEqual(u"""<html>
    563585          <p>Sei gegrüßt, <a href="#42">Alter</a>!</p>
    564586        </html>""", tmpl.generate(anchor='42').render())
     
    618640        translator = Translator(gettext)
    619641        translator.setup(tmpl)
    620         self.assertEqual("""<html>
     642        self.assertEqual(u"""<html>
    621643          <p><input type="text" name="num" value="x"/> Einträge pro Seite anzeigen.</p>
    622644        </html>""", tmpl.generate().render())
     
    677699        tmpl.filters.insert(0, translator)
    678700        tmpl.add_directives(Translator.NAMESPACE, translator)
    679         self.assertEqual("""<html>
     701        self.assertEqual(u"""<html>
    680702          <p title="Voh bär">Voh</p>
    681703        </html>""", tmpl.generate().render())
     
    721743        translator = Translator(translations)
    722744        translator.setup(tmpl)
    723         self.assertEqual("""<html>
     745        self.assertEqual(u"""<html>
    724746          Modificado à um dia por Pedro
    725         </html>""", tmpl.generate(date='um dia', author="Pedro").render())
     747        </html>""".encode('utf-8'), tmpl.generate(date='um dia', author="Pedro").render(encoding='utf-8'))
    726748
    727749
     
    750772        translator = Translator(translations)
    751773        translator.setup(tmpl)
    752         self.assertEqual("""<html>
     774        self.assertEqual(u"""<html>
    753775          <p><tt><b>Trandução[ 0 ]</b>: <em>Uma moeda</em></tt></p>
    754         </html>""", tmpl.generate().render())
     776        </html>""".encode('utf-8'), tmpl.generate().render(encoding='utf-8'))
    755777
    756778    def test_extract_i18n_msg_with_other_directives_nested(self):
     
    812834        ctx = Context()
    813835        ctx.push({'trac': {'homepage': 'http://trac.edgewall.org/'}})
    814         self.assertEqual("""<html>
     836        self.assertEqual(u"""<html>
    815837          <p>Antes de o fazer, porém,
    816838            <strong>por favor tente <a href="http://trac.edgewall.org/search?ticket=yes&amp;noquickjump=1&amp;q=q">procurar</a>
     
    847869            messages[0][2]
    848870        )
    849         self.assertEqual("""<html>
     871        self.assertEqual(u"""<html>
    850872          <p class="hint"><strong>Nota:</strong> Este repositório está definido em
    851873           <code><a href="href.wiki(TracIni)">trac.ini</a></code>
    852874            e não pode ser editado nesta página.</p>
    853         </html>""", tmpl.generate(editable=False).render())
     875        </html>""".encode('utf-8'), tmpl.generate(editable=False).render(encoding='utf-8'))
    854876
    855877    def test_extract_i18n_msg_with_py_strip(self):
     
    17721794            tmpl = loader.load('tmpl10.html')
    17731795
     1796            if IS_PYTHON2:
     1797                dgettext = translations.dugettext
     1798            else:
     1799                dgettext = translations.dgettext
     1800
    17741801            self.assertEqual("""<html>
    17751802                        <div>Included tmpl0</div>
     
    17981825                        <p title="Voh">Voh 3</p>
    17991826                </html>""", tmpl.generate(idx=-1,
    1800                                           dg=translations.dugettext).render())
     1827                                          dg=dgettext).render())
    18011828        finally:
    18021829            shutil.rmtree(dirname)
  • branches/experimental/py3k/genshi/filters/tests/transform.py

    r1080 r1141  
    4949def _transform(html, transformer, with_attrs=False):
    5050    """Apply transformation returning simplified marked stream."""
    51     if isinstance(html, basestring):
    52         html = HTML(html)
     51    if isinstance(html, basestring) and not isinstance(html, unicode):
     52        html = HTML(html, encoding='utf-8')
     53    elif isinstance(html, unicode):
     54        html = HTML(html, encoding='utf-8')
    5355    stream = transformer(html, keep_marks=True)
    5456    return _simplify(stream, with_attrs)
     
    5860    """Test .select()"""
    5961    def _select(self, select):
    60         html = HTML(FOOBAR)
     62        html = HTML(FOOBAR, encoding='utf-8')
    6163        if isinstance(select, basestring):
    6264            select = [select]
     
    139141    def test_select_text_context(self):
    140142        self.assertEqual(
    141             list(Transformer('.')(HTML('foo'), keep_marks=True)),
     143            list(Transformer('.')(HTML(u'foo'), keep_marks=True)),
    142144            [('OUTSIDE', ('TEXT', u'foo', (None, 1, 0)))],
    143145            )
     
    206208    def test_invert_text_context(self):
    207209        self.assertEqual(
    208             _simplify(Transformer('.').invert()(HTML('foo'), keep_marks=True)),
     210            _simplify(Transformer('.').invert()(HTML(u'foo'), keep_marks=True)),
    209211            [(None, 'TEXT', u'foo')],
    210212            )
     
    272274    def test_empty_text_context(self):
    273275        self.assertEqual(
    274             _simplify(Transformer('.')(HTML('foo'), keep_marks=True)),
     276            _simplify(Transformer('.')(HTML(u'foo'), keep_marks=True)),
    275277            [(OUTSIDE, TEXT, u'foo')],
    276278            )
     
    657659            def __iter__(self):
    658660                self.count += 1
    659                 return iter(HTML('CONTENT %i' % self.count))
    660 
    661         if isinstance(html, basestring):
     661                return iter(HTML(u'CONTENT %i' % self.count))
     662
     663        if isinstance(html, basestring) and not isinstance(html, unicode):
     664            html = HTML(html, encoding='utf-8')
     665        else:
    662666            html = HTML(html)
    663667        if content is None:
  • branches/experimental/py3k/genshi/filters/transform.py

    r1080 r1141  
    3232...    Some <em>body</em> text.
    3333...  </body>
    34 ... </html>''')
     34... </html>''',
     35... encoding='utf-8')
    3536>>> print(html | Transformer('body/em').map(unicode.upper, TEXT)
    3637...                                    .unwrap().wrap(tag.u))
     
    137138
    138139    >>> html = HTML('<html><head><title>Some Title</title></head>'
    139     ...             '<body>Some <em>body</em> text.</body></html>')
     140    ...             '<body>Some <em>body</em> text.</body></html>',
     141    ...             encoding='utf-8')
    140142
    141143    Transformations act on selected stream events matching an XPath expression.
     
    216218        ...         else:
    217219        ...             yield mark, (kind, data, pos)
    218         >>> short_stream = HTML('<body>Some <em>test</em> text</body>')
     220        >>> short_stream = HTML('<body>Some <em>test</em> text</body>',
     221        ...                      encoding='utf-8')
    219222        >>> print(short_stream | Transformer('.//em/text()').apply(upper))
    220223        <body>Some <em>TEST</em> text</body>
     
    234237        selection.
    235238
    236         >>> html = HTML('<body>Some <em>test</em> text</body>')
     239        >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8')
    237240        >>> print(html | Transformer().select('.//em').trace())
    238241        (None, ('START', (QName('body'), Attrs()), (None, 1, 0)))
     
    258261        are converted to OUTSIDE marks.
    259262
    260         >>> html = HTML('<body>Some <em>test</em> text</body>')
     263        >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8')
    261264        >>> print(html | Transformer('//em').invert().trace())
    262265        ('OUTSIDE', ('START', (QName('body'), Attrs()), (None, 1, 0)))
     
    278281        Example:
    279282
    280         >>> html = HTML('<body>Some <em>test</em> text</body>')
     283        >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8')
    281284        >>> print(html | Transformer('//em').end().trace())
    282285        ('OUTSIDE', ('START', (QName('body'), Attrs()), (None, 1, 0)))
     
    302305
    303306        >>> html = HTML('<html><head><title>Some Title</title></head>'
    304         ...             '<body>Some <em>body</em> text.</body></html>')
     307        ...             '<body>Some <em>body</em> text.</body></html>',
     308        ...             encoding='utf-8')
    305309        >>> print(html | Transformer('.//em').empty())
    306310        <html><head><title>Some Title</title></head><body>Some <em/>
     
    317321
    318322        >>> html = HTML('<html><head><title>Some Title</title></head>'
    319         ...             '<body>Some <em>body</em> text.</body></html>')
     323        ...             '<body>Some <em>body</em> text.</body></html>',
     324        ...             encoding='utf-8')
    320325        >>> print(html | Transformer('.//em').remove())
    321326        <html><head><title>Some Title</title></head><body>Some
     
    334339
    335340        >>> html = HTML('<html><head><title>Some Title</title></head>'
    336         ...             '<body>Some <em>body</em> text.</body></html>')
     341        ...             '<body>Some <em>body</em> text.</body></html>',
     342        ...             encoding='utf-8')
    337343        >>> print(html | Transformer('.//em').unwrap())
    338344        <html><head><title>Some Title</title></head><body>Some body
     
    347353
    348354        >>> html = HTML('<html><head><title>Some Title</title></head>'
    349         ...             '<body>Some <em>body</em> text.</body></html>')
     355        ...             '<body>Some <em>body</em> text.</body></html>',
     356        ...             encoding='utf-8')
    350357        >>> print(html | Transformer('.//em').wrap('strong'))
    351358        <html><head><title>Some Title</title></head><body>Some
     
    363370
    364371        >>> html = HTML('<html><head><title>Some Title</title></head>'
    365         ...             '<body>Some <em>body</em> text.</body></html>')
     372        ...             '<body>Some <em>body</em> text.</body></html>',
     373        ...             encoding='utf-8')
    366374        >>> print(html | Transformer('.//title/text()').replace('New Title'))
    367375        <html><head><title>New Title</title></head><body>Some <em>body</em>
     
    381389
    382390        >>> html = HTML('<html><head><title>Some Title</title></head>'
    383         ...             '<body>Some <em>body</em> text.</body></html>')
     391        ...             '<body>Some <em>body</em> text.</body></html>',
     392        ...             encoding='utf-8')
    384393        >>> print(html | Transformer('.//em').before('emphasised '))
    385394        <html><head><title>Some Title</title></head><body>Some emphasised
     
    398407
    399408        >>> html = HTML('<html><head><title>Some Title</title></head>'
    400         ...             '<body>Some <em>body</em> text.</body></html>')
     409        ...             '<body>Some <em>body</em> text.</body></html>',
     410        ...             encoding='utf-8')
    401411        >>> print(html | Transformer('.//em').after(' rock'))
    402412        <html><head><title>Some Title</title></head><body>Some <em>body</em>
     
    415425
    416426        >>> html = HTML('<html><head><title>Some Title</title></head>'
    417         ...             '<body>Some <em>body</em> text.</body></html>')
     427        ...             '<body>Some <em>body</em> text.</body></html>',
     428        ...             encoding='utf-8')
    418429        >>> print(html | Transformer('.//body').prepend('Some new body text. '))
    419430        <html><head><title>Some Title</title></head><body>Some new body text.
     
    430441
    431442        >>> html = HTML('<html><head><title>Some Title</title></head>'
    432         ...             '<body>Some <em>body</em> text.</body></html>')
     443        ...             '<body>Some <em>body</em> text.</body></html>',
     444        ...             encoding='utf-8')
    433445        >>> print(html | Transformer('.//body').append(' Some new body text.'))
    434446        <html><head><title>Some Title</title></head><body>Some <em>body</em>
     
    451463        >>> html = HTML('<html><head><title>Some Title</title></head>'
    452464        ...             '<body>Some <em class="before">body</em> <em>text</em>.</body>'
    453         ...             '</html>')
     465        ...             '</html>', encoding='utf-8')
    454466        >>> print(html | Transformer('body/em').attr('class', None))
    455467        <html><head><title>Some Title</title></head><body>Some <em>body</em>
     
    494506        >>> buffer = StreamBuffer()
    495507        >>> html = HTML('<html><head><title>Some Title</title></head>'
    496         ...             '<body>Some <em>body</em> text.</body></html>')
     508        ...             '<body>Some <em>body</em> text.</body></html>',
     509        ...             encoding='utf-8')
    497510        >>> print(html | Transformer('head/title/text()').copy(buffer)
    498511        ...     .end().select('body').prepend(tag.h1(buffer)))
     
    515528        >>> html = HTML('<html><head><title>Some Title</title></head>'
    516529        ...             '<body><em>Some</em> <em class="before">body</em>'
    517         ...             '<em>text</em>.</body></html>')
     530        ...             '<em>text</em>.</body></html>',
     531        ...             encoding='utf-8')
    518532        >>> buffer = StreamBuffer()
    519533        >>> def apply_attr(name, entry):
     
    547561        >>> buffer = StreamBuffer()
    548562        >>> html = HTML('<html><head><title>Some Title</title></head>'
    549         ...             '<body>Some <em>body</em> text.</body></html>')
     563        ...             '<body>Some <em>body</em> text.</body></html>',
     564        ...             encoding='utf-8')
    550565        >>> print(html | Transformer('.//em/text()').cut(buffer)
    551566        ...     .end().select('.//em').after(tag.h1(buffer)))
     
    578593
    579594        >>> doc = HTML('<doc><notes></notes><body>Some <note>one</note> '
    580         ...            'text <note>two</note>.</body></doc>')
     595        ...            'text <note>two</note>.</body></doc>',
     596        ...             encoding='utf-8')
    581597        >>> buffer = StreamBuffer()
    582598        >>> print(doc | Transformer('body/note').cut(buffer, accumulate=True)
     
    596612        >>> from genshi.filters.html import HTMLSanitizer
    597613        >>> html = HTML('<html><body>Some text<script>alert(document.cookie)'
    598         ...             '</script> and some more text</body></html>')
     614        ...             '</script> and some more text</body></html>',
     615        ...             encoding='utf-8')
    599616        >>> print(html | Transformer('body/*').filter(HTMLSanitizer()))
    600617        <html><body>Some text and some more text</body></html>
     
    610627
    611628        >>> html = HTML('<html><head><title>Some Title</title></head>'
    612         ...               '<body>Some <em>body</em> text.</body></html>')
     629        ...               '<body>Some <em>body</em> text.</body></html>',
     630        ...             encoding='utf-8')
    613631        >>> print(html | Transformer('head/title').map(unicode.upper, TEXT))
    614632        <html><head><title>SOME TITLE</title></head><body>Some <em>body</em>
     
    628646        >>> html = HTML('<html><body>Some text, some more text and '
    629647        ...             '<b>some bold text</b>\\n'
    630         ...             '<i>some italicised text</i></body></html>')
     648        ...             '<i>some italicised text</i></body></html>',
     649        ...             encoding='utf-8')
    631650        >>> print(html | Transformer('body/b').substitute('(?i)some', 'SOME'))
    632651        <html><body>Some text, some more text and <b>SOME bold text</b>
     
    650669
    651670        >>> html = HTML('<html><body>Some text, some more text and '
    652         ...             '<b>some bold text</b></body></html>')
     671        ...             '<b>some bold text</b></body></html>',
     672        ...             encoding='utf-8')
    653673        >>> print(html | Transformer('body/b').rename('strong'))
    654674        <html><body>Some text, some more text and <strong>some bold text</strong></body></html>
     
    659679        """Print events as they pass through the transform.
    660680
    661         >>> html = HTML('<body>Some <em>test</em> text</body>')
     681        >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8')
    662682        >>> print(html | Transformer('em').trace())
    663683        (None, ('START', (QName('body'), Attrs()), (None, 1, 0)))
     
    10251045    ...         for event in stream:
    10261046    ...             yield event
    1027     >>> html = HTML('<body>Some <em>test</em> text</body>')
     1047    >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8')
    10281048    >>> print(html | Transformer('.//em').apply(Top('Prefix ')))
    10291049    Prefix <body>Some <em>test</em> text</body>
Note: See TracChangeset for help on using the changeset viewer.