| Index: cms/converters.py |
| =================================================================== |
| --- a/cms/converters.py |
| +++ b/cms/converters.py |
| @@ -8,16 +8,18 @@ |
| # Adblock Plus is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| +from __future__ import unicode_literals |
| + |
| import os |
| import HTMLParser |
| import re |
| import jinja2 |
| import markdown |
| @@ -72,30 +74,30 @@ |
| self._attrs = None |
| self._pagename = None |
| self._inside_fixed = False |
| self._fixed_strings = None |
| def handle_starttag(self, tag, attrs): |
| if self._inside_fixed: |
| raise Exception("Unexpected HTML tag '{}' inside a fixed string" |
| - 'on page {}'.format(tag, self._pagename)) |
| + ' on page {}'.format(tag, self._pagename)) |
| if tag == 'fix': |
|
Wladimir Palant
2017/03/12 16:02:22
For reference, I'm not a huge fan of removing ever
Vasily Kuznetsov
2017/03/13 12:25:29
I agree that applying strict "no unnecessary else'
|
| self._inside_fixed = True |
| self._fixed_strings.append([]) |
| - if tag in self._whitelist: |
| + elif tag in self._whitelist: |
| self._attrs.setdefault(tag, []).append(attrs) |
| self._string.append('<{}>'.format(tag)) |
| else: |
| raise Exception("Unexpected HTML tag '{}' inside a fixed string" |
| - 'on page {}'.format(tag, self._pagename)) |
| + ' on page {}'.format(tag, self._pagename)) |
| def handle_endtag(self, tag): |
| if tag == 'fix': |
| - self._string.append('{{{}}}'.format(self._fixed_strings)) |
| + self._string.append('{{{}}}'.format(len(self._fixed_strings))) |
| self._inside_fixed = False |
| else: |
| self._string.append('</{}>'.format(tag)) |
| def _append_text(self, s): |
| if self._inside_fixed: |
| self._fixed_strings[-1].append(s) |
| else: |
| @@ -151,17 +153,17 @@ |
| # Handle duplicated strings |
| if default: |
| self._seen_defaults[(page, name)] = (default, comment) |
| else: |
| try: |
| default, comment = self._seen_defaults[(page, name)] |
| except KeyError: |
| raise Exception('Text not yet defined for string {} on page' |
| - '{}'.format(name, page)) |
| + ' {}'.format(name, page)) |
| # Extract tag attributes from default string |
| default, saved_attributes, fixed_strings = ( |
| self._attribute_parser.parse(default, self._params['page'])) |
| # Get translation |
| locale = self._params['locale'] |
| if locale == self._params['defaultlocale']: |
| @@ -176,40 +178,40 @@ |
| # Perform callback with the string if required, e.g. for the |
| # translations script |
| callback = self._params['localized_string_callback'] |
| if callback: |
| callback(page, locale, name, result, comment, fixed_strings) |
| # Insert fixed strings |
| for i, fixed_string in enumerate(fixed_strings, 1): |
| - result = result.replace('{{{%d}}}'.format(i), fixed_string) |
| + result = result.replace('{{{}}}'.format(i), fixed_string) |
| # Insert attributes |
| result = escape(result) |
| def stringify_attribute((name, value)): |
| return '{}="{}"'.format( |
| escape(name), |
| escape(self.insert_localized_strings(value, {})) |
| ) |
| for tag in self.whitelist: |
| - allowed_contents = '(?:[^<>]|{})'.format('|').join(( |
| + allowed_contents = '(?:[^<>]|{})'.format('|'.join(( |
| '<(?:{}[^<>]*?|/{})>'.format(t, t) |
| for t in map(re.escape, self.whitelist - {tag}) |
| - )) |
| + ))) |
| saved = saved_attributes.get(tag, []) |
| for attrs in saved: |
| attrs = map(stringify_attribute, attrs) |
| result = re.sub( |
| r'{}({}*?){}'.format(re_escape('<{}>'.format(tag)), |
| allowed_contents, |
| re_escape('</{}>'.format(tag))), |
| - lambda match: r'<{}{}>{}</{}>'.format( |
| + lambda match: '<{}{}>{}</{}>'.format( |
|
Wladimir Palant
2017/03/12 16:02:22
Like with my other comment, by not using raw strin
Vasily Kuznetsov
2017/03/13 12:25:29
I switched from raw strings to unicode strings to
|
| tag, |
| ' ' + ' '.join(attrs) if attrs else '', |
| match.group(1), |
| tag |
| ), |
| result, 1, flags=re.S |
| ) |
| result = re.sub( |
| @@ -281,17 +283,17 @@ |
| converter = converter_class(self._params, |
| key='includedata') |
| result = converter() |
| self.missing_translations += converter.missing_translations |
| self.total_translations += converter.total_translations |
| return result |
| raise Exception('Failed to resolve include {}' |
| - 'on page {}'.format(name, self._params['page'])) |
| + ' on page {}'.format(name, self._params['page'])) |
| return re.sub( |
| r'{}\?\s*include\s+([^\s<>"]+)\s*\?{}'.format( |
| self.include_start_regex, |
| self.include_end_regex |
| ), |
| resolve_include, |
| text |
| @@ -392,17 +394,17 @@ |
| path = os.path.join(dirname, filename) |
| namespace = self._params['source'].exec_file(path) |
| name = os.path.basename(root) |
| try: |
| dictionary[name] = namespace[name] |
| except KeyError: |
| raise Exception('Expected symbol {} not found' |
| - 'in {}'.format(name, path)) |
| + ' in {}'.format(name, path)) |
| self._env = jinja2.Environment( |
| loader=SourceTemplateLoader(self._params['source']), |
| autoescape=True) |
| self._env.filters.update(filters) |
| self._env.globals.update(globals) |
| def get_html(self, source, filename): |