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.
Files changed (345) hide show
  1. data/Gemfile +16 -0
  2. data/README +1 -0
  3. data/Rakefile +161 -53
  4. data/TODO +2 -0
  5. data/bin/rabbit +78 -34
  6. data/bin/rabbit-command +16 -3
  7. data/bin/rabbiter +74 -73
  8. data/bin/rabrick +17 -4
  9. data/bin/rabwii +77 -0
  10. data/data/rabbit/image/dark-gradation-images/background-gradation.png +0 -0
  11. data/data/rabbit/image/dark-gradation-images/dark-gradation-images.rb +2 -0
  12. data/data/rabbit/image/dark-gradation-images/property.rb +4 -0
  13. data/doc/_config.yml +2 -0
  14. data/doc/_layouts/en.html +37 -0
  15. data/doc/_layouts/ja.html +37 -0
  16. data/doc/_layouts/skeleton.html +91 -0
  17. data/doc/_plugins/converters/hiki.rb +27 -0
  18. data/doc/_plugins/converters/rd.rb +73 -0
  19. data/doc/_site/css/jquery-ui/themes/ui-lightness.css +573 -0
  20. data/doc/_site/css/rabbit.css +247 -0
  21. data/doc/_site/en/development.html +140 -0
  22. data/doc/_site/en/faq.html +117 -0
  23. data/doc/_site/en/hiki.html +420 -0
  24. data/doc/_site/en/how-to-make/hiki.html +113 -0
  25. data/doc/_site/en/how-to-make/index.html +135 -0
  26. data/doc/_site/en/how-to-make/pdf.html +111 -0
  27. data/doc/_site/en/how-to-make/rd.html +151 -0
  28. data/doc/_site/en/how-to-make/theme.html +249 -0
  29. data/doc/_site/en/index.html +343 -0
  30. data/doc/_site/en/install/homebrew.html +279 -0
  31. data/doc/_site/en/install/index.html +144 -0
  32. data/doc/_site/en/install/macports.html +158 -0
  33. data/doc/_site/en/install/windows.html +200 -0
  34. data/doc/_site/en/news.html +928 -0
  35. data/doc/_site/en/rd.html +555 -0
  36. data/doc/_site/en/sample/hiki/rabbit.html +380 -0
  37. data/doc/_site/en/sample/index.html +117 -0
  38. data/doc/_site/en/sample/rd/rabbit.html +572 -0
  39. data/doc/_site/en/slides.html +113 -0
  40. data/doc/_site/en/usage.html +445 -0
  41. data/doc/_site/en/users.html +127 -0
  42. data/doc/_site/favicon.ico +0 -0
  43. data/doc/_site/favicon.png +0 -0
  44. data/doc/_site/images/background-sample.svg +290 -0
  45. data/doc/_site/images/background.png +0 -0
  46. data/doc/_site/images/background.svg +131 -0
  47. data/doc/_site/images/hare-and-tortoise.png +0 -0
  48. data/doc/_site/images/hare-and-tortoise.svg +541 -0
  49. data/doc/_site/images/jp.png +0 -0
  50. data/{sample/momo/usako/usako_psd_100.png → doc/_site/images/lavie-icon.png} +0 -0
  51. data/doc/_site/images/lavie.png +0 -0
  52. data/doc/_site/images/screenshots/en/blue-circle-raw.png +0 -0
  53. data/doc/_site/images/screenshots/en/blue-circle.png +0 -0
  54. data/doc/_site/images/screenshots/en/clear-blue-raw.png +0 -0
  55. data/doc/_site/images/screenshots/en/clear-blue.png +0 -0
  56. data/doc/_site/images/screenshots/en/cozmixng-raw.png +0 -0
  57. data/doc/_site/images/screenshots/en/cozmixng.png +0 -0
  58. data/doc/_site/images/screenshots/en/dark-gradation-raw.png +0 -0
  59. data/doc/_site/images/screenshots/en/dark-gradation.png +0 -0
  60. data/doc/_site/images/screenshots/en/day-white-raw.png +0 -0
  61. data/doc/_site/images/screenshots/en/day-white.png +0 -0
  62. data/doc/_site/images/screenshots/en/debian-raw.png +0 -0
  63. data/doc/_site/images/screenshots/en/debian.png +0 -0
  64. data/doc/_site/images/screenshots/en/green-circle-raw.png +0 -0
  65. data/doc/_site/images/screenshots/en/green-circle.png +0 -0
  66. data/doc/_site/images/screenshots/en/night-black-raw.png +0 -0
  67. data/doc/_site/images/screenshots/en/night-black.png +0 -0
  68. data/doc/_site/images/screenshots/en/rabbit-raw.png +0 -0
  69. data/doc/_site/images/screenshots/en/rabbit.png +0 -0
  70. data/doc/_site/images/screenshots/en/ranguba-raw.png +0 -0
  71. data/doc/_site/images/screenshots/en/ranguba.png +0 -0
  72. data/doc/_site/images/screenshots/en/red-frame-raw.png +0 -0
  73. data/doc/_site/images/screenshots/en/red-frame.png +0 -0
  74. data/doc/_site/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  75. data/doc/_site/images/screenshots/en/ruby-gnome2.png +0 -0
  76. data/doc/_site/images/screenshots/ja/blue-circle-raw.png +0 -0
  77. data/doc/_site/images/screenshots/ja/blue-circle.png +0 -0
  78. data/doc/_site/images/screenshots/ja/clear-blue-raw.png +0 -0
  79. data/doc/_site/images/screenshots/ja/clear-blue.png +0 -0
  80. data/doc/_site/images/screenshots/ja/cozmixng-raw.png +0 -0
  81. data/doc/_site/images/screenshots/ja/cozmixng.png +0 -0
  82. data/doc/_site/images/screenshots/ja/dark-gradation-raw.png +0 -0
  83. data/doc/_site/images/screenshots/ja/dark-gradation.png +0 -0
  84. data/doc/_site/images/screenshots/ja/day-white-raw.png +0 -0
  85. data/doc/_site/images/screenshots/ja/day-white.png +0 -0
  86. data/doc/_site/images/screenshots/ja/debian-raw.png +0 -0
  87. data/doc/_site/images/screenshots/ja/debian.png +0 -0
  88. data/doc/_site/images/screenshots/ja/green-circle-raw.png +0 -0
  89. data/doc/_site/images/screenshots/ja/green-circle.png +0 -0
  90. data/doc/_site/images/screenshots/ja/night-black-raw.png +0 -0
  91. data/doc/_site/images/screenshots/ja/night-black.png +0 -0
  92. data/doc/_site/images/screenshots/ja/rabbit-raw.png +0 -0
  93. data/doc/_site/images/screenshots/ja/rabbit.png +0 -0
  94. data/doc/_site/images/screenshots/ja/ranguba-raw.png +0 -0
  95. data/doc/_site/images/screenshots/ja/ranguba.png +0 -0
  96. data/doc/_site/images/screenshots/ja/red-frame-raw.png +0 -0
  97. data/doc/_site/images/screenshots/ja/red-frame.png +0 -0
  98. data/doc/_site/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  99. data/doc/_site/images/screenshots/ja/ruby-gnome2.png +0 -0
  100. data/doc/_site/images/us.png +0 -0
  101. data/doc/_site/index.html.en +122 -0
  102. data/doc/_site/index.html.ja +122 -0
  103. data/doc/_site/ja/about.html +120 -0
  104. data/doc/_site/ja/development.html +141 -0
  105. data/doc/_site/ja/faq.html +232 -0
  106. data/doc/_site/ja/hiki.html +416 -0
  107. data/doc/_site/ja/how-to-make/hiki.html +113 -0
  108. data/doc/_site/ja/how-to-make/index.html +135 -0
  109. data/doc/_site/ja/how-to-make/pdf.html +112 -0
  110. data/doc/_site/ja/how-to-make/rd.html +161 -0
  111. data/doc/_site/ja/how-to-make/theme.html +254 -0
  112. data/doc/_site/ja/index.html +351 -0
  113. data/doc/_site/ja/install/homebrew.html +279 -0
  114. data/doc/_site/ja/install/index.html +146 -0
  115. data/doc/_site/ja/install/macports.html +177 -0
  116. data/doc/_site/ja/install/windows.html +200 -0
  117. data/doc/_site/ja/news.html +926 -0
  118. data/doc/_site/ja/rd.html +565 -0
  119. data/doc/_site/ja/sample/hiki/rabbit.html +390 -0
  120. data/doc/_site/ja/sample/index.html +117 -0
  121. data/doc/_site/ja/sample/rd/rabbit.html +580 -0
  122. data/doc/_site/ja/slides.html +142 -0
  123. data/doc/_site/ja/usage.html +458 -0
  124. data/doc/_site/ja/users.html +331 -0
  125. data/doc/_site/javascripts/jquery-ui.js +11544 -0
  126. data/doc/_site/javascripts/jquery.js +7179 -0
  127. data/doc/_site/screenshot.en.rab +10 -0
  128. data/doc/_site/screenshot.ja.rab +10 -0
  129. data/doc/css/jquery-ui/themes/ui-lightness.css +573 -0
  130. data/doc/css/rabbit.css +247 -0
  131. data/doc/en/development.rd +50 -0
  132. data/doc/en/faq.rd +18 -0
  133. data/doc/en/hiki.hiki +325 -0
  134. data/doc/en/how-to-make/hiki.hiki +9 -0
  135. data/doc/en/how-to-make/index.rd +25 -0
  136. data/doc/en/how-to-make/pdf.rd +7 -0
  137. data/doc/en/how-to-make/rd.rd +66 -0
  138. data/doc/en/how-to-make/theme.rd +135 -0
  139. data/doc/en/index.rd +276 -0
  140. data/doc/en/install/homebrew.rd +196 -0
  141. data/doc/en/install/index.rd +63 -0
  142. data/doc/en/install/macports.rd +77 -0
  143. data/doc/en/install/windows.rd +103 -0
  144. data/{NEWS.en → doc/en/news.rd} +78 -3
  145. data/doc/en/rd.rd +481 -0
  146. data/doc/en/sample/hiki/rabbit.hiki +389 -0
  147. data/doc/en/sample/index.rd +11 -0
  148. data/doc/en/sample/rd/rabbit.rd +467 -0
  149. data/doc/en/slides.rd +7 -0
  150. data/doc/en/usage.rd +365 -0
  151. data/doc/en/users.rd +29 -0
  152. data/doc/favicon.ico +0 -0
  153. data/doc/favicon.png +0 -0
  154. data/doc/images/background-sample.svg +290 -0
  155. data/doc/images/background.png +0 -0
  156. data/doc/images/background.svg +131 -0
  157. data/doc/images/hare-and-tortoise.png +0 -0
  158. data/doc/images/hare-and-tortoise.svg +541 -0
  159. data/doc/images/jp.png +0 -0
  160. data/doc/images/lavie-icon.png +0 -0
  161. data/doc/images/lavie.png +0 -0
  162. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  163. data/doc/images/screenshots/en/blue-circle.png +0 -0
  164. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  165. data/doc/images/screenshots/en/clear-blue.png +0 -0
  166. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  167. data/doc/images/screenshots/en/cozmixng.png +0 -0
  168. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  169. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  170. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  171. data/doc/images/screenshots/en/day-white.png +0 -0
  172. data/doc/images/screenshots/en/debian-raw.png +0 -0
  173. data/doc/images/screenshots/en/debian.png +0 -0
  174. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  175. data/doc/images/screenshots/en/green-circle.png +0 -0
  176. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  177. data/doc/images/screenshots/en/night-black.png +0 -0
  178. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  179. data/doc/images/screenshots/en/rabbit.png +0 -0
  180. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  181. data/doc/images/screenshots/en/ranguba.png +0 -0
  182. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  183. data/doc/images/screenshots/en/red-frame.png +0 -0
  184. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  185. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  186. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  187. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  188. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  189. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  190. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  191. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  192. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  193. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  194. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  195. data/doc/images/screenshots/ja/day-white.png +0 -0
  196. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  197. data/doc/images/screenshots/ja/debian.png +0 -0
  198. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  199. data/doc/images/screenshots/ja/green-circle.png +0 -0
  200. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  201. data/doc/images/screenshots/ja/night-black.png +0 -0
  202. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  203. data/doc/images/screenshots/ja/rabbit.png +0 -0
  204. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  205. data/doc/images/screenshots/ja/ranguba.png +0 -0
  206. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  207. data/doc/images/screenshots/ja/red-frame.png +0 -0
  208. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  209. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  210. data/doc/images/us.png +0 -0
  211. data/doc/index.html.en +48 -0
  212. data/doc/index.html.ja +48 -0
  213. data/doc/ja/about.rd +21 -0
  214. data/doc/ja/development.rd +49 -0
  215. data/doc/ja/faq.rd +177 -0
  216. data/doc/ja/hiki.hiki +319 -0
  217. data/doc/ja/how-to-make/hiki.hiki +9 -0
  218. data/doc/ja/how-to-make/index.rd +25 -0
  219. data/doc/ja/how-to-make/pdf.rd +8 -0
  220. data/doc/ja/how-to-make/rd.rd +83 -0
  221. data/doc/ja/how-to-make/theme.rd +142 -0
  222. data/doc/ja/index.rd +283 -0
  223. data/doc/ja/install/homebrew.rd +196 -0
  224. data/doc/ja/install/index.rd +65 -0
  225. data/doc/ja/install/macports.rd +105 -0
  226. data/doc/ja/install/windows.rd +100 -0
  227. data/{NEWS.ja → doc/ja/news.rd} +84 -3
  228. data/doc/ja/rd.rd +489 -0
  229. data/doc/ja/sample/hiki/rabbit.hiki +405 -0
  230. data/doc/ja/sample/index.rd +11 -0
  231. data/doc/ja/sample/rd/rabbit.rd +475 -0
  232. data/doc/ja/slides.rd +29 -0
  233. data/doc/ja/usage.rd +380 -0
  234. data/doc/ja/users.rd +173 -0
  235. data/doc/javascripts/jquery-ui.js +11544 -0
  236. data/doc/javascripts/jquery.js +7179 -0
  237. data/doc/screenshot.en.rab +10 -0
  238. data/doc/screenshot.ja.rab +10 -0
  239. data/lib/rabbit/action/toggle.rb +0 -14
  240. data/lib/rabbit/canvas.rb +42 -46
  241. data/lib/rabbit/console.rb +9 -1
  242. data/lib/rabbit/front.rb +1 -1
  243. data/lib/rabbit/keys.rb +0 -8
  244. data/lib/rabbit/logger/gui.rb +3 -5
  245. data/lib/rabbit/parser/pdf.rb +1 -1
  246. data/lib/rabbit/parser/wiki/output.rb +17 -1
  247. data/lib/rabbit/rabbit.rb +12 -1
  248. data/lib/rabbit/renderer/base.rb +0 -25
  249. data/lib/rabbit/renderer/display/clutter-embed.rb +5 -69
  250. data/lib/rabbit/renderer/display/drawing-area.rb +0 -2
  251. data/lib/rabbit/renderer/display/key-handler.rb +0 -8
  252. data/lib/rabbit/source/base.rb +4 -0
  253. data/lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb +4 -8
  254. data/lib/rabbit/theme/clutter-comment/clutter-comment.rb +76 -0
  255. data/lib/rabbit/theme/clutter-comment/property.rb +3 -0
  256. data/lib/rabbit/theme/color-circle/color-circle.rb +3 -0
  257. data/lib/rabbit/theme/dark-gradation/dark-gradation.rb +187 -0
  258. data/lib/rabbit/theme/dark-gradation/property.rb +3 -0
  259. data/lib/rabbit/theme/debian/debian.rb +125 -145
  260. data/lib/rabbit/theme/default/default.rb +6 -0
  261. data/lib/rabbit/theme/footer-comment/footer-comment.rb +46 -0
  262. data/lib/rabbit/theme/footer-comment/property.rb +3 -0
  263. data/lib/rabbit/theme/image/image.rb +3 -2
  264. data/lib/rabbit/theme/per-slide-background-color/property.rb +1 -1
  265. data/lib/rabbit/theme/slide-number/slide-number.rb +9 -3
  266. data/lib/rabbit/theme/stream-comment/property.rb +3 -0
  267. data/lib/rabbit/theme/stream-comment/stream-comment.rb +66 -0
  268. data/lib/rabbit/theme/tag/property.rb +1 -1
  269. data/lib/rabbit/theme/title-background-image/title-background-image.rb +6 -5
  270. data/lib/rabbit/theme/twitter-comment/property.rb +4 -0
  271. data/lib/rabbit/theme/twitter-comment/twitter-comment.rb +15 -0
  272. data/lib/rabbit/twitter.rb +216 -0
  273. data/lib/rabbit/utils.rb +26 -0
  274. data/misc/emacs/README.ja +1 -1
  275. data/misc/emacs/rabbit-mode.el +1 -1
  276. data/po/en/rabbit.po +429 -267
  277. data/po/fr/rabbit.po +440 -268
  278. data/po/ja/rabbit.po +455 -270
  279. data/po/rabbit.pot +2567 -0
  280. data/sample/rabbit-en.hiki +384 -0
  281. data/sample/rabbit-en.rd +1 -1
  282. data/sample/rabbit-implementation.rd +1 -1
  283. data/sample/rabbit.hiki +85 -13
  284. data/sample/rabbit.rd +1 -1
  285. data/sample/theme-bench-en.hiki +100 -0
  286. data/sample/theme-bench.hiki +101 -0
  287. metadata +413 -118
  288. data/README.en +0 -850
  289. data/README.ja +0 -885
  290. data/bin/rabbit.bat +0 -8
  291. data/data/locale/en/LC_MESSAGES/rabbit.mo +0 -0
  292. data/data/locale/fr/LC_MESSAGES/rabbit.mo +0 -0
  293. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  294. data/lib/rabbit/comment-canvas.rb +0 -21
  295. data/lib/rabbit/comment/log.rb +0 -74
  296. data/lib/rabbit/renderer/display/comment-drawing-area.rb +0 -175
  297. data/lib/rabbit/renderer/display/comment.rb +0 -194
  298. data/lib/rabbit/theme/comment/comment.rb +0 -5
  299. data/lib/rabbit/theme/comment/property.rb +0 -3
  300. data/lib/rt/rt2html-lib.rb +0 -157
  301. data/lib/rt/rtparser.rb +0 -226
  302. data/lib/rt/rtvisitor.rb +0 -68
  303. data/lib/rwiki/soap/common.rb +0 -5
  304. data/lib/rwiki/soap/driver.rb +0 -43
  305. data/lib/rwiki/soap/servant.rb +0 -78
  306. data/sample/asahina/alice.png +0 -0
  307. data/sample/asahina/yukiusa.png +0 -0
  308. data/sample/momo/banner/bn1.png +0 -0
  309. data/sample/momo/banner/bn2.png +0 -0
  310. data/sample/momo/banner/bn_psd.psd +0 -0
  311. data/sample/momo/banner/bn_psd2.psd +0 -0
  312. data/sample/momo/tailavi/tailavi-ruby.png +0 -0
  313. data/sample/momo/tailavi/tailavi-ruby.psd +0 -0
  314. data/sample/momo/tailavi/tailavi-taiyaki.png +0 -0
  315. data/sample/momo/tailavi/tailavi-taiyaki.psd +0 -0
  316. data/sample/momo/tailavi/tailavi-yokubari.png +0 -0
  317. data/sample/momo/tailavi/tailavi-yokubari.psd +0 -0
  318. data/sample/momo/tailavi/taiyaki.png +0 -0
  319. data/sample/momo/tailavi/taiyaki.psd +0 -0
  320. data/sample/momo/usako/blue_dot.png +0 -0
  321. data/sample/momo/usako/green_dot.png +0 -0
  322. data/sample/momo/usako/rabbit.png +0 -0
  323. data/sample/momo/usako/rabbit_mimi.png +0 -0
  324. data/sample/momo/usako/rabbit_mimi2.png +0 -0
  325. data/sample/momo/usako/red_dot.png +0 -0
  326. data/sample/momo/usako/ruby.png +0 -0
  327. data/sample/momo/usako/ruby_new.png +0 -0
  328. data/sample/momo/usako/usa1.png +0 -0
  329. data/sample/momo/usako/usa2.png +0 -0
  330. data/sample/momo/usako/usa3.png +0 -0
  331. data/sample/momo/usako/usako_psd.psd +0 -0
  332. data/sample/momo/usako/usako_psd_200.png +0 -0
  333. data/sample/rabbit-balloon.eps +0 -233
  334. data/sample/sode/kame-color.riff +0 -0
  335. data/sample/sode/kame.riff +0 -0
  336. data/sample/usatti/kame-taro.png +0 -0
  337. data/sample/usatti/rabbit-pink-logo.png +0 -0
  338. data/sample/usatti/rabbit-pink-logo2.png +0 -0
  339. data/sample/usatti/ruby-pink-circle-logo.png +0 -0
  340. data/sample/usatti/ruby-pink-circle.png +0 -0
  341. data/sample/usatti/ruby-pink-polygon-logo.png +0 -0
  342. data/sample/usatti/ruby-pink-polygon.png +0 -0
  343. data/sample/usatti/tanu-kitaro.png +0 -0
  344. data/sample/usatti/usa-taro.png +0 -0
  345. 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
@@ -0,0 +1,3 @@
1
+ @category = N_("Comment")
2
+ @title = N_("Footer Comment")
3
+ @description = N_("Show comment on the footer.")
@@ -1,6 +1,7 @@
1
1
  proc_name = "image"
2
2
 
3
- @image_frame_width = 1
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", @normal_font_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 image is specified as a slide property:\n" \
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
- num_y = canvas.height - @margin_bottom - text.height
24
- canvas.draw_layout(text.layout, x, num_y, @slide_number_color)
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,3 @@
1
+ @category = N_("Comment")
2
+ @title = N_("Stream Comment")
3
+ @description = N_("Stream comments on canvas.")
@@ -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,4 +1,4 @@
1
1
  @category = N_("Toolkit")
2
2
  @title = N_("Tag")
3
3
  @abstract = N_("Toolkit to apply custom tag")
4
- @description = N_("Applyes custom tag style.")
4
+ @description = N_("Applies custom tag style.")
@@ -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(@title_background_image),
22
+ :file_name => find_file(background_image),
22
23
  :proc_name => "title-background-image",
23
24
  :properties => image_properties,
24
25
  }
@@ -0,0 +1,4 @@
1
+ @category = N_("Comment")
2
+ @title = N_("Twitter Comment")
3
+ @abstract = N_("Get comments from Twitter TL.")
4
+ @description = N_("Get comments from Twitter TL.")
@@ -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