comparison mercurial/templater.py @ 31885:d18b624c1c06

templater: add parsing rule for key-value pair Based on the revset implementation, 70a2082f855a. This patch also adjusts the test as '=' is now a valid token.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 03 Apr 2017 20:55:55 +0900
parents 0926ca37a990
children bdda942f4b9c
comparison
equal deleted inserted replaced
31884:0926ca37a990 31885:d18b624c1c06
37 "|": (15, None, None, ("|", 15), None), 37 "|": (15, None, None, ("|", 15), None),
38 "*": (5, None, None, ("*", 5), None), 38 "*": (5, None, None, ("*", 5), None),
39 "/": (5, None, None, ("/", 5), None), 39 "/": (5, None, None, ("/", 5), None),
40 "+": (4, None, None, ("+", 4), None), 40 "+": (4, None, None, ("+", 4), None),
41 "-": (4, None, ("negate", 19), ("-", 4), None), 41 "-": (4, None, ("negate", 19), ("-", 4), None),
42 "=": (3, None, None, ("keyvalue", 3), None),
42 ",": (2, None, None, ("list", 2), None), 43 ",": (2, None, None, ("list", 2), None),
43 ")": (0, None, None, None, None), 44 ")": (0, None, None, None, None),
44 "integer": (0, "integer", None, None, None), 45 "integer": (0, "integer", None, None, None),
45 "symbol": (0, "symbol", None, None, None), 46 "symbol": (0, "symbol", None, None, None),
46 "string": (0, "string", None, None, None), 47 "string": (0, "string", None, None, None),
54 pos = start 55 pos = start
55 while pos < end: 56 while pos < end:
56 c = program[pos] 57 c = program[pos]
57 if c.isspace(): # skip inter-token whitespace 58 if c.isspace(): # skip inter-token whitespace
58 pass 59 pass
59 elif c in "(,)%|+-*/": # handle simple operators 60 elif c in "(=,)%|+-*/": # handle simple operators
60 yield (c, None, pos) 61 yield (c, None, pos)
61 elif c in '"\'': # handle quoted templates 62 elif c in '"\'': # handle quoted templates
62 s = pos + 1 63 s = pos + 1
63 data, pos = _parsetemplate(program, s, end, c) 64 data, pos = _parsetemplate(program, s, end, c)
64 yield ('template', data, s) 65 yield ('template', data, s)
460 raise error.ParseError(_("filter %s expects one argument") % n) 461 raise error.ParseError(_("filter %s expects one argument") % n)
461 f = context._filters[n] 462 f = context._filters[n]
462 return (runfilter, (args[0], f)) 463 return (runfilter, (args[0], f))
463 raise error.ParseError(_("unknown function '%s'") % n) 464 raise error.ParseError(_("unknown function '%s'") % n)
464 465
466 def buildkeyvaluepair(exp, content):
467 raise error.ParseError(_("can't use a key-value pair in this context"))
468
465 # dict of template built-in functions 469 # dict of template built-in functions
466 funcs = {} 470 funcs = {}
467 471
468 templatefunc = registrar.templatefunc(funcs) 472 templatefunc = registrar.templatefunc(funcs)
469 473
982 "group": lambda e, c: compileexp(e[1], c, exprmethods), 986 "group": lambda e, c: compileexp(e[1], c, exprmethods),
983 # ".": buildmember, 987 # ".": buildmember,
984 "|": buildfilter, 988 "|": buildfilter,
985 "%": buildmap, 989 "%": buildmap,
986 "func": buildfunc, 990 "func": buildfunc,
991 "keyvalue": buildkeyvaluepair,
987 "+": lambda e, c: buildarithmetic(e, c, lambda a, b: a + b), 992 "+": lambda e, c: buildarithmetic(e, c, lambda a, b: a + b),
988 "-": lambda e, c: buildarithmetic(e, c, lambda a, b: a - b), 993 "-": lambda e, c: buildarithmetic(e, c, lambda a, b: a - b),
989 "negate": buildnegate, 994 "negate": buildnegate,
990 "*": lambda e, c: buildarithmetic(e, c, lambda a, b: a * b), 995 "*": lambda e, c: buildarithmetic(e, c, lambda a, b: a * b),
991 "/": lambda e, c: buildarithmetic(e, c, lambda a, b: a // b), 996 "/": lambda e, c: buildarithmetic(e, c, lambda a, b: a // b),