Mercurial > genshi > mirror
changeset 952:7f8b4df4f862 trunk
Handle multiple events between or an either side of start and end tags in translated messages -- fixes #404 (bug no longer found).
author | hodgestar |
---|---|
date | Sat, 03 Sep 2011 01:11:30 +0000 |
parents | 981f3fc8c3ed |
children | 353ecf97bf61 |
files | genshi/filters/i18n.py genshi/filters/tests/i18n.py |
diffstat | 2 files changed, 29 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/genshi/filters/i18n.py +++ b/genshi/filters/i18n.py @@ -948,9 +948,18 @@ self.values = {} self.depth = 1 self.order = 1 + self._prev_order = None self.stack = [0] self.subdirectives = {} + def _add_event(self, order, event): + if order == self._prev_order: + self.events[order][-1].append(event) + else: + self._prev_order = order + self.events.setdefault(order, []) + self.events[order].append([event]) + def append(self, kind, data, pos): """Append a stream event to the buffer. @@ -965,17 +974,17 @@ subdirectives, substream = data # Store the directives that should be applied after translation self.subdirectives.setdefault(order, []).extend(subdirectives) - self.events.setdefault(order, []).append((SUB_START, None, pos)) + self._add_event(order, (SUB_START, None, pos)) for skind, sdata, spos in substream: self.append(skind, sdata, spos) - self.events.setdefault(order, []).append((SUB_END, None, pos)) + self._add_event(order, (SUB_END, None, pos)) elif kind is TEXT: if '[' in data or ']' in data: # Quote [ and ] if it ain't us adding it, ie, if the user is # using those chars in his templates, escape them data = data.replace('[', '\[').replace(']', '\]') self.string.append(data) - self.events.setdefault(self.stack[-1], []).append((kind, data, pos)) + self._add_event(self.stack[-1], (kind, data, pos)) elif kind is EXPR: if self.params: param = self.params.pop(0) @@ -992,20 +1001,19 @@ 'In-memory Template'), pos[1])) self.string.append('%%(%s)s' % param) - self.events.setdefault(self.stack[-1], []).append((kind, data, pos)) + self._add_event(self.stack[-1], (kind, data, pos)) self.values[param] = (kind, data, pos) else: if kind is START: self.string.append('[%d:' % self.order) self.stack.append(self.order) - self.events.setdefault(self.stack[-1], - []).append((kind, data, pos)) + self._add_event(self.stack[-1], (kind, data, pos)) self.depth += 1 self.order += 1 elif kind is END: self.depth -= 1 if self.depth: - self.events[self.stack[-1]].append((kind, data, pos)) + self._add_event(self.stack[-1], (kind, data, pos)) self.string.append(']') self.stack.pop() @@ -1040,10 +1048,7 @@ while parts: order, string = parts.pop(0) - if len(parts_counter[order]) == 1: - events = self.events[order] - else: - events = [self.events[order].pop(0)] + events = self.events[order].pop(0) parts_counter[order].pop() for event in events:
--- a/genshi/filters/tests/i18n.py +++ b/genshi/filters/tests/i18n.py @@ -915,6 +915,19 @@ Voh </html>""", tmpl.generate().render()) + def test_translate_i18n_msg_ticket_404(self): + tmpl = MarkupTemplate("""<html xmlns:py="http://genshi.edgewall.org/" + xmlns:i18n="http://genshi.edgewall.org/i18n"> + <p i18n:msg="first,second"> + $first <span>$second</span> KEPT <span>Inside a tag</span> tail + </p></html>""") + translator = Translator(DummyTranslations()) + translator.setup(tmpl) + self.assertEqual("""<html> + <p>FIRST <span>SECOND</span> KEPT <span>Inside a tag</span> tail""" + """</p></html>""", + tmpl.generate(first="FIRST", second="SECOND").render()) + class ChooseDirectiveTestCase(unittest.TestCase):