[PATCH conductor 1/8] Integrating Mustache with Rails

ifarkas at redhat.com ifarkas at redhat.com
Thu Apr 19 07:29:59 UTC 2012


From: Imre Farkas <ifarkas at 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
-- 
1.7.6.5




More information about the aeolus-devel mailing list