lib/closure/script.rb in closure-1.5.0 vs lib/closure/script.rb in closure-1.5.1

- old
+ new

@@ -13,24 +13,24 @@ # limitations under the License. require 'pathname' class Closure - + # A Closure::Script instance is the context in which scripts are rendered. # It inherits everything from Rack::Request and supplies a Response instance # you can use for redirects, cookies, and other controller actions. class Script < Rack::Request class NotFound < StandardError end class RenderStackOverflow < StandardError end - + ENV_ERROR_CONTENT_TYPE = 'closure.error.content_type' - + def initialize(env, sources, filename) super(env) @render_stack = [] @goog = Goog.new(env, sources, @render_stack) @response = original_response = Rack::Response.new @@ -41,23 +41,23 @@ rescue RenderStackOverflow, NotFound => e if @render_stack.size > 0 # Make errors appear from the render instead of the engine.call e.set_backtrace e.backtrace[1..-1] env[ENV_ERROR_CONTENT_TYPE] = @response.finish[1]["Content-Type"] rescue nil - raise e + raise e end @response.status = 404 @response.write "404 Not Found\n" @response.header["X-Cascade"] = "pass" @response.header["Content-Type"] = "text/plain" rescue StandardError, LoadError, SyntaxError => e env[ENV_ERROR_CONTENT_TYPE] = @response.finish[1]["Content-Type"] rescue nil raise e end - + # After rendering, #finish will be sent to the client. - # If you replace the response or add to the response#body, + # If you replace the response or add to the response#body, # the script engine rendering will not be added. # @return [Rack::Response] attr_accessor :response # All the cool stuff lives here. @@ -65,14 +65,14 @@ attr_accessor :goog # An array of filenames representing the current render stack. # @example # <%= if render_stack.size == 1 - # render 'html_version' + # render 'html_version' # else # render 'included_version' - # end + # end # %> # @return [<Array>] attr_reader :render_stack # Render another Script. @@ -82,29 +82,29 @@ # @param (Hash) locals Local variables for the Script. def render(filename, locals = {}) if render_stack.size > 100 # Since nobody sane should recurse through here, this mainly # finds a render self that you might get after a copy and paste - raise RenderStackOverflow + raise RenderStackOverflow elsif render_stack.size > 0 # Hooray for relative paths and easily movable files filename = File.expand_path(filename, File.dirname(render_stack.last)) else # Underbar scripts are partials by convention; keep them from rendering at root filename = File.expand_path(filename) raise NotFound if File.basename(filename) =~ /^_/ end - ext = File.extname(filename) + fext = File.extname(filename) files1 = [filename] - files1 << filename + '.html' if ext == '' - files1 << filename.sub(/.html$/,'') if ext == '.html' + files1 << filename + '.html' if fext == '' + files1 << filename.sub(/.html$/,'') if fext == '.html' files1.each do |filename1| Closure.config.engines.each do |ext, engine| files2 = [filename1+ext] files2 << filename1.gsub(/.html$/, ext) if File.extname(filename1) == '.html' unless filename1 =~ /^_/ or render_stack.empty? - files2 = files2 + files2.collect {|f| "#{File.dirname(f)}/_#{File.basename(f)}"} + files2 = files2 + files2.collect {|f| "#{File.dirname(f)}/_#{File.basename(f)}"} end files2.each do |filename2| if File.file?(filename2) and File.readable?(filename2) if render_stack.empty? response.header["Content-Type"] = Rack::Mime.mime_type(File.extname(filename1), 'text/html') @@ -118,11 +118,11 @@ end end end raise NotFound end - + # Helper for finding files relative to Scripts. # @param [String] filename # @return [String] absolute filesystem path def expand_path(filename, dir=nil) dir ||= File.dirname render_stack.last @@ -131,31 +131,30 @@ # Helper to locate a file as a file server path. # @param [String] filename # @return [String] absolute http path def expand_src(filename, dir=nil) - found = false filename = expand_path filename, dir src = nil - @goog.each do |dir, path| - dir_range = (dir.length..-1) - if filename.index(dir) == 0 + @goog.each do |directory, path| + dir_range = (directory.length..-1) + if filename.index(directory) == 0 src = "#{path}#{filename.slice(dir_range)}" break end end raise Errno::ENOENT unless src src end - + # Helper to locate a file as a file server path. # @param [String] filename # @return [String] relative http path def relative_src(filename, dir=nil) file = expand_src filename, dir base = Pathname.new File.dirname path_info Pathname.new(file).relative_path_from(base).to_s end - + end - + end