2003-09-29 (Mon) [長年日記]

インタビュー:XMLの実力を見定める

Tim Bray のインタビュー。利害関係のあるベンダーが増えすぎということか。

memo

Tags: XML

include プラグイン

VikiWiki のimport プラグインが羨ましくなり、himi さんからの要望もあったので Hiki 用の include プラグインをでっちあげてみた。

# $Id $
# Copyright (C) 2003 Koichiro Ohba <koichiro@meadowy.org>

def include( page )
  @content = ''
  return '' unless @db.exist?( page )
  include_content( page )
  @content
end

def include_content( page )
  include_page_backup( page )
  parser = Parser::new
  tokens = parser.parse( @db.load( page ) )
  formatter = HikiFormatter::new( tokens, @db, @db.plugin )
  @content << formatter.apply_tdiary_theme_include(formatter.to_s).sanitize
  include_page_restore
end

def include_page_backup( page )
  @tmp_page = @page
  @page = page
end

def include_page_restore
  @page = @tmp_page
end

hiki/hiki_formatter.rb への修正。

diff -c -r1.1.2.2 hiki_formatter.rb
*** hiki/hiki_formatter.rb      31 May 2003 10:13:01 -0000      1.1.2.2
--- hiki/hiki_formatter.rb      22 Oct 2003 15:16:02 -0000
***************
*** 15,20 ****
--- 15,42 ----
          if /(.*?)(<h2>.+)/ =~ line
             section << $1
            if section.size > 0 or first_f
+             tdiary_html << tdiary_day(title, section)
+             section = ''
+           end
+           first_f = true
+           title = $2
+         else
+          section << line
+         end
+      end
+      tdiary_html << tdiary_day(title, section)
+     end
+
+     def apply_tdiary_theme_include(html)
+       section = ''
+       title   = ''
+       tdiary_html    = ''
+       first_f = false
+
+       html.each do |line|
+         if /(.*?)(<h2>.+)/ =~ line
+            section << $1
+           if section.size > 0 or first_f
              tdiary_html << tdiary_section(title, section)
              section = ''
            end
***************
*** 30,42 ****
    private
      def tdiary_section(title, section)
  <<"EOS"
- <div class="day">
    #{title}
    <div class="body">
      <div class="section">
        #{section}
      </div>
    </div>
  </div>
  EOS
      end
--- 52,70 ----
    private
      def tdiary_section(title, section)
  <<"EOS"
    #{title}
    <div class="body">
      <div class="section">
        #{section}
      </div>
    </div>
+ EOS
+     end
+
+     def tdiary_day(title, section)
+ <<"EOS"
+ <div class="day">
+     #{tdiary_section(title, section)}
  </div>
  EOS
      end

使い方は埋め込みたい場所でページ名を指定する。

{{include('SandBox')}}

実行例 about:SandBox

セクションが分かれるようにしたほうがよいのかな。 <div class="day"> が入れ子にならないように対処。

あとこのままでは include 先のプラグインが元ページの情報で実行されてしまうために BBS プラグインなどが正常に動かない。include 先に合わせて Plugin クラスを初期化するとかしないとイカンかも。安直に対応。

Tags: Hiki