Sha256: ea10e6803fd7c166066ccb1dd3fa3a91a4082df9aae990cc76afe5bfb6839cdd
Contents?: true
Size: 1.47 KB
Versions: 3
Compression:
Stored size: 1.47 KB
Contents
# frozen_string_literal: true module Bemer class Predicate def initialize(**options) @block = options[:block] @condition = options[:condition].nil? ? true : options[:condition] @element = options[:elem] @mask = build_mask(options[:block], options[:elem]) @mixins = Mixes.new(options[:mix]) @modifiers = ModifierList.new(:block, :elem, options[:mods]) @wildcard = nil end def match?(node) condition?(node) && mix?(node.mix) && mods?(node.mods) end def name_match?(name) Bemer.can_use_new_matcher? ? mask.match?(name) : mask =~ name end def wildcard? return wildcard unless wildcard.nil? @wildcard = name.include?('*') end protected attr_reader :block, :element, :condition, :mask, :mixins, :name, :wildcard def condition?(node) return condition unless condition.respond_to?(:call) condition.call Context.new(node) end def mix?(mix) (mixins.to_a - mix).empty? end def mods?(mods) return false if modifiers.keys.length > mods.keys.length modifiers.all? do |name, value| val = mods[name] val.nil? ? false : (Array(value) - Array(val)).empty? end end def modifiers @modifiers.to_h end def build_mask(block, element) @name = Bemer.entity_name(block, element) name.eql?('*') ? /^((?!#{Bemer.element_name_separator}).)*$/ : /^#{name.gsub('*', '.*')}$/ end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
bemer-0.6.0 | lib/bemer/predicate.rb |
bemer-0.5.0 | lib/bemer/predicate.rb |
bemer-0.4.0 | lib/bemer/predicate.rb |