///|
fn Parser::handle_parsed_start_tag(
  self : Parser,
  name : String,
  attrs : Map[String, String?],
  self_closing : Bool,
  start : Int,
  tag_close_pos : Int,
) -> Unit {
  self.flush_deferred_initial_doctype_error()
  self.before_html_phase = false
  if self.handle_foreign_content_start_tag(
      name, attrs, self_closing, start, tag_close_pos,
    ) {
    return
  }
  if self.handle_fragment_shell_start_tag(name, attrs, start) {
    return
  }
  if self.handle_disabled_head_noscript_start_tag(name, start) {
    return
  }
  if self.close_current_document_head_for_start(name, start) {
    return
  }
  if self.handle_late_document_head_start_tag(name, start) {
    return
  }
  if self.in_select_insertion_mode() && name == "frame" {
    self.error_at("unexpected-start-tag-in-select", start)
    return
  }
  if self.handle_select_special_start_tag(
      name, attrs, self_closing, start, tag_close_pos,
    ) {
    return
  }
  if self.handle_document_frameset_start_tag(
      name, attrs, self_closing, start, tag_close_pos,
    ) {
    return
  }
  if self.handle_repeated_document_html_start_tag(name, attrs, start) {
    return
  }
  self.report_body_start_after_repeated_document_html(name, start)
  if !self.is_fragment_parser() && name == "frame" {
    self.error_at("unexpected-start-tag-ignored", start)
    return
  }
  if self.handle_template_table_context_start_tag(name, attrs, start) {
    return
  }
  self.report_template_table_context_fostered_start(name, start)
  self.clear_detached_template_table_context_for_template_start(name)
  let in_template_table_context = self.in_template_content_without_inner_table()
  if name == "col" && in_template_table_context {
    let current = self.current_node()
    if current.kind == Element && current.name == "template" {
      self.enable_template_column_group_mode()
    }
  }
  if self.handle_template_column_group_start_tag(name, attrs, start) {
    return
  }
  if self.handle_fragment_context_colgroup_start_tag(name, attrs, start) {
    return
  }
  if self.close_select_for_reprocessed_start_tag(name, start) &&
    self.handle_select_reprocessed_foreign_cell_start_tag(
      name, attrs, start, self_closing,
    ) {
    return
  }
  if self.handle_foreign_table_row_recovery_start_tag(
      name, attrs, start, self_closing,
    ) {
    return
  }
  if self.handle_recovered_post_body_cell_start_tag(
      name, attrs, start, self_closing,
    ) {
    return
  }
  if self.handle_fragment_context_caption_start_tag(name, start) {
    return
  }
  if !self.has_open_element("table") &&
    !in_template_table_context &&
    name == "caption" {
    self.error_at("unexpected-start-tag", start)
    return
  }
  if !self.has_open_element("table") &&
    !in_template_table_context &&
    table_start_tag_is_ignored_outside_table(name) {
    self.error_at("unexpected-start-tag-ignored", start)
    return
  }
  if self.col_start_tag_is_ignored_outside_table(name) {
    self.error_at("unexpected-start-tag-ignored", start)
    return
  }
  if self.close_current_caption_for_start(name, tag_close_pos) &&
    self.handle_template_table_context_start_tag(name, attrs, start) {
    return
  }
  self.close_current_column_group_for_start(name, start)
  if self.handle_table_context_hidden_input_or_form_start(
      name, attrs, start, tag_close_pos,
    ) {
    return
  }
  if self.handle_fragment_context_table_cell_start_tag(name, start) {
    return
  }
  if self.handle_fragment_context_table_row_start_tag(name, start) {
    return
  }
  if self.handle_fragment_context_table_section_start_tag(name, start) {
    return
  }
  let closed_table_cell = self.close_current_table_cell_for_start(name)
  self.close_current_table_row_for_start(name)
  self.close_current_table_section_for_start(name)
  self.clear_stack_to_table_context_for_start(name)
  if self.handle_fragment_context_table_start_tag(name, start) {
    return
  }
  ignore(self.handle_nested_table_start_tag(name, tag_close_pos))
  if !closed_table_cell {
    self.report_unexpected_table_body_cell_start(name, tag_close_pos)
  }
  if self.handle_duplicate_form_start_tag(name, start) {
    return
  }
  if name == "rp" || name == "rt" {
    self.generate_implied_end_tags(Some("rtc"))
  } else if (name == "rb" || name == "rtc") &&
    current_node_is_ruby_annotation(self.current_node()) {
    self.generate_implied_end_tags(None)
  }
  if start_tag_closes_p(name) {
    self.close_open_p_element()
  }
  if name == "button" && self.has_open_element_in_default_scope("button") {
    self.error_at("unexpected-start-tag-implies-end-tag", start)
    ignore(self.close_open_element("button"))
  }
  if name == "select" && self.in_select_insertion_mode() {
    self.error_at("unexpected-select-in-select", start)
    ignore(self.close_open_element("select"))
    self.reset_select_insertion_mode()
    return
  }
  if name == "li" {
    self.close_open_list_item()
  } else if name == "dd" || name == "dt" {
    self.close_open_definition_item(name)
  } else if name == "option" || name == "optgroup" {
    self.close_open_select_item(name)
  } else if name == "td" || name == "th" {
    self.close_open_table_cell()
  }
  if is_heading_element_name(name) {
    self.close_current_heading_element()
  }
  if !self.document_start_tag_preserves_frameset_ok(name, attrs) {
    self.frameset_ok = false
  }
  self.insert_normal_start_tag(name, attrs, self_closing, start, tag_close_pos)
}