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