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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy