Index: cms/converters.py |
diff --git a/cms/converters.py b/cms/converters.py |
index 4c50beb658a8a6dcc7aff70aa90b563bf5ca94b4..a2d44d92851d22d81b56d0827efd370b7d05518d 100644 |
--- a/cms/converters.py |
+++ b/cms/converters.py |
@@ -44,6 +44,8 @@ html_escapes = { |
class AttributeParser(HTMLParser.HTMLParser): |
_string = None |
+ _inside_fixed = False |
+ _fixed_strings = None |
_attrs = None |
def __init__(self, whitelist): |
@@ -52,39 +54,57 @@ class AttributeParser(HTMLParser.HTMLParser): |
def parse(self, text, pagename): |
self.reset() |
self._string = [] |
+ self._fixed_strings = [] |
+ self._inside_fixed = False |
self._attrs = {} |
self._pagename = pagename |
try: |
self.feed(text) |
- return "".join(self._string), self._attrs |
+ return "".join(self._string), self._attrs, map(lambda s: "".join(s), self._fixed_strings) |
Wladimir Palant
2015/03/26 20:48:56
Nit: ["".join(s) for s in self._fixed_strings] is
kzar
2015/03/26 22:11:32
Done.
|
finally: |
self._string = None |
self._attrs = None |
self._pagename = None |
+ self._inside_fixed = False |
+ self._fixed_strings = None |
def handle_starttag(self, tag, attrs): |
if tag not in self._whitelist: |
Wladimir Palant
2015/03/26 20:48:56
No tags should be allowed inside <fix> - meaning |
kzar
2015/03/26 22:11:32
Done.
|
raise Exception("Unexpected HTML tag '%s' in localizable string on page %s" % (tag, self._pagename)) |
- self._attrs.setdefault(tag, []).append(attrs) |
- self._string.append("<%s>" % tag) |
+ if tag == "fix": |
+ self._inside_fixed = True |
+ self._fixed_strings.append([]) |
+ else: |
+ self._attrs.setdefault(tag, []).append(attrs) |
+ self._string.append("<%s>" % tag) |
def handle_endtag(self, tag): |
- self._string.append("</%s>" % tag) |
+ if tag == "fix": |
+ self._string.append("{%d}" % len(self._fixed_strings)) |
+ self._inside_fixed = False |
+ else: |
+ self._string.append("</%s>" % tag) |
+ |
+ def _append_string(self, s): |
Wladimir Palant
2015/03/26 20:48:56
Nit: we are adding to self._string a lot, this hel
kzar
2015/03/26 22:11:32
Done.
|
+ if self._inside_fixed: |
+ self._fixed_strings[-1].append(s) |
+ else: |
+ self._string.append(s) |
def handle_data(self, data): |
# Note: lack of escaping here is intentional. The result is a locale string, |
# HTML escaping is applied when this string is inserted into the document. |
- self._string.append(data) |
+ self._append_string(data) |
def handle_entityref(self, name): |
- self._string.append(self.unescape("&%s;" % name)) |
+ self._append_string(self.unescape("&%s;" % name)) |
def handle_charref(self, name): |
- self._string.append(self.unescape("&#%s;" % name)) |
+ self._append_string(self.unescape("&#%s;" % name)) |
class Converter: |
- whitelist = set(["a", "em", "strong"]) |
+ whitelist = set(["a", "em", "fix", "strong"]) |
Wladimir Palant
2015/03/26 20:48:56
It makes no sense to change this set - <fix> isn't
kzar
2015/03/26 22:11:32
Done.
|
def __init__(self, params, key="pagedata"): |
self._params = params |
@@ -107,7 +127,7 @@ class Converter: |
return re.escape(escape(s)) |
# Extract tag attributes from default string |
- default, saved_attributes = self._attribute_parser.parse(default, self._params["page"]) |
+ default, saved_attributes, fixed_strings = self._attribute_parser.parse(default, self._params["page"]) |
# Get translation |
if self._params["locale"] != self._params["defaultlocale"] and name in localedata: |
@@ -115,6 +135,10 @@ class Converter: |
else: |
result = default |
+ # Insert fixed strings |
+ for i in range(len(fixed_strings)): |
+ result = re.sub(re_escape("{%d}" % (i + 1)), fixed_strings[i], result, 1) |
Wladimir Palant
2015/03/26 20:48:56
Escape the string being inserted? It looks like cu
kzar
2015/03/26 22:11:32
I originally did escape fixed_strings[i] here but
Wladimir Palant
2015/03/27 07:29:48
I see, you are inserting them before the escaping
|
+ |
# Insert attributes |
result = escape(result) |
for tag in self.whitelist: |