mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
templater: directly parse templates, no regexes
This commit is contained in:
parent
a08ba2f39f
commit
7455c67fcd
@ -6,7 +6,7 @@
|
||||
# GNU General Public License version 2 or any later version.
|
||||
|
||||
from i18n import _
|
||||
import re, sys, os
|
||||
import sys, os
|
||||
import util, config, templatefilters
|
||||
|
||||
path = ['templates', '../templates']
|
||||
@ -42,8 +42,6 @@ class engine(object):
|
||||
filter uses function to transform value. syntax is
|
||||
{key|filter1|filter2|...}.'''
|
||||
|
||||
template_re = re.compile(r'{([\w\|%]+)}')
|
||||
|
||||
def __init__(self, loader, filters={}, defaults={}):
|
||||
self.loader = loader
|
||||
self.filters = filters
|
||||
@ -113,19 +111,29 @@ class engine(object):
|
||||
v = v(**map)
|
||||
return v
|
||||
|
||||
while tmpl:
|
||||
m = self.template_re.search(tmpl)
|
||||
if not m:
|
||||
yield tmpl
|
||||
pos, stop = 0, len(tmpl)
|
||||
while pos < stop:
|
||||
n = tmpl.find('{', pos)
|
||||
if n < 0:
|
||||
yield tmpl[pos:stop]
|
||||
break
|
||||
if n > 0 and tmpl[n - 1] == '\\':
|
||||
# escaped
|
||||
yield tmpl[pos:n + 1]
|
||||
pos = n + 1
|
||||
continue
|
||||
if n > pos:
|
||||
yield tmpl[pos:n]
|
||||
|
||||
pos = n
|
||||
n = tmpl.find('}', pos)
|
||||
if n < 0:
|
||||
# no closing
|
||||
yield tmpl[pos:stop]
|
||||
break
|
||||
|
||||
start, end = m.span(0)
|
||||
variants = m.groups()
|
||||
expr = variants[0] or variants[1]
|
||||
|
||||
if start:
|
||||
yield tmpl[:start]
|
||||
tmpl = tmpl[end:]
|
||||
expr = tmpl[pos + 1:n]
|
||||
pos = n + 1
|
||||
|
||||
if '%' in expr:
|
||||
yield self._format(expr, get, map)
|
||||
|
Loading…
Reference in New Issue
Block a user