Sha256: fd0103b2127dcf1596362aade5b3f0d434aff1808e592fb6df42ab287fae06e7

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

require "pandoc_object_filters"

module PandocObjectFilters
  module V1_16
    module Element
      class Attr < PandocObjectFilters::V1_16::Element::Base
        module Behavior
          def self.included(other)
            other.contents_attr :identifier, 0
            other.contents_attr :classes, 1
            other.contents_attr :key_values, 2
            other.extend ClassMethods
          end

          module ClassMethods
            def build(options = {})
              id = options.fetch(:identifier, "")
              classes = options.fetch(:classes, [])
              key_values = options.fetch(:key_values, [])

              key_values = key_values.to_a if key_values.is_a?(Hash)

              new([id, classes, key_values])
            end
          end

          def [](key)
            # NOTE: While this pseudo Hash implementations are inefficient, they
            # guarantee any changes to key_values will be honored, which would be
            # difficult if the key_values were cached in a Hash
            result = key_values.find { |pair| pair.first == key } || []
            result[1]
          end

          def []=(key, value)
            found = key_values.find { |pair| pair.first == key }

            if found
              found[1] = value
            else
              key_values << [key, value]
            end
          end

          def include?(key)
            !!key_values.find { |pair| pair.first == key }
          end
        end

        include Behavior
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pandoc_object_filters-0.2.0 lib/pandoc_object_filters/v1_16/element/attr.rb