Sha256: 26400cad411ec93cd65d834bce616d9b21faf7e5b50cb92a43c6992463bc1736

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

# frozen_string_literal: true

module HoTModuLe
  class Fragment
    def initialize(fragment, component)
      @fragment = fragment
      @component = component
      @attribute_bindings = component.class.attribute_bindings.each do |attr_def|
        attr_def.method = component.method(attr_def.method_name)
      end
    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) # rubocop:todo Metrics
      node.attributes.each do |name, attr_node|
        @attribute_bindings.each do |attribute_binding|
          next if attribute_binding.only_for_tag && node.name != attribute_binding.only_for_tag.to_s
          next unless attribute_binding.matcher.match?(name)
          next if attribute_binding.method.receiver._check_stack(node)

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

Version data entries

1 entries across 1 versions & 1 rubygems

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