require 'html5/html5parser/phase' module HTML5 class InCellPhase < Phase # http://www.whatwg.org/specs/web-apps/current-work/#in-cell handle_start 'html', %w( caption col colgroup tbody td tfoot th thead tr ) => 'TableOther' handle_end %w( td th ) => 'TableCell', %w( body caption col colgroup html ) => 'Ignore' handle_end %w( table tbody tfoot thead tr ) => 'Imply' def processCharacters(data) @parser.phases[:inBody].processCharacters(data) end def startTagTableOther(name, attributes) if in_scope?('td', true) or in_scope?('th', true) closeCell @parser.phase.processStartTag(name, attributes) else # inner_html case parse_error end end def startTagOther(name, attributes) @parser.phases[:inBody].processStartTag(name, attributes) end def endTagTableCell(name) if in_scope?(name, true) @tree.generateImpliedEndTags(name) if @tree.open_elements.last.name != name parse_error("unexpected-cell-end-tag", {"name" => name}) remove_open_elements_until(name) else @tree.open_elements.pop end @tree.clearActiveFormattingElements @parser.phase = @parser.phases[:inRow] else parse_error("unexpected-end-tag", {"name" => name}) end end def endTagIgnore(name) parse_error("unexpected-end-tag", {"name" => name}) end def endTagImply(name) if in_scope?(name, true) closeCell @parser.phase.processEndTag(name) else # sometimes inner_html case parse_error "unexpected-end-tag", {:name => name} end end def endTagOther(name) @parser.phases[:inBody].processEndTag(name) end protected def closeCell if in_scope?('td', true) endTagTableCell('td') elsif in_scope?('th', true) endTagTableCell('th') end end end end