///|
fn Parser::insert_normal_start_tag(
  self : Parser,
  name : String,
  attrs : Map[String, String?],
  self_closing : Bool,
  start : Int,
  tag_close_pos : Int,
) -> Unit {
  let node_ns = self.start_tag_namespace(name)
  if node_ns == "html" {
    self.prepare_active_formatting_start(name, start)
  }
  if !start_tag_closes_p(name) &&
    !self.table_context_start_skips_active_reconstruction(name) {
    self.reconstruct_active_formatting_elements()
  }
  let adjusted_name = if node_ns == "html" {
    if name == "image" {
      self.error_at("image-start-tag", start)
      "img"
    } else {
      name
    }
  } else {
    adjusted_start_tag_name_for_namespace(node_ns, name)
  }
  let adjusted_attrs = if node_ns == "html" {
    attrs
  } else {
    prepare_foreign_attrs(node_ns, attrs)
  }
  let node = self.node_with_start_tag_source(
    @dom.element(adjusted_name, attrs=adjusted_attrs, ns=node_ns),
    start,
    tag_close_pos,
  )
  self.track_form_start_element(adjusted_name, node)
  self.append_start_tag_node(node, adjusted_name, start)
  if node_ns == "html" && adjusted_name == "select" {
    self.select_insertion_mode = true
  }
  let self_closes_tree = if node_ns == "html" {
    self_closing && @ser.is_void_element(adjusted_name)
  } else {
    self_closing
  }
  let inserts_empty_nonvoid = self.start_tag_inserts_empty_nonvoid(
    adjusted_name,
  )
  if node_ns == "html" &&
    !self_closes_tree &&
    self.is_special_text_element(adjusted_name) {
    self.consume_special_element_content(node, adjusted_name)
  } else if !self_closes_tree &&
    !@ser.is_void_element(adjusted_name) &&
    !inserts_empty_nonvoid {
    self.stack.push(node)
    if node_ns == "html" && active_formatting_element_name(adjusted_name) {
      let duplicate_index = self.active_formatting_duplicate_index(
        adjusted_name,
        node.attrs,
      )
      if duplicate_index >= 0 {
        self.remove_active_formatting_index(duplicate_index)
      }
      self.append_active_formatting_entry(node)
    }
    if node_ns == "html" && active_formatting_marker_element_name(adjusted_name) {
      self.push_active_formatting_marker()
    }
    if node_ns == "html" && start_tag_ignores_initial_lf(adjusted_name) {
      self.skip_one_initial_lf()
    }
  }
}