Code

Ticket #5849: blocktrans_strip.2.diff

File blocktrans_strip.2.diff, 3.4 KB (added by Dmitri Fedortchenko <zeraien@…>, 7 years ago)

Original patch could not be applied after rev 6689, this is an update.

Line 
1Index: django/templatetags/i18n.py
2===================================================================
3--- django/templatetags/i18n.py (revision 6689)
4+++ django/templatetags/i18n.py (working copy)
5@@ -70,10 +72,12 @@
6         for var, val in self.extra_context.items():
7             context[var] = val.render(context)
8         singular, vars = self.render_token_list(self.singular)
9+        singular = translation.strip_blocktrans(singular)
10         if self.plural and self.countervar and self.counter:
11             count = self.counter.resolve(context)
12             context[self.countervar] = count
13             plural, vars = self.render_token_list(self.plural)
14+            plural = translation.strip_blocktrans(plural)
15             result = translation.ungettext(singular, plural, count)
16         else:
17             result = translation.ugettext(singular)
18Index: django/utils/translation/trans_real.py
19===================================================================
20--- django/utils/translation/trans_real.py      (revision 6689)
21+++ django/utils/translation/trans_real.py      (working copy)
22@@ -448,20 +448,26 @@
23     inplural = False
24     singular = []
25     plural = []
26+   
27+    from django.utils.translation import strip_blocktrans
28+           
29     for t in Lexer(src, None).tokenize():
30         if intrans:
31             if t.token_type == TOKEN_BLOCK:
32                 endbmatch = endblock_re.match(t.contents)
33                 pluralmatch = plural_re.match(t.contents)
34                 if endbmatch:
35+                    singular = strip_blocktrans(''.join(singular))
36+                   
37                     if inplural:
38-                        out.write(' ngettext(%r,%r,count) ' % (''.join(singular), ''.join(plural)))
39+                        plural = strip_blocktrans(''.join(plural))
40+                        out.write(' ngettext(%r,%r,count) ' % (singular, plural))
41                         for part in singular:
42                             out.write(blankout(part, 'S'))
43                         for part in plural:
44                             out.write(blankout(part, 'P'))
45                     else:
46-                        out.write(' gettext(%r) ' % ''.join(singular))
47+                        out.write(' gettext(%r) ' % singular)
48                         for part in singular:
49                             out.write(blankout(part, 'S'))
50                     intrans = False
51Index: django/utils/translation/__init__.py
52===================================================================
53--- django/utils/translation/__init__.py        (revision 6689)
54+++ django/utils/translation/__init__.py        (working copy)
55@@ -109,3 +109,26 @@
56     """
57     return u''.join([force_unicode(s) for s in strings])
58 string_concat = lazy(string_concat, unicode)
59+
60+import os,re
61+def strip_blocktrans(text):
62+    """Strip indentation from the argument based on the indentation of the first non-empty line.
63+   
64+    The returned value is stripped of trailing linebreaks and spaces."""
65+   
66+    lines = text.split(os.linesep)
67+    newlines = []
68+   
69+    firstline = lines[0]
70+    if not re.match("\w",firstline) and len(lines) > 1:
71+        firstline = lines[1]
72+       
73+    thematch = re.match('^[\t\s]+',firstline)
74+    if thematch:
75+        pos = thematch.end()
76+   
77+        for line in lines:
78+            newlines.append(re.sub("^[\t\s]{0,%d}"%pos,"",line))
79+        return os.linesep.join(newlines).strip()
80+    else:
81+        return text.strip()