@@ -389,7 +389,8 @@ def __init__(self, parser, tree):
389
389
390
390
self .startTagHandler = utils .MethodDispatcher ([
391
391
("html" , self .startTagHtml ),
392
- (("title" , "style" ), self .startTagTitleStyle ),
392
+ ("title" , self .startTagTitle ),
393
+ ("style" , self .startTagStyle ),
393
394
("script" , self .startTagScript ),
394
395
(("base" , "link" , "meta" ), self .startTagBaseLinkMeta ),
395
396
("head" , self .startTagHead )
@@ -430,25 +431,31 @@ def startTagHead(self, name, attributes):
430
431
self .tree .headPointer = self .tree .openElements [- 1 ]
431
432
self .parser .phase = self .parser .phases ["inHead" ]
432
433
433
- def startTagTitleStyle (self , name , attributes ):
434
- cmFlags = {"title" :"RCDATA" , "style" :"CDATA" }
434
+ def startTagTitle (self , name , attributes ):
435
435
element = self .tree .createElement (name , attributes )
436
436
self .appendToHead (element )
437
437
self .tree .openElements .append (element )
438
- self .parser .tokenizer .contentModelFlag = \
439
- contentModelFlags [cmFlags [name ]]
438
+ self .parser .tokenizer .contentModelFlag = contentModelFlags ["RCDATA" ]
439
+
440
+ def startTagStyle (self , name , attributes ):
441
+ element = self .tree .createElement (name , attributes )
442
+ if self .tree .headPointer is not None and \
443
+ self .parser .phase == self .parser .phases ["inHead" ]:
444
+ self .appendToHead (element )
445
+ else :
446
+ self .tree .openElements [- 1 ].appendChild (element )
447
+ self .tree .openElements .append (element )
448
+ self .parser .tokenizer .contentModelFlag = contentModelFlags ["CDATA" ]
440
449
441
450
def startTagScript (self , name , attributes ):
442
451
element = self .tree .createElement (name , attributes )
443
452
element ._flags .append ("parser-inserted" )
444
-
445
- # XXX in theory we should check if we're actually in the InHead state
446
- # here and if the headElementPointer is not zero but it seems to work
447
- # without that being the case.
448
- self .tree .openElements [- 1 ].appendChild (element )
453
+ if self . tree . headPointer is not None and \
454
+ self . parser . phase == self . parser . phases [ "inHead" ]:
455
+ self . appendToHead ( element )
456
+ else :
457
+ self .tree .openElements [- 1 ].appendChild (element )
449
458
self .tree .openElements .append (element )
450
-
451
- # XXX AT we could use self.tree.insertElement(name, attributes) ...
452
459
self .parser .tokenizer .contentModelFlag = contentModelFlags ["CDATA" ]
453
460
454
461
def startTagBaseLinkMeta (self , name , attributes ):
@@ -518,7 +525,7 @@ def startTagFrameset(self, name, attributes):
518
525
519
526
def startTagFromHead (self , name , attributes ):
520
527
self .parser .parseError (_ (u"Unexpected start tag (" + name + \
521
- ") that belongs in head. Moved." ))
528
+ ") that can be in head. Moved." ))
522
529
self .parser .phase = self .parser .phases ["inHead" ]
523
530
self .parser .phase .processStartTag (name , attributes )
524
531
@@ -542,8 +549,8 @@ def __init__(self, parser, tree):
542
549
Phase .__init__ (self , parser , tree )
543
550
self .startTagHandler = utils .MethodDispatcher ([
544
551
("html" , self .startTagHtml ),
545
- ("script" , self .startTagScript ),
546
- (("base" , "link" , "meta" , "style" , " title" ),
552
+ (( "script" , "style" ), self .startTagScriptStyle ),
553
+ (("base" , "link" , "meta" , "title" ),
547
554
self .startTagFromHead ),
548
555
("body" , self .startTagBody ),
549
556
(("address" , "blockquote" , "center" , "dir" , "div" , "dl" ,
@@ -615,7 +622,7 @@ def processCharacters(self, data):
615
622
self .tree .reconstructActiveFormattingElements ()
616
623
self .tree .insertText (data )
617
624
618
- def startTagScript (self , name , attributes ):
625
+ def startTagScriptStyle (self , name , attributes ):
619
626
self .parser .phases ["inHead" ].processStartTag (name , attributes )
620
627
621
628
def startTagFromHead (self , name , attributes ):
0 commit comments