Skip to content

Commit 913aa1f

Browse files
committed
WIP
1 parent 2e6aaf6 commit 913aa1f

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

html5lib/html5parser.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ def mainLoop(self):
168168
ParseErrorToken = tokenTypes["ParseError"]
169169

170170
for token in self.normalizedTokens():
171+
#log.debug(u"Token {}".format(token))
171172
new_token = token
172173
while new_token is not None:
173174
currentNode = self.tree.openElements[-1] if self.tree.openElements else None

html5lib/tests/test_jinja.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import html5lib
2+
import unittest
3+
import logging
4+
5+
log = logging.getLogger(__name__)
6+
7+
8+
def dump(tree, tabs=0):
9+
log.debug(u"{}Tag '{}' - {} children - Value = {} - Text = {}".format(
10+
"".join(["\t" for i in range(tabs)]), tree.tag, len(tree), tree.attrib['value'] if 'value' in tree.attrib else None, tree.text))
11+
12+
for child in tree:
13+
dump(child, tabs + 1)
14+
15+
16+
class JinjaTestCase(unittest.TestCase):
17+
def setUp(self):
18+
self.parser = html5lib.HTMLParser(strict=True, namespaceHTMLElements=False, tree=html5lib.treebuilders.getTreeBuilder("etree", fullTree=True))
19+
20+
def assertTree(self, root, spec):
21+
self.assertEqual(len(root), len(spec))
22+
23+
for child, spec_child in zip(root, spec):
24+
self.assertEqual(child.tag, spec_child['tag'])
25+
26+
if 'text' in spec_child:
27+
self.assertEqual(child.text, spec_child['text'])
28+
29+
if 'value' in spec_child:
30+
self.assertEqual(child.attrib['value'], spec_child['value'])
31+
32+
if 'children' in spec_child:
33+
self.assertTree(child, spec_child['children'])
34+
else:
35+
self.assertEqual(len(child), 0)
36+
37+
if 'attrs' in spec_child:
38+
for k, v in spec_child['attrs'].iteritems():
39+
self.assertIn(k, child.attrib)
40+
self.assertEqual(v, child.attrib[k])
41+
42+
def test_open_block(self):
43+
html_string = """
44+
<div class="basket-site dropdown-menu" role="menu">
45+
{% set cart = active_cart() %}
46+
{% for cart_product in cart.products %}
47+
{% endfor %}
48+
49+
<div class="controls clearfix">
50+
{#
51+
<button type="button" class="btn btn-link">VIEW BASKET</button>
52+
#}
53+
</div>
54+
</div>
55+
"""
56+
tree = self.parser.parseFragment(html_string)
57+
dump(tree)

html5lib/tokenizer.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,14 @@ def jinjaOpenState(self):
311311
#})
312312

313313
self.state = self.jinjaStatementState
314+
elif data == "#":
315+
#self.tokenQueue.append({
316+
#"type": tokenTypes["JinjaStatementStartTag"],
317+
#"name": "{%", "data": {},
318+
#"selfClosing": False
319+
#})
320+
321+
self.state = self.jinjaCommentState
314322

315323
#self.state = self.dataState
316324
return True
@@ -359,6 +367,28 @@ def jinjaVariableEndState(self):
359367
#self.state = self.dataState
360368
return True
361369

370+
def jinjaCommentEndState(self):
371+
# We got a {
372+
data = self.stream.char()
373+
374+
if data == "}":
375+
#self.tokenQueue.append({
376+
#"type": tokenTypes["JinjaVariableEndTag"],
377+
#"name": "}}", "data": [],
378+
#"selfClosing": False
379+
#})
380+
self.state = self.dataState
381+
elif data is EOF:
382+
self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
383+
"expected-jinja-comment-closing-tag-but-got-eof",
384+
"datavars": {"data": data}})
385+
self.state = self.dataState
386+
else:
387+
self.state = self.jinjaStatementState
388+
389+
#self.state = self.dataState
390+
return True
391+
362392
def jinjaStatementState(self):
363393
data = self.stream.char()
364394

@@ -375,6 +405,24 @@ def jinjaStatementState(self):
375405

376406
return True
377407

408+
def jinjaCommentState(self):
409+
data = self.stream.char()
410+
411+
log.debug(u"Jinja comment state '{}'".format(data))
412+
413+
if data == "#":
414+
self.state = self.jinjaCommentEndState
415+
elif data is EOF:
416+
self.tokenQueue.append({"type": tokenTypes["ParseError"], "data":
417+
"missing-jinja-comment-closing-brace"})
418+
self.state = self.dataState
419+
else:
420+
chars = self.stream.charsUntil(("#", "\u0000"))
421+
#self.tokenQueue.append({"type": tokenTypes["JinjaStatementTag"], "data":
422+
#data + chars})
423+
424+
return True
425+
378426
def jinjaVariableState(self):
379427
data = self.stream.char()
380428

0 commit comments

Comments
 (0)