1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionview/lib/action_view/template/handlers.rb
Santiago Pastorino 8a998b0fa7 Add Html template handler that wraps Raw output in an OutputBuffer
This fixes the case when you try to render an html you know safe and the
file is named something.html. With this commit the content of the html
won't be escaped anymore because AV won't use Raw handler and choose
Html handler instead.
2016-01-05 16:54:39 -03:00

64 lines
2.3 KiB
Ruby

module ActionView #:nodoc:
# = Action View Template Handlers
class Template
module Handlers #:nodoc:
autoload :Raw, 'action_view/template/handlers/raw'
autoload :ERB, 'action_view/template/handlers/erb'
autoload :Html, 'action_view/template/handlers/html'
autoload :Builder, 'action_view/template/handlers/builder'
def self.extended(base)
base.register_default_template_handler :raw, Raw.new
base.register_template_handler :erb, ERB.new
base.register_template_handler :html, Html.new
base.register_template_handler :builder, Builder.new
base.register_template_handler :ruby, :source.to_proc
end
@@template_handlers = {}
@@default_template_handlers = nil
def self.extensions
@@template_extensions ||= @@template_handlers.keys
end
# Register an object that knows how to handle template files with the given
# extensions. This can be used to implement new template types.
# The handler must respond to +:call+, which will be passed the template
# and should return the rendered template as a String.
def register_template_handler(*extensions, handler)
raise(ArgumentError, "Extension is required") if extensions.empty?
extensions.each do |extension|
@@template_handlers[extension.to_sym] = handler
end
@@template_extensions = nil
end
# Opposite to register_template_handler.
def unregister_template_handler(*extensions)
extensions.each do |extension|
handler = @@template_handlers.delete extension.to_sym
@@default_template_handlers = nil if @@default_template_handlers == handler
end
@@template_extensions = nil
end
def template_handler_extensions
@@template_handlers.keys.map(&:to_s).sort
end
def registered_template_handler(extension)
extension && @@template_handlers[extension.to_sym]
end
def register_default_template_handler(extension, klass)
register_template_handler(extension, klass)
@@default_template_handlers = klass
end
def handler_for_extension(extension)
registered_template_handler(extension) || @@default_template_handlers
end
end
end
end