Sha256: c7f0d34318f5d09c5b30f26b1fdf1a25f70fefd999db2184c1c9b565b8a141d5

Contents?: true

Size: 1.88 KB

Versions: 49

Compression:

Stored size: 1.88 KB

Contents

module Temple
  # An engine is simply a chain of compilers (that often includes a parser,
  # some filters and a generator).
  #
  #   class MyEngine < Temple::Engine
  #     # First run MyParser, passing the :strict option
  #     use MyParser, :strict
  #
  #     # Then a custom filter
  #     use MyFilter
  #
  #     # Then some general optimizations filters
  #     filter :MultiFlattener
  #     filter :StaticMerger
  #     filter :DynamicInliner
  #
  #     # Finally the generator
  #     generator :ArrayBuffer, :buffer
  #   end
  #
  #   class SpecialEngine < MyEngine
  #     append MyCodeOptimizer
  #     before :ArrayBuffer, Temple::Filters::Validator
  #     replace :ArrayBuffer, Temple::Generators::RailsOutputBuffer
  #   end
  #
  #   engine = MyEngine.new(:strict => "For MyParser")
  #   engine.call(something)
  #
  # @api public
  class Engine
    include Mixins::Options
    include Mixins::EngineDSL
    extend  Mixins::EngineDSL

    attr_reader :chain

    def self.chain
      @chain ||= superclass.respond_to?(:chain) ? superclass.chain.dup : []
    end

    def initialize(o = {})
      super
      @chain = self.class.chain.dup
      [*options[:chain]].compact.each {|block| block.call(self) }
    end

    def call(input)
      call_chain.inject(input) {|m, e| e.call(m) }
    end

    protected

    def chain_modified!
      @call_chain = nil
    end

    def call_chain
      @call_chain ||= @chain.map do |e|
        name, filter, option_filter, local_options = e
        case filter
        when Class
          filtered_options = Hash[*option_filter.select {|k| options.include?(k) }.map {|k| [k, options[k]] }.flatten]
          filter.new(ImmutableHash.new(local_options, filtered_options))
        when UnboundMethod
          filter = filter.bind(self)
          filter.arity == 1 ? filter : filter.call
        else
          filter
        end
      end.compact
    end
  end
end

Version data entries

49 entries across 49 versions & 2 rubygems

Version Path
classiccms-0.7.5 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.7.4 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.7.3 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.7.2 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.7.1 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.7.0 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.9 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.8 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.7 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.6 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.5 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.4 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.3 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.2 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.1 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.6.0 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.5.17 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.5.16 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.5.15 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb
classiccms-0.5.14 vendor/bundle/gems/temple-0.4.0/lib/temple/engine.rb