Sha256: 25bda9e5cf76e63993351ba434497758775bed4be79eb64b9f46755712e6b071

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

module HoTModuLe
  class Fragment
    def initialize(fragment, attribute_bindings, html_module:)
      @fragment = fragment
      @attribute_bindings = attribute_bindings
      @html_module = html_module
    end

    # NOTE: for some reason, the Nokogiri traverse method yields node children first, then the
    # parent node. That doesn't work for our case. We want to go strictly in source order. So this
    # is our own implementation of that.
    def traverse(node, &block)
      yield(node)
      node.children.each { |child| traverse(child, &block) }
    end

    def process(fragment = @fragment)
      traverse(fragment) do |node|
        process_attribute_bindings(node)
      end
    end

    def process_attribute_bindings(node)
      node.attributes.each do |name, attr_node|
        @attribute_bindings.each do |attribute_binding|
          next unless attribute_binding.matcher.match?(name)

          break unless attribute_binding.method.(attribute: attr_node, node: node)
        end
      rescue Exception => e # rubocop:disable Lint/RescueException
        raise e.class, e.message.lines.first, ["#{@html_module}:#{attr_node.line}", *e.backtrace]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hot_module-1.0.0.alpha1 lib/hot_module/fragment.rb