From: Imre Farkas ifarkas@redhat.com
--- src/Gemfile | 1 + src/Gemfile.lock | 2 + src/config/application.rb | 1 + .../initializers/mustache_template_handler.rb | 43 ++++++++++++++++++++ 4 files changed, 47 insertions(+), 0 deletions(-) create mode 100644 src/config/initializers/mustache_template_handler.rb
diff --git a/src/Gemfile b/src/Gemfile index 2d8e8df..529d658 100644 --- a/src/Gemfile +++ b/src/Gemfile @@ -7,6 +7,7 @@ gem 'sqlite3', :require => 'sqlite3' gem 'deltacloud-client', :require => 'deltacloud' gem 'sass' gem 'haml' +gem 'mustache' gem 'will_paginate', '>= 3.0.pre1' gem 'nokogiri' gem 'simple-navigation' diff --git a/src/Gemfile.lock b/src/Gemfile.lock index 4137ff7..ef7ac01 100644 --- a/src/Gemfile.lock +++ b/src/Gemfile.lock @@ -81,6 +81,7 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.16) + mustache (0.99.4) nokogiri (1.5.0.beta.4) oauth (0.4.4) pg (0.11.0) @@ -172,6 +173,7 @@ DEPENDENCIES haml json launchy + mustache nokogiri oauth pg diff --git a/src/config/application.rb b/src/config/application.rb index d1c2a7b..7b0356f 100644 --- a/src/config/application.rb +++ b/src/config/application.rb @@ -30,6 +30,7 @@ else require 'deltacloud' require 'sass' require 'haml' + require 'mustache' require 'will_paginate' require 'nokogiri' require 'simple-navigation' diff --git a/src/config/initializers/mustache_template_handler.rb b/src/config/initializers/mustache_template_handler.rb new file mode 100644 index 0000000..b6c6fbc --- /dev/null +++ b/src/config/initializers/mustache_template_handler.rb @@ -0,0 +1,43 @@ +module MustacheTemplate + + class Handler + def self.erb_handler + @@erb_handler ||= ActionView::Template.registered_template_handler(:erb) + end + + def self.call(template) + compiled_erb_template = erb_handler.call(template).gsub(/'/, "\\'") + "MustacheTemplate::View.new(self, '#{compiled_erb_template}').render.html_safe" + end + end + + class View + def initialize(view_context, compiled_erb_template) + @view_context = view_context + @template_source = evaluate_rails_helpers(compiled_erb_template) + end + + def render + renderer = @view_context.instance_variable_get('@renderer') if @view_context.instance_variable_names.include?('@renderer') + options = renderer.instance_variable_get("@options") if renderer + + if options && options.include?(:mustache) + Mustache.render(@template_source, options[:mustache]).html_safe + else + @template_source.html_safe + end + end + + private + + def evaluate_rails_helpers(compiled_erb_template) + @view_context.instance_eval do + eval(compiled_erb_template) + end + end + end + + +end + +ActionView::Template.register_template_handler :mustache, MustacheTemplate::Handler