Sha256: 45e9b1ce29bff87027fb7a91d47b499484c0841870991a4955543c218ae3d94a

Contents?: true

Size: 1.55 KB

Versions: 4

Compression:

Stored size: 1.55 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 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

4 entries across 4 versions & 1 rubygems

Version Path
hot_module-1.0.0.alpha14 lib/hot_module/fragment.rb
hot_module-1.0.0.alpha13 lib/hot_module/fragment.rb
hot_module-1.0.0.alpha12 lib/hot_module/fragment.rb
hot_module-1.0.0.alpha11 lib/hot_module/fragment.rb