Sha256: 27d800e051897ec9ed67f2877605dc8636d9b3559d77dfa632f763153c35937a

Contents?: true

Size: 1.98 KB

Versions: 4

Compression:

Stored size: 1.98 KB

Contents

# -*- encoding : utf-8 -*-
require 'cgi'

require "#{File.dirname(__FILE__)}/parser"
require "#{File.dirname(__FILE__)}/generator"

module MustacheRender
  class Mustache
    # A Template represents a Mustache template. It compiles and caches
    # a raw string template into something usable.
    #
    # The idea is this: when handed a Mustache template, convert it into
    # a Ruby string by transforming Mustache tags into interpolated
    # Ruby.
    #
    # You shouldn't use this class directly, instead:
    #
    # >> ::MustacheRender::Mustache.render(template, hash)
    class Template
      attr_reader :source

      # Expects a Mustache template as a string along with a template
      # path, which it uses to find partials.
      def initialize(source)
        @source = source
      end

      # Renders the `@source` Mustache template using the given
      # `context`, which should be a simple hash keyed with symbols.
      #
      # The first time a template is rendered, this method is overriden
      # and from then on it is "compiled". Subsequent calls will skip
      # the compilation step and run the Ruby version of the template
      # directly.
      def render(context)
        # Compile our Mustache template into a Ruby string
        compiled = "def render(ctx) #{compile} end"

        # Here we rewrite ourself with the interpolated Ruby version of
        # our Mustache template so subsequent calls are very fast and
        # can skip the compilation stage.
        instance_eval(compiled, __FILE__, __LINE__ - 1)

        # Call the newly rewritten version of #render
        render(context)
      end

      # Does the dirty work of transforming a Mustache template into an
      # interpolation-friendly Ruby string.
      def compile(src = @source)
        Generator.new.compile(tokens(src))
      end
      alias_method :to_s, :compile

      # Returns an array of tokens for a given template.
      def tokens(src = @source)
        Parser.new.compile(src)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
mustache_render-0.0.25 lib/mustache_render/mustache/template.rb
mustache_render-0.0.24 lib/mustache_render/mustache/template.rb
mustache_render-0.0.23 lib/mustache_render/mustache/template.rb
mustache_render-0.0.22 lib/mustache_render/mustache/template.rb