# HG changeset patch # User hodgestar # Date 1315012290 0 # Node ID 7f8b4df4f862b9ba2eee8aaf5d912fc682c23f80 # Parent 981f3fc8c3edb2c3a9f51c25dd8917044f54aa0f Handle multiple events between or an either side of start and end tags in translated messages -- fixes #404 (bug no longer found). diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py --- 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: diff --git a/genshi/filters/tests/i18n.py b/genshi/filters/tests/i18n.py --- a/genshi/filters/tests/i18n.py +++ b/genshi/filters/tests/i18n.py @@ -915,6 +915,19 @@ Voh """, tmpl.generate().render()) + def test_translate_i18n_msg_ticket_404(self): + tmpl = MarkupTemplate(""" +

+ $first $second KEPT Inside a tag tail +

""") + translator = Translator(DummyTranslations()) + translator.setup(tmpl) + self.assertEqual(""" +

FIRST SECOND KEPT Inside a tag tail""" + """

""", + tmpl.generate(first="FIRST", second="SECOND").render()) + class ChooseDirectiveTestCase(unittest.TestCase):