ソースを読む(1)
http://hikiwiki.org/
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/hiki/hiki/
起動部 - hiki.cgi
require 'hiki/config' conf = Hiki::Config::new ... cgi = CGI::new db = Hiki::HikiDB::new( conf ) db.open_db { cmd = Hiki::Command::new( cgi, db, conf ) cmd.dispatch }
CGI::new を使ってるようです。
まず db を作る。んで cmd を作って dispatch させるのをブロックで渡す、と。
データベース
hiki/stroge.rb:
Hiki::HikiDBBase - database の base class
open_db() でblock 渡されれば yield して close_db する。
hiki/db/flatfile.rb:
Hiki::HikiDB < HikiDBBase
store()で flatfile で保存。
コマンド - hiki/command.rb
Hiki::Command
メンバ変数
@db, @params, @cgi, @conf, @cmd, @p...
dispatch() - コマンド処理
edit, save, create は if 判定で処理、その後 plugin 判定をし、それ以外は send("cmd=#{@cmd}") で投げる。
cmd_view() - ページ表示
def cmd_view ... tokens = @db.load_cache( @p ) unless tokens text = @db.load( @p ) parser = @conf.parser::new( @conf ) tokens = parser.parse( text ) @db.save_cache( @p, tokens ) end formatter = @conf.formatter::new( tokens, @db, @plugin, @conf ) contents, toc = formatter.to_s, formatter.toc ... data = get_common_data( @db, @plugin, @conf ) pg_title = @plugin.page_name(@p) data[:page_title] = (@plugin.hiki_anchor( @p.escape, @p.escapeHTML )) data[:view_title] = pg_title data[:title] = title( pg_title ) data[:toc] = @plugin.toc_f ? toc : nil data[:body] = formatter.apply_tdiary_theme(contents) ... generate_page( data ) end
ページテキストを db から読み込み、parser に parse させ tokes を切り出す。それを formatter にかけ、to_s で contents に入れておく。data[] にハッシュで出力情報を入れておき、generate_page(data) で吐かせる。
generate_page(data) - ページ生成、表示
def generate_page( data, status = 'OK' ) @plugin.hiki_menu(data, @cmd) @plugin.title = data[:title] data[:cmd] = @cmd data[:cgi_name] = @conf.cgi_name ... @page = Hiki::Page::new( @cgi, @conf ) @page.template = @conf.read_template( @cmd ) @page.contents = data data[:last_modified] = Time::now unless data[:last_modified] @page.process( @plugin ) @page.out( 'status' => status ) end
data[] に情報を付加した後、Hiki::Page オブジェクトを生成、contents に data を渡し、process()、out()