Sha256: ac1bf4770d2e451a92c5817907b3e8b78e6ea011a91339b84a2fc7de468110cf

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

require "pandoc_object_filters"

module PandocObjectFilters
  class Walker
    def initialize(object, &block)
      @object = object
      @block = block
    end

    def walk(object = @object)
      if object.is_a?(Array)
        object.each do |item|
          if item.is_a?(PandocObjectFilters::Element::BaseElement)
            @block.call(item)
          end

          walk(item)
        end
      elsif object.is_a?(Hash)
        object.values.each do |value|
          walk(value)
        end
      elsif object.is_a?(PandocObjectFilters::Element::Base)
        walk(object.contents)
      end

      object
    end

    def walk!(object = @object)
      if object.is_a?(Array)
        result = []
        object.each do |item|
          if item.is_a?(PandocObjectFilters::Element::BaseElement)
            res = @block.call(item)
            if !res
              result.push(walk!(item))
            elsif res.is_a?(Array)
              res.each do |z|
                result.push(walk!(z))
              end
            else
              result.push(walk!(res))
            end
          else
            result.push(walk!(item))
          end
        end
        return result
      elsif object.is_a?(Hash)
        result = {}
        object.each do |key, value|
          result[key] = walk!(value)
        end
        return result
      elsif object.is_a?(PandocObjectFilters::Element::Base)
        object.contents = walk!(object.contents)
        return object
      else
        return object
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pandoc_object_filters-0.2.0 lib/pandoc_object_filters/walker.rb
pandoc_object_filters-0.1.0 lib/pandoc_object_filters/walker.rb