Mercurial > genshi > mirror
comparison genshi/output.py @ 939:f15334b65cf8 trunk
Don't cache (TEXT, Markup) events in serializers. This is not needed and since Markup instances compare equal to the same non-Markup string this can lead to incorrect cached output being retrieved. Fixes #429. This is patch t429-fix.2.patch from that ticket. It includes an additional unrelated test to check that the WhitespaceFilter actually removes ignorable whitespace.
author | hodgestar |
---|---|
date | Sun, 12 Jun 2011 00:41:35 +0000 |
parents | 8d0f693081b5 |
children | 6fc92535c888 e02843c0fecc |
comparison
equal
deleted
inserted
replaced
938:8d0f693081b5 | 939:f15334b65cf8 |
---|---|
237 _emit, _get = self._prepare_cache() | 237 _emit, _get = self._prepare_cache() |
238 | 238 |
239 for filter_ in self.filters: | 239 for filter_ in self.filters: |
240 stream = filter_(stream) | 240 stream = filter_(stream) |
241 for kind, data, pos in stream: | 241 for kind, data, pos in stream: |
242 if kind is TEXT and isinstance(data, Markup): | |
243 yield data | |
244 continue | |
242 cached = _get((kind, data)) | 245 cached = _get((kind, data)) |
243 if cached is not None: | 246 if cached is not None: |
244 yield cached | 247 yield cached |
245 elif kind is START or kind is EMPTY: | 248 elif kind is START or kind is EMPTY: |
246 tag, attrib = data | 249 tag, attrib = data |
343 _emit, _get = self._prepare_cache() | 346 _emit, _get = self._prepare_cache() |
344 | 347 |
345 for filter_ in self.filters: | 348 for filter_ in self.filters: |
346 stream = filter_(stream) | 349 stream = filter_(stream) |
347 for kind, data, pos in stream: | 350 for kind, data, pos in stream: |
351 if kind is TEXT and isinstance(data, Markup): | |
352 yield data | |
353 continue | |
348 cached = _get((kind, data)) | 354 cached = _get((kind, data)) |
349 if cached is not None: | 355 if cached is not None: |
350 yield cached | 356 yield cached |
351 | 357 |
352 elif kind is START or kind is EMPTY: | 358 elif kind is START or kind is EMPTY: |
465 _emit, _get = self._prepare_cache() | 471 _emit, _get = self._prepare_cache() |
466 | 472 |
467 for filter_ in self.filters: | 473 for filter_ in self.filters: |
468 stream = filter_(stream) | 474 stream = filter_(stream) |
469 for kind, data, _ in stream: | 475 for kind, data, _ in stream: |
476 if kind is TEXT and isinstance(data, Markup): | |
477 yield data | |
478 continue | |
470 output = _get((kind, data)) | 479 output = _get((kind, data)) |
471 if output is not None: | 480 if output is not None: |
472 yield output | 481 yield output |
473 if (kind is START or kind is EMPTY) \ | 482 if (kind is START or kind is EMPTY) \ |
474 and data[0] in noescape_elems: | 483 and data[0] in noescape_elems: |
656 val += 1 | 665 val += 1 |
657 yield 'ns%d' % val | 666 yield 'ns%d' % val |
658 _gen_prefix = _gen_prefix().next | 667 _gen_prefix = _gen_prefix().next |
659 | 668 |
660 for kind, data, pos in stream: | 669 for kind, data, pos in stream: |
670 if kind is TEXT and isinstance(data, Markup): | |
671 yield kind, data, pos | |
672 continue | |
661 output = _get((kind, data)) | 673 output = _get((kind, data)) |
662 if output is not None: | 674 if output is not None: |
663 yield kind, output, pos | 675 yield kind, output, pos |
664 | 676 |
665 elif kind is START or kind is EMPTY: | 677 elif kind is START or kind is EMPTY: |