##// END OF EJS Templates
templater: add function to parse whole string as template expression...
Yuya Nishihara -
r28911:35da1934 default
parent child Browse files
Show More
@@ -40,7 +40,9 b' elements = {'
40 "end": (0, None, None, None, None),
40 "end": (0, None, None, None, None),
41 }
41 }
42
42
43 def tokenize(program, start, end):
43 def tokenize(program, start, end, term=None):
44 """Parse a template expression into a stream of tokens, which must end
45 with term if specified"""
44 pos = start
46 pos = start
45 while pos < end:
47 while pos < end:
46 c = program[pos]
48 c = program[pos]
@@ -127,13 +129,15 b' def tokenize(program, start, end):'
127 sym = program[s:pos]
129 sym = program[s:pos]
128 yield ('symbol', sym, s)
130 yield ('symbol', sym, s)
129 pos -= 1
131 pos -= 1
130 elif c == '}':
132 elif c == term:
131 yield ('end', None, pos + 1)
133 yield ('end', None, pos + 1)
132 return
134 return
133 else:
135 else:
134 raise error.ParseError(_("syntax error"), pos)
136 raise error.ParseError(_("syntax error"), pos)
135 pos += 1
137 pos += 1
136 raise error.ParseError(_("unterminated template expansion"), start)
138 if term:
139 raise error.ParseError(_("unterminated template expansion"), start)
140 yield ('end', None, pos)
137
141
138 def _parsetemplate(tmpl, start, stop, quote=''):
142 def _parsetemplate(tmpl, start, stop, quote=''):
139 r"""
143 r"""
@@ -171,7 +175,7 b' def _parsetemplate(tmpl, start, stop, qu'
171 if c == quote:
175 if c == quote:
172 return parsed, n + 1
176 return parsed, n + 1
173
177
174 parseres, pos = p.parse(tokenize(tmpl, n + 1, stop))
178 parseres, pos = p.parse(tokenize(tmpl, n + 1, stop, '}'))
175 parsed.append(parseres)
179 parsed.append(parseres)
176
180
177 if quote:
181 if quote:
@@ -218,6 +222,28 b' def parse(tmpl):'
218 assert pos == len(tmpl), 'unquoted template should be consumed'
222 assert pos == len(tmpl), 'unquoted template should be consumed'
219 return _unnesttemplatelist(('template', parsed))
223 return _unnesttemplatelist(('template', parsed))
220
224
225 def _parseexpr(expr):
226 """Parse a template expression into tree
227
228 >>> _parseexpr('"foo"')
229 ('string', 'foo')
230 >>> _parseexpr('foo(bar)')
231 ('func', ('symbol', 'foo'), ('symbol', 'bar'))
232 >>> _parseexpr('foo(')
233 Traceback (most recent call last):
234 ...
235 ParseError: ('not a prefix: end', 4)
236 >>> _parseexpr('"foo" "bar"')
237 Traceback (most recent call last):
238 ...
239 ParseError: ('invalid token', 7)
240 """
241 p = parser.parser(elements)
242 tree, pos = p.parse(tokenize(expr, 0, len(expr)))
243 if pos != len(expr):
244 raise error.ParseError(_('invalid token'), pos)
245 return _unnesttemplatelist(tree)
246
221 def prettyformat(tree):
247 def prettyformat(tree):
222 return parser.prettyformat(tree, ('integer', 'string', 'symbol'))
248 return parser.prettyformat(tree, ('integer', 'string', 'symbol'))
223
249
General Comments 0
You need to be logged in to leave comments. Login now