lib/mustache_render/mustache.rb in mustache_render-0.0.7 vs lib/mustache_render/mustache.rb in mustache_render-0.0.9

- old
+ new

@@ -17,22 +17,27 @@ def media @media ||= config.default_render_media end def render(data = template, ctx = {}) - tpl = templateify(data) - - return tpl.render(context) if ctx == {} + self.template = data + return self.template.render(context) if ctx == {} + begin context.push(ctx) - tpl.render(context) + self.template.render(context) ensure context.pop end end + # 片段树 + def partials_tree + + end + # Context accessors. # # view = Mustache.new # view[:name] = "Jon" # view.template = "Hi, {{name}}!" @@ -72,27 +77,114 @@ def db_render(full_path, context={}) @media = :db render(partial(full_path), context) end - def read_template_from_meida name + def impl_read_db_template name + db_template = ::MustacheRenderTemplate.find_with_full_path(name) + db_template.try :content + end + + def self.generate_template_name(name, template_extension) + # 如果路径中以扩展名结尾,则直接去取这个文件 + name = name.to_s.strip + + if name.start_with?('/') + name = name[1..-1] + end + + if name.end_with?(template_extension) + "#{name}" + else + "#{name}#{template_extension}" + end + end + + def impl_read_file_template name + # TODO: 对路径的语法需要加强 + full_path = "#{config.file_template_root_path}/#{self.class.generate_template_name(name, config.file_template_extension)}" + begin + File.read full_path + rescue + if config.raise_on_file_template_miss? + raise ::MustacheRender::Mustache::TemplateMiss.new("read file template error: #{full_path}") + else + '' + end + end + end + + def read_template_from_media name, media + # puts "read_template_from_media: #{name} #{media}" case media when :db - db_template = ::MustacheRenderTemplate.find_with_full_path(name) - db_template.try :content + if ::MustacheRender.config.db_template_cache? + self.class.fetch_partial_cache name, media, :expires_in => ::MustacheRender.config.db_template_cache_expires_in do + impl_read_db_template name + end + else + impl_read_db_template name + end when :file - File.read "#{config.file_template_root_path}/#{name}.#{config.file_template_extension}" + if ::MustacheRender.config.file_template_cache? + self.class.fetch_partial_cache name, media, :expires_in => ::MustacheRender.config.file_template_cache_expires_in do + impl_read_file_template name + end + else + impl_read_file_template name + end end end + def self.fix_path_name name + # 需要以 / 开头,此处fix一下这里 + if name.to_s.start_with?('/') + name.to_s + else + "/#{name}" + end + end + # Override this in your subclass if you want to do fun things like # reading templates from a database. It will be rendered by the # context, so all you need to do is return a string. def partial(name) - self.read_template_from_meida name + name = self.class.fix_path_name name + # return self.read_template_from_media name, media + @_cached_partials ||= {} + (@_cached_partials[media] ||= {})[name] ||= self.read_template_from_media name, media end + def self.partial_cache_key(name, media) + raise 'options key: :media must in(:file, :db)' unless [:file, :db].include?(media) + "MustacheRender::Mustache#Template.cache##{media}##{name}" + end + + def self.exist_partial_cache?(name, media) + ::MustacheRender.config.cache.exist?(self.partial_cache_key(name, media)) + end + + def self.delete_partial_cache(name, media) + ::MustacheRender.config.cache.delete(self.partial_cache_key(name, media)) + end + + def self.fetch_partial_cache(name, media, options={}, &block) + ::MustacheRender.config.cache.fetch(self.partial_cache_key(name, media), options) do + if block_given? + block.call + end + end + end + + def self.read_partial_cache(name, media) + ::MustacheRender.config.cache.read(self.partial_cache_key(name, media)) + end + + def self.write_partial_cache(name, media, value, options={}) + ::MustacheRender.config.cache.write(self.partial_cache_key(name, media), value, options) + end + # Override this to provide custom escaping. # # class PersonView < Mustache # def escapeHTML(str) # my_html_escape_method(str) @@ -161,9 +253,19 @@ end # Has this instance or its class already compiled a template? def compiled? (@template && @template.is_a?(Template)) || self.class.compiled? + end + + def template + return @template if @template + + self.template = '' + end + + def template= template + @template = templateify(template) end # template_partial => TemplatePartial # template/partial => Template::Partial def self.classify(underscored)