rabbit 3.0.5 → 4.0.0
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.
- checksums.yaml +4 -4
- data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
- data/doc/_config.yml +2 -2
- data/doc/en/news.rd +54 -0
- data/doc/ja/news.rd +54 -0
- data/lib/rabbit/actions.rb +446 -0
- data/lib/rabbit/author-configuration.rb +7 -10
- data/lib/rabbit/canvas.rb +74 -42
- data/lib/rabbit/command/rabbit-slide.rb +11 -13
- data/lib/rabbit/command/rabbit-theme.rb +10 -12
- data/lib/rabbit/command/rabbit.rb +31 -43
- data/lib/rabbit/console.rb +20 -22
- data/lib/rabbit/dependency-canvas.rb +2 -2
- data/lib/rabbit/element/base.rb +93 -6
- data/lib/rabbit/element/block-element.rb +17 -1
- data/lib/rabbit/element/block.rb +17 -1
- data/lib/rabbit/element/container-element.rb +59 -3
- data/lib/rabbit/element/description-list.rb +18 -2
- data/lib/rabbit/element/enum-list.rb +18 -2
- data/lib/rabbit/element/footnote.rb +18 -2
- data/lib/rabbit/element/image-title-slide.rb +17 -1
- data/lib/rabbit/element/image.rb +32 -2
- data/lib/rabbit/element/index-slide.rb +29 -13
- data/lib/rabbit/element/item-list.rb +18 -2
- data/lib/rabbit/element/method-list.rb +18 -2
- data/lib/rabbit/element/poppler-page.rb +17 -1
- data/lib/rabbit/element/poppler-slide.rb +18 -2
- data/lib/rabbit/element/poppler-title-slide.rb +18 -2
- data/lib/rabbit/element/preformatted.rb +18 -2
- data/lib/rabbit/element/slide-element.rb +29 -2
- data/lib/rabbit/element/slide.rb +18 -2
- data/lib/rabbit/element/syntax-highlighting.rb +17 -1
- data/lib/rabbit/element/table.rb +19 -3
- data/lib/rabbit/element/tag.rb +18 -2
- data/lib/rabbit/element/text-block-element.rb +18 -2
- data/lib/rabbit/element/text-container-element.rb +41 -2
- data/lib/rabbit/element/text-element.rb +17 -1
- data/lib/rabbit/element/text-renderer.rb +17 -1
- data/lib/rabbit/element/text.rb +4 -4
- data/lib/rabbit/element/title-slide.rb +19 -3
- data/lib/rabbit/element/video.rb +157 -56
- data/lib/rabbit/element.rb +20 -20
- data/lib/rabbit/formatter.rb +18 -1
- data/lib/rabbit/frame.rb +102 -90
- data/lib/rabbit/front.rb +11 -4
- data/lib/rabbit/gem-finder.rb +4 -8
- data/lib/rabbit/gem-pusher.rb +4 -4
- data/lib/rabbit/gesture/handler.rb +26 -21
- data/lib/rabbit/graffiti/config-dialog.rb +18 -2
- data/lib/rabbit/graffiti/processor.rb +20 -4
- data/lib/rabbit/gtk.rb +48 -14
- data/lib/rabbit/html/generator.rb +18 -18
- data/{test/helper/fixture.rb → lib/rabbit/icon.rb} +16 -6
- data/lib/rabbit/image/base.rb +7 -6
- data/lib/rabbit/image/default.rb +17 -1
- data/lib/rabbit/image/dia.rb +2 -2
- data/lib/rabbit/image/eps.rb +16 -2
- data/lib/rabbit/image/gimp.rb +28 -11
- data/lib/rabbit/image/mermaid.rb +3 -3
- data/lib/rabbit/image/pdf.rb +3 -3
- data/lib/rabbit/image/svg.rb +2 -2
- data/lib/rabbit/image.rb +8 -8
- data/lib/rabbit/info-window.rb +55 -18
- data/lib/rabbit/key-handler.rb +381 -0
- data/lib/rabbit/keys.rb +31 -2
- data/lib/rabbit/logger/base.rb +17 -1
- data/lib/rabbit/logger/gui.rb +20 -4
- data/lib/rabbit/logger/stderr.rb +16 -2
- data/lib/rabbit/logger.rb +4 -4
- data/lib/rabbit/menu.rb +200 -220
- data/lib/rabbit/parser/base.rb +17 -1
- data/lib/rabbit/parser/ext/aafigure.rb +17 -1
- data/lib/rabbit/parser/ext/blockdiag.rb +17 -1
- data/lib/rabbit/parser/ext/charty.rb +2 -2
- data/lib/rabbit/parser/ext/coderay.rb +20 -4
- data/lib/rabbit/parser/ext/enscript.rb +31 -15
- data/lib/rabbit/parser/ext/entity.rb +17 -1
- data/lib/rabbit/parser/ext/image.rb +6 -6
- data/lib/rabbit/parser/ext/inline.rb +17 -1
- data/lib/rabbit/parser/ext/rouge.rb +7 -4
- data/lib/rabbit/parser/ext/tex.rb +18 -2
- data/lib/rabbit/parser/ext/video.rb +4 -4
- data/lib/rabbit/parser/image.rb +20 -4
- data/lib/rabbit/parser/markdown/converter.rb +12 -13
- data/lib/rabbit/parser/markdown.rb +18 -2
- data/lib/rabbit/parser/pause-support.rb +1 -0
- data/lib/rabbit/parser/pdf.rb +3 -3
- data/lib/rabbit/parser/rd/ext/base.rb +20 -4
- data/lib/rabbit/parser/rd/ext/block-verbatim.rb +24 -28
- data/lib/rabbit/parser/rd/ext/character-reference.rb +18 -2
- data/lib/rabbit/parser/rd/ext/image.rb +3 -3
- data/lib/rabbit/parser/rd/ext/inline-verbatim.rb +6 -6
- data/lib/rabbit/parser/rd/ext/refer.rb +18 -2
- data/lib/rabbit/parser/rd/ext/video.rb +19 -2
- data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +24 -8
- data/lib/rabbit/parser/rd/rt/rt2rabbit-lib.rb +18 -2
- data/lib/rabbit/parser/rd/visitor.rb +18 -2
- data/lib/rabbit/parser/rd.rb +18 -2
- data/lib/rabbit/parser/wiki/output.rb +25 -28
- data/lib/rabbit/parser/wiki.rb +18 -2
- data/lib/rabbit/parser.rb +6 -6
- data/lib/rabbit/path-manipulatable.rb +4 -4
- data/lib/rabbit/progress.rb +17 -1
- data/lib/rabbit/properties.rb +3 -3
- data/lib/rabbit/rabbit.rb +15 -7
- data/lib/rabbit/readme-parser.rb +4 -6
- data/lib/rabbit/renderer/base.rb +44 -36
- data/lib/rabbit/renderer/color.rb +18 -2
- data/lib/rabbit/renderer/display/base.rb +10 -12
- data/lib/rabbit/renderer/display/button-handler.rb +141 -60
- data/lib/rabbit/renderer/display/cursor.rb +4 -5
- data/lib/rabbit/renderer/display/drawing-area-base.rb +32 -48
- data/lib/rabbit/renderer/display/drawing-area-primitive.rb +10 -61
- data/lib/rabbit/renderer/display/drawing-area-view-only.rb +19 -8
- data/lib/rabbit/renderer/display/drawing-area.rb +19 -15
- data/lib/rabbit/renderer/display/gesture.rb +9 -9
- data/lib/rabbit/renderer/display/graffiti.rb +22 -13
- data/lib/rabbit/renderer/display/info.rb +22 -2
- data/lib/rabbit/renderer/display/magnifier.rb +30 -17
- data/lib/rabbit/renderer/display/mask.rb +17 -1
- data/lib/rabbit/renderer/display/menu.rb +27 -3
- data/lib/rabbit/renderer/display/motion-handler.rb +45 -0
- data/lib/rabbit/renderer/display/progress.rb +17 -2
- data/lib/rabbit/renderer/display/scroll-handler.rb +60 -13
- data/lib/rabbit/renderer/display/search.rb +19 -2
- data/lib/rabbit/renderer/display/spotlight.rb +39 -25
- data/lib/rabbit/renderer/display.rb +16 -36
- data/lib/rabbit/renderer/engine/cairo.rb +4 -11
- data/lib/rabbit/renderer/engine.rb +17 -1
- data/lib/rabbit/renderer/kernel.rb +2 -20
- data/lib/rabbit/renderer/offscreen.rb +8 -14
- data/lib/rabbit/renderer/print-layout.rb +2 -2
- data/lib/rabbit/renderer/printer.rb +9 -16
- data/lib/rabbit/renderer/scene-background-widget.rb +95 -0
- data/lib/rabbit/renderer/scene-node-widget.rb +63 -0
- data/lib/rabbit/renderer/scene.rb +508 -0
- data/lib/rabbit/renderer.rb +6 -6
- data/lib/rabbit/search-window.rb +18 -2
- data/lib/rabbit/searcher.rb +15 -1
- data/lib/rabbit/size.rb +9 -1
- data/lib/rabbit/slide-configuration.rb +11 -14
- data/lib/rabbit/soap/driver.rb +20 -4
- data/lib/rabbit/soap/server.rb +17 -1
- data/lib/rabbit/source/argf.rb +5 -5
- data/lib/rabbit/source/base.rb +5 -6
- data/lib/rabbit/source/file.rb +5 -5
- data/lib/rabbit/source/memory.rb +20 -4
- data/lib/rabbit/source/uri.rb +9 -11
- data/lib/rabbit/source-generator/hiki.rb +2 -7
- data/lib/rabbit/source-generator/markdown.rb +2 -7
- data/lib/rabbit/source-generator/rd.rb +2 -7
- data/lib/rabbit/source-generator.rb +4 -4
- data/lib/rabbit/source.rb +5 -5
- data/lib/rabbit/task/slide.rb +13 -11
- data/lib/rabbit/task/theme.rb +8 -11
- data/lib/rabbit/task.rb +3 -3
- data/lib/rabbit/theme/applier.rb +27 -11
- data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
- data/lib/rabbit/theme/color-circle/color-circle.rb +18 -1
- data/lib/rabbit/theme/cozmixng/cozmixng.rb +1 -1
- data/lib/rabbit/theme/default/default.rb +1 -0
- data/lib/rabbit/theme/default-icon/default-icon.rb +1 -1
- data/lib/rabbit/theme/default-item-mark-setup/default-item-mark-setup.rb +17 -1
- data/lib/rabbit/theme/default-preformatted/default-preformatted.rb +9 -1
- data/lib/rabbit/theme/enishi-green/enishi-green.rb +1 -1
- data/lib/rabbit/theme/entry.rb +10 -12
- data/lib/rabbit/theme/icon/icon.rb +3 -8
- data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +5 -5
- data/lib/rabbit/theme/image-timer/image-timer.rb +3 -3
- data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +1 -0
- data/lib/rabbit/theme/lightning-talk/lightning-talk.rb +1 -0
- data/lib/rabbit/theme/manager.rb +19 -9
- data/lib/rabbit/theme/rabbit-icon/rabbit-icon.rb +1 -1
- data/lib/rabbit/theme/ranguba/ranguba.rb +1 -1
- data/lib/rabbit/theme/red-frame/red-frame.rb +6 -2
- data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +1 -0
- data/lib/rabbit/theme/ruby-gnome2-icon/ruby-gnome2-icon.rb +1 -1
- data/lib/rabbit/theme/searcher.rb +23 -7
- data/lib/rabbit/theme/slide-number/slide-number.rb +1 -1
- data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
- data/lib/rabbit/theme/table/table.rb +2 -2
- data/lib/rabbit/theme/video/property.rb +3 -0
- data/lib/rabbit/theme/video/video.rb +5 -0
- data/lib/rabbit/theme-configuration.rb +9 -11
- data/lib/rabbit/utils.rb +12 -94
- data/lib/rabbit/version.rb +1 -1
- data/lib/rabbit/xmlrpc/client.rb +17 -1
- data/lib/rabbit/xmlrpc/server.rb +17 -1
- data/po/en/rabbit.edit.po +324 -316
- data/po/en/rabbit.po +61 -55
- data/po/fr/rabbit.edit.po +324 -316
- data/po/fr/rabbit.po +61 -55
- data/po/ja/rabbit.edit.po +345 -370
- data/po/ja/rabbit.po +83 -80
- data/rabbit.gemspec +4 -2
- data/sample/block-quote.rab +13 -0
- data/sample/description-list.rab +17 -0
- data/sample/mermaid.rab +16 -0
- data/sample/rabbit-en.hiki +0 -1
- data/sample/rabbit-en.md +0 -1
- data/sample/rabbit-en.rd +0 -1
- data/sample/rabbit.hiki +0 -1
- data/sample/rabbit.md +0 -1
- data/sample/rabbit.rd +0 -1
- data/sample/video.rab +17 -0
- metadata +33 -65
- data/lib/rabbit/action/basic.rb +0 -304
- data/lib/rabbit/action/radio.rb +0 -78
- data/lib/rabbit/action/toggle.rb +0 -82
- data/lib/rabbit/action.rb +0 -140
- data/lib/rabbit/renderer/display/gl.rb +0 -98
- data/lib/rabbit/renderer/display/key-handler.rb +0 -321
- data/lib/rabbit/renderer/gl.rb +0 -95
- data/lib/rabbit/renderer/screen.rb +0 -286
- data/lib/rabbit/renderer/widget/drawing-area.rb +0 -93
- data/lib/rabbit/stock.rb +0 -31
- data/lib/rabbit/trackball.rb +0 -228
- data/lib/rabbit/video-window.rb +0 -123
- data/test/command/test-rabbit.rb +0 -101
- data/test/helper/parser.rb +0 -48
- data/test/helper.rb +0 -24
- data/test/image/test-dia.rb +0 -54
- data/test/image/test-eps.rb +0 -41
- data/test/parser/test-markdown.rb +0 -360
- data/test/parser/test-rd.rb +0 -43
- data/test/parser/test-wiki.rb +0 -71
- data/test/run-test.rb +0 -27
- data/test/source-generator/test-hiki.rb +0 -68
- data/test/source-generator/test-markdown.rb +0 -67
- data/test/source-generator/test-rd.rb +0 -69
- data/test/test-applier.rb +0 -73
- data/test/test-author-configuration.rb +0 -37
- data/test/test-canvas.rb +0 -70
- data/test/test-color.rb +0 -51
- data/test/test-element.rb +0 -103
- data/test/test-readme-parser.rb +0 -160
- data/test/test-size.rb +0 -155
- data/test/test-slide-configuration.rb +0 -74
- data/test/test-source.rb +0 -122
- data/test/test-theme-configuration.rb +0 -47
- data/test/test-utils.rb +0 -64
data/lib/rabbit/element/video.rb
CHANGED
@@ -1,9 +1,25 @@
|
|
1
|
-
|
1
|
+
# Copyright (C) 2012 Narihiro Nakamura <authornari@gmail.com>
|
2
|
+
# Copyright (C) 2013-2025 Sutou Kouhei <kou@cozmixng.org>
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License along
|
15
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
16
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2
17
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
18
|
+
require_relative "../image"
|
19
|
+
require_relative "../parser/base"
|
20
|
+
require_relative "../properties"
|
21
|
+
require_relative "block-element"
|
22
|
+
require_relative "text-renderer"
|
7
23
|
|
8
24
|
module Rabbit
|
9
25
|
module Element
|
@@ -11,7 +27,6 @@ module Rabbit
|
|
11
27
|
include Base
|
12
28
|
include BlockElement
|
13
29
|
include BlockHorizontalCentering
|
14
|
-
include TextRenderer
|
15
30
|
|
16
31
|
attr_reader :filename
|
17
32
|
attr_reader :relative_width, :relative_height
|
@@ -20,33 +35,24 @@ module Rabbit
|
|
20
35
|
attr_reader :relative_padding_top, :relative_padding_bottom
|
21
36
|
attr_reader :relative_padding_left, :relative_padding_right
|
22
37
|
|
23
|
-
def initialize(filename,
|
38
|
+
def initialize(filename, props)
|
24
39
|
@filename = filename
|
25
|
-
|
40
|
+
@thumbnail = nil
|
26
41
|
super()
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
%w(as_large_as_possible).each do |name|
|
33
|
-
instance_variable_set("@#{name}", true_value?(prop[name]))
|
34
|
-
end
|
35
|
-
%w(width height
|
36
|
-
relative_width relative_height
|
42
|
+
@properties = Properties.new(props)
|
43
|
+
width, height = detect_size
|
44
|
+
@original_width = width
|
45
|
+
@original_height = height
|
46
|
+
%w(relative_width relative_height
|
37
47
|
relative_margin_top relative_margin_bottom
|
38
48
|
relative_margin_left relative_margin_right
|
39
49
|
relative_padding_top relative_padding_bottom
|
40
50
|
relative_padding_left relative_padding_right
|
41
51
|
).each do |name|
|
42
|
-
|
43
|
-
|
44
|
-
rescue ArgumentError
|
45
|
-
raise InvalidSizeError.new(filename, name, prop[name])
|
46
|
-
end
|
52
|
+
instance_variable_set("@#{name}",
|
53
|
+
@properties.get_relative_size(name, @filename))
|
47
54
|
end
|
48
|
-
|
49
|
-
resize(@width, @height)
|
55
|
+
resize(width, height)
|
50
56
|
end
|
51
57
|
|
52
58
|
alias _compile compile
|
@@ -59,6 +65,23 @@ module Rabbit
|
|
59
65
|
adjust_size(canvas, @x, @y, @w, @h)
|
60
66
|
end
|
61
67
|
|
68
|
+
def setup_scene_element(canvas, scene_widget, x, y, w, h)
|
69
|
+
x, y, w, h = super
|
70
|
+
|
71
|
+
video = Gtk::Video.new(@filename)
|
72
|
+
scene_widget.put(video, x, y, @width || w, @height || h)
|
73
|
+
y += @height
|
74
|
+
h -= @height
|
75
|
+
|
76
|
+
[x, y, w, h]
|
77
|
+
end
|
78
|
+
|
79
|
+
def scene_snapshot_element(widget, snapshot, canvas, x, y, w, h)
|
80
|
+
y += @height
|
81
|
+
h -= @height
|
82
|
+
[x, y, w, h]
|
83
|
+
end
|
84
|
+
|
62
85
|
def width
|
63
86
|
@width.to_i + @padding_left + @padding_right
|
64
87
|
end
|
@@ -68,23 +91,24 @@ module Rabbit
|
|
68
91
|
end
|
69
92
|
|
70
93
|
def as_large_as_possible?
|
71
|
-
@as_large_as_possible
|
94
|
+
@properties.get_boolean("as_large_as_possible", false)
|
95
|
+
end
|
96
|
+
|
97
|
+
def keep_ratio?
|
98
|
+
@properties.get_boolean("keep_ratio", true) and
|
99
|
+
@original_width and
|
100
|
+
@original_height
|
72
101
|
end
|
73
102
|
|
74
103
|
def draw_element(canvas, x, y, w, h, simulation)
|
75
104
|
unless simulation
|
76
|
-
if
|
77
|
-
require "rabbit/video-window"
|
78
|
-
VideoWindow.show(canvas.window, self)
|
79
|
-
else
|
80
|
-
draw_layout(canvas, x, y)
|
81
|
-
end
|
105
|
+
@thumbnail.draw(canvas, x, y) if @thumbnail
|
82
106
|
end
|
83
107
|
[x, y + height, w, h - height]
|
84
108
|
end
|
85
109
|
|
86
110
|
def text
|
87
|
-
"video
|
111
|
+
"video: #{File.basename(@filename)}"
|
88
112
|
end
|
89
113
|
|
90
114
|
def to_rd
|
@@ -92,26 +116,106 @@ module Rabbit
|
|
92
116
|
end
|
93
117
|
|
94
118
|
private
|
119
|
+
def detect_size
|
120
|
+
width = @properties.get_size("width", @filename)
|
121
|
+
height = @properties.get_size("height", @filename)
|
122
|
+
if (width.nil? or height.nil?) and Gtk.const_defined?(:MediaFile)
|
123
|
+
w, h = detect_size_media_file
|
124
|
+
width ||= w
|
125
|
+
height ||= h
|
126
|
+
end
|
127
|
+
if (width.nil? or height.nil?) and defined?(::Gst)
|
128
|
+
w, h = detect_size_gstreamer
|
129
|
+
width ||= w
|
130
|
+
height ||= h
|
131
|
+
end
|
132
|
+
[width, height]
|
133
|
+
end
|
134
|
+
|
135
|
+
def detect_size_media_file
|
136
|
+
gio_file = Gio::File.open(path: @filename)
|
137
|
+
media_file = Gtk::MediaFile.new(gio_file)
|
138
|
+
# We want to mute here to avoid playing audio but if we
|
139
|
+
# mute, media_file isn't prepared...
|
140
|
+
# media_file.muted = true
|
141
|
+
media_file.play
|
142
|
+
while GLib::MainContext.default.iteration(true) do
|
143
|
+
end
|
144
|
+
width = media_file.intrinsic_width
|
145
|
+
width = nil if width.zero?
|
146
|
+
height = media_file.intrinsic_height
|
147
|
+
height = nil if height.zero?
|
148
|
+
media_file.pause
|
149
|
+
media_file.unref
|
150
|
+
[width, height]
|
151
|
+
end
|
152
|
+
|
153
|
+
def detect_size_gstreamer
|
154
|
+
pipeline = Gst::Pipeline.new
|
155
|
+
filesrc = Gst::ElementFactory.make("filesrc")
|
156
|
+
filesrc.location = @filename
|
157
|
+
decodebin = Gst::ElementFactory.make("decodebin")
|
158
|
+
return [nil, nil] if decodebin.nil?
|
159
|
+
videoconvert = Gst::ElementFactory.make("videoconvert")
|
160
|
+
return [nil, nil] if videoconvert.nil?
|
161
|
+
jpegenc = Gst::ElementFactory.make("jpegenc")
|
162
|
+
return [nil, nil] if jpegenc.nil?
|
163
|
+
filesink = Gst::ElementFactory.make("filesink")
|
164
|
+
@thumbnail_file = Tempfile.new(["rabbit-video", ".jpeg"])
|
165
|
+
filesink.location = @thumbnail_file.path
|
166
|
+
|
167
|
+
pipeline << filesrc << decodebin << videoconvert << jpegenc << filesink
|
168
|
+
filesrc >> decodebin
|
169
|
+
decodebin.signal_connect(:pad_added) do |_, pad|
|
170
|
+
sink_pad = videoconvert.get_static_pad("sink")
|
171
|
+
pad.link(sink_pad)
|
172
|
+
end
|
173
|
+
videoconvert >> jpegenc >> filesink
|
174
|
+
|
175
|
+
loop = GLib::MainLoop.new
|
176
|
+
|
177
|
+
bus = pipeline.bus
|
178
|
+
bus.add_watch do |bus, message|
|
179
|
+
case message.type
|
180
|
+
when Gst::MessageType::EOS
|
181
|
+
loop.quit
|
182
|
+
when Gst::MessageType::ERROR
|
183
|
+
loop.quit
|
184
|
+
end
|
185
|
+
true
|
186
|
+
end
|
187
|
+
|
188
|
+
pipeline.play
|
189
|
+
begin
|
190
|
+
loop.run
|
191
|
+
ensure
|
192
|
+
pipeline.stop
|
193
|
+
end
|
194
|
+
|
195
|
+
@thumbnail = ImageLoader.new(@thumbnail_file.path)
|
196
|
+
[@thumbnail.width, @thumbnail.height]
|
197
|
+
end
|
198
|
+
|
95
199
|
def adjust_margin(w, h)
|
96
200
|
@margin_top =
|
97
|
-
|
201
|
+
@relative_margin_top&.resolve(h) || @margin_top
|
98
202
|
@margin_bottom =
|
99
|
-
|
203
|
+
@relative_margin_bottom&.resolve(h) || @margin_bottom
|
100
204
|
@margin_left =
|
101
|
-
|
205
|
+
@relative_margin_left&.resolve(w) || @margin_left
|
102
206
|
@margin_right =
|
103
|
-
|
207
|
+
@relative_margin_right&.resolve(w) || @margin_right
|
104
208
|
end
|
105
209
|
|
106
210
|
def adjust_padding(w, h)
|
107
211
|
@padding_top =
|
108
|
-
|
212
|
+
@relative_padding_top&.resolve(h) || @padding_top
|
109
213
|
@padding_bottom =
|
110
|
-
|
214
|
+
@relative_padding_bottom&.resolve(h) || @padding_bottom
|
111
215
|
@padding_left =
|
112
|
-
|
216
|
+
@relative_padding_left&.resolve(w) || @padding_left
|
113
217
|
@padding_right =
|
114
|
-
|
218
|
+
@relative_padding_right&.resolve(w) || @padding_right
|
115
219
|
end
|
116
220
|
|
117
221
|
def adjust_size(canvas, x, y, w, h)
|
@@ -120,21 +224,25 @@ module Rabbit
|
|
120
224
|
adjust_margin(base_w, base_h)
|
121
225
|
adjust_padding(base_w, base_h)
|
122
226
|
base_h = base_h - @padding_top - @padding_bottom
|
123
|
-
if
|
227
|
+
if as_large_as_possible?
|
124
228
|
iw = base_w
|
125
229
|
ih = base_h
|
126
230
|
else
|
127
|
-
|
128
|
-
|
129
|
-
iw = rw || base_w
|
130
|
-
ih = rh || base_h
|
231
|
+
iw = @relative_width&.resolve(base_w)
|
232
|
+
ih = @relative_height&.resolve(base_h)
|
131
233
|
end
|
132
234
|
resize(iw, ih)
|
133
235
|
end
|
134
236
|
|
135
237
|
def resize(w, h)
|
136
|
-
if w.nil? and h.nil?
|
137
|
-
|
238
|
+
return if w.nil? and h.nil?
|
239
|
+
|
240
|
+
if keep_ratio?
|
241
|
+
if w and h.nil?
|
242
|
+
h = (@original_height * w.to_f / @original_width).ceil
|
243
|
+
elsif w.nil? and h
|
244
|
+
w = (@original_width * h.to_f / @original_height).ceil
|
245
|
+
end
|
138
246
|
else
|
139
247
|
w ||= width
|
140
248
|
h ||= height
|
@@ -144,16 +252,9 @@ module Rabbit
|
|
144
252
|
if w and w > 0 and h and h > 0 and [w, h] != [width, height]
|
145
253
|
@width = w
|
146
254
|
@height = h
|
255
|
+
@thumbnail&.resize(@width, @height)
|
147
256
|
end
|
148
257
|
end
|
149
|
-
|
150
|
-
def make_relative_size(size, parent_size)
|
151
|
-
size && parent_size && ((size / 100.0) * parent_size).ceil
|
152
|
-
end
|
153
|
-
|
154
|
-
def true_value?(value)
|
155
|
-
value == true or value == "true"
|
156
|
-
end
|
157
258
|
end
|
158
259
|
end
|
159
260
|
end
|
data/lib/rabbit/element.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2017 Kouhei
|
1
|
+
# Copyright (C) 2017-2025 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,22 +14,22 @@
|
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
17
|
+
require_relative "element/block"
|
18
|
+
require_relative "element/description-list"
|
19
|
+
require_relative "element/enum-list"
|
20
|
+
require_relative "element/footnote"
|
21
|
+
require_relative "element/image-title-slide"
|
22
|
+
require_relative "element/image"
|
23
|
+
require_relative "element/index-slide"
|
24
|
+
require_relative "element/item-list"
|
25
|
+
require_relative "element/method-list"
|
26
|
+
require_relative "element/poppler-slide"
|
27
|
+
require_relative "element/poppler-title-slide"
|
28
|
+
require_relative "element/preformatted"
|
29
|
+
require_relative "element/slide"
|
30
|
+
require_relative "element/syntax-highlighting"
|
31
|
+
require_relative "element/table"
|
32
|
+
require_relative "element/tag"
|
33
|
+
require_relative "element/text"
|
34
|
+
require_relative "element/title-slide"
|
35
|
+
require_relative "element/video"
|
data/lib/rabbit/formatter.rb
CHANGED
@@ -1,5 +1,22 @@
|
|
1
|
+
# Copyright (C) 2004-2025 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
|
+
|
1
17
|
require "erb"
|
2
|
-
|
18
|
+
|
19
|
+
require_relative "renderer/color"
|
3
20
|
|
4
21
|
module Rabbit
|
5
22
|
module Format
|
data/lib/rabbit/frame.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2004-
|
1
|
+
# Copyright (C) 2004-2025 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,9 +15,10 @@
|
|
15
15
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
16
|
|
17
17
|
require "forwardable"
|
18
|
-
require "rabbit/gtk"
|
19
18
|
require "rexml/text"
|
20
19
|
|
20
|
+
require_relative "gtk"
|
21
|
+
|
21
22
|
begin
|
22
23
|
case ENV["RABBIT_GTK"]
|
23
24
|
when "4"
|
@@ -28,15 +29,14 @@ begin
|
|
28
29
|
rescue LoadError
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
|
-
|
32
|
+
require_relative "rabbit"
|
33
|
+
require_relative "utils"
|
33
34
|
|
34
35
|
module Rabbit
|
35
36
|
class Frame
|
36
37
|
extend Forwardable
|
37
38
|
|
38
39
|
def_delegators(:@window, :icon, :icon=, :set_icon)
|
39
|
-
def_delegators(:@window, :icon_list, :icon_list=, :set_icon_list)
|
40
40
|
def_delegators(:@window, :iconify, :show, :hide, :visible?)
|
41
41
|
def_delegators(:@window, :set_size_request, :resize)
|
42
42
|
|
@@ -47,14 +47,13 @@ module Rabbit
|
|
47
47
|
def_delegators(:@canvas, :output_html=, :output_index_html=)
|
48
48
|
def_delegators(:@canvas, :rss_base_uri=, :use_gl?, :use_gl=)
|
49
49
|
|
50
|
-
attr_reader :window
|
50
|
+
attr_reader :window
|
51
51
|
attr_accessor :geometry
|
52
52
|
|
53
|
-
def initialize(
|
54
|
-
@logger = logger
|
53
|
+
def initialize(canvas)
|
55
54
|
@canvas = canvas
|
56
55
|
@geometry = nil
|
57
|
-
@
|
56
|
+
@stack = nil
|
58
57
|
@terminal = nil
|
59
58
|
@running = true
|
60
59
|
end
|
@@ -115,8 +114,7 @@ module Rabbit
|
|
115
114
|
@fullscreen = false
|
116
115
|
@main_window = main_window
|
117
116
|
@terminal.show if @terminal
|
118
|
-
@
|
119
|
-
@window.show
|
117
|
+
@stack.show if @stack
|
120
118
|
@canvas.post_init_gui
|
121
119
|
end
|
122
120
|
|
@@ -130,17 +128,20 @@ module Rabbit
|
|
130
128
|
|
131
129
|
def toggle_terminal
|
132
130
|
return if @terminal.nil?
|
133
|
-
|
134
|
-
|
135
|
-
|
131
|
+
if @stack.visible_child_name == "terminal"
|
132
|
+
if @stack.respond_to?(:pages)
|
133
|
+
@stack.visible_child = @stack.pages[0].child
|
134
|
+
else
|
135
|
+
@stack.visible_child = @stack.children[0]
|
136
|
+
end
|
136
137
|
else
|
137
|
-
@
|
138
|
+
@stack.visible_child_name = "terminal"
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
141
142
|
def in_terminal?
|
142
143
|
return false if @terminal.nil?
|
143
|
-
@
|
144
|
+
@stack.visible_child_name == "terminal"
|
144
145
|
end
|
145
146
|
|
146
147
|
private
|
@@ -149,54 +150,92 @@ module Rabbit
|
|
149
150
|
@window = Gtk::ApplicationWindow.new(::Rabbit.application)
|
150
151
|
@window.set_default_size(width, height)
|
151
152
|
@window.parse_geometry(@geometry) if @geometry
|
152
|
-
@window.set_app_paintable(true)
|
153
153
|
if defined?(Vte::Terminal)
|
154
|
-
|
154
|
+
init_stack
|
155
155
|
end
|
156
|
-
|
156
|
+
set_window_signal_destroy
|
157
157
|
setup_dnd
|
158
|
-
@
|
158
|
+
@window.show # @window.surface is only available after @window.show.
|
159
|
+
if Gtk::Version::MAJOR < 4
|
160
|
+
@window.signal_connect(:configure_event) do |_, event|
|
161
|
+
GLib::Idle.add do
|
162
|
+
width = @stack.allocated_width
|
163
|
+
height = @stack.allocated_height
|
164
|
+
@canvas.renderer.update_size(width, height)
|
165
|
+
GLib::Source::REMOVE
|
166
|
+
end
|
167
|
+
false
|
168
|
+
end
|
169
|
+
@window.signal_connect(:window_state_event) do |widget, event|
|
170
|
+
if event.changed_mask.fullscreen?
|
171
|
+
@fullscreen = event.new_window_state.fullscreen?
|
172
|
+
if @fullscreen
|
173
|
+
@canvas.fullscreened
|
174
|
+
else
|
175
|
+
@canvas.unfullscreened
|
176
|
+
end
|
177
|
+
elsif event.changed_mask.iconified?
|
178
|
+
if event.new_window_state.iconified?
|
179
|
+
@canvas.iconified
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
false
|
184
|
+
end
|
185
|
+
else
|
186
|
+
previous_width = nil
|
187
|
+
previous_height = nil
|
188
|
+
previous_fullscreen = @fullscreen = @window.fullscreen?
|
189
|
+
previous_minimized = false
|
190
|
+
@surface = @window.surface # This is to guard from GC.
|
191
|
+
@surface.signal_connect(:notify) do |surface, param|
|
192
|
+
case param.name
|
193
|
+
when "width", "height"
|
194
|
+
GLib::Idle.add do
|
195
|
+
width = @stack.width
|
196
|
+
height = @stack.height
|
197
|
+
if previous_width != width or previous_height != height
|
198
|
+
@canvas.renderer.update_size(width, height)
|
199
|
+
previous_width = width
|
200
|
+
previous_height = height
|
201
|
+
end
|
202
|
+
GLib::Source::REMOVE
|
203
|
+
end
|
204
|
+
when "state"
|
205
|
+
state = surface.state
|
206
|
+
@canvas.reload_source if state.focused?
|
207
|
+
fullscreen = state.fullscreen?
|
208
|
+
if previous_fullscreen != fullscreen
|
209
|
+
@fullscreen = fullscreen
|
210
|
+
if @fullscreen
|
211
|
+
@canvas.fullscreened
|
212
|
+
else
|
213
|
+
@canvas.unfullscreened
|
214
|
+
end
|
215
|
+
previous_fullscreen = @fullscreen
|
216
|
+
end
|
217
|
+
minimized = state.minimized?
|
218
|
+
if previous_minimized != minimized
|
219
|
+
@canvas.iconified if minimized
|
220
|
+
previous_minimized = minimized
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
@canvas.attach_to(self, @window, @stack)
|
159
226
|
if defined?(Vte::Terminal)
|
160
227
|
init_terminal
|
161
228
|
end
|
162
229
|
end
|
163
230
|
|
164
|
-
def
|
165
|
-
@
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
border-width: 0px;
|
171
|
-
}
|
172
|
-
CSS
|
173
|
-
@notebook.style_context.add_provider(provider,
|
174
|
-
Gtk::StyleProvider::PRIORITY_USER)
|
175
|
-
@window.add(@notebook)
|
176
|
-
end
|
177
|
-
|
178
|
-
def set_window_signal
|
179
|
-
set_window_signal_window_state_event
|
180
|
-
set_window_signal_destroy
|
181
|
-
end
|
182
|
-
|
183
|
-
def set_window_signal_window_state_event
|
184
|
-
@window.signal_connect("window_state_event") do |widget, event|
|
185
|
-
if event.changed_mask.fullscreen?
|
186
|
-
@fullscreen = event.new_window_state.fullscreen?
|
187
|
-
if @fullscreen
|
188
|
-
@canvas.fullscreened
|
189
|
-
else
|
190
|
-
@canvas.unfullscreened
|
191
|
-
end
|
192
|
-
elsif event.changed_mask.iconified?
|
193
|
-
if event.new_window_state.iconified?
|
194
|
-
@canvas.iconified
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
false
|
231
|
+
def init_stack
|
232
|
+
@stack = Gtk::Stack.new
|
233
|
+
if Gtk::StackTransitionType.const_defined?(:ROTATE_LEFT_RIGHT)
|
234
|
+
@stack.transition_type = :rotate_left_right
|
235
|
+
else
|
236
|
+
@stack.transition_type = :slide_left_right
|
199
237
|
end
|
238
|
+
@window.child = @stack
|
200
239
|
end
|
201
240
|
|
202
241
|
def set_window_signal_destroy
|
@@ -206,6 +245,7 @@ module Rabbit
|
|
206
245
|
end
|
207
246
|
|
208
247
|
def setup_dnd
|
248
|
+
return if Gtk::Version::MAJOR >= 4 # TODO
|
209
249
|
@window.drag_dest_set(:all,
|
210
250
|
[["text/uri-list", 0, 0],
|
211
251
|
["_NETSCAPE_URL", 0, 0]],
|
@@ -214,7 +254,7 @@ module Rabbit
|
|
214
254
|
widget, context, x, y, selection_data, info, time = args
|
215
255
|
uri = selection_data.data.chomp
|
216
256
|
Gtk.idle_add do
|
217
|
-
parse(Source::URI.new(nil,
|
257
|
+
parse(Source::URI.new(nil, uri))
|
218
258
|
false
|
219
259
|
end
|
220
260
|
Gtk::Drag.finish(context, true, false, time)
|
@@ -242,11 +282,11 @@ module Rabbit
|
|
242
282
|
@terminal.color_background = terminal_color_background
|
243
283
|
end
|
244
284
|
@terminal.enable_sixel = true if @terminal.respond_to?(:enable_sixel=)
|
245
|
-
@
|
285
|
+
@stack.add_named(@terminal, "terminal")
|
246
286
|
pid = nil
|
247
287
|
in_terminal = false
|
248
|
-
@
|
249
|
-
if
|
288
|
+
@stack.signal_connect("notify::visible-child-name") do |_, param|
|
289
|
+
if @stack.visible_child_name == "terminal"
|
250
290
|
if @running
|
251
291
|
pid = @terminal.spawn if pid.nil?
|
252
292
|
@canvas.pre_terminal unless in_terminal
|
@@ -259,8 +299,7 @@ module Rabbit
|
|
259
299
|
end
|
260
300
|
@terminal.signal_connect(:child_exited) do
|
261
301
|
pid = nil
|
262
|
-
|
263
|
-
if @notebook.current_page == terminal_page
|
302
|
+
if @stack.visible_child_name == "terminal"
|
264
303
|
@canvas.activate("ToggleTerminal")
|
265
304
|
end
|
266
305
|
end
|
@@ -277,10 +316,9 @@ module Rabbit
|
|
277
316
|
end
|
278
317
|
|
279
318
|
def_null_methods(:icon, :icon=, :set_icon)
|
280
|
-
def_null_methods(:icon_list, :icon_list=, :set_icon_list)
|
281
319
|
def_null_methods(:update_title, :geometry, :geometry=)
|
282
320
|
|
283
|
-
def_null_methods(:
|
321
|
+
def_null_methods(:quit)
|
284
322
|
|
285
323
|
def fullscreen_available?
|
286
324
|
false
|
@@ -296,35 +334,9 @@ module Rabbit
|
|
296
334
|
def in_terminal?
|
297
335
|
false
|
298
336
|
end
|
299
|
-
end
|
300
|
-
|
301
|
-
class EmbedFrame < Frame
|
302
|
-
def update_title(new_title)
|
303
|
-
end
|
304
|
-
|
305
|
-
def fullscreen_available?
|
306
|
-
false
|
307
|
-
end
|
308
|
-
|
309
|
-
def iconify_available?
|
310
|
-
false
|
311
|
-
end
|
312
|
-
|
313
|
-
def toggle_terminal
|
314
|
-
end
|
315
337
|
|
316
|
-
def
|
338
|
+
def fullscreen?
|
317
339
|
false
|
318
340
|
end
|
319
|
-
|
320
|
-
def init_gui(width, height, main_window, window_type=nil)
|
321
|
-
@window = Gtk::EventBox.new
|
322
|
-
@window.set_size_request(width, height)
|
323
|
-
@canvas.attach_to(self, @window)
|
324
|
-
@fullscreen = false
|
325
|
-
@main_window = main_window
|
326
|
-
@window.show
|
327
|
-
@canvas.post_init_gui
|
328
|
-
end
|
329
341
|
end
|
330
342
|
end
|