module KramdownRFC::YAMLcheck

def self.check_dup_keys(data)

def self.check_dup_keys(data)
  ast = YAML.parse_stream(data)
  check_dup_keys1(ast, [])
end

def self.check_dup_keys1(node, path)

Does not follow aliases.
def self.check_dup_keys1(node, path)
  if YAML::Nodes::Mapping === node
    children = node.children.each_slice(2)
    duplicates = children.map { |key_node, _value_node| 
      key_node }.group_by{short_name(_1)}.select { |_value, nodes| nodes.size > 1 }
    duplicates.each do |key, nodes|
      name = (path + [key]).join("/")
      lines = nodes.map { |occurrence| occurrence.start_line + 1 }.join(", ")
      warn "** duplicate map key >#{name}< in YAML, lines #{lines}"
    end
    children.each do |key_node, value_node| 
      newname = short_name(key_node)
      check_dup_keys1(value_node, path + Array(newname))
    end
  else
    node.children.to_a.each { |child| check_dup_keys1(child, path) }
  end
end

def self.short_name(node)

def self.short_name(node)
  if node.scalar?
    node.value
  else
    node.children&.map {short_name(_1)}&.join("_")
  end
end