+ if t.type is TYPE_END_TAG and t.name is 'br'
+ parse_error()
+ # W3C: t.type = TYPE_START_TAG
+ t = new_open_tag 'br' # WHATWG
+ # fall through
+ if t.type is TYPE_START_TAG and (t.name is 'area' or t.name is 'br' or t.name is 'embed' or t.name is 'img' or t.name is 'keygen' or t.name is 'wbr')
+ reconstruct_afe()
+ insert_html_element t
+ open_els.shift()
+ t.acknowledge_self_closing()
+ flag_frameset_ok = false
+ return
+ if t.type is TYPE_START_TAG and t.name is 'input'
+ reconstruct_afe()
+ insert_html_element t
+ open_els.shift()
+ t.acknowledge_self_closing()
+ unless is_input_hidden_tok t
+ flag_frameset_ok = false
+ return
+ if t.type is TYPE_START_TAG and (t.name is 'menuitem' or t.name is 'param' or t.name is 'source' or t.name is 'track')
+ # WHATWG adds 'menuitem' for this block
+ insert_html_element t
+ open_els.shift()
+ t.acknowledge_self_closing()
+ return
+ if t.type is TYPE_START_TAG and t.name is 'hr'
+ close_p_if_in_button_scope()
+ insert_html_element t
+ open_els.shift()
+ t.acknowledge_self_closing()
+ flag_frameset_ok = false
+ return
+ if t.type is TYPE_START_TAG and t.name is 'image'
+ parse_error()
+ t.name = 'img'
+ process_token t
+ return
+ if t.type is TYPE_START_TAG and t.name is 'isindex'
+ parse_error()
+ if template_tag_is_open() is false and form_element_pointer isnt null
+ return
+ t.acknowledge_self_closing()
+ flag_frameset_ok = false
+ close_p_if_in_button_scope()
+ el = insert_html_element new_open_tag 'form'
+ unless template_tag_is_open()
+ form_element_pointer = el
+ for a in t.attrs_a
+ if a[0] is 'action'
+ el.attrs['action'] = a[1]
+ break
+ insert_html_element new_open_tag 'hr'
+ open_els.shift()
+ reconstruct_afe()
+ insert_html_element new_open_tag 'label'
+ # note: this is a little out-of-spec-order so we only have to scan t.attrs_a once
+ input_el = new_open_tag 'input'
+ prompt = null
+ for a in t.attrs_a
+ if a[0] is 'prompt'
+ prompt = a[1]
+ if a[0] isnt 'name' and a[0] isnt 'action' and a[0] isnt 'prompt'
+ input_el.attrs_a.push [a[0], a[1]]
+ input_el.attrs_a.push ['name', 'isindex']
+ # fixfull this next bit is in english... internationalize?
+ prompt ?= "This is a searchable index. Enter search keywords: "
+ insert_character new_character_token prompt # fixfull split
+ # TODO submit typo "balue" in spec
+ insert_html_element input_el
+ open_els.shift()
+ # insert_character '' # you can put chars here if promt attr missing
+ open_els.shift()
+ insert_html_element new_open_tag 'hr'
+ open_els.shift()
+ open_els.shift()
+ unless template_tag_is_open()
+ form_element_pointer = null
+ return
+ if t.type is TYPE_START_TAG and t.name is 'textarea'
+ insert_html_element t
+ eat_next_token_if_newline()
+ tok_state = tok_state_rcdata
+ original_ins_mode = ins_mode
+ flag_frameset_ok = false
+ ins_mode = ins_mode_text
+ return
+ if t.type is TYPE_START_TAG and t.name is 'xmp'
+ close_p_if_in_button_scope()
+ reconstruct_afe()
+ flag_frameset_ok = false
+ parse_generic_raw_text t
+ return
+ if t.type is TYPE_START_TAG and t.name is 'iframe'
+ flag_frameset_ok = false
+ parse_generic_raw_text t
+ return
+ if t.type is TYPE_START_TAG and (t.name is 'noembed' or (t.name is 'noscript' and flag_scripting))
+ parse_generic_raw_text t
+ return
+ if t.type is TYPE_START_TAG and t.name is 'select'
+ reconstruct_afe()
+ insert_html_element t
+ flag_frameset_ok = false
+ if ins_mode is ins_mode_in_table or ins_mode is ins_mode_in_caption or ins_mode is ins_mode_in_table_body or ins_mode is ins_mode_in_row or ins_mode is ins_mode_in_cell
+ ins_mode = ins_mode_in_select_in_table
+ else
+ ins_mode = ins_mode_in_select
+ return
+ if t.type is TYPE_START_TAG and (t.name is 'optgroup' or t.name is 'option')
+ if open_els[0].name is 'option' and open_els[0].namespace is NS_HTML
+ open_els.shift()
+ reconstruct_afe()
+ insert_html_element t
+ return
+# this comment block implements the W3C spec
+# if t.type is TYPE_START_TAG and (t.name is 'rb' or t.name is 'rp' or t.name is 'rtc')
+# if is_in_scope 'ruby', NS_HTML
+# generate_implied_end_tags()
+# unless open_els[0].name is 'ruby' and open_els[0].namespace is NS_HTML
+# parse_error()
+# insert_html_element t
+# return
+# if t.type is TYPE_START_TAG and t.name is 'rt'
+# if is_in_scope 'ruby', NS_HTML
+# generate_implied_end_tags 'rtc' # arg is exception
+# unless (open_els[0].name is 'ruby' or open_els[0].name is 'rtc') and open_els[0].namespace is NS_HTML
+# parse_error()
+# insert_html_element t
+# return
+# below implements the WHATWG spec https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+ if t.type is TYPE_START_TAG and (t.name is 'rb' or t.name is 'rtc')
+ if is_in_scope 'ruby', NS_HTML
+ generate_implied_end_tags()
+ unless open_els[0].name is 'ruby' and open_els[0].namespace is NS_HTML
+ parse_error()
+ insert_html_element t
+ return
+ if t.type is TYPE_START_TAG and (t.name is 'rp' or t.name is 'rt')
+ if is_in_scope 'ruby', NS_HTML
+ generate_implied_end_tags 'rtc'
+ unless (open_els[0].name is 'ruby' or open_els[0].name is 'rtc') and open_els[0].namespace is NS_HTML
+ parse_error()
+ insert_html_element t
+ return
+# end WHATWG chunk
+ if t.type is TYPE_START_TAG and t.name is 'math'
+ reconstruct_afe()
+ adjust_mathml_attributes t
+ adjust_foreign_attributes t
+ insert_foreign_element t, NS_MATHML
+ if t.flag 'self-closing'
+ open_els.shift()
+ t.acknowledge_self_closing()
+ return
+ if t.type is TYPE_START_TAG and t.name is 'svg'
+ reconstruct_afe()
+ adjust_svg_attributes t
+ adjust_foreign_attributes t
+ insert_foreign_element t, NS_SVG
+ if t.flag 'self-closing'
+ open_els.shift()
+ t.acknowledge_self_closing()
+ return
+ if t.type is TYPE_START_TAG and (t.name is 'caption' or t.name is 'col' or t.name is 'colgroup' or t.name is 'frame' or t.name is 'head' or t.name is 'tbody' or t.name is 'td' or t.name is 'tfoot' or t.name is 'th' or t.name is 'thead' or t.name is 'tr')
+ parse_error()