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