vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb in radiant-0.6.4 vs vendor/rails/actionpack/lib/action_view/helpers/javascript_helper.rb in radiant-0.6.5

- old
+ new

@@ -1,7 +1,7 @@ -require File.dirname(__FILE__) + '/tag_helper' -require File.dirname(__FILE__) + '/prototype_helper' +require 'action_view/helpers/tag_helper' +require 'action_view/helpers/prototype_helper' module ActionView module Helpers # Provides functionality for working with JavaScript in your views. # @@ -78,11 +78,11 @@ # throw e # }; # return false;">Show me more</a> # def link_to_function(name, *args, &block) - html_options = args.last.is_a?(Hash) ? args.pop : {} + html_options = args.extract_options! function = args[0] || '' html_options.symbolize_keys! function = update_page(&block) if block_given? content_tag( @@ -109,11 +109,11 @@ # end # button_to_function "Details", :class => "details_button" do |page| # page[:details].visual_effect :toggle_slide # end def button_to_function(name, *args, &block) - html_options = args.last.is_a?(Hash) ? args.pop : {} + html_options = args.extract_options! function = args[0] || '' html_options.symbolize_keys! function = update_page(&block) if block_given? tag(:input, html_options.merge({ @@ -130,45 +130,64 @@ # Note: The recommended approach is to copy the contents of # lib/action_view/helpers/javascripts/ into your application's # public/javascripts/ directory, and use +javascript_include_tag+ to # create remote <script> links. def define_javascript_functions - javascript = '<script type="text/javascript">' + javascript = "<script type=\"#{Mime::JS}\">" # load prototype.js and its extensions first prototype_libs = Dir.glob(File.join(JAVASCRIPT_PATH, 'prototype*')).sort.reverse prototype_libs.each do |filename| javascript << "\n" << IO.read(filename) end - # load other librairies + # load other libraries (Dir.glob(File.join(JAVASCRIPT_PATH, '*')) - prototype_libs).each do |filename| javascript << "\n" << IO.read(filename) end javascript << '</script>' end # Escape carrier returns and single and double quotes for JavaScript segments. def escape_javascript(javascript) - (javascript || '').gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" } + (javascript || '').gsub('\\','\0\0').gsub('</','<\/').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" } end # Returns a JavaScript tag with the +content+ inside. Example: # javascript_tag "alert('All is good')" # # Returns: - # # <script type="text/javascript"> # //<![CDATA[ # alert('All is good') # //]]> # </script> # # +html_options+ may be a hash of attributes for the <script> tag. Example: - # javascript_tag "alert('All is good')", :defer => 'true' # => <script defer="true" type="text/javascript">alert('All is good')</script> - def javascript_tag(content, html_options = {}) - content_tag("script", javascript_cdata_section(content), html_options.merge(:type => "text/javascript")) + # javascript_tag "alert('All is good')", :defer => 'defer' + # # => <script defer="defer" type="text/javascript">alert('All is good')</script> + # + # Instead of passing the content as an argument, you can also use a block + # in which case, you pass your +html_options+ as the first parameter. + # <% javascript_tag :defer => 'defer' do -%> + # alert('All is good') + # <% end -%> + def javascript_tag(content_or_options_with_block = nil, html_options = {}, &block) + if block_given? + html_options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash) + content = capture(&block) + else + content = content_or_options_with_block + end + + javascript_tag = content_tag("script", javascript_cdata_section(content), html_options.merge(:type => Mime::JS)) + + if block_given? && block_is_within_action_view?(block) + concat(javascript_tag, block.binding) + else + javascript_tag + end end def javascript_cdata_section(content) #:nodoc: "\n//#{cdata_section("\n#{content}\n//")}\n" end @@ -183,9 +202,14 @@ "['#{option.join('\',\'')}']" elsif !option.nil? "'#{option}'" end js_option + end + + private + def block_is_within_action_view?(block) + eval("defined? _erbout", block.binding) end end JavascriptHelper = JavaScriptHelper unless const_defined? :JavascriptHelper end