Sha256: 5b9d6a797b289ff8a2135de27e5bf4525d555e2f06e8e087dc12d0141394edec

Contents?: true

Size: 1.74 KB

Versions: 125

Compression:

Stored size: 1.74 KB

Contents

require 'oga' unless defined?(Oga)
require 'multi_xml/parsers/libxml2_parser'

module MultiXml
  module Parsers
    module Oga #:nodoc:
      include Libxml2Parser
      extend self

      def parse_error
        LL::ParserError
      end

      def parse(io)
        document = ::Oga.parse_xml(io)
        node_to_hash(document.children[0])
      end

      def node_to_hash(node, hash = {}) # rubocop:disable AbcSize, CyclomaticComplexity, MethodLength, PerceivedComplexity
        node_hash = {MultiXml::CONTENT_ROOT => ''}

        name = node_name(node)

        # Insert node hash into parent hash correctly.
        case hash[name]
        when Array
          hash[name] << node_hash
        when Hash
          hash[name] = [hash[name], node_hash]
        when NilClass
          hash[name] = node_hash
        end

        # Handle child elements
        each_child(node) do |c|
          if c.is_a?(::Oga::XML::Element)
            node_to_hash(c, node_hash)
          elsif c.is_a?(::Oga::XML::Text) || c.is_a?(::Oga::XML::Cdata)
            node_hash[MultiXml::CONTENT_ROOT] << c.text
          end
        end

        # Remove content node if it is empty
        if node_hash[MultiXml::CONTENT_ROOT].strip.empty?
          node_hash.delete(MultiXml::CONTENT_ROOT)
        end

        # Handle attributes
        each_attr(node) do |a|
          key = node_name(a)
          v = node_hash[key]
          node_hash[key] = (v ? [a.value, v] : a.value)
        end

        hash
      end

    private

      def each_child(node, &block)
        node.children.each(&block)
      end

      def each_attr(node, &block)
        node.attributes.each(&block)
      end

      def node_name(node)
        node.name
      end
    end # Oga
  end # Parsers
end # MultiXml

Version data entries

125 entries across 99 versions & 6 rubygems

Version Path
harbr-2.8.1 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.7 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.6 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.5 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.4 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.3 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.2 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.1 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
study_line-0.2.0 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.10 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.9 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.8 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.7 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.6 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.5 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.4 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.3 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.2 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.1 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb
harbr-0.2.0 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/oga.rb