- Timestamp:
- Mar 18, 2011, 10:11:53 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 1 deleted
- 7 edited
- 1 copied
-
. (modified) (1 prop)
-
genshi/filters/html.py (modified) (4 diffs)
-
genshi/filters/i18n.py (modified) (8 diffs)
-
genshi/filters/tests/__init__.py (modified) (1 diff)
-
genshi/filters/tests/html.py (deleted)
-
genshi/filters/tests/i18n.py (modified) (22 diffs)
-
genshi/filters/tests/test_html.py (copied) (copied from branches/experimental/py3k/genshi/filters/tests/test_html.py)
-
genshi/filters/tests/transform.py (modified) (6 diffs)
-
genshi/filters/transform.py (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/experimental/py3k merged: 1141
- Property svn:mergeinfo changed
-
trunk/genshi/filters/html.py
r1134 r1158 33 33 >>> html = HTML('''<form> 34 34 ... <p><input type="text" name="foo" /></p> 35 ... </form>''' )35 ... </form>''', encoding='utf-8') 36 36 >>> filler = HTMLFormFiller(data={'foo': 'bar'}) 37 37 >>> print(html | filler) … … 200 200 201 201 >>> 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') 203 203 >>> print(html | HTMLSanitizer()) 204 204 <div/> … … 208 208 following instantation would work: 209 209 210 >>> html = HTML('<div style="background: #000"></div>' )210 >>> html = HTML('<div style="background: #000"></div>', encoding='utf-8') 211 211 >>> sanitizer = HTMLSanitizer(safe_attrs=HTMLSanitizer.SAFE_ATTRS | set(['style'])) 212 212 >>> print(html | sanitizer) … … 216 216 constructs from style attributes: 217 217 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') 219 219 >>> print(html | sanitizer) 220 220 <div style="color: #000"/> -
trunk/genshi/filters/i18n.py
r1120 r1158 34 34 from genshi.template.directives import Directive, StripDirective 35 35 from genshi.template.markup import MarkupTemplate, EXEC 36 from genshi.compat import IS_PYTHON2 36 37 37 38 __all__ = ['Translator', 'extract'] … … 289 290 examples: 290 291 291 >>> tmpl = MarkupTemplate('''\ 292 <html xmlns:i18n="http://genshi.edgewall.org/i18n"> 292 >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n"> 293 293 ... <div i18n:choose="num; num"> 294 294 ... <p i18n:singular="">There is $num coin</p> … … 302 302 u'There are %(num)s coins'), [])] 303 303 304 >>> tmpl = MarkupTemplate('''\ 305 <html xmlns:i18n="http://genshi.edgewall.org/i18n"> 304 >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n"> 306 305 ... <div i18n:choose="num; num"> 307 306 ... <p i18n:singular="">There is $num coin</p> … … 325 324 When used as a element and not as an attribute: 326 325 327 >>> tmpl = MarkupTemplate('''\ 328 <html xmlns:i18n="http://genshi.edgewall.org/i18n"> 326 >>> tmpl = MarkupTemplate('''<html xmlns:i18n="http://genshi.edgewall.org/i18n"> 329 327 ... <i18n:choose numeral="num" params="num"> 330 328 ... <p i18n:singular="">There is $num coin</p> … … 493 491 494 492 >>> 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"> 497 494 ... <p i18n:msg="">Bar</p> 498 495 ... <div i18n:domain="foo"> … … 664 661 ctxt['_i18n.gettext'] = gettext 665 662 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 668 669 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 671 676 except AttributeError: 672 677 dgettext = lambda _, y: gettext(y) … … 679 684 680 685 if ctxt and ctxt.get('_i18n.domain'): 686 # TODO: This can cause infinite recursion if dgettext is defined 687 # via the AttributeError case above! 681 688 gettext = lambda msg: dgettext(ctxt.get('_i18n.domain'), msg) 682 689 … … 1169 1176 strings = [] 1170 1177 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): 1172 1181 strings.append(unicode(arg.s, 'utf-8')) 1173 1182 elif arg: -
trunk/genshi/filters/tests/__init__.py
r835 r1158 16 16 17 17 def suite(): 18 from genshi.filters.tests import html, i18n, transform18 from genshi.filters.tests import test_html, i18n, transform 19 19 suite = unittest.TestSuite() 20 suite.addTest( html.suite())20 suite.addTest(test_html.suite()) 21 21 suite.addTest(i18n.suite()) 22 22 if hasattr(doctest, 'NORMALIZE_WHITESPACE'): -
trunk/genshi/filters/tests/i18n.py
r1120 r1158 15 15 import doctest 16 16 from gettext import NullTranslations 17 from StringIO import StringIO18 17 import unittest 19 18 … … 22 21 from genshi.filters.i18n import Translator, extract 23 22 from genshi.input import HTML 23 from genshi.compat import IS_PYTHON2, StringIO 24 24 25 25 … … 40 40 return getattr(self._domains.get(domain, self), func)(*args, **kwargs) 41 41 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) 53 67 54 68 def ungettext(self, msgid1, msgid2, n): … … 63 77 return msgid2 64 78 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) 67 89 68 90 … … 73 95 Verify that translated attributes end up in a proper `Attrs` instance. 74 96 """ 75 html = HTML( """<html>97 html = HTML(u"""<html> 76 98 <span title="Foo"></span> 77 99 </html>""") … … 219 241 translator = Translator(gettext) 220 242 translator.setup(tmpl) 221 self.assertEqual( """<html>243 self.assertEqual(u"""<html> 222 244 <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')) 224 246 225 247 def test_extract_i18n_msg_nonewline(self): … … 242 264 translator = Translator(gettext) 243 265 translator.setup(tmpl) 244 self.assertEqual( """<html>266 self.assertEqual(u"""<html> 245 267 <p>Für Details siehe bitte <a href="help.html">Hilfe</a></p> 246 268 </html>""", tmpl.generate().render()) … … 265 287 translator = Translator(gettext) 266 288 translator.setup(tmpl) 267 self.assertEqual( """<html>289 self.assertEqual(u"""<html> 268 290 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')) 270 292 271 293 def test_extract_i18n_msg_with_attributes(self): … … 395 417 translator = Translator(gettext) 396 418 translator.setup(tmpl) 397 self.assertEqual( """<html>419 self.assertEqual(u"""<html> 398 420 <p>Für Details siehe bitte <a href="help.html"><em>Hilfeseite</em></a>.</p> 399 421 </html>""", tmpl.generate().render()) … … 450 472 translator = Translator(gettext) 451 473 translator.setup(tmpl) 452 self.assertEqual( """<html>474 self.assertEqual(u"""<html> 453 475 <p><input type="text" name="num"/> Einträge pro Seite anzeigen.</p> 454 476 </html>""", tmpl.generate().render()) … … 477 499 translator = Translator(gettext) 478 500 translator.setup(tmpl) 479 self.assertEqual( """<html>501 self.assertEqual(u"""<html> 480 502 <p>Für <em>Details</em> siehe bitte <a href="help.html">Hilfe</a>.</p> 481 503 </html>""", tmpl.generate().render()) … … 501 523 Show me <input type="text" name="num" /> entries per page, starting at page <input type="text" name="num" />. 502 524 </p> 503 </html>""" )525 </html>""", encoding='utf-8') 504 526 gettext = lambda s: u"[1:] Einträge pro Seite, beginnend auf Seite [2:]." 505 527 translator = Translator(gettext) 506 528 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')) 510 532 511 533 def test_extract_i18n_msg_with_param(self): … … 546 568 translator = Translator(gettext) 547 569 translator.setup(tmpl) 548 self.assertEqual( """<html>570 self.assertEqual(u"""<html> 549 571 <p>Jim, sei gegrüßt!</p> 550 572 </html>""", tmpl.generate(user=dict(name='Jim')).render()) … … 560 582 translator = Translator(gettext) 561 583 translator.setup(tmpl) 562 self.assertEqual( """<html>584 self.assertEqual(u"""<html> 563 585 <p>Sei gegrüßt, <a href="#42">Alter</a>!</p> 564 586 </html>""", tmpl.generate(anchor='42').render()) … … 618 640 translator = Translator(gettext) 619 641 translator.setup(tmpl) 620 self.assertEqual( """<html>642 self.assertEqual(u"""<html> 621 643 <p><input type="text" name="num" value="x"/> Einträge pro Seite anzeigen.</p> 622 644 </html>""", tmpl.generate().render()) … … 677 699 tmpl.filters.insert(0, translator) 678 700 tmpl.add_directives(Translator.NAMESPACE, translator) 679 self.assertEqual( """<html>701 self.assertEqual(u"""<html> 680 702 <p title="Voh bär">Voh</p> 681 703 </html>""", tmpl.generate().render()) … … 721 743 translator = Translator(translations) 722 744 translator.setup(tmpl) 723 self.assertEqual( """<html>745 self.assertEqual(u"""<html> 724 746 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')) 726 748 727 749 … … 750 772 translator = Translator(translations) 751 773 translator.setup(tmpl) 752 self.assertEqual( """<html>774 self.assertEqual(u"""<html> 753 775 <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')) 755 777 756 778 def test_extract_i18n_msg_with_other_directives_nested(self): … … 812 834 ctx = Context() 813 835 ctx.push({'trac': {'homepage': 'http://trac.edgewall.org/'}}) 814 self.assertEqual( """<html>836 self.assertEqual(u"""<html> 815 837 <p>Antes de o fazer, porém, 816 838 <strong>por favor tente <a href="http://trac.edgewall.org/search?ticket=yes&noquickjump=1&q=q">procurar</a> … … 847 869 messages[0][2] 848 870 ) 849 self.assertEqual( """<html>871 self.assertEqual(u"""<html> 850 872 <p class="hint"><strong>Nota:</strong> Este repositório está definido em 851 873 <code><a href="href.wiki(TracIni)">trac.ini</a></code> 852 874 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')) 854 876 855 877 def test_extract_i18n_msg_with_py_strip(self): … … 1772 1794 tmpl = loader.load('tmpl10.html') 1773 1795 1796 if IS_PYTHON2: 1797 dgettext = translations.dugettext 1798 else: 1799 dgettext = translations.dgettext 1800 1774 1801 self.assertEqual("""<html> 1775 1802 <div>Included tmpl0</div> … … 1798 1825 <p title="Voh">Voh 3</p> 1799 1826 </html>""", tmpl.generate(idx=-1, 1800 dg= translations.dugettext).render())1827 dg=dgettext).render()) 1801 1828 finally: 1802 1829 shutil.rmtree(dirname) -
trunk/genshi/filters/tests/transform.py
r1080 r1158 49 49 def _transform(html, transformer, with_attrs=False): 50 50 """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') 53 55 stream = transformer(html, keep_marks=True) 54 56 return _simplify(stream, with_attrs) … … 58 60 """Test .select()""" 59 61 def _select(self, select): 60 html = HTML(FOOBAR )62 html = HTML(FOOBAR, encoding='utf-8') 61 63 if isinstance(select, basestring): 62 64 select = [select] … … 139 141 def test_select_text_context(self): 140 142 self.assertEqual( 141 list(Transformer('.')(HTML( 'foo'), keep_marks=True)),143 list(Transformer('.')(HTML(u'foo'), keep_marks=True)), 142 144 [('OUTSIDE', ('TEXT', u'foo', (None, 1, 0)))], 143 145 ) … … 206 208 def test_invert_text_context(self): 207 209 self.assertEqual( 208 _simplify(Transformer('.').invert()(HTML( 'foo'), keep_marks=True)),210 _simplify(Transformer('.').invert()(HTML(u'foo'), keep_marks=True)), 209 211 [(None, 'TEXT', u'foo')], 210 212 ) … … 272 274 def test_empty_text_context(self): 273 275 self.assertEqual( 274 _simplify(Transformer('.')(HTML( 'foo'), keep_marks=True)),276 _simplify(Transformer('.')(HTML(u'foo'), keep_marks=True)), 275 277 [(OUTSIDE, TEXT, u'foo')], 276 278 ) … … 657 659 def __iter__(self): 658 660 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: 662 666 html = HTML(html) 663 667 if content is None: -
trunk/genshi/filters/transform.py
r1080 r1158 32 32 ... Some <em>body</em> text. 33 33 ... </body> 34 ... </html>''') 34 ... </html>''', 35 ... encoding='utf-8') 35 36 >>> print(html | Transformer('body/em').map(unicode.upper, TEXT) 36 37 ... .unwrap().wrap(tag.u)) … … 137 138 138 139 >>> 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') 140 142 141 143 Transformations act on selected stream events matching an XPath expression. … … 216 218 ... else: 217 219 ... 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') 219 222 >>> print(short_stream | Transformer('.//em/text()').apply(upper)) 220 223 <body>Some <em>TEST</em> text</body> … … 234 237 selection. 235 238 236 >>> html = HTML('<body>Some <em>test</em> text</body>' )239 >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8') 237 240 >>> print(html | Transformer().select('.//em').trace()) 238 241 (None, ('START', (QName('body'), Attrs()), (None, 1, 0))) … … 258 261 are converted to OUTSIDE marks. 259 262 260 >>> html = HTML('<body>Some <em>test</em> text</body>' )263 >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8') 261 264 >>> print(html | Transformer('//em').invert().trace()) 262 265 ('OUTSIDE', ('START', (QName('body'), Attrs()), (None, 1, 0))) … … 278 281 Example: 279 282 280 >>> html = HTML('<body>Some <em>test</em> text</body>' )283 >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8') 281 284 >>> print(html | Transformer('//em').end().trace()) 282 285 ('OUTSIDE', ('START', (QName('body'), Attrs()), (None, 1, 0))) … … 302 305 303 306 >>> 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') 305 309 >>> print(html | Transformer('.//em').empty()) 306 310 <html><head><title>Some Title</title></head><body>Some <em/> … … 317 321 318 322 >>> 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') 320 325 >>> print(html | Transformer('.//em').remove()) 321 326 <html><head><title>Some Title</title></head><body>Some … … 334 339 335 340 >>> 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') 337 343 >>> print(html | Transformer('.//em').unwrap()) 338 344 <html><head><title>Some Title</title></head><body>Some body … … 347 353 348 354 >>> 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') 350 357 >>> print(html | Transformer('.//em').wrap('strong')) 351 358 <html><head><title>Some Title</title></head><body>Some … … 363 370 364 371 >>> 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') 366 374 >>> print(html | Transformer('.//title/text()').replace('New Title')) 367 375 <html><head><title>New Title</title></head><body>Some <em>body</em> … … 381 389 382 390 >>> 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') 384 393 >>> print(html | Transformer('.//em').before('emphasised ')) 385 394 <html><head><title>Some Title</title></head><body>Some emphasised … … 398 407 399 408 >>> 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') 401 411 >>> print(html | Transformer('.//em').after(' rock')) 402 412 <html><head><title>Some Title</title></head><body>Some <em>body</em> … … 415 425 416 426 >>> 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') 418 429 >>> print(html | Transformer('.//body').prepend('Some new body text. ')) 419 430 <html><head><title>Some Title</title></head><body>Some new body text. … … 430 441 431 442 >>> 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') 433 445 >>> print(html | Transformer('.//body').append(' Some new body text.')) 434 446 <html><head><title>Some Title</title></head><body>Some <em>body</em> … … 451 463 >>> html = HTML('<html><head><title>Some Title</title></head>' 452 464 ... '<body>Some <em class="before">body</em> <em>text</em>.</body>' 453 ... '</html>' )465 ... '</html>', encoding='utf-8') 454 466 >>> print(html | Transformer('body/em').attr('class', None)) 455 467 <html><head><title>Some Title</title></head><body>Some <em>body</em> … … 494 506 >>> buffer = StreamBuffer() 495 507 >>> 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') 497 510 >>> print(html | Transformer('head/title/text()').copy(buffer) 498 511 ... .end().select('body').prepend(tag.h1(buffer))) … … 515 528 >>> html = HTML('<html><head><title>Some Title</title></head>' 516 529 ... '<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') 518 532 >>> buffer = StreamBuffer() 519 533 >>> def apply_attr(name, entry): … … 547 561 >>> buffer = StreamBuffer() 548 562 >>> 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') 550 565 >>> print(html | Transformer('.//em/text()').cut(buffer) 551 566 ... .end().select('.//em').after(tag.h1(buffer))) … … 578 593 579 594 >>> 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') 581 597 >>> buffer = StreamBuffer() 582 598 >>> print(doc | Transformer('body/note').cut(buffer, accumulate=True) … … 596 612 >>> from genshi.filters.html import HTMLSanitizer 597 613 >>> 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') 599 616 >>> print(html | Transformer('body/*').filter(HTMLSanitizer())) 600 617 <html><body>Some text and some more text</body></html> … … 610 627 611 628 >>> 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') 613 631 >>> print(html | Transformer('head/title').map(unicode.upper, TEXT)) 614 632 <html><head><title>SOME TITLE</title></head><body>Some <em>body</em> … … 628 646 >>> html = HTML('<html><body>Some text, some more text and ' 629 647 ... '<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') 631 650 >>> print(html | Transformer('body/b').substitute('(?i)some', 'SOME')) 632 651 <html><body>Some text, some more text and <b>SOME bold text</b> … … 650 669 651 670 >>> 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') 653 673 >>> print(html | Transformer('body/b').rename('strong')) 654 674 <html><body>Some text, some more text and <strong>some bold text</strong></body></html> … … 659 679 """Print events as they pass through the transform. 660 680 661 >>> html = HTML('<body>Some <em>test</em> text</body>' )681 >>> html = HTML('<body>Some <em>test</em> text</body>', encoding='utf-8') 662 682 >>> print(html | Transformer('em').trace()) 663 683 (None, ('START', (QName('body'), Attrs()), (None, 1, 0))) … … 1025 1045 ... for event in stream: 1026 1046 ... 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') 1028 1048 >>> print(html | Transformer('.//em').apply(Top('Prefix '))) 1029 1049 Prefix <body>Some <em>test</em> text</body>
Note: See TracChangeset
for help on using the changeset viewer.
