Created
March 13, 2014 22:04
-
-
Save shortly-portly/9538005 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def parse(self, text): | |
# Basically, r_tag.split will split the text into | |
# an array containing, 'non-tag', 'tag', 'non-tag', 'tag' | |
# so if we alternate this variable, we know | |
# what to look for. This is alternate to | |
# line.startswith("{{") | |
in_tag = False | |
extend = None | |
pre_extend = True | |
skip = False | |
# Use a list to store everything in | |
# This is because later the code will "look ahead" | |
# for missing strings or brackets. | |
ij = self.r_tag.split(text) | |
# j = current index | |
# i = current item | |
stack = self.stack | |
for j in range(len(ij)): | |
i = ij[j] | |
if i: | |
if not stack: | |
self._raise_error('The "end" tag is unmatched, please check if you have a starting "block" tag') | |
# Our current element in the stack. | |
top = stack[-1] | |
if in_tag: | |
line = i | |
# Get rid of delimiters | |
line = line[len(self.delimiters[0]):-len(self.delimiters[1])].strip() | |
# This is bad juju, but let's do it anyway | |
if not line: | |
continue | |
# We do not want to replace the newlines in code, | |
# only in block comments. | |
def remove_newline(re_val): | |
# Take the entire match and replace newlines with | |
# escaped newlines. | |
return re_val.group(0).replace('\n', '\\n') | |
# Perform block comment escaping. | |
# This performs escaping ON anything | |
# in between """ and """ | |
line = sub(TemplateParser.r_multiline, | |
remove_newline, | |
line) | |
if line.startswith('='): | |
# IE: {{=response.title}} | |
name, value = '=', line[1:].strip() | |
else: | |
v = line.split(' ', 1) | |
if len(v) == 1: | |
# Example | |
# {{ include }} | |
# {{ end }} | |
name = v[0] | |
value = '' | |
else: | |
# Example | |
# {{ block pie }} | |
# {{ include "layout.html" }} | |
# {{ for i in range(10): }} | |
name = v[0] | |
value = v[1] | |
# This will replace newlines in block comments | |
# with the newline character. This is so that they | |
# retain their formatting, but squish down to one | |
# line in the rendered template. | |
# First check if we have any custom lexers | |
if name in self.lexers: | |
# Pass the information to the lexer | |
# and allow it to inject in the environment | |
# You can define custom names such as | |
# '{{<<variable}}' which could potentially | |
# write unescaped version of the variable. | |
self.lexers[name](parser=self, | |
value=value, | |
top=top, | |
stack=stack) | |
elif name == '=': | |
# So we have a variable to insert into | |
# the template | |
buf = "\n%s(%s)" % (self.writer, value) | |
top.append(Node(buf, pre_extend=pre_extend)) | |
elif name == 'verbatim': | |
skip = True | |
elif name == 'endverbatim': | |
skip = False | |
elif skip == True: | |
buf = "\n%s(%r, escape=False)" % (self.writer, i) | |
top.append(Node(buf, pre_extend=pre_extend)) | |
elif name == 'block' and not value.startswith('='): | |
# Make a new node with name. | |
node = BlockNode(name=value.strip(), | |
pre_extend=pre_extend, | |
delimiters=self.delimiters) | |
# Append this node to our active node | |
top.append(node) | |
# Make sure to add the node to the stack. | |
# so anything after this gets added | |
# to this node. This allows us to | |
# "nest" nodes. | |
stack.append(node) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment