フレームワーク Sizuku
2005-06-16
かんさんが作られた軽量フレームワークの「Nagisa」をベースにして、シンプルなフレームワークを作ってみた。 「Nagisa」にちなんで名前は「Sizuku」。 「Nagisa」と同じく、PATH_INFOでアクションを切り分けるようになっている。
Sizuku::Handlerを継承して使う感じ。サンプルは後ほど。
module Sizuku
class Request
def initialize(cgi)
@cgi = cgi
@cgi.params.each do |key, val|
unless instance_variable_get("@#{key}")
val = val[0] if val.size == 1
instance_variable_set("@#{key}", val)
end
end
end
attr_reader :cgi
end
class Response
def initialize(cgi)
@header = {}
@cgi = cgi
end
def set_redirect(uri)
@header['status'] = '301 Moved Permanently'
@header['Location'] = uri
end
def output(body = nil)
print @cgi.header(@header)
print body
end
attr_accessor :header
end
class Handler
def initialize(conf)
end
def handle(cgi)
req = Request.new(cgi)
res = Response.new(cgi)
if cgi.path_info =~ /\/?(.*)/
method = $1.gsub('/','_')
end
method ||= 'main'
content = __send__('handle_' + method, req, res)
if content
content.template_id ||= method
content.template_path = 'template/'
res.output(content.output)
else
res.output
end
end
end
# Template modules
module BaseTemplate
attr_accessor :template_id, :template_path
def output
@template_path ||= '.'
template = "#{@template_path}/#{@template_id}"
_output(template)
end
end
begin
require 'amrita2'
require 'amrita2/template'
require 'stringio'
module Amrita2Template
include BaseTemplate
include Amrita2
def _output(template)
out = StringIO.new
t = Amrita2::TemplateFile.new("#{template}.html")
t.amrita_id = 'amrita_id'
t.expand(out, self)
out.string
end
end
rescue LoadError
# STDERR.puts 'Amrita2 is not found'
end
begin
require 'erb'
module ErbTemplate
include BaseTemplate
def _output(template)
ERB.new(File.open("#{template}.rhtml"){|f| f.read}).result(binding())
end
end
rescue LoadError
# STDERR.puts 'ERB is not found'
end
end