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)