Sha256: daf6df8b255cb9a4a6ced167b13e26af35bf20dbcd1eb618a9914e411dbccb2f

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

require "grokdown"

module Grokdown
  module Creating
    def self.extended(base)
      base.send(:include, InstanceMethods)
    end

    def build(node)
      begin
        return collection_of_arguments_from_node(node).map { |args| _build(args, false) { |i| i.node = node } } if respond_to?(:collection_of_arguments_from_node)
      rescue NoMethodError => e
        raise Error, "cannot find #{e.name} from #{node.to_commonmark.inspect} at #{node.sourcepos[:start_line]} in #{self} collection_of_arguments_from_node"
      rescue CommonMarker::NodeError
        raise Error, "could not get string content from #{node.to_commonmark.inspect} at #{node.sourcepos[:start_line]} in #{self} collection_of_arguments_from_node"
      end

      begin
        return _build(arguments_from_node(node)) { |i| i.node = node } if respond_to?(:arguments_from_node)
      rescue NoMethodError => e
        raise Error, "cannot find #{e.name} from #{node.to_commonmark.inspect} at #{node.sourcepos[:start_line]} in #{self} arguments_from_node"
      rescue CommonMarker::NodeError
        raise Error, "could not get string content from #{node.to_commonmark.inspect} at #{node.sourcepos[:start_line]} in #{self} arguments_from_node"
      end

      new.tap { |i| i.node = node }
    end

    private def _build(args, recurse = true, &block)
      case args
      when Hash
        if self < Hash
          new.merge!(args).tap(&block)
        else
          new(**args).tap(&block)
        end
      when Array
        if self < Array
          new(args).tap(&block)
        else
          new(*args).tap(&block)
        end
      else
        new(*args).tap(&block)
      end
    end

    module InstanceMethods
      def sourcepos
        @node&.sourcepos || {}
      end

      def node=(node)
        @node = node
      end

      def node
        @node
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
grokdown-0.4.0 lib/grokdown/creating.rb