Added the RoR Login-Engine and activated it on the site.
[selectricity-live] / vendor / plugins / engines / lib / bundles / require_resource.rb
diff --git a/vendor/plugins/engines/lib/bundles/require_resource.rb b/vendor/plugins/engines/lib/bundles/require_resource.rb
new file mode 100644 (file)
index 0000000..3469c63
--- /dev/null
@@ -0,0 +1,124 @@
+# RequireResource v.1.4 by Duane Johnson
+#
+# Makes inclusion of javascript and stylesheet resources easier via automatic or explicit
+# calls.  e.g. require_javascript 'popup' is an explicit call.
+#
+# The simplest way to make use of this functionality is to add
+#   <%= resource_tags %>
+# to your layout (usually in the <head></head> section).  This will automatically add
+# bundle support to your application, as well as enable simple javascript and stylesheet
+# dependencies for your views.
+#
+# Note that this can easily be turned in to a helper on its own.
+module RequireResource
+  mattr_accessor :path_prefix
+
+  # Write out all javascripts & stylesheets, including default javascripts (unless :defaults => false)
+  def resource_tags(options = {})
+    options = {:auto => true, :defaults => true}.update(options)
+    require_defaults if options[:defaults]
+    stylesheet_auto_link_tags(:auto => options[:auto]) +
+    javascript_auto_include_tags(:auto => options[:auto])
+  end
+  
+  # Write out the <link> tags themselves based on the array of stylesheets to be included
+  def stylesheet_auto_link_tags(options = {})
+    options = {:auto => true}.update(options)
+    ensure_resource_is_initialized(:stylesheet)
+    autorequire(:stylesheet) if options[:auto]
+    @stylesheets.uniq.inject("") do |buffer, css|
+      buffer << stylesheet_link_tag(css) + "\n    "
+    end
+  end
+
+  # Write out the <script> tags themselves based on the array of javascripts to be included
+  def javascript_auto_include_tags(options = {})
+    options = {:auto => true}.update(options)
+    ensure_resource_is_initialized(:javascript)
+    autorequire(:javascript) if options[:auto]
+    @javascripts.uniq.inject("") do |buffer, js|
+      buffer << javascript_include_tag(js) + "\n    "
+    end
+  end
+
+  # Bundle the defaults together for easy inclusion
+  def require_defaults
+    require_javascript(:prototype)
+    require_javascript(:controls)
+    require_javascript(:effects)
+    require_javascript(:dragdrop)
+  end
+  
+  # Adds a javascript to the array of javascripts that will be included in the layout by
+  # either your call to 'javascript_auto_include_tags' or 'resource_tags'.
+  def require_javascript(*scripts)
+    scripts.each do |script|
+      require_resource(:javascript, RequireResource.path_prefix.to_s + script.to_s)
+    end
+  end
+
+  # Adds a stylesheet to the array of stylesheets that will be included in the layout by
+  # either your call to 'stylesheet_auto_link_tags' or 'resource_tags'.
+  def require_stylesheet(*sheets)
+    sheets.each do |sheet|
+      require_resource(:stylesheet, RequireResource.path_prefix.to_s + sheet.to_s)
+    end
+  end
+  
+  # Changes the RequireResource.path_prefix within the scope of a block.  This is
+  # particularly useful when requiring several resources within a directory.  For example,
+  # bundles can take advantage of this by calling
+  #   require_relative_to Engines.current.public_dir do
+  #     require_javascript '...'
+  #     require_stylesheet '...'
+  #     # ...
+  #   end
+  def require_relative_to(path)
+    former_prefix = RequireResource.path_prefix
+    RequireResource.path_prefix = path
+    yield
+    RequireResource.path_prefix = former_prefix
+  end
+  
+  protected
+    # Adds resources such as stylesheet or javascript files to the corresponding array of
+    # resources that will be 'required' by the layout. The +resource_type+ is either
+    # :javascript or :stylesheet. The +extension+ is optional, and should normally correspond
+    # with the resource type, e.g. 'css' for :stylesheet and 'js' for :javascript.
+    def autorequire(resource_type, extension = nil)
+      extensions = {:stylesheet => 'css', :javascript => 'js'}
+      extension ||= extensions[resource_type]
+      candidates = []
+      class_iterator = controller.class
+      resource_path = "#{RAILS_ROOT}/public/#{resource_type.to_s.pluralize}/" 
+
+      while ![ActionController::Base].include? class_iterator
+        controller_path = class_iterator.to_s.underscore.sub('controllers/', '').sub('_controller', '')
+        candidates |= [ "#{controller_path}", "#{controller_path}/#{controller.action_name}" ]
+        class_iterator = class_iterator.superclass
+      end
+      
+      for candidate in candidates
+        if FileTest.exist?("#{resource_path}/#{candidate}.#{extension}")
+          require_resource(resource_type, candidate)
+        end
+      end
+    end
+
+    # Adds a resource (e.g. a javascript) to the appropriate array (e.g. @javascripts)
+    # ONLY if the resource is not already included.
+    def require_resource(type, name)
+      variable = type.to_s.pluralize
+      new_resource_array = (instance_variable_get("@#{variable}") || []) | [name.to_s]
+      instance_variable_set("@#{variable}", new_resource_array)
+    end
+
+    # Ensures that a resource array (e.g. @javascripts) is not nil--uses [] if so
+    def ensure_resource_is_initialized(type)
+      variable = type.to_s.pluralize
+      new_resource_array = (instance_variable_get("@#{variable}") || [])
+      instance_variable_set("@#{variable}", new_resource_array)      
+    end
+end
+
+ActionView::Base.send(:include, RequireResource)

Benjamin Mako Hill || Want to submit a patch?