module Merb::Template
Constants
- EXTENSIONS
- METHOD_LIST
- MTIMES
- SUPPORTED_LOCALS_LIST
Public Class Methods
Finds the engine for a particular path.
Parameters¶ ↑
- path<String>
-
The path of the file to find an engine for.
Returns¶ ↑
- Class
-
The engine.
:api: private
# File lib/merb-core/controller/template.rb, line 153 def engine_for(path) path = File.expand_path(path) EXTENSIONS[path.match(/\.([^\.]*)$/)[1]] end
Takes a template at a particular path and inlines it into a module and adds it to the METHOD_LIST table to speed lookup later.
Parameters¶ ↑
- io<#path>
-
An IO that responds to path (File or VirtualFile)
- locals
> A list of local names that should be assigned in the template method from the arguments hash. Defaults to [].
- mod<Module>
The module to put the compiled method into. Defaults to Merb::InlineTemplates
Returns¶ ↑
- Symbol
-
The name of the method that the template was compiled into.
Notes¶ ↑
Even though this method supports inlining into any module, the method must be available to instances of AbstractController that will use it.
:api: private
# File lib/merb-core/controller/template.rb, line 131 def inline_template(io, locals=[], mod = Merb::InlineTemplates) full_file_path = File.expand_path(io.path) engine_neutral_path = full_file_path.gsub(/\.[^\.]*$/, "") local_list = (SUPPORTED_LOCALS_LIST[engine_neutral_path] |= locals) ret = METHOD_LIST[engine_neutral_path] = engine_for(full_file_path).compile_template(io, template_name(full_file_path), local_list, mod) io.close ret end
For a given path, get an IO object that responds to path.
This is so that plugins can override this if they provide mechanisms for specifying templates that are not just simple files. The plugin is responsible for ensuring that the fake path provided will work with template_for, and thus the RenderMixin in general.
Parameters¶ ↑
- path<String>
-
A full path to find a template for. This is the
path that the RenderMixin assumes it should find the template in.
Returns¶ ↑
- IO#path
-
An IO object that responds to path (File or VirtualFile).
:api: plugin @overridable
# File lib/merb-core/controller/template.rb, line 54 def load_template_io(path) file = Dir["#{path}.{#{template_extensions.join(',')}}"].first File.open(file, "r") if file end
Decide if a template needs to be re/compiled.
Parameters¶ ↑
- path<String>
-
The full path of the template to check support for.
- locals
> The list of locals that need to be supported
Returns¶ ↑
- Boolean
-
Whether or not the template for the provided path needs to be recompiled
:api: private
# File lib/merb-core/controller/template.rb, line 92 def needs_compilation?(path, locals) return true if Merb::Config[:reload_templates] || !METHOD_LIST[path] current_locals = SUPPORTED_LOCALS_LIST[path] current_locals != locals && !(locals - current_locals).empty? end
Registers the extensions that will trigger a particular templating engine.
Parameters¶ ↑
- engine<Class>
-
The class of the engine that is being registered
- extensions
> The list of extensions that will be registered with this templating language
Raises¶ ↑
- ArgumentError
-
engine does not have a compile_template method.
Returns¶ ↑
nil
Example¶ ↑
Merb::Template.register_extensions(Merb::Template::Erubis, ["erb"])
:api: plugin
# File lib/merb-core/controller/template.rb, line 177 def register_extensions(engine, extensions) raise ArgumentError, "The class you are registering does not have a compile_template method" unless engine.respond_to?(:compile_template) extensions.each{|ext| EXTENSIONS[ext] = engine } Merb::AbstractController.class_eval <<-HERE include #{engine}::Mixin HERE end
Get the name of the template method for a particular path.
Parameters¶ ↑
- path<String>
-
A full path to find a template method for.
- template_stack<Array>
-
The template stack. Not used.
- locals
> The names of local variables
Returns¶ ↑
- <String>
-
name of the method that inlines the template.
:api: private
# File lib/merb-core/controller/template.rb, line 71 def template_for(path, template_stack = [], locals=[]) path = File.expand_path(path) if needs_compilation?(path, locals) template_io = load_template_io(path) METHOD_LIST[path] = inline_template(template_io, locals) if template_io end METHOD_LIST[path] end
Get the template's method name from a full path. This replaces non-alphanumeric characters with __ and “.” with “_”
Collisions are potentially possible with something like: ~foo.bar and __foo.bar or !foo.bar.
Parameters¶ ↑
- path<String>
-
A full path to convert to a valid Ruby method name
Returns¶ ↑
- String
-
The template name.
We might want to replace this with something that varies the character replaced based on the non-alphanumeric character to avoid edge-case collisions.
:api: private
# File lib/merb-core/controller/template.rb, line 30 def template_name(path) path = File.expand_path(path) path.gsub(/[^\.a-zA-Z0-9]/, "__").gsub(/\./, "_") end