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
@@ -267,6 +267,12 @@ module Rabbit
267
267
  def add_gesture_action(sequence, action, &block)
268
268
  end
269
269
 
270
+ def pre_terminal
271
+ end
272
+
273
+ def post_terminal
274
+ end
275
+
270
276
  private
271
277
  def offscreen_renderer?
272
278
  false
@@ -5,7 +5,6 @@ require "rabbit/renderer/display/mask"
5
5
  require "rabbit/renderer/display/search"
6
6
  require "rabbit/renderer/display/gesture"
7
7
  require "rabbit/renderer/display/graffiti"
8
- require "rabbit/renderer/display/menu"
9
8
  require "rabbit/renderer/display/button-handler"
10
9
  require "rabbit/renderer/display/key-handler"
11
10
  require "rabbit/renderer/display/scroll-handler"
@@ -179,7 +178,7 @@ module Rabbit
179
178
  end
180
179
 
181
180
  def confirm(message)
182
- confirm_dialog(message) == Gtk::MessageDialog::RESPONSE_OK
181
+ confirm_dialog(message) == Gtk::ResponseType::OK
183
182
  end
184
183
 
185
184
  def reload_theme(&callback)
@@ -83,6 +83,7 @@ module Rabbit
83
83
 
84
84
  def post_parse
85
85
  clear_compiled_slides
86
+ update_cursor(:blank, true)
86
87
  end
87
88
 
88
89
  def pre_toggle_index_mode
@@ -32,7 +32,12 @@ module Rabbit
32
32
 
33
33
  def post_move(old_index, index)
34
34
  super
35
- @info_window.moved(index)
35
+ @info_window.moved
36
+ end
37
+
38
+ def post_move_in_slide(old_index, index)
39
+ super
40
+ @info_window.moved
36
41
  end
37
42
 
38
43
  def index_mode_on
@@ -19,10 +19,19 @@ module Rabbit
19
19
  @user_accel_group.disconnect_key(keyval, modifier)
20
20
  end
21
21
 
22
+ def pre_terminal
23
+ @window.remove_accel_group(@accel_group)
24
+ end
25
+
26
+ def post_terminal
27
+ @window.add_accel_group(@accel_group)
28
+ end
29
+
22
30
  private
23
31
  def init_key_handler
24
32
  @user_accel_group = nil
25
33
  init_accel_group
34
+ init_toggle_terminal_accel_group
26
35
  end
27
36
 
28
37
  def clear_user_accel_group
@@ -31,10 +40,12 @@ module Rabbit
31
40
 
32
41
  def attach_key(window)
33
42
  window.add_accel_group(@accel_group)
43
+ window.add_accel_group(@toggle_terminal_accel_group)
34
44
  end
35
45
 
36
46
  def detach_key(window)
37
47
  window.remove_accel_group(@accel_group)
48
+ window.remove_accel_group(@toggle_terminal_accel_group)
38
49
  end
39
50
 
40
51
  def clear_keys
@@ -53,10 +64,24 @@ module Rabbit
53
64
  init_alt_keys
54
65
  end
55
66
 
56
- def set_keys(keys, mod, flags=nil, &block)
67
+ def init_toggle_terminal_accel_group
68
+ @toggle_terminal_accel_group = Gtk::AccelGroup.new
69
+ mod = Gdk::ModifierType::SHIFT_MASK |
70
+ Gdk::ModifierType::CONTROL_MASK |
71
+ Gdk::ModifierType::MOD1_MASK
72
+ keys = Keys::ShiftControlAlt::TOGGLE_TERMINAL_KEYS
73
+ set_keys(keys,
74
+ mod,
75
+ nil,
76
+ @toggle_terminal_accel_group) do |group, obj, val, modifier|
77
+ @canvas.activate("ToggleTerminal")
78
+ end
79
+ end
80
+
81
+ def set_keys(keys, mod, flags=nil, accel_group=@accel_group, &block)
57
82
  flags ||= Gtk::AccelFlags::VISIBLE
58
83
  keys.each do |val|
59
- @accel_group.connect(val, mod, flags, &block)
84
+ accel_group.connect(val, mod, flags, &block)
60
85
  end
61
86
  end
62
87
 
@@ -195,6 +195,7 @@ module Rabbit
195
195
  def draw_pixbuf(pixbuf, x, y, params={})
196
196
  x, y = from_screen(x, y)
197
197
  @context.save do
198
+ apply_clip(x, y, pixbuf.width, pixbuf.height, params)
198
199
  @context.translate(x, y)
199
200
  set_source_pixbuf(pixbuf, params)
200
201
  @context.paint(params[:alpha])
@@ -244,11 +245,14 @@ module Rabbit
244
245
  def draw_rsvg_handle(handle, x, y, params={})
245
246
  x, y = from_screen(x, y)
246
247
  dim = handle.dimensions
247
- width = (params[:width] || dim.width).to_f
248
- height = (params[:height] || dim.height).to_f
248
+ w = dim.width
249
+ h = dim.height
250
+ width = (params[:width] || w).to_f
251
+ height = (params[:height] || h).to_f
249
252
  @context.save do
253
+ apply_clip(x, y, w, h, params)
250
254
  @context.translate(x, y)
251
- @context.scale(width / dim.width, height / dim.height)
255
+ @context.scale(width / w, height / h)
252
256
  @context.render_rsvg_handle(handle)
253
257
  end
254
258
 
@@ -262,6 +266,7 @@ module Rabbit
262
266
  width = (params[:width] || w).to_f
263
267
  height = (params[:height] || h).to_f
264
268
  @context.save do
269
+ apply_clip(x, y, w, h, params)
265
270
  @context.translate(x, y)
266
271
  @context.scale(width / w, height / h)
267
272
  @context.render_poppler_page(page)
@@ -396,6 +401,22 @@ module Rabbit
396
401
  end
397
402
  end
398
403
 
404
+ def apply_clip(x, y, w, h, params)
405
+ clip_x = params[:clip_x]
406
+ clip_y = params[:clip_y]
407
+ clip_width = params[:clip_width]
408
+ clip_height = params[:clip_height]
409
+ if clip_x or clip_y or clip_width or clip_height
410
+ @context.rectangle(x,
411
+ y,
412
+ clip_width || w,
413
+ clip_height || h)
414
+ @context.clip
415
+ @context.translate(x - (clip_x || x),
416
+ y - (clip_y || y))
417
+ end
418
+ end
419
+
399
420
  def make_matrix(xx, xy, x0, yx, yy, y0)
400
421
  ::Cairo::Matrix.new(xx, yx, xy, yy, x0, y0)
401
422
  end
@@ -25,7 +25,6 @@ require "rabbit/renderer/display/mask"
25
25
  require "rabbit/renderer/display/search"
26
26
  require "rabbit/renderer/display/gesture"
27
27
  require "rabbit/renderer/display/graffiti"
28
- require "rabbit/renderer/display/menu"
29
28
  require "rabbit/renderer/display/button-handler"
30
29
  require "rabbit/renderer/display/key-handler"
31
30
  require "rabbit/renderer/display/scroll-handler"
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2017 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2021 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -17,12 +17,11 @@
17
17
  require "date"
18
18
  require "time"
19
19
 
20
- require "yaml"
21
-
22
20
  require "rabbit/gettext"
23
21
  require "rabbit/logger"
24
22
  require "rabbit/author-configuration"
25
23
  require "rabbit/path-manipulatable"
24
+ require "rabbit/yaml-loader"
26
25
 
27
26
  module Rabbit
28
27
  class SlideConfiguration
@@ -41,11 +40,13 @@ module Rabbit
41
40
  attr_accessor :licenses
42
41
  attr_accessor :slideshare_id
43
42
  attr_accessor :speaker_deck_id
44
- attr_accessor :ustream_id
45
43
  attr_accessor :vimeo_id
46
44
  attr_accessor :youtube_id
47
45
  attr_writer :version
48
46
  attr_accessor :author
47
+ attr_accessor :width
48
+ attr_accessor :height
49
+ attr_accessor :source_code_uri
49
50
  def initialize(logger=nil)
50
51
  @logger = logger || Logger.default
51
52
  clear
@@ -65,7 +66,7 @@ module Rabbit
65
66
 
66
67
  def load
67
68
  return unless File.exist?(path)
68
- conf = YAML.load(File.read(path))
69
+ conf = YAMLLoader.load(File.read(path))
69
70
  clear
70
71
  merge!(conf)
71
72
  rescue
@@ -94,10 +95,12 @@ module Rabbit
94
95
  @licenses = []
95
96
  @slideshare_id = nil
96
97
  @speaker_deck_id = nil
97
- @ustream_id = nil
98
98
  @vimeo_id = nil
99
99
  @youtube_id = nil
100
100
  @author = nil
101
+ @width = 800
102
+ @height = 600
103
+ @source_code_uri = nil
101
104
  end
102
105
 
103
106
 
@@ -113,7 +116,6 @@ module Rabbit
113
116
  @version = conf["version"] || @version
114
117
  @slideshare_id = conf["slideshare_id"] || @slideshare_id
115
118
  @speaker_deck_id = conf["speaker_deck_id"] || @speaker_deck_id
116
- @ustream_id = conf["ustream_id"] || @ustream_id
117
119
  @vimeo_id = conf["vimeo_id"] || @vimeo_id
118
120
  @youtube_id = conf["youtube_id"] || @youtube_id
119
121
 
@@ -122,6 +124,10 @@ module Rabbit
122
124
 
123
125
  @author ||= AuthorConfiguration.new(@logger)
124
126
  @author.merge!(conf["author"] || {})
127
+
128
+ @width = conf["width"] || @width
129
+ @height = conf["height"] || @height
130
+ @source_code_uri = conf["source_code_uri"] || @source_code_uri
125
131
  end
126
132
 
127
133
  def to_hash
@@ -136,9 +142,11 @@ module Rabbit
136
142
  "licenses" => @licenses,
137
143
  "slideshare_id" => @slideshare_id,
138
144
  "speaker_deck_id" => @speaker_deck_id,
139
- "ustream_id" => @ustream_id,
140
145
  "vimeo_id" => @vimeo_id,
141
146
  "youtube_id" => @youtube_id,
147
+ "width" => @width,
148
+ "height" => @height,
149
+ "source_code_uri" => @source_code_uri,
142
150
  }
143
151
  config["author"] = @author.to_hash if @author
144
152
  config
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2016 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -65,6 +65,9 @@ module Rabbit
65
65
  spec.summary = readme_parser.title || "TODO"
66
66
  spec.description = readme_parser.description || "TODO"
67
67
  spec.licenses = @slide.licenses
68
+ if @slide.source_code_uri
69
+ spec.metadata["source_code_uri"] = @slide.source_code_uri
70
+ end
68
71
 
69
72
  slide_conf_path = @slide.path
70
73
  spec.files = [".rabbit", slide_conf_path, "Rakefile"]
@@ -155,11 +158,6 @@ module Rabbit
155
158
 
156
159
  publish_tasks = []
157
160
  namespace :publish do
158
- if @slide.author.slideshare_user
159
- define_publish_slideshare_task
160
- publish_tasks << :slideshare
161
- end
162
-
163
161
  if @slide.author.speaker_deck_user
164
162
  define_publish_speaker_deck_task
165
163
  publish_tasks << :speaker_deck
@@ -174,40 +172,15 @@ module Rabbit
174
172
  end
175
173
 
176
174
  def define_publish_rubygems_task
177
- desc(_("Publish the slide to %s" % "RubyGems.org"))
175
+ desc(_("Publish the slide to %s") % "RubyGems.org")
178
176
  task :rubygems => :gem do
179
177
  pusher = GemPusher.new(gem_path, @slide.author.rubygems_user)
180
178
  pusher.push
181
179
  end
182
180
  end
183
181
 
184
- def define_publish_slideshare_task
185
- slideshare_user = @slide.author.slideshare_user
186
- desc(_("Publish the slide to %s" % "SlideShare"))
187
- task :slideshare => [:pdf, "gem:validate"] do
188
- require "rabbit/slideshare"
189
- slideshare = SlideShare.new(@logger)
190
- slideshare.user = slideshare_user
191
- slideshare.pdf_path = pdf_path
192
- slideshare.id = @slide.id
193
- slideshare.title = spec.summary
194
- slideshare.description = spec.description
195
- slideshare.tags = @slide.tags if @slide.tags
196
- url = slideshare.upload
197
- if url
198
- @logger.info(_("Uploaded successfully!"))
199
- @logger.info(_("See %s") % url)
200
- Gtk.show_uri(url) if Gtk.respond_to?(:show_uri)
201
-
202
- slide_id = url.split(/\//).last
203
- @slide.slideshare_id = slide_id
204
- @slide.save(".")
205
- end
206
- end
207
- end
208
-
209
182
  def define_publish_speaker_deck_task
210
- desc(_("Publish the slide to %s" % "Speaker Deck"))
183
+ desc(_("Publish the slide to %s") % "Speaker Deck")
211
184
  task :speaker_deck => :pdf do
212
185
  puts "Not implemented yet."
213
186
  end
@@ -32,6 +32,11 @@ def apply_background_image_property(element, options={})
32
32
  image.vertical_centering = true
33
33
  end
34
34
 
35
+ layout = nil
36
+ caption_height = 0
37
+ caption_text = image.caption
38
+ caption_text = nil if caption_text and caption_text.empty?
39
+
35
40
  element.add_pre_draw_proc(proc_name) do |canvas, x, y, w, h, simulation|
36
41
  if simulation
37
42
  if compute_initial_geometry
@@ -78,6 +83,39 @@ def apply_background_image_property(element, options={})
78
83
  end
79
84
  end
80
85
  image.draw(simulation)
86
+
87
+ if caption_text
88
+ # TODO: Should we move this to Image#draw and unify this and
89
+ # similar code in lib/rabbit/theme/image/image.rb?
90
+ if simulation
91
+ caption = Text.new(caption_text)
92
+ caption_font_size = image.caption_font_size
93
+ caption_font_size = font_size(caption_font_size) if caption_font_size
94
+ caption.prop_set("size",
95
+ caption_font_size || @image_caption_font_size)
96
+ set_font_family(caption)
97
+ if image.horizontal_centering
98
+ caption.do_horizontal_centering(canvas, x, y, w, h)
99
+ end
100
+ caption.compile(canvas,
101
+ (image.x || x) + image.margin_left,
102
+ y + image.height + image.margin_top,
103
+ image.ow || w,
104
+ h - image.height)
105
+ layout = caption.layout
106
+ caption_height = caption.height
107
+ end
108
+ if !simulation and layout
109
+ base_x = (image.x || x) + image.margin_left
110
+ base_y = image.height + y + image.margin_top
111
+ caption_color = image["caption-color"] || @image_caption_color
112
+ canvas.draw_layout(layout,
113
+ base_x,
114
+ base_y + image.margin_bottom,
115
+ caption_color)
116
+ end
117
+ end
118
+
81
119
  [x, y, w - element_margin_right, h]
82
120
  end
83
121
 
@@ -77,8 +77,10 @@ match(Slide, HeadLine) do |heads|
77
77
  end
78
78
 
79
79
  match(Slide, Body) do |bodies|
80
- bodies.vertical_centering = true
81
80
  bodies.each do |body|
81
+ if body.slide["enable-clear-blue-slide-body-vertical-centering"] != "false"
82
+ body.vertical_centering = true
83
+ end
82
84
  next if body.elements.all? {|element| element.is_a?(Image)}
83
85
  next if body.elements.any? {|element| element.is_a?(BlockQuote)}
84
86
  next if body.elements.any? {|element| element.is_a?(PreformattedBlock)}
@@ -94,6 +96,6 @@ include_theme("slide-logo")
94
96
  @icon_images = ["clear-blue-icon.png"]
95
97
  include_theme("icon")
96
98
 
97
- @slide_footer_info_left_text ||= canvas.title.gsub(/\n/, '')
99
+ @slide_footer_info_left_text ||= canvas.title.gsub(/\n/, " ")
98
100
  @slide_footer_info_right_text ||= "Powered by Rabbit #{Rabbit::VERSION}"
99
101
  include_theme("slide-footer-info")
@@ -13,6 +13,7 @@ match(SlideElement) do |slides|
13
13
  line_color = options[:line_color] || "#666"
14
14
  line_params = options[:line_params] || {}
15
15
  left_text = options[:left_text]
16
+ center_text = options[:center_text]
16
17
  right_text = options[:right_text]
17
18
  text_position = options[:text_position] || :lower
18
19
  text_over_line = options[:text_over_line]
@@ -36,15 +37,20 @@ match(SlideElement) do |slides|
36
37
  "size" => text_size,
37
38
  "color" => text_color,
38
39
  }
39
- left_layout = right_layout = nil
40
+ left_layout = center_layout = right_layout = nil
40
41
  if left_text and !left_text.empty?
41
42
  left_layout = make_formatted_layout.call(props, left_text)
42
43
  end
44
+ if center_text and !center_text.empty?
45
+ center_layout = make_formatted_layout.call(props, center_text)
46
+ center_layout.alignment = :center
47
+ center_layout.width = (w - (x_margin * 2)) * Pango::SCALE
48
+ end
43
49
  if right_text and !right_text.empty?
44
50
  right_layout = make_formatted_layout.call(props, right_text)
45
51
  end
46
52
 
47
- layouts = [left_layout, right_layout].compact
53
+ layouts = [left_layout, center_layout, right_layout].compact
48
54
  unless layouts.empty?
49
55
  max_height = layouts.collect {|layout| layout.pixel_size[1]}.max
50
56
  if text_position == :lower
@@ -63,6 +69,10 @@ match(SlideElement) do |slides|
63
69
  canvas.draw_layout(left_layout, x_margin, text_base_y)
64
70
  end
65
71
 
72
+ if center_layout
73
+ canvas.draw_layout(center_layout, x_margin, text_base_y)
74
+ end
75
+
66
76
  if right_layout
67
77
  text_width, text_height = right_layout.pixel_size
68
78
  right_text_x = canvas.width - text_width - x_margin
@@ -51,6 +51,9 @@ match("**", Image) do |images|
51
51
  caption_height = 0
52
52
 
53
53
  image.add_post_draw_proc(proc_name) do |canvas, x, y, w, h, simulation|
54
+ # TODO: Should we move this to Image#draw and unify this and
55
+ # similar code in
56
+ # lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb?
54
57
  if simulation
55
58
  caption = Text.new(caption_text)
56
59
  caption.prop_set("size", @image_caption_font_size)
@@ -32,7 +32,7 @@ end
32
32
  target_n_slides = nil
33
33
 
34
34
  match(Slide) do |slides|
35
- slides.delete_post_draw_proc_by_name(proc_name)
35
+ slides.delete_pre_draw_proc_by_name(proc_name)
36
36
 
37
37
  break if @image_slide_number_uninstall
38
38
 
@@ -63,7 +63,7 @@ match(Slide) do |slides|
63
63
  "weight" => "heavy",
64
64
  }
65
65
 
66
- slides.add_post_draw_proc(proc_name) do |slide, canvas, x, y, w, h, simulation|
66
+ draw = lambda do |slide, canvas, x, y, w, h, simulation|
67
67
  if simulation
68
68
  image_height = canvas.height * @image_slide_number_space_ratio
69
69
  loader.resize(nil, image_height)
@@ -88,7 +88,7 @@ match(Slide) do |slides|
88
88
  margin_bottom = @image_slide_number_margin_bottom || slide.margin_bottom
89
89
  base_x = margin_left
90
90
  base_y = canvas.height - loader.height - margin_bottom
91
- max_width = canvas.width - margin_left - base_x - loader.width
91
+ max_width = canvas.width - margin_right - base_x - loader.width
92
92
  start_base_x = base_x
93
93
  goal_base_x = canvas.width - margin_right - goal_flag_width
94
94
 
@@ -126,4 +126,9 @@ match(Slide) do |slides|
126
126
  end
127
127
  [x, y, w, h]
128
128
  end
129
+ if slides[0].is_a?(PopplerSlide)
130
+ slides.add_post_draw_proc(proc_name, &draw)
131
+ else
132
+ slides.add_pre_draw_proc(proc_name, &draw)
133
+ end
129
134
  end
@@ -38,7 +38,7 @@ end
38
38
  @image_timer_target_paths ||= [Slide]
39
39
 
40
40
  match(*@image_timer_target_paths) do |slides|
41
- slides.delete_post_draw_proc_by_name(proc_name)
41
+ slides.delete_pre_draw_proc_by_name(proc_name)
42
42
  stop_auto_redraw_timer
43
43
 
44
44
  break if @image_timer_uninstall
@@ -51,7 +51,7 @@ match(*@image_timer_target_paths) do |slides|
51
51
  @image_timer_auto_updating = true
52
52
  start_auto_redraw_timer(@image_timer_interval)
53
53
  end
54
- slide.delete_post_draw_proc_by_name(init_proc_name)
54
+ slide.delete_pre_draw_proc_by_name(init_proc_name)
55
55
  end
56
56
  [x, y, w, h]
57
57
  end
@@ -61,7 +61,7 @@ match(*@image_timer_target_paths) do |slides|
61
61
  max_width = nil
62
62
  base_y = nil
63
63
 
64
- slides.add_post_draw_proc(proc_name) do |slide, canvas, x, y, w, h, simulation|
64
+ draw = lambda do |slide, canvas, x, y, w, h, simulation|
65
65
  margin_left = @image_timer_margin_left || slide.margin_left
66
66
  margin_right = @image_timer_margin_right || slide.margin_right
67
67
  margin_bottom = @image_timer_margin_bottom || slide.margin_bottom
@@ -111,4 +111,9 @@ match(*@image_timer_target_paths) do |slides|
111
111
  end
112
112
  [x, y, w, h]
113
113
  end
114
+ if slides[0].is_a?(PopplerSlide)
115
+ slides.add_post_draw_proc(proc_name, &draw)
116
+ else
117
+ slides.add_pre_draw_proc(proc_name, &draw)
118
+ end
114
119
  end
@@ -1,7 +1,7 @@
1
1
  set_background("black")
2
2
 
3
3
  begin
4
- include_theme(canvas.title)
4
+ include_theme(".")
5
5
  rescue LoadError
6
6
  end
7
7
 
@@ -25,6 +25,7 @@ end
25
25
  @slide_footer_info_base_y ||= canvas.height - @margin_bottom
26
26
 
27
27
  @slide_footer_info_left_text ||= nil
28
+ @slide_footer_info_center_text ||= nil
28
29
  @slide_footer_info_right_text ||= nil
29
30
 
30
31
  include_theme("edge-info-toolkit")
@@ -39,6 +40,7 @@ match(SlideElement) do
39
40
  :line_color => @slide_footer_info_line_color,
40
41
  :line_params => @slide_footer_info_line_params,
41
42
  :left_text => @slide_footer_info_left_text,
43
+ :center_text => @slide_footer_info_center_text,
42
44
  :right_text => @slide_footer_info_right_text,
43
45
  :text_position => :lower,
44
46
  :text_over_line => @slide_footer_info_text_over_line,
@@ -61,12 +61,19 @@ match("**", CustomTag) do |tags|
61
61
  find_target.call(tag).prop_set("size", @xx_large_font_size)
62
62
  when /\A(normal|oblique|italic)\z/
63
63
  find_target.call(tag).prop_set("style", $1)
64
- when /\Amargin-(top|bottom|left|right)(?:\s*\*\s*(\d+))?\z/
64
+ when /\Amargin-(top|bottom|left|right)(?:\s*\*\s*([-\d.]+))?\z/
65
65
  target = "margin_#{$1}"
66
- scale = Integer($2 || 1)
66
+ scale = Float($2 || 1)
67
67
  outer_block = find_outer_block.call(tag)
68
68
  current_value = outer_block.send(target)
69
69
  outer_block.send("#{target}=", current_value + (@space * scale))
70
+ when /\Awrap-(.+)\z/
71
+ wrap = $1
72
+ find_target.call(tag).wrap_mode = wrap
73
+ when /\Ajustify?\z/
74
+ find_target.call(tag).justify = true
75
+ when /\Ano-justify?\z/
76
+ find_target.call(tag).justify = false
70
77
  else
71
78
  handler = find_handler.call(tag)
72
79
  if handler
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2021 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,11 +14,10 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "yaml"
18
-
19
17
  require "rabbit/gettext"
20
18
  require "rabbit/author-configuration"
21
19
  require "rabbit/path-manipulatable"
20
+ require "rabbit/yaml-loader"
22
21
 
23
22
  module Rabbit
24
23
  class ThemeConfiguration
@@ -42,7 +41,7 @@ module Rabbit
42
41
 
43
42
  def load
44
43
  return unless File.exist?(path)
45
- conf = YAML.load(File.read(path))
44
+ conf = YAMLLoader.load(File.read(path))
46
45
  merge!(conf)
47
46
  rescue
48
47
  format = _("Failed to read slide configuration: %s: %s")
data/lib/rabbit/utils.rb CHANGED
@@ -352,9 +352,32 @@ module Rabbit
352
352
 
353
353
  module SystemRunner
354
354
  module_function
355
- def run(cmd, *args)
355
+ def run(cmd, *args, progress: nil)
356
356
  begin
357
- system(cmd, *args)
357
+ IO.pipe do |input, output|
358
+ pid = spawn(cmd, *args, out: output)
359
+ output.close
360
+ begin
361
+ loop do
362
+ readables, = IO.select([input], nil, nil, 0.1)
363
+ if readables
364
+ readable = readables[0]
365
+ begin
366
+ $stdout.print(readable.read_nonblock(4096))
367
+ rescue EOFError
368
+ break
369
+ else
370
+ break if readable.eof?
371
+ end
372
+ else
373
+ progress.call if progress
374
+ end
375
+ end
376
+ true
377
+ ensure
378
+ Process.waitpid(pid)
379
+ end
380
+ end
358
381
  rescue SystemCallError
359
382
  yield($!) if block_given?
360
383
  false
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2019 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2021 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -15,5 +15,5 @@
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
17
  module Rabbit
18
- VERSION = "3.0.0"
18
+ VERSION = "3.0.2"
19
19
  end