@@ -426,10 +426,13 @@ def getMetaclass(use_metaclass, metaclass_func):
426
426
class Phase (with_metaclass (getMetaclass (debug , log ))):
427
427
"""Base class for helper object that implements each phase of processing
428
428
"""
429
+ __slots__ = ("parser" , "tree" , "__startTagCache" , "__endTagCache" )
429
430
430
431
def __init__ (self , parser , tree ):
431
432
self .parser = parser
432
433
self .tree = tree
434
+ self .__startTagCache = {}
435
+ self .__endTagCache = {}
433
436
434
437
def processEOF (self ):
435
438
raise NotImplementedError
@@ -449,7 +452,12 @@ def processSpaceCharacters(self, token):
449
452
self .tree .insertText (token ["data" ])
450
453
451
454
def processStartTag (self , token ):
452
- return self .startTagHandler [token ["name" ]](token )
455
+ name = token ["name" ]
456
+ try :
457
+ func = self .__startTagCache [name ]
458
+ except KeyError :
459
+ func = self .__startTagCache [name ] = self .startTagHandler [name ].__get__ (self )
460
+ return func (token )
453
461
454
462
def startTagHtml (self , token ):
455
463
if not self .parser .firstStartTag and token ["name" ] == "html" :
@@ -462,9 +470,16 @@ def startTagHtml(self, token):
462
470
self .parser .firstStartTag = False
463
471
464
472
def processEndTag (self , token ):
465
- return self .endTagHandler [token ["name" ]](token )
473
+ name = token ["name" ]
474
+ try :
475
+ func = self .__endTagCache [name ]
476
+ except KeyError :
477
+ func = self .__endTagCache [name ] = self .endTagHandler [name ].__get__ (self )
478
+ return func (token )
466
479
467
480
class InitialPhase (Phase ):
481
+ __slots__ = tuple ()
482
+
468
483
def processSpaceCharacters (self , token ):
469
484
pass
470
485
@@ -593,6 +608,8 @@ def processEOF(self):
593
608
return True
594
609
595
610
class BeforeHtmlPhase (Phase ):
611
+ __slots__ = tuple ()
612
+
596
613
# helper methods
597
614
def insertHtmlElement (self ):
598
615
self .tree .insertRoot (impliedTagToken ("html" , "StartTag" ))
@@ -628,10 +645,7 @@ def processEndTag(self, token):
628
645
return token
629
646
630
647
class BeforeHeadPhase (Phase ):
631
- def __init__ (self , parser , tree ):
632
- Phase .__init__ (self , parser , tree )
633
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
634
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
648
+ __slots__ = tuple ()
635
649
636
650
def processEOF (self ):
637
651
self .startTagHead (impliedTagToken ("head" , "StartTag" ))
@@ -676,10 +690,7 @@ def endTagOther(self, token):
676
690
endTagHandler .default = endTagOther
677
691
678
692
class InHeadPhase (Phase ):
679
- def __init__ (self , parser , tree ):
680
- Phase .__init__ (self , parser , tree )
681
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
682
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
693
+ __slots__ = tuple ()
683
694
684
695
# the real thing
685
696
def processEOF (self ):
@@ -781,10 +792,7 @@ def anythingElse(self):
781
792
endTagHandler .default = endTagOther
782
793
783
794
class InHeadNoscriptPhase (Phase ):
784
- def __init__ (self , parser , tree ):
785
- Phase .__init__ (self , parser , tree )
786
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
787
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
795
+ __slots__ = tuple ()
788
796
789
797
def processEOF (self ):
790
798
self .parser .parseError ("eof-in-head-noscript" )
@@ -847,10 +855,7 @@ def anythingElse(self):
847
855
endTagHandler .default = endTagOther
848
856
849
857
class AfterHeadPhase (Phase ):
850
- def __init__ (self , parser , tree ):
851
- Phase .__init__ (self , parser , tree )
852
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
853
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
858
+ __slots__ = tuple ()
854
859
855
860
def processEOF (self ):
856
861
self .anythingElse ()
@@ -918,11 +923,10 @@ def anythingElse(self):
918
923
class InBodyPhase (Phase ):
919
924
# http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody
920
925
# the really-really-really-very crazy mode
921
- def __init__ (self , parser , tree ):
922
- Phase .__init__ (self , parser , tree )
923
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
924
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
926
+ __slots__ = ("processSpaceCharacters" ,)
925
927
928
+ def __init__ (self , * args , ** kwargs ):
929
+ super (InBodyPhase , self ).__init__ (* args , ** kwargs )
926
930
# Set this to the default handler
927
931
self .processSpaceCharacters = self .processSpaceCharactersNonPre
928
932
@@ -1641,10 +1645,7 @@ def endTagOther(self, token):
1641
1645
endTagHandler .default = endTagOther
1642
1646
1643
1647
class TextPhase (Phase ):
1644
- def __init__ (self , parser , tree ):
1645
- Phase .__init__ (self , parser , tree )
1646
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
1647
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
1648
+ __slots__ = tuple ()
1648
1649
1649
1650
def processCharacters (self , token ):
1650
1651
self .tree .insertText (token ["data" ])
@@ -1678,10 +1679,7 @@ def endTagOther(self, token):
1678
1679
1679
1680
class InTablePhase (Phase ):
1680
1681
# http://www.whatwg.org/specs/web-apps/current-work/#in-table
1681
- def __init__ (self , parser , tree ):
1682
- Phase .__init__ (self , parser , tree )
1683
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
1684
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
1682
+ __slots__ = tuple ()
1685
1683
1686
1684
# helper methods
1687
1685
def clearStackToTableContext (self ):
@@ -1825,8 +1823,10 @@ def endTagOther(self, token):
1825
1823
endTagHandler .default = endTagOther
1826
1824
1827
1825
class InTableTextPhase (Phase ):
1828
- def __init__ (self , parser , tree ):
1829
- Phase .__init__ (self , parser , tree )
1826
+ __slots__ = ("originalPhase" , "characterTokens" )
1827
+
1828
+ def __init__ (self , * args , ** kwargs ):
1829
+ super (InTableTextPhase , self ).__init__ (* args , ** kwargs )
1830
1830
self .originalPhase = None
1831
1831
self .characterTokens = []
1832
1832
@@ -1871,10 +1871,7 @@ def processEndTag(self, token):
1871
1871
1872
1872
class InCaptionPhase (Phase ):
1873
1873
# http://www.whatwg.org/specs/web-apps/current-work/#in-caption
1874
- def __init__ (self , parser , tree ):
1875
- Phase .__init__ (self , parser , tree )
1876
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
1877
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
1874
+ __slots__ = tuple ()
1878
1875
1879
1876
def ignoreEndTagCaption (self ):
1880
1877
return not self .tree .elementInScope ("caption" , variant = "table" )
@@ -1944,11 +1941,7 @@ def endTagOther(self, token):
1944
1941
1945
1942
class InColumnGroupPhase (Phase ):
1946
1943
# http://www.whatwg.org/specs/web-apps/current-work/#in-column
1947
-
1948
- def __init__ (self , parser , tree ):
1949
- Phase .__init__ (self , parser , tree )
1950
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
1951
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
1944
+ __slots__ = tuple ()
1952
1945
1953
1946
def ignoreEndTagColgroup (self ):
1954
1947
return self .tree .openElements [- 1 ].name == "html"
@@ -2012,10 +2005,7 @@ def endTagOther(self, token):
2012
2005
2013
2006
class InTableBodyPhase (Phase ):
2014
2007
# http://www.whatwg.org/specs/web-apps/current-work/#in-table0
2015
- def __init__ (self , parser , tree ):
2016
- Phase .__init__ (self , parser , tree )
2017
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2018
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2008
+ __slots__ = tuple ()
2019
2009
2020
2010
# helper methods
2021
2011
def clearStackToTableBodyContext (self ):
@@ -2113,10 +2103,7 @@ def endTagOther(self, token):
2113
2103
2114
2104
class InRowPhase (Phase ):
2115
2105
# http://www.whatwg.org/specs/web-apps/current-work/#in-row
2116
- def __init__ (self , parser , tree ):
2117
- Phase .__init__ (self , parser , tree )
2118
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2119
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2106
+ __slots__ = tuple ()
2120
2107
2121
2108
# helper methods (XXX unify this with other table helper methods)
2122
2109
def clearStackToTableRowContext (self ):
@@ -2205,10 +2192,7 @@ def endTagOther(self, token):
2205
2192
2206
2193
class InCellPhase (Phase ):
2207
2194
# http://www.whatwg.org/specs/web-apps/current-work/#in-cell
2208
- def __init__ (self , parser , tree ):
2209
- Phase .__init__ (self , parser , tree )
2210
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2211
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2195
+ __slots__ = tuple ()
2212
2196
2213
2197
# helper
2214
2198
def closeCell (self ):
@@ -2283,10 +2267,7 @@ def endTagOther(self, token):
2283
2267
endTagHandler .default = endTagOther
2284
2268
2285
2269
class InSelectPhase (Phase ):
2286
- def __init__ (self , parser , tree ):
2287
- Phase .__init__ (self , parser , tree )
2288
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2289
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2270
+ __slots__ = tuple ()
2290
2271
2291
2272
# http://www.whatwg.org/specs/web-apps/current-work/#in-select
2292
2273
def processEOF (self ):
@@ -2385,10 +2366,7 @@ def endTagOther(self, token):
2385
2366
endTagHandler .default = endTagOther
2386
2367
2387
2368
class InSelectInTablePhase (Phase ):
2388
- def __init__ (self , parser , tree ):
2389
- Phase .__init__ (self , parser , tree )
2390
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2391
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2369
+ __slots__ = tuple ()
2392
2370
2393
2371
def processEOF (self ):
2394
2372
self .parser .phases ["inSelect" ].processEOF ()
@@ -2426,6 +2404,8 @@ def endTagOther(self, token):
2426
2404
endTagHandler .default = endTagOther
2427
2405
2428
2406
class InForeignContentPhase (Phase ):
2407
+ __slots__ = tuple ()
2408
+
2429
2409
breakoutElements = frozenset (["b" , "big" , "blockquote" , "body" , "br" ,
2430
2410
"center" , "code" , "dd" , "div" , "dl" , "dt" ,
2431
2411
"em" , "embed" , "h1" , "h2" , "h3" ,
@@ -2435,9 +2415,6 @@ class InForeignContentPhase(Phase):
2435
2415
"span" , "strong" , "strike" , "sub" , "sup" ,
2436
2416
"table" , "tt" , "u" , "ul" , "var" ])
2437
2417
2438
- def __init__ (self , parser , tree ):
2439
- Phase .__init__ (self , parser , tree )
2440
-
2441
2418
def adjustSVGTagNames (self , token ):
2442
2419
replacements = {"altglyph" : "altGlyph" ,
2443
2420
"altglyphdef" : "altGlyphDef" ,
@@ -2541,10 +2518,7 @@ def processEndTag(self, token):
2541
2518
return new_token
2542
2519
2543
2520
class AfterBodyPhase (Phase ):
2544
- def __init__ (self , parser , tree ):
2545
- Phase .__init__ (self , parser , tree )
2546
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2547
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2521
+ __slots__ = tuple ()
2548
2522
2549
2523
def processEOF (self ):
2550
2524
# Stop parsing
@@ -2591,10 +2565,7 @@ def endTagOther(self, token):
2591
2565
2592
2566
class InFramesetPhase (Phase ):
2593
2567
# http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
2594
- def __init__ (self , parser , tree ):
2595
- Phase .__init__ (self , parser , tree )
2596
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2597
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2568
+ __slots__ = tuple ()
2598
2569
2599
2570
def processEOF (self ):
2600
2571
if self .tree .openElements [- 1 ].name != "html" :
@@ -2650,10 +2621,7 @@ def endTagOther(self, token):
2650
2621
2651
2622
class AfterFramesetPhase (Phase ):
2652
2623
# http://www.whatwg.org/specs/web-apps/current-work/#after3
2653
- def __init__ (self , parser , tree ):
2654
- Phase .__init__ (self , parser , tree )
2655
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2656
- self .endTagHandler = _utils .BoundMethodDispatcher (self , self .endTagHandler )
2624
+ __slots__ = tuple ()
2657
2625
2658
2626
def processEOF (self ):
2659
2627
# Stop parsing
@@ -2688,9 +2656,7 @@ def endTagOther(self, token):
2688
2656
endTagHandler .default = endTagOther
2689
2657
2690
2658
class AfterAfterBodyPhase (Phase ):
2691
- def __init__ (self , parser , tree ):
2692
- Phase .__init__ (self , parser , tree )
2693
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2659
+ __slots__ = tuple ()
2694
2660
2695
2661
def processEOF (self ):
2696
2662
pass
@@ -2727,9 +2693,7 @@ def processEndTag(self, token):
2727
2693
startTagHandler .default = startTagOther
2728
2694
2729
2695
class AfterAfterFramesetPhase (Phase ):
2730
- def __init__ (self , parser , tree ):
2731
- Phase .__init__ (self , parser , tree )
2732
- self .startTagHandler = _utils .BoundMethodDispatcher (self , self .startTagHandler )
2696
+ __slots__ = tuple ()
2733
2697
2734
2698
def processEOF (self ):
2735
2699
pass
0 commit comments