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:
Copyright (C) 2012-2017 Edgewall Software