diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/zorglub/config.rb | 6 | ||||
-rw-r--r-- | lib/zorglub/node.rb | 45 |
2 files changed, 45 insertions, 6 deletions
diff --git a/lib/zorglub/config.rb b/lib/zorglub/config.rb index 26fd449..7cdb965 100644 --- a/lib/zorglub/config.rb +++ b/lib/zorglub/config.rb @@ -9,6 +9,7 @@ module Zorglub :layout => 'default', :view_dir => 'view', :layout_dir => 'layout', + :static_dir => 'static', :session_on => false, :session_key => 'zorglub.sid', :session_secret => 'session-secret-secret', @@ -42,6 +43,11 @@ module Zorglub ( p.nil? ? File.join(@options[:root], @options[:layout_dir]) : p ) end # + def static_base_path + p = @options[:static_path] + ( p.nil? ? File.join(@options[:root], @options[:static_dir]) : p ) + end + # def register_engine name, ext, proc return unless name @engines[name]=[ ext, proc ] diff --git a/lib/zorglub/node.rb b/lib/zorglub/node.rb index c85e42d..a3552a9 100644 --- a/lib/zorglub/node.rb +++ b/lib/zorglub/node.rb @@ -32,6 +32,11 @@ module Zorglub @layout ||= Config.layout end # + def static val=nil + @static = val if (val==true or val==false) + @static ||=false + end + # def inherited_var sym, *args var = @inherited_vars[sym] ||=[] unless args.empty? @@ -55,13 +60,13 @@ module Zorglub def call env meth, *args = env['PATH_INFO'].sub(/^\//,'').split '/' meth||= 'index' - node = self.new env, {:engine=>engine,:layout=>layout,:view=>r(meth),:method=>meth,:args=>args} + node = self.new env, {:engine=>engine,:layout=>layout,:view=>r(meth),:method=>meth,:args=>args,:static=>static} return error_404 node if not node.respond_to? meth node.realize! end # def partial meth, *args - node = self.new nil, {:engine=>engine,:layout=>nil,:view=>r(meth),:method=>meth.to_s,:args=>args} + node = self.new nil, {:engine=>engine,:layout=>nil,:view=>r(meth),:method=>meth.to_s,:args=>args,:static=>static} return error_404 node if not node.respond_to? meth node.feed! node.content @@ -119,6 +124,32 @@ module Zorglub Node.call_before_hooks self state :meth @content = self.send @options[:method], *@options[:args] + static_path = static + if static_path.nil? + compile! + else + static! static_path + end + state :post_cb + Node.call_after_hooks self + state :finished + return @content, @mime + end + # + def static! path + if not File.exists? path + compile! + Dir.mkdir Config.static_base_path + Dir.mkdir File.dirname path + File.open(path, 'w') {|f| f.write(@content); f.write("\n@mime:"+@mime) } + else + content = File.open(path, 'r') {|f| f.read } + @content = content.sub /\n@mime:(.*)$/,'' + @mime = $1 + end + end + # + def compile! v, l, e = view, layout, Config.engine_proc(@options[:engine]) state (@options[:layout].nil? ? :partial : :view) @content, mime = e.call v, self if e and File.exists? v @@ -126,10 +157,6 @@ module Zorglub state :layout @content, mime = e.call l, self if e and File.exists? l @mime = mime unless mime.nil? - state :post_cb - Node.call_after_hooks self - state :finished - return @content, @mime end # def redirect target, options={}, &block @@ -163,6 +190,12 @@ module Zorglub @options[:layout] = nil end # + def static val=nil + @options[:static] = val if (val==true or val==false) + return nil if not @options[:static] or @options[:view].nil? + File.join(Config.static_base_path, @options[:view])+Config.engine_ext(@options[:engine]) + end + # def view view=nil @options[:view] = view unless view.nil? or view.empty? return '' if @options[:view].nil? |