Sha256: 50174d4db0799ba1dbedaa7e675545840560ef7d2d4033bd77833beb981012bf

Contents?: true

Size: 1.68 KB

Versions: 1

Compression:

Stored size: 1.68 KB

Contents

module Infoboxer
  module Templates
    class Base < Tree::Template
      include Tree
      
      class << self
        attr_accessor :template_name, :template_options

        def inspect
          template_name ? "Infoboxer::Templates::#{clean_name}" : super
        end

        def clean_name
          template_name ? "Template[#{template_name}]" : 'Template'
        end
      end

      def unnamed_variables
        variables.select{|v| v.name =~ /^\d+$/}
      end

      def fetch(*patterns)
        Nodes[*patterns.map{|p| variables.find(name: p)}.flatten]
      end

      def fetch_hash(*patterns)
        fetch(*patterns).map{|v| [v.name, v]}.to_h
      end

      def fetch_date(*patterns)
        components = fetch(*patterns)
        components.pop while components.last.nil? && !components.empty?
        
        if components.empty?
          nil
        else
          Date.new(*components.map{|v| v.to_s.to_i})
        end
      end

      def ==(other)
        other.kind_of?(Tree::Template) && _eq(other)
      end

      protected

      def clean_class
        if self.class.template_name == name
          self.class.clean_name
        else
          super
        end
      end
    end

    # Renders all of its unnamed variables as space-separated text
    # Also allows in-template navigation
    class Show < Base
      alias_method :children, :unnamed_variables

      protected

      def children_separator
        ' '
      end
    end

    class Replace < Base
      def replace
        fail(NotImplementedError, "Descendants should define :replace")
      end

      def text
        replace
      end
    end

    class Literal < Base
      alias_method :text, :name
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
infoboxer-0.1.0 lib/infoboxer/templates/base.rb