ソースを読む(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()

ページ - hiki/page.rb

Hiki::Page

Wiki "Page" というより、Web "Page" か?

メンバ変数

@cgi, @conf, @templates, @contents

process(plugin)

tba

out()

tba