@@ -168,7 +168,7 @@ def mainLoop(self):
168168ParseErrorToken = tokenTypes ["ParseError" ]
169169JinjaStatementStartTag = tokenTypes ["JinjaStatementStartTag" ]
170170JinjaStatementEndTag = tokenTypes ["JinjaStatementEndTag" ]
171- JinjaStatementTag = tokenTypes ["JinjaStatementTag " ]
171+ JinjaStatement = tokenTypes ["JinjaStatement " ]
172172JinjaVariableStartTag = tokenTypes ["JinjaVariableStartTag" ]
173173JinjaVariableEndTag = tokenTypes ["JinjaVariableEndTag" ]
174174JinjaVariable = tokenTypes ["JinjaVariable" ]
@@ -195,6 +195,9 @@ def mainLoop(self):
195195if type in (JinjaVariableStartTag ,JinjaVariableEndTag ,JinjaVariable ,JinjaFilter ,JinjaPipe ):
196196log .debug (u"Type is a jinja variable tag" )
197197phase = self .phases ["inJinjaVariable" ]
198+ elif type in (JinjaStatementStartTag ,JinjaStatementEndTag ,JinjaStatement ):
199+ log .debug (u"Type is a jinja statement tag" )
200+ phase = self .phases ["inJinjaStatement" ]
198201elif type in (JinjaArgumentStartTag ,JinjaArgumentEndTag ,JinjaArgument ):
199202log .debug (u"Type is a jinja argument tag" )
200203phase = self .phases ["inJinjaArgument" ]
@@ -230,8 +233,8 @@ def mainLoop(self):
230233new_token = phase .processJinjaStatementStartTag (new_token )
231234elif type == JinjaStatementEndTag :
232235new_token = phase .processJinjaStatementEndTag (new_token )
233- elif type == JinjaStatementTag :
234- new_token = phase .processJinjaStatementTag (new_token )
236+ elif type == JinjaStatement :
237+ new_token = phase .processJinjaStatement (new_token )
235238elif type == JinjaVariableStartTag :
236239new_token = phase .processJinjaVariableStartTag (new_token )
237240elif type == JinjaVariableEndTag :
@@ -518,6 +521,8 @@ def processDoctype(self, token):
518521self .parser .parseError ("unexpected-doctype" )
519522
520523def processCharacters (self ,token ):
524+ log = logging .getLogger (u"html5lib" )
525+ log .debug (u"Inserting text {}.format(token)" )
521526self .tree .insertText (token ["data" ])
522527
523528def processSpaceCharacters (self ,token ):
@@ -529,7 +534,7 @@ def processJinjaStatementStartTag(self, token):
529534def processJinjaStatementEndTag (self ,token ):
530535pass
531536
532- def processJinjaStatementTag (self ,token ):
537+ def processJinjaStatement (self ,token ):
533538pass
534539
535540def processJinjaVariableStartTag (self ,token ):
@@ -610,6 +615,36 @@ def processJinjaFilter(self, token):
610615element = self .tree .createElementWithoutNamespace (token )
611616self .tree .openElements [- 1 ].appendChild (element )
612617
618+ class InJinjaStatementPhase (Phase ):
619+ def processJinjaStatementStartTag (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+ def processJinjaStatementEndTag (self ,token ):
626+ log = logging .getLogger ('html5lib' )
627+ log .debug (u"InJinjaStatement: End Tag {}" .format (token ["name" ]))
628+ for node in self .tree .openElements [::- 1 ]:
629+ log .debug (u"InJinjaStatement: Open tag {} token {}" .format (node ,token ))
630+ if node .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+ if self .tree .openElements [- 1 ].name != token ["name" ]:
634+ self .parser .parseError ("unexpected-end-tag" , {"name" :token ["name" ]})
635+ while self .tree .openElements .pop ()!= node :
636+ pass
637+ break
638+ else :
639+ if node .nameTuple in specialElements :
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+ def processJinjaStatement (self ,token ):
645+ element = self .tree .createElementWithoutNamespace (token )
646+ self .tree .openElements [- 1 ].appendChild (element )
647+
613648class InJinjaArgumentPhase (Phase ):
614649def processJinjaArgumentStartTag (self ,token ):
615650log = logging .getLogger ('html5lib' )
@@ -1136,6 +1171,9 @@ def processSpaceCharactersDropNewline(self, token):
11361171self .tree .insertText (data )
11371172
11381173def processCharacters (self ,token ):
1174+ import logging
1175+ log = logging .getLogger (u"html5lib" )
1176+ log .debug (u"In Body phase processing Characters {}" .format (token ))
11391177if token ["data" ]== "\u0000 " :
11401178# The tokenizer should always emit null on its own
11411179return
@@ -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 ,