rabbit 2.0.5 → 2.0.6
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.
- data/Rakefile +46 -12
- data/data/locale/en/LC_MESSAGES/rabbit.mo +0 -0
- data/data/locale/fr/LC_MESSAGES/rabbit.mo +0 -0
- data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
- data/doc/_config.yml +3 -3
- data/doc/_layouts/en.html +10 -0
- data/doc/_layouts/ja.html +10 -0
- data/doc/css/rabbit.css +25 -4
- data/doc/en/index.rd +1 -1
- data/doc/en/news.rd +46 -0
- data/doc/images/rabbit-slide-show-logo.png +0 -0
- data/doc/images/rabbit-slide-show-logo.svg +597 -0
- data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
- data/doc/images/screenshots/en/blue-circle.png +0 -0
- data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
- data/doc/images/screenshots/en/clear-blue.png +0 -0
- data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
- data/doc/images/screenshots/en/cozmixng.png +0 -0
- data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
- data/doc/images/screenshots/en/dark-gradation.png +0 -0
- data/doc/images/screenshots/en/day-white-raw.png +0 -0
- data/doc/images/screenshots/en/day-white.png +0 -0
- data/doc/images/screenshots/en/debian-raw.png +0 -0
- data/doc/images/screenshots/en/debian.png +0 -0
- data/doc/images/screenshots/en/green-circle-raw.png +0 -0
- data/doc/images/screenshots/en/green-circle.png +0 -0
- data/doc/images/screenshots/en/night-black-raw.png +0 -0
- data/doc/images/screenshots/en/night-black.png +0 -0
- data/doc/images/screenshots/en/rabbit-raw.png +0 -0
- data/doc/images/screenshots/en/rabbit.png +0 -0
- data/doc/images/screenshots/en/ranguba-raw.png +0 -0
- data/doc/images/screenshots/en/ranguba.png +0 -0
- data/doc/images/screenshots/en/red-frame-raw.png +0 -0
- data/doc/images/screenshots/en/red-frame.png +0 -0
- data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
- data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
- data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
- data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
- data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
- data/doc/images/screenshots/ja/blue-circle.png +0 -0
- data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
- data/doc/images/screenshots/ja/clear-blue.png +0 -0
- data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
- data/doc/images/screenshots/ja/cozmixng.png +0 -0
- data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
- data/doc/images/screenshots/ja/dark-gradation.png +0 -0
- data/doc/images/screenshots/ja/day-white-raw.png +0 -0
- data/doc/images/screenshots/ja/day-white.png +0 -0
- data/doc/images/screenshots/ja/debian-raw.png +0 -0
- data/doc/images/screenshots/ja/debian.png +0 -0
- data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
- data/doc/images/screenshots/ja/green-circle.png +0 -0
- data/doc/images/screenshots/ja/night-black-raw.png +0 -0
- data/doc/images/screenshots/ja/night-black.png +0 -0
- data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
- data/doc/images/screenshots/ja/rabbit.png +0 -0
- data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
- data/doc/images/screenshots/ja/ranguba.png +0 -0
- data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
- data/doc/images/screenshots/ja/red-frame.png +0 -0
- data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
- data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
- data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
- data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
- data/doc/index.html.ja +2 -2
- data/doc/ja/how-to-make/rd.rd +30 -3
- data/doc/ja/index.rd +1 -1
- data/doc/ja/news.rd +46 -0
- data/doc/ja/slides.rd +1 -1
- data/doc/ja/usage/rabbit-theme.rd +1 -1
- data/doc/ja/users.rd +16 -2
- data/lib/rabbit/author-configuration.rb +6 -6
- data/lib/rabbit/command/rabbit-slide.rb +208 -161
- data/lib/rabbit/command/rabbit.rb +2 -2
- data/lib/rabbit/console.rb +1 -1
- data/lib/rabbit/element/text-renderer.rb +2 -2
- data/lib/rabbit/element/video.rb +167 -0
- data/lib/rabbit/image/pdf.rb +19 -10
- data/lib/rabbit/parser/ext/video.rb +18 -0
- data/lib/rabbit/parser/rd/ext/block-verbatim.rb +10 -0
- data/lib/rabbit/parser/rd/ext/video.rb +15 -0
- data/lib/rabbit/slide-configuration.rb +15 -8
- data/lib/rabbit/slideshare.rb +93 -13
- data/lib/rabbit/task/slide.rb +5 -4
- data/lib/rabbit/task/theme.rb +3 -1
- data/lib/rabbit/theme/applier.rb +1 -1
- data/lib/rabbit/theme/entry.rb +0 -29
- data/lib/rabbit/theme/title-shadow/title-shadow.rb +1 -1
- data/lib/rabbit/version.rb +1 -1
- data/lib/rabbit/video-window.rb +122 -0
- data/misc/github-post-receiver/config.ru +170 -0
- data/misc/github-post-receiver/config.yaml.sample +3 -0
- data/misc/github-post-receiver/tmp/restart.txt +0 -0
- data/po/en/rabbit.po~ +2567 -0
- data/po/fr/rabbit.po~ +2674 -0
- data/po/ja/rabbit.po~ +2695 -0
- data/po/rabbit.pot +1195 -1094
- data/rabbit.gemspec +1 -0
- data/test/test-author-configuration.rb +1 -0
- data/test/test-slide-configuration.rb +3 -0
- metadata +659 -640
- data/bin/rabbit-theme-manager +0 -133
- data/lib/rabbit/theme-browser.rb +0 -104
- data/lib/rabbit/theme-browser/default-tag.yaml +0 -89
- data/lib/rabbit/theme-browser/document.rb +0 -200
- data/lib/rabbit/theme-browser/ext/block-verbatim.rb +0 -39
- data/lib/rabbit/theme-browser/page.rb +0 -133
- data/lib/rabbit/theme-browser/rd2document-lib.rb +0 -181
- data/lib/rabbit/theme-browser/tag.rb +0 -67
- data/lib/rabbit/theme-browser/tree.rb +0 -91
|
@@ -613,7 +613,7 @@ module Rabbit
|
|
|
613
613
|
end
|
|
614
614
|
|
|
615
615
|
options_file = File.join(source, options.options_file)
|
|
616
|
-
if File.
|
|
616
|
+
if File.file?(options_file)
|
|
617
617
|
options.rest.clear
|
|
618
618
|
console.read_options_file(parser, options, options_file)
|
|
619
619
|
end
|
|
@@ -660,7 +660,7 @@ module Rabbit
|
|
|
660
660
|
rest_arguments = @options.rest
|
|
661
661
|
if @options.source_type == :auto
|
|
662
662
|
if rest_arguments.empty?
|
|
663
|
-
file_name = choose_source_file_by_dialog
|
|
663
|
+
file_name = choose_source_file_by_dialog
|
|
664
664
|
exit if file_name.nil?
|
|
665
665
|
rest_arguments = [file_name]
|
|
666
666
|
@options.source_type = Source::File
|
data/lib/rabbit/console.rb
CHANGED
|
@@ -256,8 +256,8 @@ module Rabbit
|
|
|
256
256
|
shadow_layout = canvas.make_layout(shadow_text)
|
|
257
257
|
setup_layout(shadow_layout, @layout.width / Pango::SCALE)
|
|
258
258
|
line_height = shadow_layout.pixel_size[1] / shadow_layout.line_count
|
|
259
|
-
shadow_x = prop_value("shadow-x") || (line_height * 0.
|
|
260
|
-
shadow_y = prop_value("shadow-y") || (line_height * 0.
|
|
259
|
+
shadow_x = prop_value("shadow-x") || (line_height * 0.03)
|
|
260
|
+
shadow_y = prop_value("shadow-y") || (line_height * 0.02)
|
|
261
261
|
canvas.draw_layout(shadow_layout, x + shadow_x, y + shadow_y,
|
|
262
262
|
shadow_color)
|
|
263
263
|
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
require "rabbit/utils"
|
|
2
|
+
|
|
3
|
+
require "rabbit/image"
|
|
4
|
+
require "rabbit/element"
|
|
5
|
+
require "rabbit/parser/base"
|
|
6
|
+
require "rabbit/video-window"
|
|
7
|
+
|
|
8
|
+
module Rabbit
|
|
9
|
+
module Element
|
|
10
|
+
class Video
|
|
11
|
+
include Base
|
|
12
|
+
include BlockElement
|
|
13
|
+
include BlockHorizontalCentering
|
|
14
|
+
include TextRenderer
|
|
15
|
+
|
|
16
|
+
attr_reader :filename
|
|
17
|
+
attr_reader :normalized_width, :normalized_height
|
|
18
|
+
attr_reader :relative_width, :relative_height
|
|
19
|
+
attr_reader :relative_margin_top, :relative_margin_bottom
|
|
20
|
+
attr_reader :relative_margin_left, :relative_margin_right
|
|
21
|
+
attr_reader :relative_padding_top, :relative_padding_bottom
|
|
22
|
+
attr_reader :relative_padding_left, :relative_padding_right
|
|
23
|
+
|
|
24
|
+
def initialize(filename, prop)
|
|
25
|
+
@filename = filename
|
|
26
|
+
prop = Utils.stringify_hash_key(prop)
|
|
27
|
+
super()
|
|
28
|
+
normalized_prop = {}
|
|
29
|
+
prop.each do |name, value|
|
|
30
|
+
normalized_prop[name.gsub(/-/, '_')] = value
|
|
31
|
+
end
|
|
32
|
+
prop = normalized_prop
|
|
33
|
+
%w(as_large_as_possible).each do |name|
|
|
34
|
+
instance_variable_set("@#{name}", true_value?(prop[name]))
|
|
35
|
+
end
|
|
36
|
+
%w(width height
|
|
37
|
+
normalized_width normalized_height
|
|
38
|
+
relative_width relative_height
|
|
39
|
+
relative_margin_top relative_margin_bottom
|
|
40
|
+
relative_margin_left relative_margin_right
|
|
41
|
+
relative_padding_top relative_padding_bottom
|
|
42
|
+
relative_padding_left relative_padding_right
|
|
43
|
+
).each do |name|
|
|
44
|
+
begin
|
|
45
|
+
instance_variable_set("@#{name}", prop[name] && Integer(prop[name]))
|
|
46
|
+
rescue ArgumentError
|
|
47
|
+
raise InvalidImageSizeError.new(filename, name, prop[name])
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
resize(@width, @height)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
alias _compile compile
|
|
55
|
+
def compile_for_horizontal_centering(canvas, x, y, w, h)
|
|
56
|
+
_compile(canvas, x, y, w, h)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def compile(canvas, x, y, w, h)
|
|
60
|
+
super
|
|
61
|
+
adjust_size(canvas, @x, @y, @w, @h)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def width
|
|
65
|
+
@width.to_i + @padding_left + @padding_right
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def height
|
|
69
|
+
@height.to_i + @padding_top + @padding_bottom
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def as_large_as_possible?
|
|
73
|
+
@as_large_as_possible
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def draw_element(canvas, x, y, w, h, simulation)
|
|
77
|
+
unless simulation
|
|
78
|
+
if canvas.display?
|
|
79
|
+
@video_window ||= VideoWindow.new(self)
|
|
80
|
+
@video_window.show(canvas.window)
|
|
81
|
+
else
|
|
82
|
+
draw_layout(canvas, x, y)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
[x, y + height, w, h - height]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def text
|
|
89
|
+
"video : #{File.basename(@filename)}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def to_rd
|
|
93
|
+
text
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
def adjust_margin(w, h)
|
|
98
|
+
@margin_top =
|
|
99
|
+
make_relative_size(@relative_margin_top, h) || @margin_top
|
|
100
|
+
@margin_bottom =
|
|
101
|
+
make_relative_size(@relative_margin_bottom, h) || @margin_bottom
|
|
102
|
+
@margin_left =
|
|
103
|
+
make_relative_size(@relative_margin_left, w) || @margin_left
|
|
104
|
+
@margin_right =
|
|
105
|
+
make_relative_size(@relative_margin_right, w) || @margin_right
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def adjust_padding(w, h)
|
|
109
|
+
@padding_top =
|
|
110
|
+
make_relative_size(@relative_padding_top, h) || @padding_top
|
|
111
|
+
@padding_bottom =
|
|
112
|
+
make_relative_size(@relative_padding_bottom, h) || @padding_bottom
|
|
113
|
+
@padding_left =
|
|
114
|
+
make_relative_size(@relative_padding_left, w) || @padding_left
|
|
115
|
+
@padding_right =
|
|
116
|
+
make_relative_size(@relative_padding_right, w) || @padding_right
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def adjust_size(canvas, x, y, w, h)
|
|
120
|
+
base_w = w
|
|
121
|
+
base_h = h
|
|
122
|
+
adjust_margin(base_w, base_h)
|
|
123
|
+
adjust_padding(base_w, base_h)
|
|
124
|
+
base_h = base_h - @padding_top - @padding_bottom
|
|
125
|
+
if @as_large_as_possible
|
|
126
|
+
iw = base_w
|
|
127
|
+
ih = base_h
|
|
128
|
+
else
|
|
129
|
+
nw = make_normalized_size(@normalized_width)
|
|
130
|
+
nh = make_normalized_size(@normalized_height)
|
|
131
|
+
rw = make_relative_size(@relative_width, base_w)
|
|
132
|
+
rh = make_relative_size(@relative_height, base_h)
|
|
133
|
+
iw = nw || rw || base_w
|
|
134
|
+
ih = nh || rh || base_h
|
|
135
|
+
end
|
|
136
|
+
resize(iw, ih)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def resize(w, h)
|
|
140
|
+
if w.nil? and h.nil?
|
|
141
|
+
return
|
|
142
|
+
else
|
|
143
|
+
w ||= width
|
|
144
|
+
h ||= height
|
|
145
|
+
end
|
|
146
|
+
w = w.ceil if w
|
|
147
|
+
h = h.ceil if h
|
|
148
|
+
if w and w > 0 and h and h > 0 and [w, h] != [width, height]
|
|
149
|
+
@width = w
|
|
150
|
+
@height = h
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def make_normalized_size(size)
|
|
155
|
+
size && screen_size(size)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def make_relative_size(size, parent_size)
|
|
159
|
+
size && parent_size && ((size / 100.0) * parent_size).ceil
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def true_value?(value)
|
|
163
|
+
value == true or value == "true"
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
data/lib/rabbit/image/pdf.rb
CHANGED
|
@@ -7,22 +7,29 @@ require "rabbit/image/base"
|
|
|
7
7
|
module Rabbit
|
|
8
8
|
module ImageManipulable
|
|
9
9
|
class PDF < Base
|
|
10
|
+
include GetText
|
|
10
11
|
|
|
11
12
|
unshift_loader(self)
|
|
12
13
|
|
|
13
14
|
class << self
|
|
14
15
|
def match?(filename)
|
|
15
|
-
File.
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
return true if File.extname(filename) == ".pdf"
|
|
17
|
+
|
|
18
|
+
File.open(filename) do |file|
|
|
19
|
+
line = file.gets
|
|
20
|
+
return false if line.nil?
|
|
21
|
+
|
|
22
|
+
begin
|
|
23
|
+
/\A%PDF-1\.\d\z/ =~ line.chomp
|
|
24
|
+
rescue ArgumentError
|
|
25
|
+
false
|
|
26
|
+
end
|
|
18
27
|
end
|
|
19
|
-
rescue ArgumentError
|
|
20
|
-
false
|
|
21
28
|
end
|
|
22
29
|
end
|
|
23
30
|
|
|
24
31
|
def draw(canvas, x, y, params={})
|
|
25
|
-
if @
|
|
32
|
+
if @document and canvas.poppler_available?
|
|
26
33
|
default_params = {
|
|
27
34
|
:width => width,
|
|
28
35
|
:height => height,
|
|
@@ -39,21 +46,23 @@ module Rabbit
|
|
|
39
46
|
|
|
40
47
|
private
|
|
41
48
|
def page
|
|
42
|
-
index = self["page"] ||
|
|
49
|
+
index = self["page"] || 1
|
|
43
50
|
begin
|
|
44
51
|
index = Integer(index)
|
|
45
52
|
rescue ArgumentError
|
|
53
|
+
message = _("invalid PDF page number: <%s>") % index.inspect
|
|
54
|
+
raise ImageLoadError.new("#{@filename}: #{message}")
|
|
46
55
|
end
|
|
47
|
-
_page = @
|
|
56
|
+
_page = @document[index - 1]
|
|
48
57
|
if _page.nil?
|
|
49
|
-
message = _("%s page
|
|
58
|
+
message = _("%s page doesn't exist in PDF") % index
|
|
50
59
|
raise ImageLoadError.new("#{@filename}: #{message}")
|
|
51
60
|
end
|
|
52
61
|
_page
|
|
53
62
|
end
|
|
54
63
|
|
|
55
64
|
def update_size
|
|
56
|
-
@
|
|
65
|
+
@document = Poppler::Document.new(uri)
|
|
57
66
|
@width, @height = page.size
|
|
58
67
|
end
|
|
59
68
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'rabbit/element'
|
|
2
|
+
|
|
3
|
+
module Rabbit
|
|
4
|
+
module Parser
|
|
5
|
+
module Ext
|
|
6
|
+
module Video
|
|
7
|
+
def make_video(canvas, path, prop)
|
|
8
|
+
begin
|
|
9
|
+
Element::Video.new(path, prop)
|
|
10
|
+
rescue Error
|
|
11
|
+
canvas.logger.warn($!.message)
|
|
12
|
+
nil
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -8,6 +8,7 @@ rescue LoadError
|
|
|
8
8
|
end
|
|
9
9
|
require 'rabbit/parser/rd/ext/base'
|
|
10
10
|
require 'rabbit/parser/rd/ext/image'
|
|
11
|
+
require 'rabbit/parser/rd/ext/video'
|
|
11
12
|
require 'rabbit/parser/ext/enscript'
|
|
12
13
|
require 'rabbit/parser/ext/tex'
|
|
13
14
|
require 'rabbit/parser/ext/aafigure'
|
|
@@ -21,6 +22,7 @@ module Rabbit
|
|
|
21
22
|
module Ext
|
|
22
23
|
class BlockVerbatim < Base
|
|
23
24
|
include Image
|
|
25
|
+
include Video
|
|
24
26
|
include GetText
|
|
25
27
|
|
|
26
28
|
def default_ext_block_verbatim(label, source, content, visitor)
|
|
@@ -60,6 +62,14 @@ module Rabbit
|
|
|
60
62
|
end
|
|
61
63
|
end
|
|
62
64
|
|
|
65
|
+
def ext_block_verb_video(label, source, content, visitor)
|
|
66
|
+
return nil unless /^video$/i =~ label
|
|
67
|
+
src, prop = parse_source(source)
|
|
68
|
+
return nil if prop['src'].nil?
|
|
69
|
+
|
|
70
|
+
make_video(visitor, prop['src'], prop)
|
|
71
|
+
end
|
|
72
|
+
|
|
63
73
|
def ext_block_verb_enscript(label, source, content, visitor)
|
|
64
74
|
return nil unless /^enscript (\w+)$/i =~ label
|
|
65
75
|
lang = $1.downcase.untaint
|
|
@@ -32,7 +32,8 @@ module Rabbit
|
|
|
32
32
|
|
|
33
33
|
attr_accessor :logger
|
|
34
34
|
attr_accessor :id, :base_name, :tags, :presentation_date
|
|
35
|
-
attr_accessor :licenses
|
|
35
|
+
attr_accessor :licenses
|
|
36
|
+
attr_accessor :slideshare_id, :speaker_deck_id, :ustream_id, :vimeo_id
|
|
36
37
|
attr_writer :version
|
|
37
38
|
attr_accessor :author
|
|
38
39
|
def initialize(logger=nil)
|
|
@@ -69,21 +70,25 @@ module Rabbit
|
|
|
69
70
|
@licenses = []
|
|
70
71
|
@slideshare_id = nil
|
|
71
72
|
@speaker_deck_id = nil
|
|
73
|
+
@ustream_id = nil
|
|
74
|
+
@vimeo_id = nil
|
|
72
75
|
@author = nil
|
|
73
76
|
end
|
|
74
77
|
|
|
75
78
|
def merge!(conf)
|
|
76
|
-
@id
|
|
77
|
-
@base_name
|
|
78
|
-
@presentation_date
|
|
79
|
-
@version
|
|
80
|
-
@slideshare_id
|
|
81
|
-
@speaker_deck_id
|
|
79
|
+
@id = conf["id"] || @id
|
|
80
|
+
@base_name = conf["base_name"] || @base_name
|
|
81
|
+
@presentation_date = conf["presentation_date"] || @presentation_date
|
|
82
|
+
@version = conf["version"] || @version
|
|
83
|
+
@slideshare_id = conf["slideshare_id"] || @slideshare_id
|
|
84
|
+
@speaker_deck_id = conf["speaker_deck_id"] || @speaker_deck_id
|
|
85
|
+
@ustream_id = conf["ustream_id"] || @ustream_id
|
|
86
|
+
@vimeo_id = conf["vimeo_id"] || @vimeo_id
|
|
82
87
|
|
|
83
88
|
@tags |= (conf["tags"] || [])
|
|
84
89
|
@licenses |= (conf["licenses"] || [])
|
|
85
90
|
|
|
86
|
-
@author
|
|
91
|
+
@author ||= AuthorConfiguration.new(@logger)
|
|
87
92
|
@author.merge!(conf["author"] || {})
|
|
88
93
|
end
|
|
89
94
|
|
|
@@ -97,6 +102,8 @@ module Rabbit
|
|
|
97
102
|
"licenses" => @licenses,
|
|
98
103
|
"slideshare_id" => @slideshare_id,
|
|
99
104
|
"speaker_deck_id" => @speaker_deck_id,
|
|
105
|
+
"ustream_id" => @ustream_id,
|
|
106
|
+
"vimeo_id" => @vimeo_id,
|
|
100
107
|
}
|
|
101
108
|
config["author"] = @author.to_hash if @author
|
|
102
109
|
config
|
data/lib/rabbit/slideshare.rb
CHANGED
|
@@ -26,6 +26,9 @@ require "rabbit/command/rabbit"
|
|
|
26
26
|
module Rabbit
|
|
27
27
|
module Task
|
|
28
28
|
class SlideShare
|
|
29
|
+
class Error < StandardError
|
|
30
|
+
end
|
|
31
|
+
|
|
29
32
|
include GetText
|
|
30
33
|
|
|
31
34
|
BASE_URL = "https://www.slideshare.net"
|
|
@@ -33,11 +36,12 @@ module Rabbit
|
|
|
33
36
|
API_KEY = "NB1B0IzS"
|
|
34
37
|
SHARED_SECRET = "iuTFlPzU"
|
|
35
38
|
|
|
36
|
-
attr_accessor :user, :pdf_path, :title, :description, :tags
|
|
39
|
+
attr_accessor :user, :pdf_path, :id, :title, :description, :tags
|
|
37
40
|
def initialize(logger)
|
|
38
41
|
@logger = logger
|
|
39
42
|
@user = nil
|
|
40
43
|
@pdf_path = nil
|
|
44
|
+
@id = nil
|
|
41
45
|
@title = nil
|
|
42
46
|
@description = nil
|
|
43
47
|
@tags = []
|
|
@@ -50,24 +54,89 @@ module Rabbit
|
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
def upload
|
|
57
|
+
slideshow_id = nil
|
|
58
|
+
begin
|
|
59
|
+
slideshow_id = upload_slide
|
|
60
|
+
rescue Error
|
|
61
|
+
@logger.error(_("Feailed to upload: %s") % $!.message)
|
|
62
|
+
return nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
begin
|
|
66
|
+
edit_title(slideshow_id)
|
|
67
|
+
rescue Error
|
|
68
|
+
@logger.error(_("Feailed to edit title: %s") % $!.message)
|
|
69
|
+
return nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
url = nil
|
|
73
|
+
begin
|
|
74
|
+
url = slide_url(slideshow_id)
|
|
75
|
+
rescue Error
|
|
76
|
+
@logger.error(_("Feailed to get slide URL: %s") % $!.message)
|
|
77
|
+
return nil
|
|
78
|
+
end
|
|
79
|
+
url
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
def upload_slide
|
|
53
84
|
payload = {
|
|
54
85
|
:username => @user,
|
|
55
86
|
:password => password,
|
|
56
|
-
:slideshow_title =>
|
|
87
|
+
:slideshow_title => upload_title,
|
|
57
88
|
:slideshow_srcfile => Faraday::UploadIO.new(@pdf_path,
|
|
58
89
|
"application/pdf"),
|
|
59
90
|
:slideshow_description => @description,
|
|
60
91
|
:tags => @tags.join(","),
|
|
61
92
|
}
|
|
93
|
+
response = post("upload_slideshow", payload)
|
|
94
|
+
parse_upload_slideshow_response(response)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def edit_title(slideshow_id)
|
|
98
|
+
payload = {
|
|
99
|
+
:username => @user,
|
|
100
|
+
:password => password,
|
|
101
|
+
:slideshow_id => slideshow_id,
|
|
102
|
+
:slideshow_title => @title,
|
|
103
|
+
}
|
|
104
|
+
response = get("edit_slideshow", payload)
|
|
105
|
+
parse_edit_slideshow_response(response)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def slide_url(slideshow_id)
|
|
109
|
+
payload = {
|
|
110
|
+
:slideshow_id => slideshow_id,
|
|
111
|
+
}
|
|
112
|
+
response = get("get_slideshow", payload)
|
|
113
|
+
parse_get_slideshow_response(response)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def prepare_payload(payload)
|
|
62
117
|
payload = common_payload.merge(payload)
|
|
63
118
|
payload.keys.each do |key|
|
|
64
119
|
payload.delete(key) if payload[key].nil?
|
|
65
120
|
end
|
|
66
|
-
|
|
67
|
-
|
|
121
|
+
payload
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def get(command, payload)
|
|
125
|
+
@connection.get(api_url(command), prepare_payload(payload))
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def post(command, payload)
|
|
129
|
+
@connection.post(api_url(command), prepare_payload(payload))
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def api_url(command)
|
|
133
|
+
"#{API_PATH_PREFIX}/#{command}"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def upload_title
|
|
137
|
+
@id.gsub(/-/, " ")
|
|
68
138
|
end
|
|
69
139
|
|
|
70
|
-
private
|
|
71
140
|
def password
|
|
72
141
|
@password ||= read_password(_("Enter password on SlideShare"))
|
|
73
142
|
end
|
|
@@ -96,20 +165,31 @@ module Rabbit
|
|
|
96
165
|
@logger.debug(http_response.body)
|
|
97
166
|
|
|
98
167
|
unless http_response.success?
|
|
99
|
-
|
|
100
|
-
@logger.error(_("Failed to upload: %s") % detail)
|
|
101
|
-
return nil
|
|
168
|
+
raise Error, "#{http_response.status}\n#{http_response.body}"
|
|
102
169
|
end
|
|
103
170
|
|
|
104
|
-
puts http_response.body
|
|
105
171
|
response = Nokogiri::XML(http_response.body)
|
|
106
172
|
if response.root.name == "SlideShareServiceError"
|
|
107
173
|
message = response.root.elements[0]
|
|
108
|
-
|
|
109
|
-
nil
|
|
110
|
-
else
|
|
111
|
-
response.xpath("/SlideShowUploaded/SlideShowID").text.to_i
|
|
174
|
+
raise Error, message
|
|
112
175
|
end
|
|
176
|
+
|
|
177
|
+
response
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def parse_upload_slideshow_response(http_response)
|
|
181
|
+
response = parse_response(http_response)
|
|
182
|
+
response.xpath("/SlideShowUploaded/SlideShowID").text.to_i
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def parse_edit_slideshow_response(http_response)
|
|
186
|
+
response = parse_response(http_response)
|
|
187
|
+
response.xpath("/SlideShowEdited/SlideShowID").text.to_i
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def parse_get_slideshow_response(http_response)
|
|
191
|
+
response = parse_response(http_response)
|
|
192
|
+
response.xpath("/Slideshow/URL").text
|
|
113
193
|
end
|
|
114
194
|
end
|
|
115
195
|
end
|