公開しようと思ってて忘れて大分タイミングを外した。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
コメント