@@ -61,6 +61,7 @@ def __init__(self, tree = simpletree.TreeBuilder,
61
61
"inBody" : InBodyPhase (self , self .tree ),
62
62
"inCDataRCData" : InCDataRCDataPhase (self , self .tree ),
63
63
"inTable" : InTablePhase (self , self .tree ),
64
+ "inTableText" : InTableTextPhase (self , self .tree ),
64
65
"inCaption" : InCaptionPhase (self , self .tree ),
65
66
"inColumnGroup" : InColumnGroupPhase (self , self .tree ),
66
67
"inTableBody" : InTableBodyPhase (self , self .tree ),
@@ -1568,22 +1569,16 @@ def processEOF(self):
1568
1569
#Stop parsing
1569
1570
1570
1571
def processSpaceCharacters (self , token ):
1571
- if "tainted" not in self .getCurrentTable ()._flags :
1572
- self .tree .insertText (token ["data" ])
1573
- else :
1574
- self .processCharacters (token )
1572
+ self .parser .phase = self .parser .phases ["inTableText" ]
1573
+ self .parser .phase .originalPhase = self
1574
+ self .parser .phase .characterTokens .append (token )
1575
1575
1576
1576
def processCharacters (self , token ):
1577
- if self .tree .openElements [- 1 ].name in ("style" , "script" ):
1578
- self .tree .insertText (token )
1579
- else :
1580
- if "tainted" not in self .getCurrentTable ()._flags :
1581
- self .parser .parseError ("unexpected-char-implies-table-voodoo" )
1582
- self .getCurrentTable ()._flags .append ("tainted" )
1583
- # Do the table magic!
1584
- self .tree .insertFromTable = True
1585
- self .parser .phases ["inBody" ].processCharacters (token )
1586
- self .tree .insertFromTable = False
1577
+ #If we get here there must be at least one non-whitespace character
1578
+ # Do the table magic!
1579
+ self .tree .insertFromTable = True
1580
+ self .parser .phases ["inBody" ].processCharacters (token )
1581
+ self .tree .insertFromTable = False
1587
1582
1588
1583
def startTagCaption (self , token ):
1589
1584
self .clearStackToTableContext ()
@@ -1669,6 +1664,48 @@ def endTagOther(self, token):
1669
1664
self .parser .phases ["inBody" ].processEndTag (token )
1670
1665
self .tree .insertFromTable = False
1671
1666
1667
+ class InTableTextPhase (Phase ):
1668
+ def __init__ (self , parser , tree ):
1669
+ Phase .__init__ (self , parser , tree )
1670
+ self .originalPhase = None
1671
+ self .characterTokens = []
1672
+
1673
+ def flushCharacters (self ):
1674
+ data = "" .join ([item ["data" ] for item in self .characterTokens ])
1675
+ if any ([item not in spaceCharacters for item in data ]):
1676
+ token = {"type" :tokenTypes ["Characters" ], "data" :data }
1677
+ self .originalPhase .processCharacters (token )
1678
+ elif data :
1679
+ self .tree .insertText (data )
1680
+ self .characterTokens = []
1681
+
1682
+ def processComment (self , token ):
1683
+ self .flushCharacters ()
1684
+ self .phase = self .originalPhase
1685
+ self .phase .processComment (token )
1686
+
1687
+ def processEOF (self , token ):
1688
+ self .flushCharacters ()
1689
+ self .phase = self .originalPhase
1690
+ self .phase .processEOF (token )
1691
+
1692
+ def processCharacters (self , token ):
1693
+ self .characterTokens .append (token )
1694
+
1695
+ def processSpaceCharacters (self , token ):
1696
+ #pretty sure we should never reach here
1697
+ assert False
1698
+
1699
+ def processStartTag (self , token ):
1700
+ self .flushCharacters ()
1701
+ self .phase = self .originalPhase
1702
+ self .phase .processStartTag (token )
1703
+
1704
+ def processEndTag (self , token ):
1705
+ self .flushCharacters ()
1706
+ self .phase = self .originalPhase
1707
+ self .phase .processEndTag (token )
1708
+
1672
1709
1673
1710
class InCaptionPhase (Phase ):
1674
1711
# http://www.whatwg.org/specs/web-apps/current-work/#in-caption
0 commit comments