diff options
author | cduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-16 19:55:07 +0000 |
---|---|---|
committer | cduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-16 19:55:07 +0000 |
commit | 0dc4b82d8261b98febb545a85f509e4b45e042b5 (patch) | |
tree | e426135bbc23ce5b829474053fbf2854724a8b6a /third_party/handlebar | |
parent | b678b85a3716bb705224009a386ae7df778b1d4e (diff) | |
download | chromium_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.chromium | 2 | ||||
-rw-r--r-- | third_party/handlebar/handlebar.py | 86 |
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("<") - elif c == '>': - escaped.append(">") - elif c == '&': - escaped.append("&") - else: - escaped.append(c) + if value is None: + return + + string = value if isinstance(value, basestring) else str(value) + renderState.text.append(string.replace('&', '&') + .replace('<', '<') + .replace('>', '>')) 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': |