Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit24ecb5b

Browse files
committed
Parsing works a lot better
1 parent86c6f80 commit24ecb5b

File tree

4 files changed

+240
-44
lines changed

4 files changed

+240
-44
lines changed

‎html5lib/constants.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3088,7 +3088,7 @@
30883088
"ParseError":7,
30893089
"JinjaStatementStartTag":8,
30903090
"JinjaStatementEndTag":9,
3091-
"JinjaStatementTag":10,
3091+
"JinjaStatement":10,
30923092
"JinjaVariableStartTag":11,
30933093
"JinjaVariableEndTag":12,
30943094
"JinjaVariable":13,

‎html5lib/html5parser.py‎

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def mainLoop(self):
168168
ParseErrorToken=tokenTypes["ParseError"]
169169
JinjaStatementStartTag=tokenTypes["JinjaStatementStartTag"]
170170
JinjaStatementEndTag=tokenTypes["JinjaStatementEndTag"]
171-
JinjaStatementTag=tokenTypes["JinjaStatementTag"]
171+
JinjaStatement=tokenTypes["JinjaStatement"]
172172
JinjaVariableStartTag=tokenTypes["JinjaVariableStartTag"]
173173
JinjaVariableEndTag=tokenTypes["JinjaVariableEndTag"]
174174
JinjaVariable=tokenTypes["JinjaVariable"]
@@ -195,6 +195,9 @@ def mainLoop(self):
195195
iftypein (JinjaVariableStartTag,JinjaVariableEndTag,JinjaVariable,JinjaFilter,JinjaPipe):
196196
log.debug(u"Type is a jinja variable tag")
197197
phase=self.phases["inJinjaVariable"]
198+
eliftypein (JinjaStatementStartTag,JinjaStatementEndTag,JinjaStatement):
199+
log.debug(u"Type is a jinja statement tag")
200+
phase=self.phases["inJinjaStatement"]
198201
eliftypein (JinjaArgumentStartTag,JinjaArgumentEndTag,JinjaArgument):
199202
log.debug(u"Type is a jinja argument tag")
200203
phase=self.phases["inJinjaArgument"]
@@ -230,8 +233,8 @@ def mainLoop(self):
230233
new_token=phase.processJinjaStatementStartTag(new_token)
231234
eliftype==JinjaStatementEndTag:
232235
new_token=phase.processJinjaStatementEndTag(new_token)
233-
eliftype==JinjaStatementTag:
234-
new_token=phase.processJinjaStatementTag(new_token)
236+
eliftype==JinjaStatement:
237+
new_token=phase.processJinjaStatement(new_token)
235238
eliftype==JinjaVariableStartTag:
236239
new_token=phase.processJinjaVariableStartTag(new_token)
237240
eliftype==JinjaVariableEndTag:
@@ -518,6 +521,8 @@ def processDoctype(self, token):
518521
self.parser.parseError("unexpected-doctype")
519522

520523
defprocessCharacters(self,token):
524+
log=logging.getLogger(u"html5lib")
525+
log.debug(u"Inserting text {}.format(token)")
521526
self.tree.insertText(token["data"])
522527

523528
defprocessSpaceCharacters(self,token):
@@ -529,7 +534,7 @@ def processJinjaStatementStartTag(self, token):
529534
defprocessJinjaStatementEndTag(self,token):
530535
pass
531536

532-
defprocessJinjaStatementTag(self,token):
537+
defprocessJinjaStatement(self,token):
533538
pass
534539

535540
defprocessJinjaVariableStartTag(self,token):
@@ -610,6 +615,36 @@ def processJinjaFilter(self, token):
610615
element=self.tree.createElementWithoutNamespace(token)
611616
self.tree.openElements[-1].appendChild(element)
612617

618+
classInJinjaStatementPhase(Phase):
619+
defprocessJinjaStatementStartTag(self,token):
620+
log=logging.getLogger('html5lib')
621+
log.debug(u"InJinjaStatement: Start Tag")
622+
self.tree.reconstructActiveFormattingElements()
623+
self.tree.insertElement(token)
624+
625+
defprocessJinjaStatementEndTag(self,token):
626+
log=logging.getLogger('html5lib')
627+
log.debug(u"InJinjaStatement: End Tag {}".format(token["name"]))
628+
fornodeinself.tree.openElements[::-1]:
629+
log.debug(u"InJinjaStatement: Open tag {} token {}".format(node,token))
630+
ifnode.name==token["name"]:
631+
self.tree.generateImpliedEndTags(exclude=token["name"])
632+
log.debug(u"InJinjaStatement: Implied end tag {} {}".format(self.tree.openElements[-1].name,token["name"]))
633+
ifself.tree.openElements[-1].name!=token["name"]:
634+
self.parser.parseError("unexpected-end-tag", {"name":token["name"]})
635+
whileself.tree.openElements.pop()!=node:
636+
pass
637+
break
638+
else:
639+
ifnode.nameTupleinspecialElements:
640+
log.debug(u"InJinjaStatement Nametuple {} in {}".format(node.nameTuple,specialElements))
641+
self.parser.parseError("unexpected-end-tag", {"name":token["name"]})
642+
break
643+
644+
defprocessJinjaStatement(self,token):
645+
element=self.tree.createElementWithoutNamespace(token)
646+
self.tree.openElements[-1].appendChild(element)
647+
613648
classInJinjaArgumentPhase(Phase):
614649
defprocessJinjaArgumentStartTag(self,token):
615650
log=logging.getLogger('html5lib')
@@ -1136,6 +1171,9 @@ def processSpaceCharactersDropNewline(self, token):
11361171
self.tree.insertText(data)
11371172

11381173
defprocessCharacters(self,token):
1174+
importlogging
1175+
log=logging.getLogger(u"html5lib")
1176+
log.debug(u"In Body phase processing Characters {}".format(token))
11391177
iftoken["data"]=="\u0000":
11401178
# The tokenizer should always emit null on its own
11411179
return
@@ -2831,6 +2869,7 @@ def processEndTag(self, token):
28312869
# XXX "inHeadNoscript": InHeadNoScriptPhase,
28322870
"afterHead":AfterHeadPhase,
28332871
"inJinjaVariable":InJinjaVariablePhase,
2872+
"inJinjaStatement":InJinjaStatementPhase,
28342873
"inJinjaArgument":InJinjaArgumentPhase,
28352874
"inBody":InBodyPhase,
28362875
"text":TextPhase,

‎html5lib/tests/test_jinja.py‎

Lines changed: 105 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,48 @@
66

77

88
defdump(tree,tabs=0):
9-
log.debug(u"{}Tag '{}' - {} children - Value = {}".format(
10-
"".join(["\t"foriinrange(tabs)]),tree.tag,len(tree),tree.attrib['value']if'value'intree.attribelseNone))
9+
log.debug(u"{}Tag '{}' - {} children - Value = {} - Text = {}".format(
10+
"".join(["\t"foriinrange(tabs)]),tree.tag,len(tree),tree.attrib['value']if'value'intree.attribelseNone,tree.text))
1111

1212
forchildintree:
1313
dump(child,tabs+1)
1414

1515

1616
classJinjaTestCase(unittest.TestCase):
17-
deftest_var_1(self):
18-
parser=html5lib.HTMLParser(strict=False)
17+
defsetUp(self):
18+
self.parser=html5lib.HTMLParser(strict=False,namespaceHTMLElements=False)
1919

20+
deftest_var_1(self):
2021
html_string="""<h1>{{ hi }}</h1>"""
2122

22-
tree=parser.parseFragment(html_string)
23+
tree=self.parser.parseFragment(html_string)
2324

2425
h1=tree[0]
25-
self.assertEqual(h1.tag,"{http://www.w3.org/1999/xhtml}h1")
26+
jt=h1[0]
27+
var1=jt[0]
28+
self.assertEqual(h1.tag,"h1")
29+
self.assertEqual(var1.tag,'jinjavariable')
30+
self.assertEqual(var1.attrib['value'],'hi')
2631

27-
deftest_filter_1(self):
28-
parser=html5lib.HTMLParser(strict=False)
32+
deftest_var_2(self):
33+
html_string="""<h1>{{ a.b }}</h1>"""
34+
35+
tree=self.parser.parseFragment(html_string)
36+
37+
h1=tree[0]
38+
jt=h1[0]
39+
var1=jt[0]
40+
self.assertEqual(h1.tag,"h1")
41+
self.assertEqual(var1.tag,'jinjavariable')
42+
self.assertEqual(var1.attrib['value'],'a.b')
2943

44+
deftest_filter_1(self):
3045
html_string="""<h1>{{ hi | yo }}</h1>"""
3146

32-
tree=parser.parseFragment(html_string)
47+
tree=self.parser.parseFragment(html_string)
3348

3449
h1=tree[0]
35-
self.assertEqual(h1.tag,"{http://www.w3.org/1999/xhtml}h1")
50+
self.assertEqual(h1.tag,"h1")
3651

3752
jt=h1[0]
3853

@@ -48,15 +63,40 @@ def test_filter_1(self):
4863
self.assertEqual(yo.attrib['value'],'yo')
4964

5065
deftest_filter_2(self):
51-
parser=html5lib.HTMLParser(strict=False)
52-
5366
html_string="""<h1>{{ hi | yo("hi") }}</h1>"""
5467

55-
tree=parser.parseFragment(html_string)
68+
tree=self.parser.parseFragment(html_string)
69+
dump(tree)
70+
71+
h1=tree[0]
72+
self.assertEqual(h1.tag,"h1")
73+
74+
jt=h1[0]
75+
76+
hi=jt[0]
77+
pipe1=jt[1]
78+
yo=jt[2]
79+
80+
self.assertEqual(hi.tag,'jinjavariable')
81+
self.assertEqual(hi.attrib['value'],'hi')
82+
self.assertEqual(pipe1.tag,'jinjapipe')
83+
self.assertEqual(pipe1.attrib['value'],'|')
84+
self.assertEqual(yo.tag,'jinjafilter')
85+
self.assertEqual(yo.attrib['value'],'yo')
86+
87+
arg1=yo[0]
88+
89+
self.assertEqual(arg1.tag,'jinjaargument')
90+
self.assertEqual(arg1.attrib['value'],'"hi"')
91+
92+
deftest_filter_3(self):
93+
html_string="""<h1>{{ hi | yo("hi", "mike") }}</h1>"""
94+
95+
tree=self.parser.parseFragment(html_string)
5696
dump(tree)
5797

5898
h1=tree[0]
59-
self.assertEqual(h1.tag,"{http://www.w3.org/1999/xhtml}h1")
99+
self.assertEqual(h1.tag,"h1")
60100

61101
jt=h1[0]
62102

@@ -72,6 +112,57 @@ def test_filter_2(self):
72112
self.assertEqual(yo.attrib['value'],'yo')
73113

74114
arg1=yo[0]
115+
arg2=yo[1]
75116

76117
self.assertEqual(arg1.tag,'jinjaargument')
77118
self.assertEqual(arg1.attrib['value'],'"hi"')
119+
self.assertEqual(arg2.tag,'jinjaargument')
120+
self.assertEqual(arg2.attrib['value'],'"mike"')
121+
122+
deftest_jinja_block(self):
123+
html_string="""
124+
{% block title %}Hi{% endblock %}
125+
"""
126+
127+
tree=self.parser.parseFragment(html_string)
128+
dump(tree)
129+
130+
block=tree[0]
131+
132+
self.assertEqual(block.tag,'jinjablock')
133+
self.assertEqual(block.text,'Hi')
134+
135+
deftest_jinja_block_in_title(self):
136+
html_string="""
137+
<title>{% block title %}{% endblock %}</title>
138+
"""
139+
140+
tree=self.parser.parseFragment(html_string)
141+
dump(tree)
142+
143+
title=tree[0]
144+
block=title[0]
145+
146+
self.assertEqual(title.tag,'title')
147+
self.assertEqual(block.tag,'jinjablock')
148+
self.assertEqual(block.attrib['value'],'title')
149+
150+
deftest_jinja_for(self):
151+
html_string="""
152+
{% for a in b %}
153+
{{ a }}
154+
{% endfor %}
155+
"""
156+
157+
tree=self.parser.parseFragment(html_string)
158+
dump(tree)
159+
160+
block=tree[0]
161+
var=block[0]
162+
var1=var[0]
163+
164+
self.assertEqual(block.tag,'jinjafor')
165+
self.assertEqual(block.attrib['value'],'a in b')
166+
self.assertEqual(var.tag,'jinjavariabletag')
167+
self.assertEqual(var1.tag,'jinjavariable')
168+
self.assertEqual(var1.attrib['value'],'a')

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp