diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/zorglub/node.rb | 319 |
1 files changed, 175 insertions, 144 deletions
diff --git a/lib/zorglub/node.rb b/lib/zorglub/node.rb index 69e1e21..57ef3a1 100644 --- a/lib/zorglub/node.rb +++ b/lib/zorglub/node.rb @@ -4,36 +4,16 @@ module Zorglub # class Node # - @hooks = { - :before_all => [], - :after_all => [], - } - # - @inherited_vars = { } + # class level engine, layout, static, layout_base_path, view_base_path configuration # class << self # - attr_reader :hooks, :inherited_vars, :layout, :engine, :static - # - def inherited sub - sub.engine! engine||(self==Zorglub::Node ? Config.engine : nil ) - sub.layout! layout||(self==Zorglub::Node ? Config.layout : nil ) - sub.instance_variable_set :@inherited_vars, {} - @inherited_vars.each do |s,v| sub.inherited_var s, *v end - end + attr_reader :engine, :layout, :static # def engine! engine @engine = engine end # - def layout_base_path! path - @layout_base_path = path - end - # - def layout_base_path - @layout_base_path ||= Config.layout_base_path - end - # def no_layout! @layout = nil end @@ -42,6 +22,18 @@ module Zorglub @layout = layout end # + def static! val + @static = ( (val==true or val==false) ? val : false ) + end + # + def layout_base_path! path + @layout_base_path = path + end + # + def layout_base_path + @layout_base_path ||= Config.layout_base_path + end + # def view_base_path! path @view_base_path = path end @@ -49,20 +41,66 @@ module Zorglub def view_base_path @view_base_path ||= Config.view_base_path end - # - def static! val - @static = val if (val==true or val==false) - @static ||= false - end - # - def inherited_var sym, *args - var = @inherited_vars[sym] ||=[] - unless args.empty? - var.concat args - var.uniq! - end - var + end + # + # instance level engine, layout, view, static configuration + # + def engine! engine + @options[:engine] = engine + end + # + def engine + @options[:engine] + end + # + def no_layout! + layout! nil + end + # + def layout! layout + @options[:layout] = layout + end + # + def layout + return '' if @options[:layout].nil? + File.join(self.class.layout_base_path, @options[:layout])+ext + end + # + def view! view + @options[:view] = view + end + # + def view + return '' if @options[:view].nil? + File.join(self.class.view_base_path, @options[:view])+ext + end + # + def static! val + @options[:static] = ((val==true or val==false) ? val : false ) + end + # + def static + return nil if not @options[:static] or @options[:view].nil? + File.join(Config.static_base_path, @options[:view])+ext + end + # + # TODO rewrite + # + def ext! ext + if ext.nil? or ext.empty? + @options[:ext]='' + else + @options[:ext] = (ext[0]=='.' ? (ext.length==1 ? nil : ext) : '.'+ext) end + end + # + def ext + @options[:ext]||'' + end + # + # class level basic node functions + # + class << self # attr_accessor :app def map app, location @@ -75,21 +113,79 @@ module Zorglub (args.empty? ? @r : File.join( @r, args.map { |x| x.to_s } ) ) end # - def call env - meth, *args = env['PATH_INFO'].sub(/^\//,'').split '/' - meth||= 'index' - puts "=> #{meth}(#{args.join ','})" if Config.debug - 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 + # + # instance level basic node functions + # + def app + self.class.app + end + # + def args + @options[:args] + end + # + def map + self.class.r + end + # + def r *args + File.join map, (args.empty? ? @options[:method] : args.map { |x| x.to_s } ) + end + # + def html + [ :map, :r, :args, :engine, :layout, :view ].inject('') { |s,sym| s+="<p>#{sym} => #{self.send sym}</p>"; s } + end + # + def redirect target, options={}, &block + status = options[:status] || 302 + body = options[:body] || redirect_body(target) + header = response.header.merge('Location' => target.to_s) + throw :stop_realize, Rack::Response.new(body, status, header, &block) + end + # + def redirect_body target + "You are being redirected, please follow this link to: <a href='#{target}'>#{target}</a>!" + end + # + # inherited vars, they can be modified at class level only + # + @inherited_vars = { } + # + class << self + # + attr_reader :inherited_vars + # + def inherited_var sym, *args + var = @inherited_vars[sym] ||=[] + unless args.empty? + var.concat args + var.uniq! + end + var end # - def partial meth, *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 + end + # + def inherited_var sym, *args + d = self.class.inherited_vars[sym].clone || [] + unless args.empty? + d.concat args + d.uniq! end + d + end + # + # TODO check and rewrite maybe + # + @hooks = { + :before_all => [], + :after_all => [], + } + class << self + # + attr_reader :hooks + # # def call_before_hooks obj Node.hooks[:before_all].each do |blk| blk.call obj end @@ -109,6 +205,33 @@ module Zorglub Node.hooks[:after_all].uniq! end # + end + # + class << self + # + def inherited sub + sub.engine! engine||(self==Zorglub::Node ? Config.engine : nil ) + sub.layout! layout||(self==Zorglub::Node ? Config.layout : nil ) + sub.instance_variable_set :@inherited_vars, {} + @inherited_vars.each do |s,v| sub.inherited_var s, *v end + end + # + def call env + meth, *args = env['PATH_INFO'].sub(/^\//,'').split '/' + meth||= 'index' + puts "=> #{meth}(#{args.join ','})" if Config.debug + 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,:static=>static} + return error_404 node if not node.respond_to? meth + node.feed! + node.content + end + # def error_404 node puts " !! method not found" if Config.debug resp = node.response @@ -129,6 +252,11 @@ module Zorglub @response = Rack::Response.new end # + def state state=nil + @options[:state] = state unless state.nil? + @options[:state] + end + # def realize! catch(:stop_realize) { feed! @@ -186,103 +314,6 @@ module Zorglub @mime = mime unless mime.nil? end # - def redirect target, options={}, &block - status = options[:status] || 302 - body = options[:body] || redirect_body(target) - header = response.header.merge('Location' => target.to_s) - throw :stop_realize, Rack::Response.new(body, status, header, &block) - end - # - def redirect_body target - "You are being redirected, please follow this link to: <a href='#{target}'>#{target}</a>!" - end - # - def state state=nil - @options[:state] = state unless state.nil? - @options[:state] - end - # - def engine! engine - @options[:engine] = engine - end - # - def engine - @options[:engine] - end - # - def no_layout! - @options[:layout] = nil - end - # - def layout! layout - @options[:layout] = layout - end - # - def layout - return '' if @options[:layout].nil? - File.join(self.class.layout_base_path, @options[:layout])+ext - end - # - def static! val - @options[:static] = val if (val==true or val==false) - @options[:static] ||= false - end - # - def static - return nil if not @options[:static] or @options[:view].nil? - File.join(Config.static_base_path, @options[:view])+ext - end - # - def view! view - @options[:view] = view - end - # - def view - return '' if @options[:view].nil? - File.join(self.class.view_base_path, @options[:view])+ext - end - # - def ext! ext - if ext.nil? or ext.empty? - @options[:ext]='' - else - @options[:ext] = (ext[0]=='.' ? (ext.length==1 ? nil : ext) : '.'+ext) - end - end - # - def ext - @options[:ext]||'' - end - # - def inherited_var sym, *args - d = self.class.inherited_vars[sym].clone || [] - unless args.empty? - d.concat args - d.uniq! - end - d - end - # - def app - self.class.app - end - # - def args - @options[:args] - end - # - def map - self.class.r - end - # - def r *args - File.join map, (args.empty? ? @options[:method] : args.map { |x| x.to_s } ) - end - # - def html - [ :map, :r, :args, :engine, :layout, :view ].inject('') { |s,sym| s+="<p>#{sym} => #{self.send sym}</p>"; s } - end - # end # end |