rabbit 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +16 -0
- data/README +1 -0
- data/Rakefile +161 -53
- data/TODO +2 -0
- data/bin/rabbit +78 -34
- data/bin/rabbit-command +16 -3
- data/bin/rabbiter +74 -73
- data/bin/rabrick +17 -4
- data/bin/rabwii +77 -0
- data/data/rabbit/image/dark-gradation-images/background-gradation.png +0 -0
- data/data/rabbit/image/dark-gradation-images/dark-gradation-images.rb +2 -0
- data/data/rabbit/image/dark-gradation-images/property.rb +4 -0
- data/doc/_config.yml +2 -0
- data/doc/_layouts/en.html +37 -0
- data/doc/_layouts/ja.html +37 -0
- data/doc/_layouts/skeleton.html +91 -0
- data/doc/_plugins/converters/hiki.rb +27 -0
- data/doc/_plugins/converters/rd.rb +73 -0
- data/doc/_site/css/jquery-ui/themes/ui-lightness.css +573 -0
- data/doc/_site/css/rabbit.css +247 -0
- data/doc/_site/en/development.html +140 -0
- data/doc/_site/en/faq.html +117 -0
- data/doc/_site/en/hiki.html +420 -0
- data/doc/_site/en/how-to-make/hiki.html +113 -0
- data/doc/_site/en/how-to-make/index.html +135 -0
- data/doc/_site/en/how-to-make/pdf.html +111 -0
- data/doc/_site/en/how-to-make/rd.html +151 -0
- data/doc/_site/en/how-to-make/theme.html +249 -0
- data/doc/_site/en/index.html +343 -0
- data/doc/_site/en/install/homebrew.html +279 -0
- data/doc/_site/en/install/index.html +144 -0
- data/doc/_site/en/install/macports.html +158 -0
- data/doc/_site/en/install/windows.html +200 -0
- data/doc/_site/en/news.html +928 -0
- data/doc/_site/en/rd.html +555 -0
- data/doc/_site/en/sample/hiki/rabbit.html +380 -0
- data/doc/_site/en/sample/index.html +117 -0
- data/doc/_site/en/sample/rd/rabbit.html +572 -0
- data/doc/_site/en/slides.html +113 -0
- data/doc/_site/en/usage.html +445 -0
- data/doc/_site/en/users.html +127 -0
- data/doc/_site/favicon.ico +0 -0
- data/doc/_site/favicon.png +0 -0
- data/doc/_site/images/background-sample.svg +290 -0
- data/doc/_site/images/background.png +0 -0
- data/doc/_site/images/background.svg +131 -0
- data/doc/_site/images/hare-and-tortoise.png +0 -0
- data/doc/_site/images/hare-and-tortoise.svg +541 -0
- data/doc/_site/images/jp.png +0 -0
- data/{sample/momo/usako/usako_psd_100.png → doc/_site/images/lavie-icon.png} +0 -0
- data/doc/_site/images/lavie.png +0 -0
- data/doc/_site/images/screenshots/en/blue-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/en/blue-circle.png +0 -0
- data/doc/_site/images/screenshots/en/clear-blue-raw.png +0 -0
- data/doc/_site/images/screenshots/en/clear-blue.png +0 -0
- data/doc/_site/images/screenshots/en/cozmixng-raw.png +0 -0
- data/doc/_site/images/screenshots/en/cozmixng.png +0 -0
- data/doc/_site/images/screenshots/en/dark-gradation-raw.png +0 -0
- data/doc/_site/images/screenshots/en/dark-gradation.png +0 -0
- data/doc/_site/images/screenshots/en/day-white-raw.png +0 -0
- data/doc/_site/images/screenshots/en/day-white.png +0 -0
- data/doc/_site/images/screenshots/en/debian-raw.png +0 -0
- data/doc/_site/images/screenshots/en/debian.png +0 -0
- data/doc/_site/images/screenshots/en/green-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/en/green-circle.png +0 -0
- data/doc/_site/images/screenshots/en/night-black-raw.png +0 -0
- data/doc/_site/images/screenshots/en/night-black.png +0 -0
- data/doc/_site/images/screenshots/en/rabbit-raw.png +0 -0
- data/doc/_site/images/screenshots/en/rabbit.png +0 -0
- data/doc/_site/images/screenshots/en/ranguba-raw.png +0 -0
- data/doc/_site/images/screenshots/en/ranguba.png +0 -0
- data/doc/_site/images/screenshots/en/red-frame-raw.png +0 -0
- data/doc/_site/images/screenshots/en/red-frame.png +0 -0
- data/doc/_site/images/screenshots/en/ruby-gnome2-raw.png +0 -0
- data/doc/_site/images/screenshots/en/ruby-gnome2.png +0 -0
- data/doc/_site/images/screenshots/ja/blue-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/blue-circle.png +0 -0
- data/doc/_site/images/screenshots/ja/clear-blue-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/clear-blue.png +0 -0
- data/doc/_site/images/screenshots/ja/cozmixng-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/cozmixng.png +0 -0
- data/doc/_site/images/screenshots/ja/dark-gradation-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/dark-gradation.png +0 -0
- data/doc/_site/images/screenshots/ja/day-white-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/day-white.png +0 -0
- data/doc/_site/images/screenshots/ja/debian-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/debian.png +0 -0
- data/doc/_site/images/screenshots/ja/green-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/green-circle.png +0 -0
- data/doc/_site/images/screenshots/ja/night-black-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/night-black.png +0 -0
- data/doc/_site/images/screenshots/ja/rabbit-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/rabbit.png +0 -0
- data/doc/_site/images/screenshots/ja/ranguba-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/ranguba.png +0 -0
- data/doc/_site/images/screenshots/ja/red-frame-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/red-frame.png +0 -0
- data/doc/_site/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/ruby-gnome2.png +0 -0
- data/doc/_site/images/us.png +0 -0
- data/doc/_site/index.html.en +122 -0
- data/doc/_site/index.html.ja +122 -0
- data/doc/_site/ja/about.html +120 -0
- data/doc/_site/ja/development.html +141 -0
- data/doc/_site/ja/faq.html +232 -0
- data/doc/_site/ja/hiki.html +416 -0
- data/doc/_site/ja/how-to-make/hiki.html +113 -0
- data/doc/_site/ja/how-to-make/index.html +135 -0
- data/doc/_site/ja/how-to-make/pdf.html +112 -0
- data/doc/_site/ja/how-to-make/rd.html +161 -0
- data/doc/_site/ja/how-to-make/theme.html +254 -0
- data/doc/_site/ja/index.html +351 -0
- data/doc/_site/ja/install/homebrew.html +279 -0
- data/doc/_site/ja/install/index.html +146 -0
- data/doc/_site/ja/install/macports.html +177 -0
- data/doc/_site/ja/install/windows.html +200 -0
- data/doc/_site/ja/news.html +926 -0
- data/doc/_site/ja/rd.html +565 -0
- data/doc/_site/ja/sample/hiki/rabbit.html +390 -0
- data/doc/_site/ja/sample/index.html +117 -0
- data/doc/_site/ja/sample/rd/rabbit.html +580 -0
- data/doc/_site/ja/slides.html +142 -0
- data/doc/_site/ja/usage.html +458 -0
- data/doc/_site/ja/users.html +331 -0
- data/doc/_site/javascripts/jquery-ui.js +11544 -0
- data/doc/_site/javascripts/jquery.js +7179 -0
- data/doc/_site/screenshot.en.rab +10 -0
- data/doc/_site/screenshot.ja.rab +10 -0
- data/doc/css/jquery-ui/themes/ui-lightness.css +573 -0
- data/doc/css/rabbit.css +247 -0
- data/doc/en/development.rd +50 -0
- data/doc/en/faq.rd +18 -0
- data/doc/en/hiki.hiki +325 -0
- data/doc/en/how-to-make/hiki.hiki +9 -0
- data/doc/en/how-to-make/index.rd +25 -0
- data/doc/en/how-to-make/pdf.rd +7 -0
- data/doc/en/how-to-make/rd.rd +66 -0
- data/doc/en/how-to-make/theme.rd +135 -0
- data/doc/en/index.rd +276 -0
- data/doc/en/install/homebrew.rd +196 -0
- data/doc/en/install/index.rd +63 -0
- data/doc/en/install/macports.rd +77 -0
- data/doc/en/install/windows.rd +103 -0
- data/{NEWS.en → doc/en/news.rd} +78 -3
- data/doc/en/rd.rd +481 -0
- data/doc/en/sample/hiki/rabbit.hiki +389 -0
- data/doc/en/sample/index.rd +11 -0
- data/doc/en/sample/rd/rabbit.rd +467 -0
- data/doc/en/slides.rd +7 -0
- data/doc/en/usage.rd +365 -0
- data/doc/en/users.rd +29 -0
- data/doc/favicon.ico +0 -0
- data/doc/favicon.png +0 -0
- data/doc/images/background-sample.svg +290 -0
- data/doc/images/background.png +0 -0
- data/doc/images/background.svg +131 -0
- data/doc/images/hare-and-tortoise.png +0 -0
- data/doc/images/hare-and-tortoise.svg +541 -0
- data/doc/images/jp.png +0 -0
- data/doc/images/lavie-icon.png +0 -0
- data/doc/images/lavie.png +0 -0
- data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
- data/doc/images/screenshots/en/blue-circle.png +0 -0
- data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
- data/doc/images/screenshots/en/clear-blue.png +0 -0
- data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
- data/doc/images/screenshots/en/cozmixng.png +0 -0
- data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
- data/doc/images/screenshots/en/dark-gradation.png +0 -0
- data/doc/images/screenshots/en/day-white-raw.png +0 -0
- data/doc/images/screenshots/en/day-white.png +0 -0
- data/doc/images/screenshots/en/debian-raw.png +0 -0
- data/doc/images/screenshots/en/debian.png +0 -0
- data/doc/images/screenshots/en/green-circle-raw.png +0 -0
- data/doc/images/screenshots/en/green-circle.png +0 -0
- data/doc/images/screenshots/en/night-black-raw.png +0 -0
- data/doc/images/screenshots/en/night-black.png +0 -0
- data/doc/images/screenshots/en/rabbit-raw.png +0 -0
- data/doc/images/screenshots/en/rabbit.png +0 -0
- data/doc/images/screenshots/en/ranguba-raw.png +0 -0
- data/doc/images/screenshots/en/ranguba.png +0 -0
- data/doc/images/screenshots/en/red-frame-raw.png +0 -0
- data/doc/images/screenshots/en/red-frame.png +0 -0
- data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
- data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
- data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
- data/doc/images/screenshots/ja/blue-circle.png +0 -0
- data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
- data/doc/images/screenshots/ja/clear-blue.png +0 -0
- data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
- data/doc/images/screenshots/ja/cozmixng.png +0 -0
- data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
- data/doc/images/screenshots/ja/dark-gradation.png +0 -0
- data/doc/images/screenshots/ja/day-white-raw.png +0 -0
- data/doc/images/screenshots/ja/day-white.png +0 -0
- data/doc/images/screenshots/ja/debian-raw.png +0 -0
- data/doc/images/screenshots/ja/debian.png +0 -0
- data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
- data/doc/images/screenshots/ja/green-circle.png +0 -0
- data/doc/images/screenshots/ja/night-black-raw.png +0 -0
- data/doc/images/screenshots/ja/night-black.png +0 -0
- data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
- data/doc/images/screenshots/ja/rabbit.png +0 -0
- data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
- data/doc/images/screenshots/ja/ranguba.png +0 -0
- data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
- data/doc/images/screenshots/ja/red-frame.png +0 -0
- data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
- data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
- data/doc/images/us.png +0 -0
- data/doc/index.html.en +48 -0
- data/doc/index.html.ja +48 -0
- data/doc/ja/about.rd +21 -0
- data/doc/ja/development.rd +49 -0
- data/doc/ja/faq.rd +177 -0
- data/doc/ja/hiki.hiki +319 -0
- data/doc/ja/how-to-make/hiki.hiki +9 -0
- data/doc/ja/how-to-make/index.rd +25 -0
- data/doc/ja/how-to-make/pdf.rd +8 -0
- data/doc/ja/how-to-make/rd.rd +83 -0
- data/doc/ja/how-to-make/theme.rd +142 -0
- data/doc/ja/index.rd +283 -0
- data/doc/ja/install/homebrew.rd +196 -0
- data/doc/ja/install/index.rd +65 -0
- data/doc/ja/install/macports.rd +105 -0
- data/doc/ja/install/windows.rd +100 -0
- data/{NEWS.ja → doc/ja/news.rd} +84 -3
- data/doc/ja/rd.rd +489 -0
- data/doc/ja/sample/hiki/rabbit.hiki +405 -0
- data/doc/ja/sample/index.rd +11 -0
- data/doc/ja/sample/rd/rabbit.rd +475 -0
- data/doc/ja/slides.rd +29 -0
- data/doc/ja/usage.rd +380 -0
- data/doc/ja/users.rd +173 -0
- data/doc/javascripts/jquery-ui.js +11544 -0
- data/doc/javascripts/jquery.js +7179 -0
- data/doc/screenshot.en.rab +10 -0
- data/doc/screenshot.ja.rab +10 -0
- data/lib/rabbit/action/toggle.rb +0 -14
- data/lib/rabbit/canvas.rb +42 -46
- data/lib/rabbit/console.rb +9 -1
- data/lib/rabbit/front.rb +1 -1
- data/lib/rabbit/keys.rb +0 -8
- data/lib/rabbit/logger/gui.rb +3 -5
- data/lib/rabbit/parser/pdf.rb +1 -1
- data/lib/rabbit/parser/wiki/output.rb +17 -1
- data/lib/rabbit/rabbit.rb +12 -1
- data/lib/rabbit/renderer/base.rb +0 -25
- data/lib/rabbit/renderer/display/clutter-embed.rb +5 -69
- data/lib/rabbit/renderer/display/drawing-area.rb +0 -2
- data/lib/rabbit/renderer/display/key-handler.rb +0 -8
- data/lib/rabbit/source/base.rb +4 -0
- data/lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb +4 -8
- data/lib/rabbit/theme/clutter-comment/clutter-comment.rb +76 -0
- data/lib/rabbit/theme/clutter-comment/property.rb +3 -0
- data/lib/rabbit/theme/color-circle/color-circle.rb +3 -0
- data/lib/rabbit/theme/dark-gradation/dark-gradation.rb +187 -0
- data/lib/rabbit/theme/dark-gradation/property.rb +3 -0
- data/lib/rabbit/theme/debian/debian.rb +125 -145
- data/lib/rabbit/theme/default/default.rb +6 -0
- data/lib/rabbit/theme/footer-comment/footer-comment.rb +46 -0
- data/lib/rabbit/theme/footer-comment/property.rb +3 -0
- data/lib/rabbit/theme/image/image.rb +3 -2
- data/lib/rabbit/theme/per-slide-background-color/property.rb +1 -1
- data/lib/rabbit/theme/slide-number/slide-number.rb +9 -3
- data/lib/rabbit/theme/stream-comment/property.rb +3 -0
- data/lib/rabbit/theme/stream-comment/stream-comment.rb +66 -0
- data/lib/rabbit/theme/tag/property.rb +1 -1
- data/lib/rabbit/theme/title-background-image/title-background-image.rb +6 -5
- data/lib/rabbit/theme/twitter-comment/property.rb +4 -0
- data/lib/rabbit/theme/twitter-comment/twitter-comment.rb +15 -0
- data/lib/rabbit/twitter.rb +216 -0
- data/lib/rabbit/utils.rb +26 -0
- data/misc/emacs/README.ja +1 -1
- data/misc/emacs/rabbit-mode.el +1 -1
- data/po/en/rabbit.po +429 -267
- data/po/fr/rabbit.po +440 -268
- data/po/ja/rabbit.po +455 -270
- data/po/rabbit.pot +2567 -0
- data/sample/rabbit-en.hiki +384 -0
- data/sample/rabbit-en.rd +1 -1
- data/sample/rabbit-implementation.rd +1 -1
- data/sample/rabbit.hiki +85 -13
- data/sample/rabbit.rd +1 -1
- data/sample/theme-bench-en.hiki +100 -0
- data/sample/theme-bench.hiki +101 -0
- metadata +413 -118
- data/README.en +0 -850
- data/README.ja +0 -885
- data/bin/rabbit.bat +0 -8
- data/data/locale/en/LC_MESSAGES/rabbit.mo +0 -0
- data/data/locale/fr/LC_MESSAGES/rabbit.mo +0 -0
- data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
- data/lib/rabbit/comment-canvas.rb +0 -21
- data/lib/rabbit/comment/log.rb +0 -74
- data/lib/rabbit/renderer/display/comment-drawing-area.rb +0 -175
- data/lib/rabbit/renderer/display/comment.rb +0 -194
- data/lib/rabbit/theme/comment/comment.rb +0 -5
- data/lib/rabbit/theme/comment/property.rb +0 -3
- data/lib/rt/rt2html-lib.rb +0 -157
- data/lib/rt/rtparser.rb +0 -226
- data/lib/rt/rtvisitor.rb +0 -68
- data/lib/rwiki/soap/common.rb +0 -5
- data/lib/rwiki/soap/driver.rb +0 -43
- data/lib/rwiki/soap/servant.rb +0 -78
- data/sample/asahina/alice.png +0 -0
- data/sample/asahina/yukiusa.png +0 -0
- data/sample/momo/banner/bn1.png +0 -0
- data/sample/momo/banner/bn2.png +0 -0
- data/sample/momo/banner/bn_psd.psd +0 -0
- data/sample/momo/banner/bn_psd2.psd +0 -0
- data/sample/momo/tailavi/tailavi-ruby.png +0 -0
- data/sample/momo/tailavi/tailavi-ruby.psd +0 -0
- data/sample/momo/tailavi/tailavi-taiyaki.png +0 -0
- data/sample/momo/tailavi/tailavi-taiyaki.psd +0 -0
- data/sample/momo/tailavi/tailavi-yokubari.png +0 -0
- data/sample/momo/tailavi/tailavi-yokubari.psd +0 -0
- data/sample/momo/tailavi/taiyaki.png +0 -0
- data/sample/momo/tailavi/taiyaki.psd +0 -0
- data/sample/momo/usako/blue_dot.png +0 -0
- data/sample/momo/usako/green_dot.png +0 -0
- data/sample/momo/usako/rabbit.png +0 -0
- data/sample/momo/usako/rabbit_mimi.png +0 -0
- data/sample/momo/usako/rabbit_mimi2.png +0 -0
- data/sample/momo/usako/red_dot.png +0 -0
- data/sample/momo/usako/ruby.png +0 -0
- data/sample/momo/usako/ruby_new.png +0 -0
- data/sample/momo/usako/usa1.png +0 -0
- data/sample/momo/usako/usa2.png +0 -0
- data/sample/momo/usako/usa3.png +0 -0
- data/sample/momo/usako/usako_psd.psd +0 -0
- data/sample/momo/usako/usako_psd_200.png +0 -0
- data/sample/rabbit-balloon.eps +0 -233
- data/sample/sode/kame-color.riff +0 -0
- data/sample/sode/kame.riff +0 -0
- data/sample/usatti/kame-taro.png +0 -0
- data/sample/usatti/rabbit-pink-logo.png +0 -0
- data/sample/usatti/rabbit-pink-logo2.png +0 -0
- data/sample/usatti/ruby-pink-circle-logo.png +0 -0
- data/sample/usatti/ruby-pink-circle.png +0 -0
- data/sample/usatti/ruby-pink-polygon-logo.png +0 -0
- data/sample/usatti/ruby-pink-polygon.png +0 -0
- data/sample/usatti/tanu-kitaro.png +0 -0
- data/sample/usatti/usa-taro.png +0 -0
- data/sample/usatti/yukidaru-taro.png +0 -0
|
@@ -28,3 +28,9 @@ include_theme("per-slide-background-image")
|
|
|
28
28
|
include_theme("body-background-image")
|
|
29
29
|
|
|
30
30
|
include_theme("tag")
|
|
31
|
+
|
|
32
|
+
if display? and canvas.renderer.widget.class.name == "Clutter::GtkEmbed"
|
|
33
|
+
include_theme("clutter-comment")
|
|
34
|
+
else
|
|
35
|
+
include_theme("footer-comment")
|
|
36
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
theme_exit unless display?
|
|
2
|
+
|
|
3
|
+
proc_name = "footer-comment"
|
|
4
|
+
|
|
5
|
+
@footer_comment_props ||= {
|
|
6
|
+
"size" => (@xx_small_font_size * 0.5).ceil,
|
|
7
|
+
"font_family" => @font_family,
|
|
8
|
+
}
|
|
9
|
+
@footer_comment_color ||= @default_foreground
|
|
10
|
+
@footer_comment_min_display_time ||= 1
|
|
11
|
+
|
|
12
|
+
match(SlideElement) do |slides|
|
|
13
|
+
slides.delete_post_draw_proc_by_name(proc_name)
|
|
14
|
+
canvas.delete_on_comment_proc_by_name(proc_name)
|
|
15
|
+
|
|
16
|
+
break if @footer_comment_uninstall
|
|
17
|
+
|
|
18
|
+
comments = []
|
|
19
|
+
canvas.on_comment(proc_name) do |comment|
|
|
20
|
+
comments << comment
|
|
21
|
+
canvas.activate("Redraw")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
redraw_time = Time.now
|
|
25
|
+
slides.add_post_draw_proc(proc_name) do |slide, canvas, x, y, w, h, simulation|
|
|
26
|
+
unless simulation
|
|
27
|
+
unless comments.empty?
|
|
28
|
+
content = comments.first
|
|
29
|
+
text = Text.new(ERB::Util.h(content.strip.gsub("\n", " ")))
|
|
30
|
+
if Time.now - redraw_time > @footer_comment_min_display_time
|
|
31
|
+
redraw_time = Time.now
|
|
32
|
+
comments.shift if comments.size > 1
|
|
33
|
+
end
|
|
34
|
+
text.font @footer_comment_props
|
|
35
|
+
set_font_family(text)
|
|
36
|
+
text.compile(canvas, x, y, w, h)
|
|
37
|
+
text.layout.set_width(w * Pango::SCALE)
|
|
38
|
+
text_x = x
|
|
39
|
+
text_y = canvas.height - slide.margin_bottom - slide.padding_bottom
|
|
40
|
+
text_y -= text.layout.pixel_size[1]
|
|
41
|
+
canvas.draw_layout(text.layout, text_x, text_y, @footer_comment_color)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
[x, y, w, h]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
proc_name = "image"
|
|
2
2
|
|
|
3
|
-
@image_frame_width
|
|
3
|
+
@image_frame_width ||= 1
|
|
4
|
+
@image_caption_font_size ||= @normal_font_size
|
|
4
5
|
|
|
5
6
|
match("**", Image) do |images|
|
|
6
7
|
|
|
@@ -49,7 +50,7 @@ match("**", Image) do |images|
|
|
|
49
50
|
image.add_post_draw_proc(proc_name) do |canvas, x, y, w, h, simulation|
|
|
50
51
|
if simulation
|
|
51
52
|
caption = Text.new(image.caption)
|
|
52
|
-
caption.prop_set("size", @
|
|
53
|
+
caption.prop_set("size", @image_caption_font_size)
|
|
53
54
|
set_font_family(caption)
|
|
54
55
|
if image.horizontal_centering
|
|
55
56
|
caption.do_horizontal_centering(canvas, x, y, w, h)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@abstract = N_("Toolkit to set background color of each slide")
|
|
4
4
|
@description = N_("Set background color of each slide.\n" \
|
|
5
5
|
"\n" \
|
|
6
|
-
"Each
|
|
6
|
+
"Each color is specified as a slide property:\n" \
|
|
7
7
|
" = target slide\n" \
|
|
8
8
|
" \n" \
|
|
9
9
|
" ...\n" \
|
|
@@ -6,12 +6,13 @@ proc_name = "slide-number"
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
@slide_number_color || nil
|
|
9
|
+
@slide_number_position ||= :bottom
|
|
9
10
|
|
|
10
11
|
match(Slide) do |slides|
|
|
11
12
|
slides.delete_post_draw_proc_by_name(proc_name)
|
|
12
13
|
|
|
13
14
|
break if @slide_number_uninstall
|
|
14
|
-
|
|
15
|
+
|
|
15
16
|
slides.add_post_draw_proc(proc_name) do |slide, canvas, x, y, w, h, simulation|
|
|
16
17
|
unless simulation
|
|
17
18
|
text = Text.new("#{slide.index}/#{canvas.slide_size - 1}")
|
|
@@ -20,8 +21,13 @@ match(Slide) do |slides|
|
|
|
20
21
|
text.compile(canvas, x, y, w, h)
|
|
21
22
|
layout = text.layout
|
|
22
23
|
layout.set_width(w * Pango::SCALE)
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
case @slide_number_position
|
|
25
|
+
when :bottom
|
|
26
|
+
number_y = canvas.height - @margin_bottom - text.height
|
|
27
|
+
when :top
|
|
28
|
+
number_y = @margin_top
|
|
29
|
+
end
|
|
30
|
+
canvas.draw_layout(text.layout, x, number_y, @slide_number_color)
|
|
25
31
|
end
|
|
26
32
|
[x, y, w, h]
|
|
27
33
|
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
theme_exit unless display?
|
|
2
|
+
|
|
3
|
+
proc_name = "stream-comment"
|
|
4
|
+
|
|
5
|
+
@stream_comment_max_n_comments ||= 20
|
|
6
|
+
@stream_comment_n_moves_base ||= 150
|
|
7
|
+
@stream_comment_n_moves_fluctuation ||= 150
|
|
8
|
+
|
|
9
|
+
match(SlideElement) do |slides|
|
|
10
|
+
slides.delete_post_draw_proc_by_name(proc_name)
|
|
11
|
+
canvas.delete_on_comment_proc_by_name(proc_name)
|
|
12
|
+
|
|
13
|
+
break if @stream_comment_uninstall
|
|
14
|
+
|
|
15
|
+
stream_comments = []
|
|
16
|
+
canvas.on_comment(proc_name) do |comment|
|
|
17
|
+
text = Text.new(ERB::Util.h(comment.strip.gsub("\n", " ")))
|
|
18
|
+
set_font_family(text)
|
|
19
|
+
text.font(:size => (@normal_font_size * rand).ceil)
|
|
20
|
+
text.compile(canvas, 0, 0, canvas.width, canvas.height)
|
|
21
|
+
color = "\#%02x%02x%02x%02x" %
|
|
22
|
+
[rand(256), rand(256), rand(256), 128 + rand(128)]
|
|
23
|
+
width, height = text.layout.pixel_size
|
|
24
|
+
stream_comment = {
|
|
25
|
+
:text => text,
|
|
26
|
+
:color => color,
|
|
27
|
+
:x => canvas.width,
|
|
28
|
+
:y => ((canvas.height - height) * rand).ceil,
|
|
29
|
+
:terminate => false,
|
|
30
|
+
}
|
|
31
|
+
stream_comments << stream_comment
|
|
32
|
+
if stream_comments.size > @stream_comment_max_n_comments
|
|
33
|
+
oldest_stream_comments = stream_comments.shift
|
|
34
|
+
oldest_stream_comments[:terminate] = true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
n = @stream_comment_n_moves_base + rand(@stream_comment_n_moves_fluctuation)
|
|
38
|
+
delta = (canvas.width + width) / n.to_f
|
|
39
|
+
GLib::Timeout.add(1000 / 50) do
|
|
40
|
+
stream_comment[:x] -= delta
|
|
41
|
+
n -= 1
|
|
42
|
+
stream_comment[:terminate] = true if n.zero?
|
|
43
|
+
keep_callback = !stream_comment[:terminate]
|
|
44
|
+
unless keep_callback
|
|
45
|
+
stream_comments.reject! do |_stream_comment|
|
|
46
|
+
_stream_comment == stream_comment
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
canvas.activate("Redraw")
|
|
50
|
+
keep_callback
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
redraw_time = Time.now
|
|
55
|
+
slides.add_post_draw_proc(proc_name) do |slide, canvas, x, y, w, h, simulation|
|
|
56
|
+
unless simulation
|
|
57
|
+
stream_comments.each do |stream_comment|
|
|
58
|
+
canvas.draw_layout(stream_comment[:text].layout,
|
|
59
|
+
stream_comment[:x],
|
|
60
|
+
stream_comment[:y],
|
|
61
|
+
stream_comment[:color])
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
[x, y, w, h]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
if @title_background_image.nil?
|
|
2
|
-
theme_exit("must specify @title_background_image!!")
|
|
3
|
-
end
|
|
4
|
-
|
|
5
1
|
@title_background_image_properties ||= {}
|
|
6
2
|
default_title_backgroud_image_properties = {
|
|
7
3
|
"as_large_as_possible" => true,
|
|
@@ -17,8 +13,13 @@ match(TitleSlide) do |slides|
|
|
|
17
13
|
value = value.to_s if value.is_a?(Symbol)
|
|
18
14
|
image_properties[key.to_s.gsub(/-/, "_")] = value
|
|
19
15
|
end
|
|
16
|
+
background_image = slide["background-image"] || @title_background_image
|
|
17
|
+
if background_image.nil?
|
|
18
|
+
theme_exit("must specify 'background-image' slide property or " \
|
|
19
|
+
"@title_background_image!!")
|
|
20
|
+
end
|
|
20
21
|
properties = {
|
|
21
|
-
:file_name => find_file(
|
|
22
|
+
:file_name => find_file(background_image),
|
|
22
23
|
:proc_name => "title-background-image",
|
|
23
24
|
:properties => image_properties,
|
|
24
25
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
theme_exit unless display?
|
|
2
|
+
|
|
3
|
+
@twitter_footer_color ||= @default_foreground
|
|
4
|
+
if !defined?(@twitter_footer_filters) or @twitter_footer_filters.nil?
|
|
5
|
+
theme_exit("must specify @twitter_footer_filters!! as " +
|
|
6
|
+
"array of keyword: ['keyword1', 'keyword1', ...])")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
canvas.twitter.close
|
|
10
|
+
theme_exit if @twitter_footer_uninstall
|
|
11
|
+
|
|
12
|
+
canvas.twitter.start(@twitter_footer_filters) do |status|
|
|
13
|
+
tweet = "@#{status['user']['screen_name']}: #{status['text']}"
|
|
14
|
+
canvas.append_comment(tweet)
|
|
15
|
+
end
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
require 'shellwords'
|
|
2
|
+
require 'pathname'
|
|
3
|
+
|
|
4
|
+
module Rabbit
|
|
5
|
+
class Twitter
|
|
6
|
+
CONSUMER_KEY = "wT9WSC0afRw94fxUw0iIKw"
|
|
7
|
+
CONSUMER_SECRET = "mwY35vfQfmWde9lZbyNNB15QzCq3k2VwGj3X1IAkQ8"
|
|
8
|
+
|
|
9
|
+
def initialize(logger)
|
|
10
|
+
@logger = logger
|
|
11
|
+
@oauth_parameters = nil
|
|
12
|
+
@config_file_path = Pathname.new("~/.rabbit/twitter-oauth.yaml")
|
|
13
|
+
@config_file_path = @config_file_path.expand_path
|
|
14
|
+
@listeners = []
|
|
15
|
+
@connection = nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def register_listener(&block)
|
|
19
|
+
@listeners << block
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def setup
|
|
23
|
+
return unless @oauth_parameters.nil?
|
|
24
|
+
require 'yaml'
|
|
25
|
+
require 'twitter_oauth'
|
|
26
|
+
setup_access_token unless @config_file_path.exist?
|
|
27
|
+
oauth_access_parameters = YAML.load(@config_file_path.read)
|
|
28
|
+
@oauth_parameters = {
|
|
29
|
+
:consumer_key => CONSUMER_KEY,
|
|
30
|
+
:consumer_secret => CONSUMER_SECRET,
|
|
31
|
+
:access_key => oauth_access_parameters[:access_token],
|
|
32
|
+
:access_secret => oauth_access_parameters[:access_secret],
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def close
|
|
37
|
+
return if @connection.nil?
|
|
38
|
+
@connection.close
|
|
39
|
+
@connection = nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def start(*filters, &block)
|
|
43
|
+
register_listener(&block) if block_given?
|
|
44
|
+
setup if @oauth_parameters.nil?
|
|
45
|
+
require 'socket'
|
|
46
|
+
require 'twitter/json_stream'
|
|
47
|
+
stream_options = {
|
|
48
|
+
:oauth => @oauth_parameters,
|
|
49
|
+
:user_agent => "Rabitter #{Rabbit::VERSION}",
|
|
50
|
+
:host => "stream.twitter.com",
|
|
51
|
+
:path => "/1/statuses/filter.json",
|
|
52
|
+
:method => "POST",
|
|
53
|
+
:filters => filters,
|
|
54
|
+
}
|
|
55
|
+
@stream = ::Twitter::JSONStream.new(:signature, stream_options)
|
|
56
|
+
@connection = GLibConnection.new(@logger, @stream, stream_options)
|
|
57
|
+
|
|
58
|
+
@stream.each_item do |item|
|
|
59
|
+
status = JSON.parse(item)
|
|
60
|
+
@listeners.each do |listener|
|
|
61
|
+
listener.call(status)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@stream.on_error do |message|
|
|
66
|
+
@logger.error("[twitter] #{message}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
@stream.on_reconnect do |timeout, retries|
|
|
70
|
+
@logger.info("[twitter][reconnect] #{timeout} seconds (#{retries})")
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
@stream.on_max_reconnects do |timeout, retries|
|
|
74
|
+
@logger.info("[twitter][max-reconnects] " +
|
|
75
|
+
"Failed after #{retries} failed reconnects")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
@connection.connect
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
def setup_access_token
|
|
83
|
+
FileUtils.mkdir_p(@config_file_path.dirname)
|
|
84
|
+
oauth_options = {
|
|
85
|
+
:consumer_key => CONSUMER_KEY,
|
|
86
|
+
:consumer_secret => CONSUMER_SECRET,
|
|
87
|
+
:proxy => ENV["http_proxy"],
|
|
88
|
+
}
|
|
89
|
+
client = TwitterOAuth::Client.new(oauth_options)
|
|
90
|
+
request_token = client.request_token
|
|
91
|
+
puts "1) Access this URL: #{request_token.authorize_url}"
|
|
92
|
+
print "2) Enter the PIN: "
|
|
93
|
+
pin = STDIN.gets.strip
|
|
94
|
+
access_token = request_token.get_access_token(:oauth_verifier => pin)
|
|
95
|
+
oauth_parameters = {
|
|
96
|
+
:access_token => access_token.token,
|
|
97
|
+
:access_secret => access_token.secret,
|
|
98
|
+
}
|
|
99
|
+
@config_file_path.open("w") do |config_file|
|
|
100
|
+
config_file.chmod(0600)
|
|
101
|
+
config_file.puts(YAML.dump(oauth_parameters))
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class GLibConnection
|
|
106
|
+
def initialize(logger, handler, options)
|
|
107
|
+
@logger = logger
|
|
108
|
+
@options = options
|
|
109
|
+
@handler = handler
|
|
110
|
+
@socket = nil
|
|
111
|
+
@channel = nil
|
|
112
|
+
@source_ids = []
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def connect
|
|
116
|
+
close
|
|
117
|
+
@socket = TCPSocket.new(@options[:host], "http")
|
|
118
|
+
@channel = GLib::IOChannel.new(@socket.fileno)
|
|
119
|
+
@channel.flags = GLib::IOChannel::FLAG_NONBLOCK
|
|
120
|
+
reader_id = @channel.add_watch(GLib::IOChannel::IN) do |io, condition|
|
|
121
|
+
@logger.debug("[twitter][read][start]")
|
|
122
|
+
data = io.read(4096)
|
|
123
|
+
@logger.debug("[twitter][read][done] #{data.bytesize}")
|
|
124
|
+
if data.empty?
|
|
125
|
+
@source_ids.reject! {|id| id == reader_id}
|
|
126
|
+
@logger.debug("[twitter][read][eof]")
|
|
127
|
+
false
|
|
128
|
+
else
|
|
129
|
+
@handler.receive_data(data)
|
|
130
|
+
true
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
@source_ids << reader_id
|
|
134
|
+
error_id = @channel.add_watch(GLib::IOChannel::ERR) do |io, condition|
|
|
135
|
+
@handler.receive_error(condition)
|
|
136
|
+
true
|
|
137
|
+
end
|
|
138
|
+
@source_ids << error_id
|
|
139
|
+
@handler.extend(GLibAdapter)
|
|
140
|
+
@handler.connection = self
|
|
141
|
+
@handler.connection_completed
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def send_data(data)
|
|
145
|
+
rest = data.bytesize
|
|
146
|
+
writer_id = @channel.add_watch(GLib::IOChannel::OUT) do |io, condition|
|
|
147
|
+
if rest.zero?
|
|
148
|
+
@logger.debug("[twitter][flush][start]")
|
|
149
|
+
@channel.flush
|
|
150
|
+
@logger.debug("[twitter][flush][done]")
|
|
151
|
+
@source_ids.reject! {|id| id == writer_id}
|
|
152
|
+
false
|
|
153
|
+
else
|
|
154
|
+
@logger.debug("[twitter][write][start]")
|
|
155
|
+
written_size = @channel.write(data)
|
|
156
|
+
if written_size.is_a?(Numeric)
|
|
157
|
+
@logger.debug("[twitter][write][done] #{written_size}")
|
|
158
|
+
rest -= written_size
|
|
159
|
+
data[0, written_size] = ""
|
|
160
|
+
else
|
|
161
|
+
# for Ruby/GLib2 < 0.90.9
|
|
162
|
+
rest = 0
|
|
163
|
+
data.replace("")
|
|
164
|
+
end
|
|
165
|
+
true
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
@source_ids << writer_id
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def close
|
|
172
|
+
return if @socket.nil?
|
|
173
|
+
@source_ids.reject! do |id|
|
|
174
|
+
GLib::Source.remove(id)
|
|
175
|
+
true
|
|
176
|
+
end
|
|
177
|
+
@channel = nil
|
|
178
|
+
@socket.close
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def reconnect(options={})
|
|
182
|
+
close
|
|
183
|
+
after = options[:after] || 0
|
|
184
|
+
if after.zero?
|
|
185
|
+
connect
|
|
186
|
+
else
|
|
187
|
+
id = GLib::Timeout.add(after) do
|
|
188
|
+
connect
|
|
189
|
+
false
|
|
190
|
+
end
|
|
191
|
+
@source_ids << id
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
module GLibAdapter
|
|
197
|
+
attr_accessor :connection
|
|
198
|
+
def send_data(data)
|
|
199
|
+
@connection.send_data(data)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def reconnect_after(timeout)
|
|
203
|
+
@reconnect_callback.call(timeout, @reconnect_retries) if @reconnect_callback
|
|
204
|
+
@connection.reconnect(:after => timeout)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def reconnect(server, port)
|
|
208
|
+
@connection.reconnect
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def close_connection
|
|
212
|
+
@connection.close
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|