rabbit 2.1.9 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
- data/doc/_config.yml +4 -4
- data/doc/en/faq.rd +8 -8
- data/doc/en/news.rd +105 -1
- data/doc/ja/news.rd +104 -1
- data/lib/rabbit/canvas.rb +2 -1
- data/lib/rabbit/command/rabbit.rb +6 -3
- data/lib/rabbit/element/index-slide.rb +2 -2
- data/lib/rabbit/element/text-container-element.rb +30 -1
- data/lib/rabbit/element/text-renderer.rb +12 -1
- data/lib/rabbit/element/text.rb +7 -0
- data/lib/rabbit/error.rb +4 -3
- data/lib/rabbit/frame.rb +8 -22
- data/lib/rabbit/front.rb +8 -8
- data/lib/rabbit/gem-pusher.rb +66 -0
- data/lib/rabbit/gtk.rb +4 -0
- data/lib/rabbit/image-data-loader.rb +3 -3
- data/lib/rabbit/image/dia.rb +11 -6
- data/lib/rabbit/image/eps.rb +13 -11
- data/lib/rabbit/image/gimp.rb +1 -1
- data/lib/rabbit/image/pdf.rb +6 -10
- data/lib/rabbit/image/svg.rb +5 -1
- data/lib/rabbit/parser/markdown.rb +1 -0
- data/lib/rabbit/parser/markdown/converter.rb +43 -2
- data/lib/rabbit/password-reader.rb +34 -0
- data/lib/rabbit/progress.rb +22 -10
- data/lib/rabbit/renderer.rb +1 -1
- data/lib/rabbit/renderer/base.rb +7 -7
- data/lib/rabbit/renderer/color.rb +8 -0
- data/lib/rabbit/renderer/display/drawing-area-base.rb +1 -0
- data/lib/rabbit/renderer/display/drawing-area-primitive.rb +14 -2
- data/lib/rabbit/renderer/display/magnifier.rb +6 -4
- data/lib/rabbit/renderer/display/scroll-handler.rb +2 -2
- data/lib/rabbit/renderer/display/spotlight.rb +1 -1
- data/lib/rabbit/renderer/engine/cairo.rb +16 -1
- data/lib/rabbit/renderer/offscreen.rb +120 -0
- data/lib/rabbit/search-window.rb +6 -6
- data/lib/rabbit/searcher.rb +4 -84
- data/lib/rabbit/slideshare.rb +7 -11
- data/lib/rabbit/source-generator/markdown.rb +4 -4
- data/lib/rabbit/task/slide.rb +4 -2
- data/lib/rabbit/task/theme.rb +6 -3
- data/lib/rabbit/theme/slide-logo/slide-logo.rb +37 -27
- data/lib/rabbit/theme/syntax-highlighting/syntax-highlighting.rb +1 -7
- data/lib/rabbit/theme/title-on-image-toolkit/title-on-image-toolkit.rb +6 -0
- data/lib/rabbit/utils.rb +0 -5
- data/lib/rabbit/version.rb +2 -2
- data/po/en/rabbit.edit.po +151 -143
- data/po/en/rabbit.po +7 -1
- data/po/fr/rabbit.edit.po +151 -143
- data/po/fr/rabbit.po +7 -1
- data/po/ja/rabbit.edit.po +155 -147
- data/po/ja/rabbit.po +11 -5
- data/rabbit.gemspec +2 -1
- data/sample/rabbit.md +10 -0
- data/test/parser/test-markdown.rb +47 -1
- data/test/source-generator/test-markdown.rb +2 -2
- metadata +21 -9
- data/lib/rabbit/renderer/pixmap.rb +0 -1
- data/lib/rabbit/renderer/pixmap/base.rb +0 -127
- data/lib/rabbit/renderer/pixmap/cairo.rb +0 -15
- data/lib/rabbit/renderer/pixmap/gl.rb +0 -46
data/lib/rabbit/element/text.rb
CHANGED
@@ -60,6 +60,13 @@ module Rabbit
|
|
60
60
|
include TextContainerElement
|
61
61
|
|
62
62
|
attr_accessor :to
|
63
|
+
|
64
|
+
# TODO: This makes paragraph instead of word link.
|
65
|
+
def draw_sub_elements(canvas, x, y, w, h)
|
66
|
+
canvas.draw_link(to) do
|
67
|
+
super
|
68
|
+
end
|
69
|
+
end
|
63
70
|
end
|
64
71
|
|
65
72
|
class Subscript
|
data/lib/rabbit/error.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2004-
|
1
|
+
# Copyright (C) 2004-2017 Kouhei Sutou <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
|
@@ -26,7 +26,8 @@ module Rabbit
|
|
26
26
|
attr_reader :filename
|
27
27
|
def initialize(filename)
|
28
28
|
@filename = filename
|
29
|
-
|
29
|
+
utf8_filename = GLib.filename_to_utf8(filename)
|
30
|
+
super(_("no such file: %s") % utf8_filename)
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -210,7 +211,7 @@ module Rabbit
|
|
210
211
|
|
211
212
|
class UnknownCursorTypeError < Error
|
212
213
|
attr_reader :type
|
213
|
-
def
|
214
|
+
def initialize(type)
|
214
215
|
@type = type
|
215
216
|
super(_("unknown cursor type: %s") % @type)
|
216
217
|
end
|
data/lib/rabbit/frame.rb
CHANGED
@@ -57,14 +57,10 @@ module Rabbit
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def fullscreen
|
60
|
-
@fullscreen_toggled = false
|
61
|
-
@fullscreen = true
|
62
60
|
@window.fullscreen
|
63
61
|
end
|
64
62
|
|
65
63
|
def unfullscreen
|
66
|
-
@fullscreen_toggled = false
|
67
|
-
@fullscreen = false
|
68
64
|
@window.unfullscreen
|
69
65
|
end
|
70
66
|
|
@@ -77,11 +73,7 @@ module Rabbit
|
|
77
73
|
end
|
78
74
|
|
79
75
|
def fullscreen?
|
80
|
-
|
81
|
-
@window.fullscreen?
|
82
|
-
else
|
83
|
-
@fullscreen
|
84
|
-
end
|
76
|
+
@fullscreen
|
85
77
|
end
|
86
78
|
|
87
79
|
def main_window?
|
@@ -94,9 +86,7 @@ module Rabbit
|
|
94
86
|
|
95
87
|
def init_gui(width, height, main_window, window_type=nil)
|
96
88
|
init_window(width, height, window_type)
|
97
|
-
@fullscreen_toggled = false
|
98
89
|
@fullscreen = false
|
99
|
-
@iconify = false
|
100
90
|
@main_window = main_window
|
101
91
|
if @main_window
|
102
92
|
@window.keep_above = @force_keep_above unless @force_keep_above.nil?
|
@@ -132,10 +122,10 @@ module Rabbit
|
|
132
122
|
set_window_signal_destroy
|
133
123
|
end
|
134
124
|
|
135
|
-
def update_keep_above(keep_above
|
125
|
+
def update_keep_above(keep_above)
|
136
126
|
if @main_window
|
137
127
|
keep_above = @force_keep_above unless @force_keep_above.nil?
|
138
|
-
@window.keep_above = keep_above
|
128
|
+
@window.keep_above = keep_above
|
139
129
|
else
|
140
130
|
@window.keep_above = true
|
141
131
|
end
|
@@ -144,23 +134,21 @@ module Rabbit
|
|
144
134
|
def set_window_signal_window_state_event
|
145
135
|
@window.signal_connect("window_state_event") do |widget, event|
|
146
136
|
if event.changed_mask.fullscreen?
|
147
|
-
@
|
148
|
-
if fullscreen
|
137
|
+
@fullscreen = event.new_window_state.fullscreen?
|
138
|
+
if @fullscreen
|
149
139
|
@window.keep_above = true
|
150
140
|
@canvas.fullscreened
|
151
141
|
else
|
152
142
|
update_keep_above(false)
|
153
143
|
@canvas.unfullscreened
|
154
144
|
end
|
155
|
-
@window.present
|
156
145
|
elsif event.changed_mask.iconified?
|
157
|
-
if
|
158
|
-
@iconify = false
|
159
|
-
else
|
146
|
+
if event.new_window_state.iconified?
|
160
147
|
@canvas.iconified
|
161
|
-
@iconify = true
|
162
148
|
end
|
163
149
|
end
|
150
|
+
|
151
|
+
false
|
164
152
|
end
|
165
153
|
end
|
166
154
|
|
@@ -233,9 +221,7 @@ module Rabbit
|
|
233
221
|
@window = Gtk::EventBox.new
|
234
222
|
@window.set_size_request(width, height)
|
235
223
|
@canvas.attach_to(self, @window)
|
236
|
-
@fullscreen_toggled = false
|
237
224
|
@fullscreen = false
|
238
|
-
@iconify = false
|
239
225
|
@main_window = main_window
|
240
226
|
@window.show
|
241
227
|
@canvas.post_init_gui
|
data/lib/rabbit/front.rb
CHANGED
@@ -156,8 +156,8 @@ module Rabbit
|
|
156
156
|
def _check_dirty
|
157
157
|
if dirty?
|
158
158
|
clean
|
159
|
-
if
|
160
|
-
|
159
|
+
if offscreen_canvas.need_reload_source?
|
160
|
+
offscreen_canvas.reload_source
|
161
161
|
synchronize
|
162
162
|
end
|
163
163
|
end
|
@@ -171,9 +171,9 @@ module Rabbit
|
|
171
171
|
prev_size = [@previous_width, @previous_height]
|
172
172
|
current_size = [@canvas.width, @canvas.height]
|
173
173
|
if prev_size != current_size
|
174
|
-
|
174
|
+
offscreen_canvas.reload_theme
|
175
175
|
end
|
176
|
-
pixbuf =
|
176
|
+
pixbuf = offscreen_canvas.to_pixbuf(index)
|
177
177
|
@images[index] = pixbuf.save_to_buffer(@image_type)
|
178
178
|
synchronize
|
179
179
|
end
|
@@ -183,7 +183,7 @@ module Rabbit
|
|
183
183
|
def dirty?
|
184
184
|
@dirty or
|
185
185
|
@last_modified < @canvas.last_modified or
|
186
|
-
|
186
|
+
offscreen_canvas.need_reload_source?
|
187
187
|
end
|
188
188
|
|
189
189
|
def synchronize
|
@@ -233,7 +233,7 @@ module Rabbit
|
|
233
233
|
end
|
234
234
|
|
235
235
|
def clean
|
236
|
-
@
|
236
|
+
@offscreen_canvas = nil
|
237
237
|
@dirty = false
|
238
238
|
@images = []
|
239
239
|
@last_modified = @canvas.last_modified
|
@@ -243,8 +243,8 @@ module Rabbit
|
|
243
243
|
@dirty = true
|
244
244
|
end
|
245
245
|
|
246
|
-
def
|
247
|
-
@
|
246
|
+
def offscreen_canvas
|
247
|
+
@offscreen_canvas ||= @canvas.offscreen_canvas
|
248
248
|
end
|
249
249
|
end
|
250
250
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (C) 2016 Kouhei Sutou <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 "rake"
|
18
|
+
require "yaml"
|
19
|
+
require "open-uri"
|
20
|
+
|
21
|
+
require "rabbit/gettext"
|
22
|
+
require "rabbit/password-reader"
|
23
|
+
|
24
|
+
module Rabbit
|
25
|
+
class GemPusher
|
26
|
+
include GetText
|
27
|
+
include Rake::DSL
|
28
|
+
|
29
|
+
def initialize(gem_path, user)
|
30
|
+
@gem_path = gem_path
|
31
|
+
@user = user
|
32
|
+
end
|
33
|
+
|
34
|
+
def push
|
35
|
+
credentials_path = File.expand_path("~/.gem/credentials")
|
36
|
+
credentials_path_exist = File.exist?(credentials_path)
|
37
|
+
if credentials_path_exist
|
38
|
+
credentials = YAML.load(File.read(credentials_path))
|
39
|
+
else
|
40
|
+
credentials = {}
|
41
|
+
end
|
42
|
+
unless credentials.key?(@user.to_sym)
|
43
|
+
credentials[@user.to_sym] = retrieve_api_key
|
44
|
+
File.open(credentials_path, "w") do |credentials_file|
|
45
|
+
credentials_file.print(credentials.to_yaml)
|
46
|
+
end
|
47
|
+
unless credentials_path_exist
|
48
|
+
File.chmod(0600, credentials_path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
ruby("-S", "gem", "push", @gem_path,
|
52
|
+
"--key", @user)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def retrieve_api_key
|
57
|
+
prompt = _("Enter password on RubyGems.org [%{user}]: ") % {:user => @user}
|
58
|
+
reader = PasswordReader.new(prompt)
|
59
|
+
password = reader.read
|
60
|
+
open("https://rubygems.org/api/v1/api_key.yaml",
|
61
|
+
:http_basic_authentication => [@user, password]) do |response|
|
62
|
+
YAML.load(response.read)[:rubygems_api_key]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/rabbit/gtk.rb
CHANGED
@@ -27,15 +27,15 @@ module Rabbit
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def load
|
30
|
-
loader =
|
30
|
+
loader = GdkPixbuf::PixbufLoader.new
|
31
31
|
id = loader.signal_connect("size_prepared") do |l, width, height|
|
32
32
|
@width = width
|
33
33
|
@height = height
|
34
34
|
end
|
35
35
|
begin
|
36
36
|
loader.last_write(@data)
|
37
|
-
rescue
|
38
|
-
loader.close rescue
|
37
|
+
rescue GdkPixbuf::PixbufError => error
|
38
|
+
loader.close rescue GdkPixbuf::PixbufError
|
39
39
|
raise ImageLoadError.new(error.message)
|
40
40
|
end
|
41
41
|
loader.signal_handler_disconnect(id)
|
data/lib/rabbit/image/dia.rb
CHANGED
@@ -17,13 +17,18 @@ module Rabbit
|
|
17
17
|
class << self
|
18
18
|
def match?(filename)
|
19
19
|
return true if File.extname(filename).downcase.end_with?(".dia")
|
20
|
+
|
20
21
|
File.open(filename) do |f|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
begin
|
23
|
+
first_line = f.gets
|
24
|
+
second_line = f.gets
|
25
|
+
return false unless second_line
|
26
|
+
return false unless first_line.start_with?("<?xml")
|
27
|
+
return false unless second_line.start_with?("<dia:diagram")
|
28
|
+
true
|
29
|
+
rescue EncodingError
|
30
|
+
false
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
data/lib/rabbit/image/eps.rb
CHANGED
@@ -15,20 +15,22 @@ module Rabbit
|
|
15
15
|
class << self
|
16
16
|
def match?(filename)
|
17
17
|
File.open(filename) do |f|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
begin
|
19
|
+
f.each_line do |line|
|
20
|
+
case line
|
21
|
+
when /^%!PS-Adobe-\d+.\d+ EPS/i
|
22
|
+
return true
|
23
|
+
when /^%%/
|
24
|
+
# ignore
|
25
|
+
else
|
26
|
+
return false
|
27
|
+
end
|
26
28
|
end
|
29
|
+
false
|
30
|
+
rescue EncodingError, ArgumentError
|
31
|
+
false
|
27
32
|
end
|
28
33
|
end
|
29
|
-
false
|
30
|
-
rescue ArgumentError
|
31
|
-
false
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
data/lib/rabbit/image/gimp.rb
CHANGED
data/lib/rabbit/image/pdf.rb
CHANGED
@@ -14,15 +14,11 @@ module Rabbit
|
|
14
14
|
def match?(filename)
|
15
15
|
return true if File.extname(filename) == ".pdf"
|
16
16
|
|
17
|
-
File.open(filename) do |file|
|
18
|
-
|
19
|
-
return false if
|
17
|
+
File.open(filename, "rb") do |file|
|
18
|
+
data = file.read(10)
|
19
|
+
return false if data.nil?
|
20
20
|
|
21
|
-
|
22
|
-
/\A%PDF-1\.\d\z/ =~ line.chomp
|
23
|
-
rescue ArgumentError
|
24
|
-
false
|
25
|
-
end
|
21
|
+
data.start_with?("%PDF-1.")
|
26
22
|
end
|
27
23
|
end
|
28
24
|
end
|
@@ -70,13 +66,13 @@ module Rabbit
|
|
70
66
|
end
|
71
67
|
|
72
68
|
def uri
|
73
|
-
|
69
|
+
GLib.filename_to_uri(filename)
|
74
70
|
end
|
75
71
|
|
76
72
|
def to_pixbuf
|
77
73
|
w = original_width
|
78
74
|
h = original_height
|
79
|
-
pixbuf =
|
75
|
+
pixbuf = GdkPixbuf::Pixbuf.new(:rgb, true, 8, w, h)
|
80
76
|
page.render(0, 0, w, h, 1.0, 0, pixbuf)
|
81
77
|
pixbuf
|
82
78
|
end
|
data/lib/rabbit/image/svg.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# Copyright (C) 2012-2016 Kouhei Sutou <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
|
+
|
1
17
|
require "English"
|
2
18
|
|
3
19
|
require "rabbit/gettext"
|
@@ -156,7 +172,17 @@ module Rabbit
|
|
156
172
|
if element.options[:transparent] and child_types == [:text]
|
157
173
|
element.children.first.value.chomp!
|
158
174
|
end
|
159
|
-
|
175
|
+
converted_children = apply_class(convert_container(element),
|
176
|
+
element.attr["class"])
|
177
|
+
create_paragraph(converted_children)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def apply_class(children, klass)
|
182
|
+
return children if klass.nil?
|
183
|
+
classes = klass.split
|
184
|
+
classes.inject(children) do |nested_children, klass|
|
185
|
+
CustomTag.new(klass, nested_children)
|
160
186
|
end
|
161
187
|
end
|
162
188
|
|
@@ -177,7 +203,10 @@ module Rabbit
|
|
177
203
|
waited_paragraphs = list_item.elements.find_all do |element|
|
178
204
|
element.is_a?(Paragraph) and element.have_wait_tag?
|
179
205
|
end
|
180
|
-
|
206
|
+
if waited_paragraphs.empty?
|
207
|
+
list_item.default_visible = true
|
208
|
+
list_item.clear_theme
|
209
|
+
else
|
181
210
|
waited_paragraphs.each do |paragraph|
|
182
211
|
paragraph.default_visible = true
|
183
212
|
paragraph.clear_theme
|
@@ -377,6 +406,18 @@ module Rabbit
|
|
377
406
|
Ext::Inline.note(convert_container(element))
|
378
407
|
end
|
379
408
|
|
409
|
+
def convert_tag(element)
|
410
|
+
name = element.attr["name"]
|
411
|
+
if name.nil?
|
412
|
+
raise ParseError, _("tag name is missing.")
|
413
|
+
end
|
414
|
+
if element.children.empty?
|
415
|
+
CustomTag.new(name)
|
416
|
+
else
|
417
|
+
CustomTag.new(name, convert_container(element))
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
380
421
|
def convert_strikethrough(element)
|
381
422
|
DeletedText.new(text(element.value))
|
382
423
|
end
|