Code

Ticket #5849: blocktrans_strip.diff

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

Patch that adds stripping of indentation from contents of blocktrans block.

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