ソースコードを使う高橋メソッド用Rabbitテーマ

公開しようと思ってて忘れて大分タイミングを外した。 RubyKaigi2006のライトニングトークで使った ときのRabbitのテーマ。基本的には高橋メソッドで、でもところどころ混じるソースコードの解説は割と文字数が多かった。なので、lightning-rabbitテーマをベースにいじってみた。

説明

Preformattedな部分をソースコードとみなして、rabbit添付の高橋メソッドの実装と同じ発想で「全体画面内に収まる範囲でできるだけ大きく」表示している。取り合えずレンダリングさせてみて溢れたら小さくするとと言う強引さも高橋メソッドの実装と同じ。

言い訳

  • 書いた本人にも謎のマジックナンバーが散らばっている。こうしないとフォントが大きすぎたのだ。
  • 初ライトニングトーク、初Rabbit、初テーマ作成だったのでよくわからなかったけど、見様見まねで書いた。須藤さんに「ドキュメントないの?」って聞いたら「ソース嫁」って言われた。

代物

##
## lightning-code-review.rb
##
## Copyright (c) 2006 Yugui
## License: Ruby's
## 

include_theme('lightning-rabbit')

PreformattedText.class_eval do
  def adjust_code
    block = parent
    body = block.parent
    slide = body.parent

    add_pre_draw_proc(nil) do |canvas, x, y, w, h, simulation|
      if simulation
        max_width = canvas.width - slide.margin_left - slide.margin_right - body.margin_left - body.margin_right
        max_height = canvas.height - slide.margin_top - slide.margin_bottom - body.margin_top - body.margin_bottom
        max_width *= Pango::SCALE
        max_height *= Pango::SCALE
        size = 1800

        loop do
          new_size = (size * 1.05).ceil
          current_height = current_width = 0
          self.text.each do |line|
            current_height += new_size
            current_width = [ current_width, line.length * new_size ].max
          end
          if max_width < current_width or max_height < current_height
            break
          else
            size = new_size
          end
        end
        font :size => size
      end
      [x, y, w, h]
    end
  end
end

match(Slide, Body, PreformattedBlock, PreformattedText) do |texts|
  texts.each do |pre|
    pre.adjust_code
  end
end