Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: cms/utils.py

Issue 29516687: Issue 4488 - Add support for JSON page front matter (Closed) Base URL: https://hg.adblockplus.org/cms
Patch Set: Add newline for code clarity Created April 18, 2018, 10:45 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/expected_output/en/metadata_json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # This file is part of the Adblock Plus web scripts, 1 # This file is part of the Adblock Plus web scripts,
2 # Copyright (C) 2006-present eyeo GmbH 2 # Copyright (C) 2006-present eyeo GmbH
3 # 3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify 4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as 5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation. 6 # published by the Free Software Foundation.
7 # 7 #
8 # Adblock Plus is distributed in the hope that it will be useful, 8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details. 11 # GNU General Public License for more details.
12 # 12 #
13 # You should have received a copy of the GNU General Public License 13 # You should have received a copy of the GNU General Public License
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
15 15
16 import re 16 import re
17 import json
17 18
18 __all__ = [ 19 __all__ = [
19 'get_page_params', 20 'get_page_params',
20 'process_page', 21 'process_page',
21 'split_head_body', 22 'split_head_body',
22 'extract_page_metadata' 23 'extract_page_metadata'
23 ] 24 ]
24 25
25 26
26 def split_head_body(html): 27 def split_head_body(html):
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 ---------- 59 ----------
59 source: str 60 source: str
60 Source text of the page. 61 Source text of the page.
61 62
62 Returns 63 Returns
63 ------- 64 -------
64 (dict, str) 65 (dict, str)
65 Metadata of the page, remaining source text without metadata. 66 Metadata of the page, remaining source text without metadata.
66 67
67 """ 68 """
68 metadata = {} 69 m = re.search(r'^\s*<!--\s*(.*?)-->', source, re.S)
69 lines = source.splitlines(True) 70 text = m.group(1) if m else source
70 for i, line in enumerate(lines): 71
71 if line.strip() in {'<!--', '-->'}: 72 decoder = json.JSONDecoder()
72 lines[i] = '' 73 try:
73 continue 74 metadata, length = decoder.raw_decode(text)
74 if not re.search(r'^\s*[\w\-]+\s*=', line): 75 except ValueError:
75 break 76 metadata = None
76 name, value = line.split('=', 1) 77
77 value = value.strip() 78 if not isinstance(metadata, dict):
78 if value.startswith('[') and value.endswith(']'): 79 metadata = {}
79 value = [element.strip() for element in value[1:-1].split(',')] 80 length = 0
80 lines[i] = '\n' 81 for line in text.splitlines(True):
81 metadata[name.strip()] = value 82 if not re.search(r'^\s*[\w\-]+\s*=', line):
82 return metadata, ''.join(lines) 83 break
84 name, value = line.split('=', 1)
85 value = value.strip()
86 if value.startswith('[') and value.endswith(']'):
87 value = [element.strip() for element in value[1:-1].split(',')]
88 metadata[name.strip()] = value
89 length += len(line)
90
91 if length > 0:
92 # Need to preserve line numbers for jinja2 tracebacks
93 cutoff = m.end() if m else length
94 source = '\n' * source.count('\n', 0, cutoff) + source[cutoff:]
95
96 return metadata, source
83 97
84 98
85 def get_page_params(source, locale, page, format=None, site_url_override=None, 99 def get_page_params(source, locale, page, format=None, site_url_override=None,
86 localized_string_callback=None): 100 localized_string_callback=None):
87 from cms.converters import converters 101 from cms.converters import converters
88 102
89 # Guess page format if omitted, but default to Markdown for friendlier excep tions 103 # Guess page format if omitted, but default to Markdown for friendlier excep tions
90 if format is None: 104 if format is None:
91 for format in converters.iterkeys(): 105 for format in converters.iterkeys():
92 if source.has_page(page, format): 106 if source.has_page(page, format):
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 return params 167 return params
154 168
155 169
156 def process_page(source, locale, page, format=None, site_url_override=None, 170 def process_page(source, locale, page, format=None, site_url_override=None,
157 localized_string_callback=None): 171 localized_string_callback=None):
158 from cms.converters import TemplateConverter 172 from cms.converters import TemplateConverter
159 173
160 params = get_page_params(source, locale, page, format, site_url_override, 174 params = get_page_params(source, locale, page, format, site_url_override,
161 localized_string_callback) 175 localized_string_callback)
162 return TemplateConverter(*params['templatedata'], params=params)() 176 return TemplateConverter(*params['templatedata'], params=params)()
OLDNEW
« no previous file with comments | « no previous file | tests/expected_output/en/metadata_json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld