rabbit 3.0.0 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
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