Mercurial > genshi > mirror
changeset 953:ea40c6ff63da stable-0.6.x
Merge r1177 from trunk (support multiple stream events around tags inside translated messages -- see #404).
author | hodgestar |
---|---|
date | Sat, 03 Sep 2011 01:13:08 +0000 |
parents | 40415173f513 |
children | cadb6703ac18 |
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 @@ -941,9 +941,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. @@ -958,17 +967,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) @@ -985,20 +994,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() @@ -1033,10 +1041,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 @@ -893,6 +893,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):