Index: cms/converters.py |
=================================================================== |
--- a/cms/converters.py |
+++ b/cms/converters.py |
@@ -27,18 +27,18 @@ |
def isBlockLevel(tag): |
- if tag == "head": |
+ if tag == 'head': |
return True |
else: |
return orig_isBlockLevel(tag) |
markdown.util.isBlockLevel = isBlockLevel |
html_escapes = { |
- "<": "<", |
- ">": ">", |
- "&": "&", |
- "\"": """, |
- "'": "'", |
+ '<': '<', |
+ '>': '>', |
+ '&': '&', |
+ '"': '"', |
+ "'": ''', |
} |
@@ -61,11 +61,11 @@ |
# Force-escape ampersands, otherwise the parser will autocomplete bogus |
# entities. |
- text = re.sub(r"&(?!\S+;)", "&", text) |
+ text = re.sub(r'&(?!\S+;)', '&', text) |
try: |
self.feed(text) |
- return "".join(self._string), self._attrs, ["".join(s) for s in self._fixed_strings] |
+ return ''.join(self._string), self._attrs, [''.join(s) for s in self._fixed_strings] |
finally: |
self._string = None |
self._attrs = None |
@@ -76,21 +76,21 @@ |
def handle_starttag(self, tag, attrs): |
if self._inside_fixed: |
raise Exception("Unexpected HTML tag '%s' inside a fixed string on page %s" % (tag, self._pagename)) |
- elif tag == "fix": |
+ elif tag == 'fix': |
self._inside_fixed = True |
self._fixed_strings.append([]) |
elif tag in self._whitelist: |
self._attrs.setdefault(tag, []).append(attrs) |
- self._string.append("<%s>" % tag) |
+ self._string.append('<%s>' % tag) |
else: |
raise Exception("Unexpected HTML tag '%s' in localizable string on page %s" % (tag, self._pagename)) |
def handle_endtag(self, tag): |
- if tag == "fix": |
- self._string.append("{%d}" % len(self._fixed_strings)) |
+ if tag == 'fix': |
+ self._string.append('{%d}' % len(self._fixed_strings)) |
self._inside_fixed = False |
else: |
- self._string.append("</%s>" % tag) |
+ self._string.append('</%s>' % tag) |
def _append_text(self, s): |
if self._inside_fixed: |
@@ -104,18 +104,18 @@ |
self._append_text(data) |
def handle_entityref(self, name): |
- self._append_text(self.unescape("&%s;" % name)) |
+ self._append_text(self.unescape('&%s;' % name)) |
def handle_charref(self, name): |
- self._append_text(self.unescape("&#%s;" % name)) |
+ self._append_text(self.unescape('&#%s;' % name)) |
class Converter: |
- whitelist = {"a", "em", "sup", "strong", "code", "span"} |
+ whitelist = {'a', 'em', 'sup', 'strong', 'code', 'span'} |
missing_translations = 0 |
total_translations = 0 |
- def __init__(self, params, key="pagedata"): |
+ def __init__(self, params, key='pagedata'): |
self._params = params |
self._key = key |
self._attribute_parser = AttributeParser(self.whitelist) |
@@ -125,16 +125,16 @@ |
data, filename = params[key] |
lines = data.splitlines(True) |
for i, line in enumerate(lines): |
- if not re.search(r"^\s*[\w\-]+\s*=", line): |
+ if not re.search(r'^\s*[\w\-]+\s*=', line): |
break |
- name, value = line.split("=", 1) |
+ name, value = line.split('=', 1) |
params[name.strip()] = value.strip() |
- lines[i] = "\n" |
- params[key] = ("".join(lines), filename) |
+ lines[i] = '\n' |
+ params[key] = (''.join(lines), filename) |
def localize_string(self, page, name, default, comment, localedata, escapes): |
def escape(s): |
- return re.sub(r".", |
+ return re.sub(r'.', |
lambda match: escapes.get(match.group(0), match.group(0)), |
s, flags=re.S) |
@@ -148,15 +148,15 @@ |
try: |
default, comment = self._seen_defaults[(page, name)] |
except KeyError: |
- raise Exception("Text not yet defined for string %s on page %s" % |
+ raise Exception('Text not yet defined for string %s on page %s' % |
(name, page)) |
# Extract tag attributes from default string |
- default, saved_attributes, fixed_strings = self._attribute_parser.parse(default, self._params["page"]) |
+ default, saved_attributes, fixed_strings = self._attribute_parser.parse(default, self._params['page']) |
# Get translation |
- locale = self._params["locale"] |
- if locale == self._params["defaultlocale"]: |
+ locale = self._params['locale'] |
+ if locale == self._params['defaultlocale']: |
result = default |
elif name in localedata: |
result = localedata[name].strip() |
@@ -166,13 +166,13 @@ |
self.total_translations += 1 |
# Perform callback with the string if required, e.g. for the translations script |
- callback = self._params["localized_string_callback"] |
+ 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}" % i, fixed_string) |
+ result = result.replace('{%d}' % i, fixed_string) |
# Insert attributes |
result = escape(result) |
@@ -184,28 +184,28 @@ |
) |
for tag in self.whitelist: |
- allowed_contents = "(?:[^<>]|%s)" % "|".join(( |
- "<(?:%s[^<>]*?|/%s)>" % (t, t) |
+ allowed_contents = '(?:[^<>]|%s)' % '|'.join(( |
+ '<(?:%s[^<>]*?|/%s)>' % (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"%s(%s*?)%s" % (re_escape("<%s>" % tag), allowed_contents, |
- re_escape("</%s>" % tag)), |
+ r'%s(%s*?)%s' % (re_escape('<%s>' % tag), allowed_contents, |
+ re_escape('</%s>' % tag)), |
lambda match: r'<%s%s>%s</%s>' % ( |
tag, |
- " " + " ".join(attrs) if attrs else "", |
+ ' ' + ' '.join(attrs) if attrs else '', |
match.group(1), |
tag |
), |
result, 1, flags=re.S |
) |
result = re.sub( |
- r"%s(%s*?)%s" % (re_escape("<%s>" % tag), allowed_contents, |
- re_escape("</%s>" % tag)), |
- r"<%s>\1</%s>" % (tag, tag), |
+ r'%s(%s*?)%s' % (re_escape('<%s>' % tag), allowed_contents, |
+ re_escape('</%s>' % tag)), |
+ r'<%s>\1</%s>' % (tag, tag), |
result, flags=re.S |
) |
return result |
@@ -215,19 +215,19 @@ |
name, comment, default = match.groups() |
if default: |
default = to_html(default).strip() |
- return self.localize_string(self._params["page"], name, default, |
- comment, self._params["localedata"], escapes) |
+ return self.localize_string(self._params['page'], name, default, |
+ comment, self._params['localedata'], escapes) |
return re.sub( |
- r"{{\s*" |
- r"([\w\-]+)" # String ID |
- r"(?:(?:\[(.*?)\])?" # Optional comment |
- r"\s+" |
- r"((?:(?!{{).|" # Translatable text |
- r"{{(?:(?!}}).)*}}" # Nested translation |
- r")*?)" |
- r")?" |
- r"}}", |
+ r'{{\s*' |
+ r'([\w\-]+)' # String ID |
+ r'(?:(?:\[(.*?)\])?' # Optional comment |
+ r'\s+' |
+ r'((?:(?!{{).|' # Translatable text |
+ r'{{(?:(?!}}).)*}}' # Nested translation |
+ r')*?)' |
+ r')?' |
+ r'}}', |
lookup_string, |
text, |
flags=re.S |
@@ -238,16 +238,16 @@ |
pre, attr, url, post = match.groups() |
url = jinja2.Markup(url).unescape() |
- locale, new_url = self._params["source"].resolve_link(url, self._params["locale"]) |
+ locale, new_url = self._params['source'].resolve_link(url, self._params['locale']) |
if new_url != None: |
url = new_url |
- if attr == "href": |
+ if attr == 'href': |
post += ' hreflang="%s"' % jinja2.Markup.escape(locale) |
- return "".join((pre, jinja2.Markup.escape(url), post)) |
+ return ''.join((pre, jinja2.Markup.escape(url), post)) |
- text = re.sub(r"(<a\s[^<>]*\b(href)=\")([^<>\"]+)(\")", process_link, text) |
- text = re.sub(r"(<img\s[^<>]*\b(src)=\")([^<>\"]+)(\")", process_link, text) |
+ text = re.sub(r'(<a\s[^<>]*\b(href)=\")([^<>\"]+)(\")', process_link, text) |
+ text = re.sub(r'(<img\s[^<>]*\b(src)=\")([^<>\"]+)(\")', process_link, text) |
return text |
include_start_regex = '<' |
@@ -258,14 +258,14 @@ |
global converters |
name = match.group(1) |
for format, converter_class in converters.iteritems(): |
- if self._params["source"].has_include(name, format): |
- self._params["includedata"] = self._params["source"].read_include(name, format) |
- converter = converter_class(self._params, key="includedata") |
+ if self._params['source'].has_include(name, format): |
+ self._params['includedata'] = self._params['source'].read_include(name, format) |
+ 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 %s on page %s" % (name, self._params["page"])) |
+ raise Exception('Failed to resolve include %s on page %s' % (name, self._params['page'])) |
return re.sub( |
r'%s\?\s*include\s+([^\s<>"]+)\s*\?%s' % ( |
@@ -279,14 +279,14 @@ |
def __call__(self): |
result = self.get_html(*self._params[self._key]) |
result = self.resolve_includes(result) |
- if self._key == "pagedata": |
+ if self._key == 'pagedata': |
head = [] |
def add_to_head(match): |
head.append(match.group(1)) |
- return "" |
- body = re.sub(r"<head>(.*?)</head>", add_to_head, result, flags=re.S) |
- return "".join(head), body |
+ return '' |
+ body = re.sub(r'<head>(.*?)</head>', add_to_head, result, flags=re.S) |
+ return ''.join(head), body |
else: |
return result |
@@ -318,19 +318,19 @@ |
escapes = {} |
for char in markdown.Markdown.ESCAPED_CHARS: |
- escapes[char] = "&#" + str(ord(char)) + ";" |
+ escapes[char] = '&#' + str(ord(char)) + ';' |
for key, value in html_escapes.iteritems(): |
escapes[key] = value |
- md = markdown.Markdown(output="html5", extensions=["extra"]) |
- md.preprocessors["html_block"].markdown_in_raw = True |
+ md = markdown.Markdown(output='html5', extensions=['extra']) |
+ md.preprocessors['html_block'].markdown_in_raw = True |
def to_html(s): |
return re.sub(r'</?p>', '', md.convert(s)) |
result = self.insert_localized_strings(source, escapes, to_html) |
result = md.convert(result) |
- result = re.sub(r"&#(\d+);", remove_unnecessary_entities, result) |
+ result = re.sub(r'&#(\d+);', remove_unnecessary_entities, result) |
result = self.process_links(result) |
return result |
@@ -341,7 +341,7 @@ |
def get_source(self, environment, template): |
try: |
- result = self.source.read_file(template + ".tmpl") |
+ result = self.source.read_file(template + '.tmpl') |
except Exception: |
raise jinja2.TemplateNotFound(template) |
return result + (None,) |
@@ -352,32 +352,32 @@ |
Converter.__init__(self, *args, **kwargs) |
filters = { |
- "translate": self.translate, |
- "linkify": self.linkify, |
- "toclist": self.toclist, |
+ 'translate': self.translate, |
+ 'linkify': self.linkify, |
+ 'toclist': self.toclist, |
} |
globals = { |
- "get_string": self.get_string, |
- "get_page_content": self.get_page_content, |
+ 'get_string': self.get_string, |
+ 'get_page_content': self.get_page_content, |
} |
- for dirname, dictionary in [("filters", filters), ("globals", globals)]: |
- for filename in self._params["source"].list_files(dirname): |
+ for dirname, dictionary in [('filters', filters), ('globals', globals)]: |
+ for filename in self._params['source'].list_files(dirname): |
root, ext = os.path.splitext(filename) |
- if ext.lower() != ".py": |
+ if ext.lower() != '.py': |
continue |
- path = "%s/%s" % (dirname, filename) |
- namespace = self._params["source"].exec_file(path) |
+ path = '%s/%s' % (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 %r not found in %r" % (name, path)) |
+ raise Exception('Expected symbol %r not found in %r' % (name, path)) |
- self._env = jinja2.Environment(loader=SourceTemplateLoader(self._params["source"]), autoescape=True) |
+ self._env = jinja2.Environment(loader=SourceTemplateLoader(self._params['source']), autoescape=True) |
self._env.filters.update(filters) |
self._env.globals.update(globals) |
@@ -392,7 +392,7 @@ |
env.handle_exception() |
for key, value in module.__dict__.iteritems(): |
- if not key.startswith("_"): |
+ if not key.startswith('_'): |
self._params[key] = value |
result = unicode(module) |
@@ -401,32 +401,32 @@ |
def translate(self, default, name, comment=None): |
return jinja2.Markup(self.localize_string( |
- self._params["page"], name, default, comment, |
- self._params["localedata"], html_escapes |
+ self._params['page'], name, default, comment, |
+ self._params['localedata'], html_escapes |
)) |
def get_string(self, name, page=None): |
if page is None: |
- page = self._params["page"] |
+ page = self._params['page'] |
- localedata = self._params["source"].read_locale(self._params["locale"], page) |
+ localedata = self._params['source'].read_locale(self._params['locale'], page) |
default = localedata[name] |
return jinja2.Markup(self.localize_string( |
- page, name, default, "", localedata, html_escapes |
+ page, name, default, '', localedata, html_escapes |
)) |
def get_page_content(self, page, locale=None): |
from cms.utils import get_page_params |
if locale is None: |
- locale = self._params["locale"] |
- return get_page_params(self._params["source"], locale, page) |
+ locale = self._params['locale'] |
+ return get_page_params(self._params['source'], locale, page) |
def linkify(self, page, locale=None, **attrs): |
if locale is None: |
- locale = self._params["locale"] |
+ locale = self._params['locale'] |
- locale, url = self._params["source"].resolve_link(page, locale) |
+ locale, url = self._params['source'].resolve_link(page, locale) |
return jinja2.Markup('<a%s>' % ''.join( |
' %s="%s"' % (name, jinja2.escape(value)) for name, value in [ |
('href', url), |
@@ -438,23 +438,23 @@ |
flat = [] |
for match in re.finditer(r'<h(\d)\s[^<>]*\bid="([^<>"]+)"[^<>]*>(.*?)</h\1>', content, re.S): |
flat.append({ |
- "level": int(match.group(1)), |
- "anchor": jinja2.Markup(match.group(2)).unescape(), |
- "title": jinja2.Markup(match.group(3)).unescape(), |
- "subitems": [], |
+ 'level': int(match.group(1)), |
+ 'anchor': jinja2.Markup(match.group(2)).unescape(), |
+ 'title': jinja2.Markup(match.group(3)).unescape(), |
+ 'subitems': [], |
}) |
structured = [] |
- stack = [{"level": 0, "subitems": structured}] |
+ stack = [{'level': 0, 'subitems': structured}] |
for item in flat: |
- while stack[-1]["level"] >= item["level"]: |
+ while stack[-1]['level'] >= item['level']: |
stack.pop() |
- stack[-1]["subitems"].append(item) |
+ stack[-1]['subitems'].append(item) |
stack.append(item) |
return structured |
converters = { |
- "html": RawConverter, |
- "md": MarkdownConverter, |
- "tmpl": TemplateConverter, |
+ 'html': RawConverter, |
+ 'md': MarkdownConverter, |
+ 'tmpl': TemplateConverter, |
} |