Sha256: 0fcdfab9ddb4be9bd78683e39674d695186dcc64a49b8ec9c8549e62c3376dec

Contents?: true

Size: 1.28 KB

Versions: 3

Compression:

Stored size: 1.28 KB

Contents

module CSL
  class Style

    class Choose < Node

      class Block < Node
        attr_struct :match, *Schema.attr(:conditionals)

        attr_defaults :match => 'all'

        class << self
          def matches?(nodename)
            nodename.to_s =~ /^if(-else)?|else$/
          end
        end

        def conditions
          attributes_for(*Schema.attr(:conditionals)).map do |name, values|
            extract_type_and_matcher_from(name) << values.to_s.split(/\s+/)
          end
        end

        def matcher(match = attributes[:match])
          case match.to_s
          when 'any'
            :any?
          when 'none'
            :none?
          else
            :all?
          end
        end

        private

        def extract_type_and_matcher_from(attribute)
          type, match = attribute.to_s.split(/-(any|all|none)$/, 2)

          # subtle: if the default matcher is :none? and there
          # is no override we want to use :any? inside the nested
          # lists to avoid double negation during evaluation of
          # the entire expression!

          if match.nil?
            match = matcher
            [type.to_sym, match == :none? ? :any? : matcher]
          else
            [type.to_sym, matcher(match)]
          end
        end
      end
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
csl-1.0.2 lib/csl/style/choose.rb
csl-1.0.1 lib/csl/style/choose.rb
csl-1.0.0 lib/csl/style/choose.rb