vendor/plugins/haml/lib/haml/template.rb in radiant-0.8.2 vs vendor/plugins/haml/lib/haml/template.rb in radiant-0.9.0.rc2
- old
+ new
@@ -1,51 +1,85 @@
require 'haml/engine'
module Haml
- class Template
- class << self
- @@options = {}
+ # The class that keeps track of the global options for Haml within Rails.
+ module Template
+ extend self
- # Gets various options for Haml. See README.rdoc for details.
- def options
- @@options
- end
+ @options = {}
+ # The options hash for Haml when used within Rails.
+ # See {file:HAML_REFERENCE.md#haml_options the Haml options documentation}.
+ #
+ # @return [{Symbol => Object}]
+ attr_accessor :options
- # Sets various options for Haml. See README.rdoc for details.
- def options=(value)
- @@options = value
+ # Enables integration with the Rails 2.2.5+ XSS protection,
+ # if it's available and enabled.
+ #
+ # @return [Boolean] Whether the XSS integration was enabled.
+ def try_enabling_xss_integration
+ return false unless ActionView::Base.respond_to?(:xss_safe?) && ActionView::Base.xss_safe?
+
+ Haml::Template.options[:escape_html] = true
+
+ Haml::Util.module_eval {def rails_xss_safe?; true; end}
+
+ require 'haml/helpers/xss_mods'
+ Haml::Helpers.send(:include, Haml::Helpers::XssMods)
+
+ Haml::Precompiler.module_eval do
+ def precompiled_method_return_value_with_haml_xss
+ "::Haml::Util.html_safe(#{precompiled_method_return_value_without_haml_xss})"
+ end
+ alias_method :precompiled_method_return_value_without_haml_xss, :precompiled_method_return_value
+ alias_method :precompiled_method_return_value, :precompiled_method_return_value_with_haml_xss
end
+
+ true
end
end
end
+if Haml::Util.rails_env == "production"
+ Haml::Template.options[:ugly] = true
+end
+
# Decide how we want to load Haml into Rails.
# Patching was necessary for versions <= 2.0.1,
# but we can make it a normal handler for higher versions.
-if defined?(ActionView::TemplateHandler)
+if defined?(ActionView::TemplateHandler) || defined?(ActionView::Template::Handler)
require 'haml/template/plugin'
else
require 'haml/template/patch'
end
-if defined?(RAILS_ROOT)
+# Enable XSS integration. Use Rails' after_initialize method if possible
+# so that integration will be checked after the rails_xss plugin is loaded
+# (for Rails 2.3.* where it's not enabled by default).
+if defined?(Rails.configuration.after_initialize)
+ Rails.configuration.after_initialize {Haml::Template.try_enabling_xss_integration}
+else
+ Haml::Template.try_enabling_xss_integration
+end
+
+if Haml::Util.rails_root
# Update init.rb to the current version
# if it's out of date.
#
# We can probably remove this as of v1.9,
# because the new init file is sufficiently flexible
# to not need updating.
- rails_init_file = File.join(RAILS_ROOT, 'vendor', 'plugins', 'haml', 'init.rb')
- haml_init_file = Haml.scope('init.rb')
+ rails_init_file = File.join(Haml::Util.rails_root, 'vendor', 'plugins', 'haml', 'init.rb')
+ haml_init_file = Haml::Util.scope('init.rb')
begin
if File.exists?(rails_init_file)
require 'fileutils'
FileUtils.cp(haml_init_file, rails_init_file) unless FileUtils.cmp(rails_init_file, haml_init_file)
end
rescue SystemCallError
warn <<END
HAML WARNING:
#{rails_init_file} is out of date and couldn't be automatically updated.
-Please run `haml --rails #{File.expand_path(RAILS_ROOT)}' to update it.
+Please run `haml --rails #{File.expand_path(Haml::Util.rails_root)}' to update it.
END
end
end