Mercurial > public > mercurial-scm > hg
comparison mercurial/templater.py @ 25597:fd5bc660c9f0
templater: do not reevaluate rawstring as template (BC)
The previous patch made 'string' is always interpreted as a template. So
this patch removes the special handling of r'rawstring' instead. Now r''
disables template processing at all.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Wed, 10 Jun 2015 21:44:43 +0900 |
parents | c1975809a6b5 |
children | 55c2cb65bdfa |
comparison
equal
deleted
inserted
replaced
25596:c1975809a6b5 | 25597:fd5bc660c9f0 |
---|---|
144 return context._filters[f] | 144 return context._filters[f] |
145 | 145 |
146 def gettemplate(exp, context): | 146 def gettemplate(exp, context): |
147 if exp[0] == 'template': | 147 if exp[0] == 'template': |
148 return compiletemplate(exp[1], context) | 148 return compiletemplate(exp[1], context) |
149 if exp[0] == 'rawstring': | |
150 return compiletemplate(exp[1], context, strtoken=exp[0]) | |
151 if exp[0] == 'symbol': | 149 if exp[0] == 'symbol': |
152 return context._load(exp[1]) | 150 return context._load(exp[1]) |
153 raise error.ParseError(_("expected template specifier")) | 151 raise error.ParseError(_("expected template specifier")) |
154 | 152 |
155 def runinteger(context, mapping, data): | 153 def runinteger(context, mapping, data): |
300 width = int(stringify(args[1][0](context, mapping, args[1][1]))) | 298 width = int(stringify(args[1][0](context, mapping, args[1][1]))) |
301 except ValueError: | 299 except ValueError: |
302 # i18n: "fill" is a keyword | 300 # i18n: "fill" is a keyword |
303 raise error.ParseError(_("fill expects an integer width")) | 301 raise error.ParseError(_("fill expects an integer width")) |
304 try: | 302 try: |
305 initindent = stringify(_evalifliteral(args[2], context, mapping)) | 303 initindent = stringify(args[2][0](context, mapping, args[2][1])) |
306 hangindent = stringify(_evalifliteral(args[3], context, mapping)) | 304 hangindent = stringify(args[3][0](context, mapping, args[3][1])) |
307 except IndexError: | 305 except IndexError: |
308 pass | 306 pass |
309 | 307 |
310 return templatefilters.fill(text, width, initindent, hangindent) | 308 return templatefilters.fill(text, width, initindent, hangindent) |
311 | 309 |
316 # i18n: "pad" is a keyword | 314 # i18n: "pad" is a keyword |
317 raise error.ParseError(_("pad() expects two to four arguments")) | 315 raise error.ParseError(_("pad() expects two to four arguments")) |
318 | 316 |
319 width = int(args[1][1]) | 317 width = int(args[1][1]) |
320 | 318 |
321 text = stringify(_evalifliteral(args[0], context, mapping)) | 319 text = stringify(args[0][0](context, mapping, args[0][1])) |
322 | 320 |
323 right = False | 321 right = False |
324 fillchar = ' ' | 322 fillchar = ' ' |
325 if len(args) > 2: | 323 if len(args) > 2: |
326 fillchar = stringify(args[2][0](context, mapping, args[2][1])) | 324 fillchar = stringify(args[2][0](context, mapping, args[2][1])) |
366 raise error.ParseError(_("get() expects a dict as first argument")) | 364 raise error.ParseError(_("get() expects a dict as first argument")) |
367 | 365 |
368 key = args[1][0](context, mapping, args[1][1]) | 366 key = args[1][0](context, mapping, args[1][1]) |
369 yield dictarg.get(key) | 367 yield dictarg.get(key) |
370 | 368 |
371 def _evalifliteral(arg, context, mapping): | |
372 # get back to token tag to reinterpret string as template | |
373 strtoken = {runrawstring: 'rawstring'}.get(arg[0]) | |
374 if strtoken: | |
375 yield runtemplate(context, mapping, | |
376 compiletemplate(arg[1], context, strtoken)) | |
377 else: | |
378 yield stringify(arg[0](context, mapping, arg[1])) | |
379 | |
380 def if_(context, mapping, args): | 369 def if_(context, mapping, args): |
381 """:if(expr, then[, else]): Conditionally execute based on the result of | 370 """:if(expr, then[, else]): Conditionally execute based on the result of |
382 an expression.""" | 371 an expression.""" |
383 if not (2 <= len(args) <= 3): | 372 if not (2 <= len(args) <= 3): |
384 # i18n: "if" is a keyword | 373 # i18n: "if" is a keyword |
385 raise error.ParseError(_("if expects two or three arguments")) | 374 raise error.ParseError(_("if expects two or three arguments")) |
386 | 375 |
387 test = stringify(args[0][0](context, mapping, args[0][1])) | 376 test = stringify(args[0][0](context, mapping, args[0][1])) |
388 if test: | 377 if test: |
389 yield _evalifliteral(args[1], context, mapping) | 378 yield args[1][0](context, mapping, args[1][1]) |
390 elif len(args) == 3: | 379 elif len(args) == 3: |
391 yield _evalifliteral(args[2], context, mapping) | 380 yield args[2][0](context, mapping, args[2][1]) |
392 | 381 |
393 def ifcontains(context, mapping, args): | 382 def ifcontains(context, mapping, args): |
394 """:ifcontains(search, thing, then[, else]): Conditionally execute based | 383 """:ifcontains(search, thing, then[, else]): Conditionally execute based |
395 on whether the item "search" is in "thing".""" | 384 on whether the item "search" is in "thing".""" |
396 if not (3 <= len(args) <= 4): | 385 if not (3 <= len(args) <= 4): |
399 | 388 |
400 item = stringify(args[0][0](context, mapping, args[0][1])) | 389 item = stringify(args[0][0](context, mapping, args[0][1])) |
401 items = args[1][0](context, mapping, args[1][1]) | 390 items = args[1][0](context, mapping, args[1][1]) |
402 | 391 |
403 if item in items: | 392 if item in items: |
404 yield _evalifliteral(args[2], context, mapping) | 393 yield args[2][0](context, mapping, args[2][1]) |
405 elif len(args) == 4: | 394 elif len(args) == 4: |
406 yield _evalifliteral(args[3], context, mapping) | 395 yield args[3][0](context, mapping, args[3][1]) |
407 | 396 |
408 def ifeq(context, mapping, args): | 397 def ifeq(context, mapping, args): |
409 """:ifeq(expr1, expr2, then[, else]): Conditionally execute based on | 398 """:ifeq(expr1, expr2, then[, else]): Conditionally execute based on |
410 whether 2 items are equivalent.""" | 399 whether 2 items are equivalent.""" |
411 if not (3 <= len(args) <= 4): | 400 if not (3 <= len(args) <= 4): |
413 raise error.ParseError(_("ifeq expects three or four arguments")) | 402 raise error.ParseError(_("ifeq expects three or four arguments")) |
414 | 403 |
415 test = stringify(args[0][0](context, mapping, args[0][1])) | 404 test = stringify(args[0][0](context, mapping, args[0][1])) |
416 match = stringify(args[1][0](context, mapping, args[1][1])) | 405 match = stringify(args[1][0](context, mapping, args[1][1])) |
417 if test == match: | 406 if test == match: |
418 yield _evalifliteral(args[2], context, mapping) | 407 yield args[2][0](context, mapping, args[2][1]) |
419 elif len(args) == 4: | 408 elif len(args) == 4: |
420 yield _evalifliteral(args[3], context, mapping) | 409 yield args[3][0](context, mapping, args[3][1]) |
421 | 410 |
422 def join(context, mapping, args): | 411 def join(context, mapping, args): |
423 """:join(list, sep): Join items in a list with a delimiter.""" | 412 """:join(list, sep): Join items in a list with a delimiter.""" |
424 if not (1 <= len(args) <= 2): | 413 if not (1 <= len(args) <= 2): |
425 # i18n: "join" is a keyword | 414 # i18n: "join" is a keyword |
449 if len(args) != 2: | 438 if len(args) != 2: |
450 # i18n: "label" is a keyword | 439 # i18n: "label" is a keyword |
451 raise error.ParseError(_("label expects two arguments")) | 440 raise error.ParseError(_("label expects two arguments")) |
452 | 441 |
453 # ignore args[0] (the label string) since this is supposed to be a a no-op | 442 # ignore args[0] (the label string) since this is supposed to be a a no-op |
454 yield _evalifliteral(args[1], context, mapping) | 443 yield args[1][0](context, mapping, args[1][1]) |
455 | 444 |
456 def revset(context, mapping, args): | 445 def revset(context, mapping, args): |
457 """:revset(query[, formatargs...]): Execute a revision set query. See | 446 """:revset(query[, formatargs...]): Execute a revision set query. See |
458 :hg:`help revset`.""" | 447 :hg:`help revset`.""" |
459 if not len(args) > 0: | 448 if not len(args) > 0: |
565 # i18n: "sub" is a keyword | 554 # i18n: "sub" is a keyword |
566 raise error.ParseError(_("sub expects three arguments")) | 555 raise error.ParseError(_("sub expects three arguments")) |
567 | 556 |
568 pat = stringify(args[0][0](context, mapping, args[0][1])) | 557 pat = stringify(args[0][0](context, mapping, args[0][1])) |
569 rpl = stringify(args[1][0](context, mapping, args[1][1])) | 558 rpl = stringify(args[1][0](context, mapping, args[1][1])) |
570 src = stringify(_evalifliteral(args[2], context, mapping)) | 559 src = stringify(args[2][0](context, mapping, args[2][1])) |
571 yield re.sub(pat, rpl, src) | 560 yield re.sub(pat, rpl, src) |
572 | 561 |
573 def startswith(context, mapping, args): | 562 def startswith(context, mapping, args): |
574 """:startswith(pattern, text): Returns the value from the "text" argument | 563 """:startswith(pattern, text): Returns the value from the "text" argument |
575 if it begins with the content from the "pattern" argument.""" | 564 if it begins with the content from the "pattern" argument.""" |