Skip to content

Commit 1eb1bee

Browse files
committed
Fixed if conditions
1 parent 2db2cb0 commit 1eb1bee

File tree

3 files changed

+131
-62
lines changed

3 files changed

+131
-62
lines changed

html5lib/html5parser.py

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,6 @@ def resetInsertionMode(self):
456456
new_phase = self.phases["inBody"]
457457
break
458458

459-
#log.debug(u"Changing phase to {}".format(new_phase))
460459
self.phase = new_phase
461460

462461
def parseRCDataRawtext(self, token, contentType):
@@ -474,7 +473,6 @@ def parseRCDataRawtext(self, token, contentType):
474473

475474
self.originalPhase = self.phase
476475

477-
log.debug(u"Changing phase to text")
478476
self.phase = self.phases["text"]
479477

480478

@@ -530,8 +528,6 @@ def processDoctype(self, token):
530528
self.parser.parseError("unexpected-doctype")
531529

532530
def processCharacters(self, token):
533-
log = logging.getLogger(u"html5lib")
534-
log.debug(u"Inserting text {}.format(token)")
535531
self.tree.insertText(token["data"])
536532

537533
def processSpaceCharacters(self, token):
@@ -604,27 +600,20 @@ def processEndTag(self, token):
604600

605601
class InJinjaVariablePhase(Phase):
606602
def processJinjaVariableStartTag(self, token):
607-
log = logging.getLogger('html5lib')
608-
log.debug(u"InJinjaVariable: Start Tag")
609603
self.tree.reconstructActiveFormattingElements()
610604
self.tree.insertElement(token)
611605

612606
def processJinjaVariableEndTag(self, token):
613-
log = logging.getLogger('html5lib')
614-
log.debug(u"InJinjaVariable: End Tag {}".format(token["name"]))
615607
for node in self.tree.openElements[::-1]:
616-
log.debug(u"InJinjaVariable: Open tag {} token {}".format(node, token))
617608
if node.name == token["name"]:
618609
self.tree.generateImpliedEndTags(exclude=token["name"])
619-
log.debug(u"InJinjaVariable: Implied end tag {} {}".format(self.tree.openElements[-1].name, token["name"]))
620610
if self.tree.openElements[-1].name != token["name"]:
621611
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
622612
while self.tree.openElements.pop() != node:
623613
pass
624614
break
625615
else:
626616
if node.nameTuple in specialElements:
627-
log.debug(u"InJinjaVariable Nametuple {} in {}".format(node.nameTuple, specialElements))
628617
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
629618
break
630619

@@ -642,27 +631,51 @@ def processJinjaFilter(self, token):
642631

643632
class InJinjaStatementPhase(Phase):
644633
def processJinjaStatementStartTag(self, token):
645-
log = logging.getLogger('html5lib')
646-
log.debug(u"InJinjaStatement: Start Tag")
634+
if token['name'] == 'jinjaelse':
635+
self.closeOpenIf(token)
636+
elif token['name'] == 'jinjaelif':
637+
self.closeOpenIf(token)
638+
647639
self.tree.reconstructActiveFormattingElements()
648640
self.tree.insertElement(token)
649641

642+
def closeOpenIf(self, token):
643+
import logging
644+
log = logging.getLogger(u"html5lib")
645+
646+
for node in self.tree.openElements[::-1]:
647+
log.debug(u"Prev {} Cur {}".format(node.name, token['name']))
648+
649+
if node.name == token["name"] or (node.name in ["jinjaif", "jinjaelif"] and token["name"] in ["jinjaelse", "jinjaelif"]):
650+
self.tree.generateImpliedEndTags(exclude=token["name"])
651+
652+
if self.tree.openElements[-1].name in ["jinjaif", "jinjaelif"] and token["name"] in ["jinjaelse", "jinjaelif"]:
653+
pass
654+
elif self.tree.openElements[-1].name != token["name"]:
655+
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
656+
while self.tree.openElements.pop() != node:
657+
pass
658+
659+
break
660+
else:
661+
if node.nameTuple in specialElements:
662+
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
663+
break
664+
650665
def processJinjaStatementEndTag(self, token):
651-
log = logging.getLogger('html5lib')
652-
log.debug(u"InJinjaStatement: End Tag {}".format(token["name"]))
653666
for node in self.tree.openElements[::-1]:
654-
log.debug(u"InJinjaStatement: Open tag {} token {}".format(node, token))
655-
if node.name == token["name"]:
667+
if node.name == token["name"] or (node.name in ["jinjaelse", "jinjaelif"] and token["name"] == "jinjaif"):
656668
self.tree.generateImpliedEndTags(exclude=token["name"])
657-
log.debug(u"InJinjaStatement: Implied end tag {} {}".format(self.tree.openElements[-1].name, token["name"]))
658-
if self.tree.openElements[-1].name != token["name"]:
669+
670+
if self.tree.openElements[-1].name in ["jinjaelse", "jinjaelif"] and token["name"] == "jinjaif":
671+
pass
672+
elif self.tree.openElements[-1].name != token["name"]:
659673
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
660674
while self.tree.openElements.pop() != node:
661675
pass
662676
break
663677
else:
664678
if node.nameTuple in specialElements:
665-
log.debug(u"InJinjaStatement Nametuple {} in {}".format(node.nameTuple, specialElements))
666679
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
667680
break
668681

@@ -671,18 +684,7 @@ def processJinjaStatement(self, token):
671684
self.tree.openElements[-1].appendChild(element)
672685

673686
class InJinjaArgumentPhase(Phase):
674-
def processJinjaArgumentStartTag(self, token):
675-
log = logging.getLogger('html5lib')
676-
log.debug(u"InJinjaArgument: Start Tag")
677-
678-
def processJinjaArgumentEndTag(self, token):
679-
log = logging.getLogger('html5lib')
680-
log.debug(u"InJinjaArgument: End Tag {}".format(token["name"]))
681-
682687
def processJinjaArgument(self, token):
683-
log = logging.getLogger('html5lib')
684-
log.debug(u"InJinjaArgument: Process Jinja Argument {}".format(token["name"]))
685-
686688
element = self.tree.createElementWithoutNamespace(token)
687689
self.tree.openElements[-1].childNodes[-1].appendChild(element)
688690

@@ -979,8 +981,6 @@ def startTagOther(self, token):
979981
def endTagHead(self, token):
980982
node = self.parser.tree.openElements.pop()
981983
assert node.name == "head", "Expected head got %s" % node.name
982-
log = logging.getLogger(u"html5lib")
983-
log.debug(u"Switching phase to afterHead")
984984
self.parser.phase = self.parser.phases["afterHead"]
985985

986986
def endTagHtmlBodyBr(self, token):
@@ -991,8 +991,6 @@ def endTagOther(self, token):
991991
self.parser.parseError("unexpected-end-tag", {"name": token["name"]})
992992

993993
def anythingElse(self):
994-
log = logging.getLogger(u"html5lib")
995-
log.debug(u"Implied end head tag")
996994
self.endTagHead(impliedTagToken("head"))
997995

998996
# XXX If we implement a parser for which scripting is disabled we need to
@@ -1063,8 +1061,6 @@ def endTagOther(self, token):
10631061

10641062
def anythingElse(self):
10651063
self.tree.insertElement(impliedTagToken("body", "StartTag"))
1066-
log = logging.getLogger(u"html5lib")
1067-
log.debug(u"Changing phase to body")
10681064
self.parser.phase = self.parser.phases["inBody"]
10691065
self.parser.framesetOK = True
10701066

@@ -1196,9 +1192,6 @@ def processSpaceCharactersDropNewline(self, token):
11961192
self.tree.insertText(data)
11971193

11981194
def processCharacters(self, token):
1199-
import logging
1200-
log = logging.getLogger(u"html5lib")
1201-
log.debug(u"In Body phase processing Characters {}".format(token))
12021195
if token["data"] == "\u0000":
12031196
# The tokenizer should always emit null on its own
12041197
return

html5lib/tests/test_jinja.py

Lines changed: 97 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,28 @@ class JinjaTestCase(unittest.TestCase):
1717
def setUp(self):
1818
self.parser = html5lib.HTMLParser(strict=True, namespaceHTMLElements=False, tree=html5lib.treebuilders.getTreeBuilder("etree", fullTree=True))
1919

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+
2042
def test_var_1(self):
2143
html_string = """<h1>{{ hi }}</h1>"""
2244

@@ -142,6 +164,18 @@ def test_jinja_block(self):
142164
'text': 'Hi'
143165
}])
144166

167+
def test_jinja_block_named(self):
168+
html_string = """
169+
{% block title %}Hi{% endblock title %}
170+
"""
171+
172+
tree = self.parser.parseFragment(html_string)
173+
174+
self.assertTree(tree, [{
175+
'tag': 'jinjablock',
176+
'text': 'Hi'
177+
}])
178+
145179
def test_jinja_block_in_title(self):
146180
html_string = """
147181
<title>{% block title %}{% endblock %}</title>
@@ -258,6 +292,41 @@ def test_jinja_if(self):
258292
'text': 'yay'
259293
}])
260294

295+
def test_jinja_if_else(self):
296+
html_string = """
297+
{% if True %}yay{% else %}boo{% endif %}
298+
"""
299+
300+
tree = self.parser.parseFragment(html_string)
301+
dump(tree)
302+
303+
self.assertTree(tree, [{
304+
'tag': 'jinjaif',
305+
'text': 'yay'
306+
}, {
307+
'tag': 'jinjaelse',
308+
'text': 'boo'
309+
}])
310+
311+
def test_jinja_if_elif_else(self):
312+
html_string = """
313+
{% if True %}yay{% elif False %}too{% else %}boo{% endif %}
314+
"""
315+
316+
tree = self.parser.parseFragment(html_string)
317+
dump(tree)
318+
319+
self.assertTree(tree, [{
320+
'tag': 'jinjaif',
321+
'text': 'yay'
322+
}, {
323+
'tag': 'jinjaelif',
324+
'text': 'too'
325+
}, {
326+
'tag': 'jinjaelse',
327+
'text': 'boo'
328+
}])
329+
261330
def test_jinja_if_lstrip(self):
262331
html_string = """
263332
{%+ if True %}yay{% endif %}
@@ -382,24 +451,34 @@ def test_comment(self):
382451
'value': "{{ '[%s]' % page.title if page.title }} "
383452
}])
384453

385-
def assertTree(self, root, spec):
386-
self.assertEqual(len(root), len(spec))
387-
388-
for child, spec_child in zip(root, spec):
389-
self.assertEqual(child.tag, spec_child['tag'])
390-
391-
if 'text' in spec_child:
392-
self.assertEqual(child.text, spec_child['text'])
454+
def test_file(self):
455+
html_string = """
456+
<h4>{{ (term_price.price / term_price.term.num_cycles) | currency }}/month</h4>
393457
394-
if 'value' in spec_child:
395-
self.assertEqual(child.attrib['value'], spec_child['value'])
458+
"""
396459

397-
if 'children' in spec_child:
398-
self.assertTree(child, spec_child['children'])
399-
else:
400-
self.assertEqual(len(child), 0)
460+
tree = self.parser.parseFragment(html_string)
461+
dump(tree)
401462

402-
if 'attrs' in spec_child:
403-
for k, v in spec_child['attrs'].iteritems():
404-
self.assertIn(k, child.attrib)
405-
self.assertEqual(v, child.attrib[k])
463+
self.assertTree(tree, [{
464+
'tag': 'h4',
465+
'children': [{
466+
'tag': 'jinjavariabletag',
467+
'children': [{
468+
'tag': 'jinjavariable',
469+
'value': '(term_price.price'
470+
}, {
471+
'tag': 'jinjavariable',
472+
'value': '/'
473+
}, {
474+
'tag': 'jinjavariable',
475+
'value': 'term_price.term.num_cycles)'
476+
}, {
477+
'tag': 'jinjapipe',
478+
'value': '|'
479+
}, {
480+
'tag': 'jinjafilter',
481+
'value': 'currency'
482+
}]
483+
}]
484+
}])

html5lib/tokenizer.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,6 @@ def emitCurrentToken(self, resetState=True):
258258
# Below are the various tokenizer states worked out.
259259
def dataState(self):
260260
data = self.stream.char()
261-
log.debug(u"Tokenizer DataState {}".format(data))
262261

263262
if data == "&":
264263
self.state = self.entityDataState
@@ -539,7 +538,7 @@ def jinjaVariableState(self):
539538

540539
if data == "}":
541540
self.state = self.jinjaVariableEndState
542-
elif data == "(":
541+
elif data == "(" and self.currentToken['type'] in [tokenTypes["JinjaVariable"], tokenTypes["JinjaFilter"]]:
543542
self.currentToken = {
544543
"type": tokenTypes["JinjaArgumentStartTag"],
545544
"name": u"jinjaargumentstarttag", "data": {},
@@ -595,8 +594,6 @@ def jinjaVariableState(self):
595594
def jinjaArgState(self):
596595
data = self.stream.char()
597596

598-
log.debug(u"Arg {}".format(data))
599-
600597
if data == ")":
601598
self.tokenQueue.append({
602599
"type": tokenTypes["JinjaArgumentEndTag"],

0 commit comments

Comments
 (0)