summaryrefslogtreecommitdiffstats
path: root/third_party/handlebar
diff options
context:
space:
mode:
authorcduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-16 19:55:07 +0000
committercduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-16 19:55:07 +0000
commit0dc4b82d8261b98febb545a85f509e4b45e042b5 (patch)
treee426135bbc23ce5b829474053fbf2854724a8b6a /third_party/handlebar
parentb678b85a3716bb705224009a386ae7df778b1d4e (diff)
downloadchromium_src-0dc4b82d8261b98febb545a85f509e4b45e042b5.zip
chromium_src-0dc4b82d8261b98febb545a85f509e4b45e042b5.tar.gz
chromium_src-0dc4b82d8261b98febb545a85f509e4b45e042b5.tar.bz2
Extensions Docs Server: Faster Handlebar
Handlebar renders much faster. Thanks Ben! TBR=kalman@chromium.org BUG=142011 Review URL: https://chromiumcodereview.appspot.com/10857042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@151950 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/handlebar')
-rw-r--r--third_party/handlebar/README.chromium2
-rw-r--r--third_party/handlebar/handlebar.py86
2 files changed, 39 insertions, 49 deletions
diff --git a/third_party/handlebar/README.chromium b/third_party/handlebar/README.chromium
index bb6ffbd..1b720ef 100644
--- a/third_party/handlebar/README.chromium
+++ b/third_party/handlebar/README.chromium
@@ -3,7 +3,7 @@ Short Name: handlebar
URL: https://github.com/kalman/templates
Version: 0
Date: July 13, 2012
-Revision: commit 606e9f31a240173e5d6c0b8768159c2e2835da42
+Revision: commit 8999739b363a9958b718f85257d912ed67b849d9
License: Apache 2.0
Security Critical: no
diff --git a/third_party/handlebar/handlebar.py b/third_party/handlebar/handlebar.py
index 3e7b5a5..c5a2c10 100644
--- a/third_party/handlebar/handlebar.py
+++ b/third_party/handlebar/handlebar.py
@@ -43,9 +43,6 @@ class CustomContext(object):
print(Handlebar('hello {{world}}').render(CustomContext()).text)
"""
-def _SafeStr(obj):
- return obj if isinstance(obj, basestring) else str(obj)
-
class ParseException(Exception):
""" Exception thrown while parsing the template.
"""
@@ -65,22 +62,24 @@ class StringBuilder(object):
"""
def __init__(self):
self._buf = []
- self._length = 0
def __len__(self):
- return self._length
+ self._Collapse()
+ return len(self._buf[0])
- def append(self, obj):
- string = _SafeStr(obj)
+ def append(self, string):
self._buf.append(string)
- self._length += len(string)
def toString(self):
- return u''.join(self._buf)
+ self._Collapse()
+ return self._buf[0]
def __str__(self):
return self.toString()
+ def _Collapse(self):
+ self._buf = [u''.join(self._buf)]
+
class RenderState(object):
""" The state of a render call.
"""
@@ -110,7 +109,7 @@ class RenderState(object):
return self
buf = StringBuilder()
for message in messages:
- buf.append(message)
+ buf.append(str(message))
self.errors.append(buf.toString())
return self
@@ -144,16 +143,16 @@ class Identifier(object):
return self._resolveFromContext(renderState.getFirstContext())
resolved = self._resolveFromContexts(renderState.localContexts)
- if resolved == None:
+ if resolved is None:
resolved = self._resolveFromContexts(renderState.globalContexts)
- if resolved == None:
+ if resolved is None:
renderState.addError("Couldn't resolve identifier ", self._path)
return resolved
def _resolveFromContexts(self, contexts):
for context in contexts:
resolved = self._resolveFromContext(context)
- if resolved != None:
+ if resolved is not None:
return resolved
return None
@@ -162,7 +161,7 @@ class Identifier(object):
for next in self._path:
# Only require that contexts provide a get method, meaning that callers
# can provide dict-like contexts (for example, to populate values lazily).
- if result == None or not getattr(result, "get", None):
+ if result is None or not getattr(result, "get", None):
return None
result = result.get(next)
return result
@@ -236,32 +235,26 @@ class InlineNode(DecoratorNode):
self._content.render(contentRenderState)
renderState.errors.extend(contentRenderState.errors)
-
- for c in contentRenderState.text.toString():
- if c != '\n':
- renderState.text.append(c)
+ renderState.text.append(
+ contentRenderState.text.toString().replace('\n', ''))
class IndentedNode(DecoratorNode):
def __init__(self, content, indentation):
DecoratorNode.__init__(self, content)
- self._indentation = indentation
+ self._indent_str = ' ' * indentation
def render(self, renderState):
contentRenderState = renderState.inSameContext()
self._content.render(contentRenderState)
renderState.errors.extend(contentRenderState.errors)
-
- self._indent(renderState.text)
- for i, c in enumerate(contentRenderState.text.toString()):
- renderState.text.append(c)
- if c == '\n' and i < len(contentRenderState.text) - 1:
- self._indent(renderState.text)
+ renderState.text.append(self._indent_str)
+ # TODO: this might introduce an extra \n at the end? need test.
+ renderState.text.append(
+ contentRenderState.text.toString().replace('\n',
+ '\n' + self._indent_str))
renderState.text.append('\n')
- def _indent(self, buf):
- buf.append(' ' * self._indentation)
-
class BlockNode(DecoratorNode):
def __init__(self, content):
DecoratorNode.__init__(self, content)
@@ -354,19 +347,13 @@ class EscapedVariableNode(LeafNode):
def render(self, renderState):
value = self._id.resolve(renderState)
- if value != None:
- self._appendEscapedHtml(renderState.text, _SafeStr(value))
-
- def _appendEscapedHtml(self, escaped, unescaped):
- for c in unescaped:
- if c == '<':
- escaped.append("&lt;")
- elif c == '>':
- escaped.append("&gt;")
- elif c == '&':
- escaped.append("&amp;")
- else:
- escaped.append(c)
+ if value is None:
+ return
+
+ string = value if isinstance(value, basestring) else str(value)
+ renderState.text.append(string.replace('&', '&amp;')
+ .replace('<', '&lt;')
+ .replace('>', '&gt;'))
class UnescapedVariableNode(LeafNode):
""" {{{foo}}}
@@ -377,8 +364,10 @@ class UnescapedVariableNode(LeafNode):
def render(self, renderState):
value = self._id.resolve(renderState)
- if value != None:
- renderState.text.append(value)
+ if value is None:
+ return
+ renderState.text.append(
+ value if isinstance(value, basestring) else str(value))
class SectionNode(DecoratorNode):
""" {{#foo}} ... {{/}}
@@ -389,7 +378,7 @@ class SectionNode(DecoratorNode):
def render(self, renderState):
value = self._id.resolve(renderState)
- if value == None:
+ if value is None:
return
if isinstance(value, list):
@@ -420,7 +409,7 @@ class VertedSectionNode(DecoratorNode):
renderState.localContexts.pop(0)
def _VertedSectionNodeShouldRender(value):
- if value == None:
+ if value is None:
return False
if isinstance(value, bool):
return value
@@ -457,8 +446,9 @@ class JsonNode(LeafNode):
def render(self, renderState):
value = self._id.resolve(renderState)
- if value != None:
- renderState.text.append(json.dumps(value, separators=(',',':')))
+ if value is None:
+ return
+ renderState.text.append(json.dumps(value, separators=(',',':')))
class PartialNode(LeafNode):
""" {{+foo}}
@@ -549,7 +539,7 @@ class TokenStream(object):
self.advance()
def hasNext(self):
- return self.nextToken != None
+ return self.nextToken is not None
def advance(self):
if self.nextContents == '\n':