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
@@ -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