rabbit 3.0.0 → 3.0.2

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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -1
  3. data/data/locale/en/LC_MESSAGES/rabbit.mo +0 -0
  4. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  5. data/doc/_config.yml +2 -2
  6. data/doc/_layouts/skeleton.html +0 -7
  7. data/doc/en/faq.rd +4 -2
  8. data/doc/en/install/homebrew.rd +8 -13
  9. data/doc/en/news.rd +158 -0
  10. data/doc/en/sample/hiki/rabbit.hiki +0 -4
  11. data/doc/en/sample/rd/rabbit.rd +0 -4
  12. data/doc/en/usage/rabbit-slide.rd +3 -3
  13. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  14. data/doc/images/screenshots/en/blue-circle.png +0 -0
  15. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  16. data/doc/images/screenshots/en/clear-blue.png +0 -0
  17. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  18. data/doc/images/screenshots/en/cozmixng.png +0 -0
  19. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  20. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  21. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  22. data/doc/images/screenshots/en/day-white.png +0 -0
  23. data/doc/images/screenshots/en/debian-raw.png +0 -0
  24. data/doc/images/screenshots/en/debian.png +0 -0
  25. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  26. data/doc/images/screenshots/en/green-circle.png +0 -0
  27. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  28. data/doc/images/screenshots/en/night-black.png +0 -0
  29. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  30. data/doc/images/screenshots/en/rabbit.png +0 -0
  31. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  32. data/doc/images/screenshots/en/ranguba.png +0 -0
  33. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  34. data/doc/images/screenshots/en/red-frame.png +0 -0
  35. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  36. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  37. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  38. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  39. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  40. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  41. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  42. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  43. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  44. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  45. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  46. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  47. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  48. data/doc/images/screenshots/ja/day-white.png +0 -0
  49. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  50. data/doc/images/screenshots/ja/debian.png +0 -0
  51. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  52. data/doc/images/screenshots/ja/green-circle.png +0 -0
  53. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  54. data/doc/images/screenshots/ja/night-black.png +0 -0
  55. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  56. data/doc/images/screenshots/ja/rabbit.png +0 -0
  57. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  58. data/doc/images/screenshots/ja/ranguba.png +0 -0
  59. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  60. data/doc/images/screenshots/ja/red-frame.png +0 -0
  61. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  62. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  63. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  64. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  65. data/doc/index.html.en +1 -1
  66. data/doc/ja/faq.rd +2 -0
  67. data/doc/ja/install/homebrew.rd +8 -12
  68. data/doc/ja/news.rd +157 -0
  69. data/doc/ja/sample/hiki/rabbit.hiki +0 -4
  70. data/doc/ja/sample/rd/rabbit.rd +0 -4
  71. data/doc/ja/usage/rabbit-slide.rd +3 -3
  72. data/doc/ja/users.rd +7 -0
  73. data/lib/rabbit/action/toggle.rb +7 -0
  74. data/lib/rabbit/author-configuration.rb +3 -4
  75. data/lib/rabbit/canvas.rb +18 -6
  76. data/lib/rabbit/command/rabbit-slide.rb +59 -1
  77. data/lib/rabbit/command/rabbit-slide.ui +127 -49
  78. data/lib/rabbit/command/rabbit.rb +5 -9
  79. data/lib/rabbit/element/base.rb +1 -5
  80. data/lib/rabbit/element/image.rb +139 -89
  81. data/lib/rabbit/element/video.rb +3 -11
  82. data/lib/rabbit/error.rb +9 -3
  83. data/lib/rabbit/formatter.rb +1 -1
  84. data/lib/rabbit/frame.rb +102 -4
  85. data/lib/rabbit/gem-pusher.rb +29 -6
  86. data/lib/rabbit/image/base.rb +163 -28
  87. data/lib/rabbit/image/dia.rb +21 -14
  88. data/lib/rabbit/image/mermaid.rb +73 -0
  89. data/lib/rabbit/image/pdf.rb +22 -9
  90. data/lib/rabbit/image/svg.rb +1 -4
  91. data/lib/rabbit/image.rb +6 -6
  92. data/lib/rabbit/info-window.rb +106 -80
  93. data/lib/rabbit/keys.rb +6 -0
  94. data/lib/rabbit/menu.rb +2 -0
  95. data/lib/rabbit/parser/base.rb +2 -1
  96. data/lib/rabbit/parser/ext/blockdiag.rb +16 -14
  97. data/lib/rabbit/parser/ext/charty.rb +58 -0
  98. data/lib/rabbit/parser/ext/image.rb +38 -10
  99. data/lib/rabbit/parser/markdown/converter.rb +36 -30
  100. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +33 -35
  101. data/lib/rabbit/parser/rd/ext/image.rb +23 -4
  102. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +3 -1
  103. data/lib/rabbit/parser/rd.rb +1 -1
  104. data/lib/rabbit/parser/wiki/output.rb +9 -9
  105. data/lib/rabbit/parser.rb +2 -2
  106. data/lib/rabbit/progress.rb +1 -1
  107. data/lib/rabbit/properties.rb +154 -0
  108. data/lib/rabbit/rabbit.rb +3 -1
  109. data/lib/rabbit/relative-size.rb +28 -0
  110. data/lib/rabbit/renderer/base.rb +6 -0
  111. data/lib/rabbit/renderer/display/drawing-area-base.rb +1 -2
  112. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +1 -0
  113. data/lib/rabbit/renderer/display/info.rb +6 -1
  114. data/lib/rabbit/renderer/display/key-handler.rb +27 -2
  115. data/lib/rabbit/renderer/engine/cairo.rb +24 -3
  116. data/lib/rabbit/renderer/screen.rb +0 -1
  117. data/lib/rabbit/slide-configuration.rb +16 -8
  118. data/lib/rabbit/task/slide.rb +6 -33
  119. data/lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb +38 -0
  120. data/lib/rabbit/theme/clear-blue/clear-blue.rb +4 -2
  121. data/lib/rabbit/theme/edge-info-toolkit/edge-info-toolkit.rb +12 -2
  122. data/lib/rabbit/theme/image/image.rb +3 -0
  123. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +8 -3
  124. data/lib/rabbit/theme/image-timer/image-timer.rb +8 -3
  125. data/lib/rabbit/theme/pdf/pdf.rb +1 -1
  126. data/lib/rabbit/theme/slide-footer-info/slide-footer-info.rb +2 -0
  127. data/lib/rabbit/theme/tag/tag.rb +9 -2
  128. data/lib/rabbit/theme-configuration.rb +3 -4
  129. data/lib/rabbit/utils.rb +25 -2
  130. data/lib/rabbit/version.rb +2 -2
  131. data/lib/rabbit/video-window.rb +14 -3
  132. data/{test/test-slideshare.rb → lib/rabbit/yaml-loader.rb} +20 -15
  133. data/po/en/rabbit.edit.po +123 -121
  134. data/po/en/rabbit.po +28 -26
  135. data/po/fr/rabbit.edit.po +122 -120
  136. data/po/fr/rabbit.po +27 -25
  137. data/po/ja/rabbit.edit.po +156 -125
  138. data/po/ja/rabbit.po +34 -30
  139. data/rabbit.gemspec +0 -1
  140. data/sample/can_rabbit.rd +0 -24
  141. data/sample/rabbit-en.hiki +0 -4
  142. data/sample/rabbit-en.md +13 -0
  143. data/sample/rabbit-en.rd +10 -4
  144. data/sample/rabbit.hiki +0 -4
  145. data/sample/rabbit.md +21 -0
  146. data/sample/rabbit.rd +20 -4
  147. data/test/command/test-rabbit.rb +1 -0
  148. data/test/parser/test-markdown.rb +2 -2
  149. data/test/test-slide-configuration.rb +4 -2
  150. metadata +30 -46
  151. data/doc/css/jquery-ui/themes/ui-lightness.css +0 -573
  152. data/doc/javascripts/jquery-ui.js +0 -11544
  153. data/doc/javascripts/jquery.js +0 -7179
  154. data/lib/rabbit/slideshare.rb +0 -192
@@ -1,29 +1,36 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <!-- Generated with glade 3.22.1 -->
2
+ <!-- Generated with glade 3.38.2 -->
3
3
  <interface>
4
4
  <requires lib="gtk+" version="3.20"/>
5
+ <object class="GtkAdjustment" id="slide-height-adjustment">
6
+ <property name="upper">4000</property>
7
+ <property name="step-increment">10</property>
8
+ <property name="page-increment">100</property>
9
+ </object>
10
+ <object class="GtkAdjustment" id="slide-width-adjustment">
11
+ <property name="upper">4000</property>
12
+ <property name="step-increment">10</property>
13
+ <property name="page-increment">100</property>
14
+ </object>
5
15
  <object class="GtkDialog" id="dialog">
6
- <property name="can_focus">False</property>
7
- <property name="type_hint">dialog</property>
8
- <child>
9
- <placeholder/>
10
- </child>
16
+ <property name="can-focus">False</property>
17
+ <property name="type-hint">dialog</property>
11
18
  <child internal-child="vbox">
12
19
  <object class="GtkBox">
13
- <property name="can_focus">False</property>
20
+ <property name="can-focus">False</property>
14
21
  <property name="orientation">vertical</property>
15
22
  <property name="spacing">2</property>
16
23
  <child internal-child="action_area">
17
24
  <object class="GtkButtonBox">
18
- <property name="can_focus">False</property>
19
- <property name="layout_style">end</property>
25
+ <property name="can-focus">False</property>
26
+ <property name="layout-style">end</property>
20
27
  <child>
21
28
  <object class="GtkButton" id="cancel-button">
22
29
  <property name="label">gtk-cancel</property>
23
30
  <property name="visible">True</property>
24
- <property name="can_focus">True</property>
25
- <property name="receives_default">True</property>
26
- <property name="use_stock">True</property>
31
+ <property name="can-focus">True</property>
32
+ <property name="receives-default">True</property>
33
+ <property name="use-stock">True</property>
27
34
  </object>
28
35
  <packing>
29
36
  <property name="expand">True</property>
@@ -35,9 +42,9 @@
35
42
  <object class="GtkButton" id="apply-button">
36
43
  <property name="label">gtk-apply</property>
37
44
  <property name="visible">True</property>
38
- <property name="can_focus">True</property>
39
- <property name="receives_default">True</property>
40
- <property name="use_stock">True</property>
45
+ <property name="can-focus">True</property>
46
+ <property name="receives-default">True</property>
47
+ <property name="use-stock">True</property>
41
48
  </object>
42
49
  <packing>
43
50
  <property name="expand">True</property>
@@ -55,90 +62,153 @@
55
62
  <child>
56
63
  <object class="GtkBox">
57
64
  <property name="visible">True</property>
58
- <property name="can_focus">False</property>
65
+ <property name="can-focus">False</property>
59
66
  <property name="orientation">vertical</property>
60
67
  <child>
61
68
  <object class="GtkFrame">
62
69
  <property name="visible">True</property>
63
- <property name="can_focus">False</property>
64
- <property name="label_xalign">0</property>
65
- <property name="shadow_type">none</property>
70
+ <property name="can-focus">False</property>
71
+ <property name="label-xalign">0</property>
72
+ <property name="shadow-type">none</property>
66
73
  <child>
67
74
  <object class="GtkAlignment">
68
75
  <property name="visible">True</property>
69
- <property name="can_focus">False</property>
70
- <property name="left_padding">12</property>
76
+ <property name="can-focus">False</property>
77
+ <property name="left-padding">12</property>
71
78
  <child>
79
+ <!-- n-columns=3 n-rows=5 -->
72
80
  <object class="GtkGrid">
73
81
  <property name="visible">True</property>
74
- <property name="can_focus">False</property>
82
+ <property name="can-focus">False</property>
75
83
  <child>
76
84
  <object class="GtkLabel">
77
85
  <property name="visible">True</property>
78
- <property name="can_focus">False</property>
86
+ <property name="can-focus">False</property>
79
87
  <property name="halign">end</property>
80
88
  <property name="label" translatable="yes">ID:</property>
81
89
  </object>
82
90
  <packing>
83
- <property name="left_attach">0</property>
84
- <property name="top_attach">0</property>
91
+ <property name="left-attach">0</property>
92
+ <property name="top-attach">0</property>
85
93
  </packing>
86
94
  </child>
87
95
  <child>
88
- <object class="GtkEntry" id="slide-id">
96
+ <object class="GtkLabel">
89
97
  <property name="visible">True</property>
90
- <property name="can_focus">True</property>
91
- <property name="placeholder_text" translatable="yes">rubykaigi2012</property>
98
+ <property name="can-focus">False</property>
99
+ <property name="halign">end</property>
100
+ <property name="label" translatable="yes">Base name:</property>
92
101
  </object>
93
102
  <packing>
94
- <property name="left_attach">1</property>
95
- <property name="top_attach">0</property>
103
+ <property name="left-attach">0</property>
104
+ <property name="top-attach">1</property>
96
105
  </packing>
97
106
  </child>
98
107
  <child>
99
108
  <object class="GtkLabel">
100
109
  <property name="visible">True</property>
101
- <property name="can_focus">False</property>
102
- <property name="halign">end</property>
103
- <property name="label" translatable="yes">Base name:</property>
110
+ <property name="can-focus">False</property>
111
+ <property name="label" translatable="yes">Markup language:</property>
104
112
  </object>
105
113
  <packing>
106
- <property name="left_attach">0</property>
107
- <property name="top_attach">1</property>
114
+ <property name="left-attach">0</property>
115
+ <property name="top-attach">2</property>
116
+ </packing>
117
+ </child>
118
+ <child>
119
+ <object class="GtkLabel">
120
+ <property name="visible">True</property>
121
+ <property name="can-focus">False</property>
122
+ <property name="label" translatable="yes">Height:</property>
123
+ </object>
124
+ <packing>
125
+ <property name="left-attach">0</property>
126
+ <property name="top-attach">4</property>
127
+ </packing>
128
+ </child>
129
+ <child>
130
+ <object class="GtkEntry" id="slide-id">
131
+ <property name="visible">True</property>
132
+ <property name="can-focus">True</property>
133
+ <property name="placeholder-text" translatable="yes">rubykaigi2012</property>
134
+ </object>
135
+ <packing>
136
+ <property name="left-attach">1</property>
137
+ <property name="top-attach">0</property>
108
138
  </packing>
109
139
  </child>
110
140
  <child>
111
141
  <object class="GtkEntry" id="slide-base-name">
112
142
  <property name="visible">True</property>
113
- <property name="can_focus">True</property>
114
- <property name="placeholder_text" translatable="yes">rabbit-introduction</property>
143
+ <property name="can-focus">True</property>
144
+ <property name="placeholder-text" translatable="yes">rabbit-introduction</property>
115
145
  </object>
116
146
  <packing>
117
- <property name="left_attach">1</property>
118
- <property name="top_attach">1</property>
147
+ <property name="left-attach">1</property>
148
+ <property name="top-attach">1</property>
149
+ </packing>
150
+ </child>
151
+ <child>
152
+ <object class="GtkComboBoxText" id="slide-markup-language">
153
+ <property name="visible">True</property>
154
+ <property name="can-focus">False</property>
155
+ </object>
156
+ <packing>
157
+ <property name="left-attach">1</property>
158
+ <property name="top-attach">2</property>
159
+ </packing>
160
+ </child>
161
+ <child>
162
+ <object class="GtkSpinButton" id="slide-height">
163
+ <property name="visible">True</property>
164
+ <property name="can-focus">True</property>
165
+ <property name="adjustment">slide-height-adjustment</property>
166
+ <property name="climb-rate">10</property>
167
+ <property name="numeric">True</property>
168
+ </object>
169
+ <packing>
170
+ <property name="left-attach">1</property>
171
+ <property name="top-attach">4</property>
119
172
  </packing>
120
173
  </child>
121
174
  <child>
122
175
  <object class="GtkLabel">
123
176
  <property name="visible">True</property>
124
- <property name="can_focus">False</property>
125
- <property name="label" translatable="yes">Markup language:</property>
177
+ <property name="can-focus">False</property>
178
+ <property name="label" translatable="yes">Width:</property>
126
179
  </object>
127
180
  <packing>
128
- <property name="left_attach">0</property>
129
- <property name="top_attach">2</property>
181
+ <property name="left-attach">0</property>
182
+ <property name="top-attach">3</property>
130
183
  </packing>
131
184
  </child>
132
185
  <child>
133
- <object class="GtkComboBoxText" id="slide-markup-language">
186
+ <object class="GtkSpinButton" id="slide-width">
134
187
  <property name="visible">True</property>
135
- <property name="can_focus">False</property>
188
+ <property name="can-focus">True</property>
189
+ <property name="adjustment">slide-width-adjustment</property>
190
+ <property name="climb-rate">10</property>
136
191
  </object>
137
192
  <packing>
138
- <property name="left_attach">1</property>
139
- <property name="top_attach">2</property>
193
+ <property name="left-attach">1</property>
194
+ <property name="top-attach">3</property>
140
195
  </packing>
141
196
  </child>
197
+ <child>
198
+ <placeholder/>
199
+ </child>
200
+ <child>
201
+ <placeholder/>
202
+ </child>
203
+ <child>
204
+ <placeholder/>
205
+ </child>
206
+ <child>
207
+ <placeholder/>
208
+ </child>
209
+ <child>
210
+ <placeholder/>
211
+ </child>
142
212
  </object>
143
213
  </child>
144
214
  </object>
@@ -146,7 +216,7 @@
146
216
  <child type="label">
147
217
  <object class="GtkLabel">
148
218
  <property name="visible">True</property>
149
- <property name="can_focus">False</property>
219
+ <property name="can-focus">False</property>
150
220
  <property name="label" translatable="yes">Slide information</property>
151
221
  </object>
152
222
  </child>
@@ -158,7 +228,15 @@
158
228
  </packing>
159
229
  </child>
160
230
  <child>
161
- <placeholder/>
231
+ <object class="GtkBox">
232
+ <property name="visible">True</property>
233
+ <property name="can-focus">False</property>
234
+ </object>
235
+ <packing>
236
+ <property name="expand">False</property>
237
+ <property name="fill">True</property>
238
+ <property name="position">1</property>
239
+ </packing>
162
240
  </child>
163
241
  <child>
164
242
  <placeholder/>
@@ -636,14 +636,10 @@ module Rabbit
636
636
  end
637
637
 
638
638
  def choose_source_file_by_dialog
639
- dialog = Gtk::FileChooserDialog.new(_("Choose a Rabbit source file"),
640
- nil,
641
- Gtk::FileChooser::ACTION_OPEN,
642
- nil,
643
- [Gtk::Stock::CANCEL,
644
- Gtk::Dialog::RESPONSE_CANCEL],
645
- [Gtk::Stock::OPEN,
646
- Gtk::Dialog::RESPONSE_ACCEPT])
639
+ dialog = Gtk::FileChooserDialog.new(:title => _("Choose a Rabbit source file"),
640
+ :action => :open,
641
+ :buttons => [[Gtk::Stock::CANCEL, :cancel],
642
+ [Gtk::Stock::OPEN, :accept]])
647
643
  dialog.current_folder = @options.base if @options.base
648
644
  add_source_dialog_filter(dialog, "Rabbit files", "*.rab")
649
645
  add_source_dialog_filter(dialog, "RD files", "*.rd")
@@ -652,7 +648,7 @@ module Rabbit
652
648
  add_source_dialog_filter(dialog, "Markdown files", "*.md")
653
649
  add_source_dialog_filter(dialog, "All files", "*")
654
650
  file_name = nil
655
- if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
651
+ if dialog.run == Gtk::ResponseType::ACCEPT
656
652
  file_name = dialog.filename
657
653
  dialog.destroy
658
654
  end
@@ -430,11 +430,7 @@ module Rabbit
430
430
 
431
431
  def make_prop_value(name, *values)
432
432
  formatter_name = to_class_name(name)
433
- begin
434
- unless Format.const_defined?(formatter_name)
435
- raise NameError
436
- end
437
- rescue NameError
433
+ unless Format.const_defined?(formatter_name)
438
434
  raise UnknownPropertyError.new(name)
439
435
  end
440
436
  Format.const_get(formatter_name).new(*values)
@@ -1,5 +1,21 @@
1
- require 'rabbit/image'
2
- require 'rabbit/element/block-element'
1
+ # Copyright (C) 2004-2021 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require "rabbit/image"
18
+ require "rabbit/element/block-element"
3
19
 
4
20
  module Rabbit
5
21
  module Element
@@ -13,61 +29,29 @@ module Rabbit
13
29
  alias image_draw draw
14
30
  alias draw element_draw
15
31
 
16
- attr_reader :filename
17
- attr_reader :caption
18
- attr_reader :normalized_width, :normalized_height
19
- attr_reader :relative_width, :relative_height
20
- attr_reader :relative_margin_top, :relative_margin_bottom
21
- attr_reader :relative_margin_left, :relative_margin_right
22
- attr_reader :relative_padding_top, :relative_padding_bottom
23
- attr_reader :relative_padding_left, :relative_padding_right
24
-
25
- def initialize(filename, prop)
26
- @filename = filename
27
- prop = Utils.stringify_hash_key(prop)
28
- super(filename, prop)
29
- normalized_prop = {}
30
- prop.each do |name, value|
31
- normalized_prop[name.gsub(/-/, '_')] = value
32
- end
33
- prop = normalized_prop
34
- %w(caption dither_mode).each do |name|
35
- instance_variable_set("@#{name}", prop[name])
36
- end
37
- %w(keep_scale keep_ratio).each do |name|
38
- unless prop[name].nil?
39
- self.keep_ratio = true_value?(prop[name])
40
- end
41
- end
42
- %w(as_large_as_possible).each do |name|
43
- instance_variable_set("@#{name}", true_value?(prop[name]))
44
- end
45
- %w(width height
46
- x_dither y_dither
47
- normalized_width normalized_height
48
- relative_width relative_height
49
- relative_margin_top relative_margin_bottom
50
- relative_margin_left relative_margin_right
51
- relative_padding_top relative_padding_bottom
52
- relative_padding_left relative_padding_right
53
- ).each do |name|
54
- begin
55
- instance_variable_set("@#{name}", prop[name] && Integer(prop[name]))
56
- rescue ArgumentError
57
- raise InvalidImageSizeError.new(filename, name, prop[name])
58
- end
59
- end
60
-
61
- setup_draw_parameters(prop)
62
- resize(@width, @height)
32
+ def initialize(filename, props, canvas: nil)
33
+ super(filename, props, canvas: canvas)
34
+ setup_draw_parameters
35
+ resize(properties.get_size("width", @filename),
36
+ properties.get_size("height", @filename))
63
37
  end
64
38
 
65
39
  def draw_element(canvas, x, y, w, h, simulation)
66
- draw_image(canvas, x, y, w, h, simulation)
40
+ result = draw_image(canvas, x, y, w, h, simulation)
41
+ draw_properties(canvas, x, y, w, h) unless simulation
42
+ result
43
+ end
44
+
45
+ def caption
46
+ self["caption"]
47
+ end
48
+
49
+ def caption_font_size
50
+ properties.get_float("caption-font-size")
67
51
  end
68
52
 
69
53
  def text
70
- @caption.to_s
54
+ caption.to_s
71
55
  end
72
56
 
73
57
  def to_rd
@@ -85,22 +69,44 @@ module Rabbit
85
69
  html
86
70
  end
87
71
 
88
- def dither_mode
89
- @dither_mode ||= "normal"
90
- mode_name = "DITHER_#{@dither_mode.upcase}"
91
- if Gdk::RGB.const_defined?(mode_name)
92
- Gdk::RGB.const_get(mode_name)
93
- else
94
- Gdk::RGB::DITHER_NORMAL
95
- end
72
+ def relative_width
73
+ properties.get_relative_size("relative_width", @filename)
74
+ end
75
+
76
+ def relative_height
77
+ properties.get_relative_size("relative_height", @filename)
96
78
  end
97
79
 
98
- def x_dither
99
- @x_dither || 0
80
+ def relative_margin_top
81
+ properties.get_relative_size("relative_margin_top", @filename)
100
82
  end
101
83
 
102
- def y_dither
103
- @y_dither || 0
84
+ def relative_margin_bottom
85
+ properties.get_relative_size("relative_margin_bottom", @filename)
86
+ end
87
+
88
+ def relative_margin_left
89
+ properties.get_relative_size("relative_margin_left", @filename)
90
+ end
91
+
92
+ def relative_margin_right
93
+ properties.get_relative_size("relative_margin_right", @filename)
94
+ end
95
+
96
+ def relative_padding_top
97
+ properties.get_relative_size("relative_padding_top", @filename)
98
+ end
99
+
100
+ def relative_padding_bottom
101
+ properties.get_relative_size("relative_padding_bottom", @filename)
102
+ end
103
+
104
+ def relative_padding_left
105
+ properties.get_relative_size("relative_padding_left", @filename)
106
+ end
107
+
108
+ def relative_padding_right
109
+ properties.get_relative_size("relative_padding_right", @filename)
104
110
  end
105
111
 
106
112
  alias _compile compile
@@ -113,32 +119,34 @@ module Rabbit
113
119
  adjust_size(canvas, @x, @y, @w, @h)
114
120
  end
115
121
 
122
+ alias_method :width_without_padding, :width
116
123
  def width
117
124
  super + @padding_left + @padding_right
118
125
  end
119
126
 
127
+ alias_method :height_without_padding, :height
120
128
  def height
121
129
  super + @padding_top + @padding_bottom
122
130
  end
123
131
 
124
132
  def as_large_as_possible?
125
- @as_large_as_possible
133
+ properties.get_boolean("as_large_as_possible")
126
134
  end
127
135
 
128
136
  private
129
- def setup_draw_parameters(prop)
137
+ def setup_draw_parameters
130
138
  @draw_parameters = {}
131
139
 
132
- @draw_parameters[:reflect] = {} if true_value?(prop["reflect"])
140
+ @draw_parameters[:reflect] = {} if properties.get_boolean("reflect")
133
141
  [:ratio, :alpha].each do |key|
134
142
  name = "reflect_#{key}"
135
- value = prop[name]
143
+ value = self[name]
136
144
  next unless value
137
145
  @draw_parameters[:reflect] ||= {}
138
146
  @draw_parameters[:reflect][key] = Float(value)
139
147
  end
140
148
 
141
- alpha = prop["alpha"]
149
+ alpha = self["alpha"]
142
150
  @draw_parameters[:alpha] = Float(alpha) if alpha
143
151
  end
144
152
 
@@ -151,24 +159,24 @@ module Rabbit
151
159
 
152
160
  def adjust_margin(w, h)
153
161
  @margin_top =
154
- make_relative_size(@relative_margin_top, h) || @margin_top
162
+ relative_margin_top&.resolve(h) || @margin_top
155
163
  @margin_bottom =
156
- make_relative_size(@relative_margin_bottom, h) || @margin_bottom
164
+ relative_margin_bottom&.resolve(h) || @margin_bottom
157
165
  @margin_left =
158
- make_relative_size(@relative_margin_left, w) || @margin_left
166
+ relative_margin_left&.resolve(w) || @margin_left
159
167
  @margin_right =
160
- make_relative_size(@relative_margin_right, w) || @margin_right
168
+ relative_margin_right&.resolve(w) || @margin_right
161
169
  end
162
170
 
163
171
  def adjust_padding(w, h)
164
172
  @padding_top =
165
- make_relative_size(@relative_padding_top, h) || @padding_top
173
+ relative_padding_top&.resolve(h) || @padding_top
166
174
  @padding_bottom =
167
- make_relative_size(@relative_padding_bottom, h) || @padding_bottom
175
+ relative_padding_bottom&.resolve(h) || @padding_bottom
168
176
  @padding_left =
169
- make_relative_size(@relative_padding_left, w) || @padding_left
177
+ relative_padding_left&.resolve(w) || @padding_left
170
178
  @padding_right =
171
- make_relative_size(@relative_padding_right, w) || @padding_right
179
+ relative_padding_right&.resolve(w) || @padding_right
172
180
  end
173
181
 
174
182
  def adjust_size(canvas, x, y, w, h)
@@ -177,7 +185,7 @@ module Rabbit
177
185
  adjust_margin(base_w, base_h)
178
186
  adjust_padding(base_w, base_h)
179
187
  base_h = base_h - @padding_top - @padding_bottom
180
- if @as_large_as_possible
188
+ if as_large_as_possible?
181
189
  iw = base_w - x
182
190
  ih = base_h - y
183
191
  if iw.to_f / original_width > ih.to_f / original_height
@@ -186,26 +194,68 @@ module Rabbit
186
194
  ih = nil
187
195
  end
188
196
  else
189
- nw = make_normalized_size(@normalized_width)
190
- nh = make_normalized_size(@normalized_height)
191
- rw = make_relative_size(@relative_width, base_w)
192
- rh = make_relative_size(@relative_height, base_h)
193
- iw = nw || rw
194
- ih = nh || rh
197
+ iw = relative_width&.resolve(base_w)
198
+ ih = relative_height&.resolve(base_h)
195
199
  end
196
200
  resize(iw, ih)
197
201
  end
198
202
 
199
- def make_normalized_size(size)
200
- size && screen_size(size)
203
+ def draw_properties(canvas, base_x, base_y, base_w, base_h)
204
+ properties.draws.each do |type, *args|
205
+ case type
206
+ when "line"
207
+ if args.last.is_a?(Hash)
208
+ params = args.pop
209
+ else
210
+ params = nil
211
+ end
212
+ points = args.each_slice(2).collect do |x, y|
213
+ x = (x * width_without_padding) + base_x
214
+ y = (y * height_without_padding) + base_y
215
+ [x, y]
216
+ end
217
+ params = normalize_params(params)
218
+ color = params.delete(:color) || "black"
219
+ canvas.draw_lines(points, color, params)
220
+ when "rectangle"
221
+ filled, x, y, w, h, params = args
222
+ x = (x * width_without_padding) + base_x
223
+ y = (y * height_without_padding) + base_y
224
+ w = (w * width_without_padding)
225
+ h = (h * height_without_padding)
226
+ params = normalize_params(params)
227
+ color = params.delete(:color) || "black"
228
+ canvas.draw_rectangle(filled, x, y, w, h, color, params)
229
+ when "text"
230
+ text, x, y, params = args
231
+ params = normalize_params(params)
232
+ layout = canvas.make_layout(markup_text(text, params))
233
+ x = (x * width_without_padding) + base_x
234
+ y = (y * height_without_padding) + base_y
235
+ color = params.delete(:color) || "black"
236
+ canvas.draw_layout(layout, x, y, color, params)
237
+ end
238
+ end
201
239
  end
202
240
 
203
- def make_relative_size(size, parent_size)
204
- size && parent_size && ((size / 100.0) * parent_size).ceil
241
+ def normalize_params(params)
242
+ return {} if params.nil?
243
+ normalized_params = {}
244
+ params.each do |key, value|
245
+ normalized_params[key.to_sym] = value
246
+ end
247
+ normalized_params
205
248
  end
206
249
 
207
- def true_value?(value)
208
- value == true or value == "true"
250
+ def markup_text(text, props)
251
+ props.each do |name, value|
252
+ formatter_name = Utils.to_class_name(name.to_s)
253
+ next unless Format.const_defined?(formatter_name)
254
+ formatter = Format.const_get(formatter_name).new(value)
255
+ next unless formatter.text_formatter?
256
+ text = formatter.format(text)
257
+ end
258
+ text
209
259
  end
210
260
  end
211
261
  end