class Appium::Common::HTMLElements

@private

def characters(chars)

def characters(chars)
  return if @skip_element
  element        = @element_stack.last
  element[:text] = chars
end

def end_element(name)

def end_element(name)
  return if filter && !filter.include?(name.downcase)
  element_index = @element_stack.rindex { |e| e[:name] == name }
  @element_stack.delete_at element_index
end

def filter=(value)

convert to string to support symbols
def filter=(value)
  # nil and false disable the filter
  return @filter = false unless value # rubocop:disable Lint/ReturnInVoidContext
  @filter = value.to_s.downcase
end

def initialize # rubocop:disable Lint/MissingSuper

rubocop:disable Lint/MissingSuper
def initialize # rubocop:disable Lint/MissingSuper
  reset
  @filter = false
end

def reset

def reset
  @element_stack     = []
  @elements_in_order = []
  @skip_element      = false
end

def result

def result
  @elements_in_order.reduce('') do |r, e|
    name = e.delete :name
    attr_string = e.reduce('') do |string, attr|
      attr1 = attr[1] ? attr[1].strip : attr[1]
      "#{string}  #{attr[0]}: #{attr1}\n"
    end
    return r if attr_string.nil? || attr_string.empty?
    "#{r}\n#{name}\n#{attr_string}"
  end
end

def start_element(name, attrs = [])

def start_element(name, attrs = [])
  @skip_element = filter && !filter.include?(name.downcase)
  return if @skip_element
  element = { name: name }
  attrs.each { |a| element[a[0]] = a[1] }
  @element_stack.push element
  @elements_in_order.push element
end