class Curlybars::TemplateHandler

Public Class Methods

cache_if_key_is_not_nil(context, presenter) { || ... } click to toggle source
# File lib/curlybars/template_handler.rb, line 30
def cache_if_key_is_not_nil(context, presenter)
  key = presenter.cache_key
  if key.present?
    presenter_key = if presenter.class.respond_to?(:cache_key)
      presenter.class.cache_key
    end

    cache_options = presenter.cache_options || {}
    cache_options[:expires_in] ||= presenter.cache_duration

    # Curlybars doesn't allow Rails to handle the template digest.
    # So, we disable it.
    cache_options[:skip_digest] = true

    context.cache([key, presenter_key].compact, cache_options) do
      yield
    end
  else
    yield
  end
end
call(template) click to toggle source
# File lib/curlybars/template_handler.rb, line 17
def call(template)
  instrument(template) do
    compile_for_actionview5(template)
  end
end

Private Class Methods

compile(template, source) click to toggle source
# File lib/curlybars/template_handler.rb, line 58
      def compile(template, source)
        # Template is empty, so there's no need to initialize a presenter.
        return %("") if source.empty?

        path = template.virtual_path
        presenter_class = Curlybars::Presenter.presenter_for_path(path)

        raise Curlybars::Error::Presenter::NotFound.new(path) if presenter_class.nil?

        # For security reason, we strip the encoding directive in order to avoid
        # potential issues when rendering the template in another character
        # encoding.
        safe_source = source.gsub(/\A#{ActionView::ENCODING_FLAG}/, '')

        source = Curlybars.compile(safe_source, template.identifier)

        <<-RUBY
          if local_assigns.empty?
            options = assigns
          else
            options = local_assigns
          end

          provider_classes = ::Curlybars.configuration.global_helpers_provider_classes
          global_helpers_providers = provider_classes.map { |klass| klass.new(self) }

          presenter = ::#{presenter_class}.new(self, options)
          presenter.setup!

          @output_buffer = output_buffer || ::ActiveSupport::SafeBuffer.new

          ::Curlybars::TemplateHandler.cache_if_key_is_not_nil(self, presenter) do
            safe_concat begin
              #{source}
            end
          end

          @output_buffer
        RUBY
      end
compile_for_actionview5(template) click to toggle source
# File lib/curlybars/template_handler.rb, line 54
def compile_for_actionview5(template)
  compile(template, template.source)
end
instrument(template, &block) click to toggle source
# File lib/curlybars/template_handler.rb, line 99
def instrument(template, &block)
  payload = { path: template.virtual_path }
  ActiveSupport::Notifications.instrument("compile.curlybars", payload, &block)
end