rabbit 1.0.9 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. data/GPL +19 -20
  2. data/Rakefile +25 -10
  3. data/bin/rabbit +20 -844
  4. data/bin/rabbit-command +25 -36
  5. data/bin/rabbit-slide +22 -0
  6. data/bin/rabbit-theme +22 -0
  7. data/bin/rabbit-theme-manager +30 -30
  8. data/data/account.kou.gpg +0 -0
  9. data/data/locale/en/LC_MESSAGES/rabbit.mo +0 -0
  10. data/data/locale/fr/LC_MESSAGES/rabbit.mo +0 -0
  11. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  12. data/doc/_config.yml +8 -0
  13. data/doc/_includes/en.menu.html +8 -0
  14. data/doc/_includes/ja.menu.html +8 -0
  15. data/doc/_layouts/en.html +19 -16
  16. data/doc/_layouts/ja.html +19 -16
  17. data/doc/_plugins/converters/rd.rb +1 -1
  18. data/doc/_plugins/support_symlink.rb +11 -0
  19. data/doc/en/development.rd +2 -2
  20. data/doc/en/how-to-make/index.rd +5 -5
  21. data/doc/en/how-to-make/rd.rd +1 -1
  22. data/doc/en/index.rd +6 -12
  23. data/doc/en/sample/index.rd +3 -3
  24. data/doc/en/slides.rd +2 -0
  25. data/doc/en/usage.rd +14 -356
  26. data/doc/en/usage/rabbit.rd +360 -0
  27. data/doc/en/users.rd +3 -1
  28. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  29. data/doc/images/screenshots/en/blue-circle.png +0 -0
  30. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  31. data/doc/images/screenshots/en/clear-blue.png +0 -0
  32. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  33. data/doc/images/screenshots/en/cozmixng.png +0 -0
  34. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  35. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  36. data/doc/images/screenshots/en/day-white.png +0 -0
  37. data/doc/images/screenshots/en/debian-raw.png +0 -0
  38. data/doc/images/screenshots/en/debian.png +0 -0
  39. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  40. data/doc/images/screenshots/en/green-circle.png +0 -0
  41. data/doc/images/screenshots/en/night-black.png +0 -0
  42. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  43. data/doc/images/screenshots/en/rabbit.png +0 -0
  44. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  45. data/doc/images/screenshots/en/ranguba.png +0 -0
  46. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  47. data/doc/images/screenshots/en/red-frame.png +0 -0
  48. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  49. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  50. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  51. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  52. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  53. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  54. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  55. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  56. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  57. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  58. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  59. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  60. data/doc/images/screenshots/ja/day-white.png +0 -0
  61. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  62. data/doc/images/screenshots/ja/debian.png +0 -0
  63. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  64. data/doc/images/screenshots/ja/green-circle.png +0 -0
  65. data/doc/images/screenshots/ja/night-black.png +0 -0
  66. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  67. data/doc/images/screenshots/ja/rabbit.png +0 -0
  68. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  69. data/doc/images/screenshots/ja/ranguba.png +0 -0
  70. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  71. data/doc/images/screenshots/ja/red-frame.png +0 -0
  72. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  73. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  74. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  75. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  76. data/doc/index.html.en +1 -1
  77. data/doc/index.html.ja +1 -1
  78. data/doc/ja/about.rd +3 -3
  79. data/doc/ja/development.rd +2 -2
  80. data/doc/ja/how-to-make/index.rd +5 -5
  81. data/doc/ja/index.rd +10 -16
  82. data/doc/ja/install/macports.rd +1 -1
  83. data/doc/ja/news.rd +4 -4
  84. data/doc/ja/sample/index.rd +3 -3
  85. data/doc/ja/usage.rd +13 -358
  86. data/doc/ja/usage/rabbit.rd +362 -0
  87. data/doc/ja/users.rd +1 -1
  88. data/lib/rabbit/action.rb +2 -2
  89. data/lib/rabbit/author-configuration.rb +73 -0
  90. data/lib/rabbit/canvas.rb +0 -14
  91. data/lib/rabbit/command/rabbit-slide.rb +571 -0
  92. data/lib/rabbit/command/rabbit-theme.rb +381 -0
  93. data/lib/rabbit/command/rabbit.rb +898 -0
  94. data/lib/rabbit/config.rb +40 -0
  95. data/lib/rabbit/console.rb +124 -55
  96. data/lib/rabbit/gem-finder.rb +61 -0
  97. data/lib/rabbit/gettext.rb +6 -79
  98. data/lib/rabbit/html/generator.rb +1 -0
  99. data/lib/rabbit/image.rb +1 -1
  100. data/lib/rabbit/logger.rb +12 -2
  101. data/lib/rabbit/logger/base.rb +33 -32
  102. data/lib/rabbit/logger/stderr.rb +1 -1
  103. data/lib/rabbit/menu.rb +1 -1
  104. data/lib/rabbit/parser.rb +2 -0
  105. data/lib/rabbit/parser/ext/image.rb +14 -20
  106. data/lib/rabbit/path-manipulatable.rb +40 -0
  107. data/lib/rabbit/rabbit.rb +18 -8
  108. data/lib/rabbit/renderer/base.rb +3 -4
  109. data/lib/rabbit/renderer/color.rb +0 -1
  110. data/lib/rabbit/slideshare.rb +116 -0
  111. data/lib/rabbit/source/base.rb +1 -1
  112. data/lib/rabbit/stock.rb +1 -1
  113. data/lib/rabbit/task.rb +18 -0
  114. data/lib/rabbit/task/slide.rb +162 -0
  115. data/lib/rabbit/task/theme.rb +122 -0
  116. data/lib/rabbit/theme-browser/tree.rb +1 -1
  117. data/lib/rabbit/theme/applier.rb +9 -0
  118. data/lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb +1 -2
  119. data/lib/rabbit/theme/blue-bar/blue-bar.rb +0 -11
  120. data/lib/rabbit/theme/clear-blue/clear-blue.rb +0 -11
  121. data/lib/rabbit/theme/cozmixng/cozmixng.rb +0 -11
  122. data/lib/rabbit/theme/day-white/day-white.rb +0 -6
  123. data/lib/rabbit/theme/default/default.rb +7 -1
  124. data/lib/rabbit/theme/enishi-green/property.rb +2 -2
  125. data/lib/rabbit/theme/entry.rb +85 -27
  126. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +4 -1
  127. data/lib/rabbit/theme/lightning-monochrome/lightning-monochrome.rb +0 -1
  128. data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +0 -1
  129. data/lib/rabbit/theme/nari/nari.rb +6 -16
  130. data/lib/rabbit/theme/nari/property.rb +3 -0
  131. data/lib/rabbit/theme/night-black/night-black.rb +0 -6
  132. data/lib/rabbit/theme/pdf/pdf.rb +0 -4
  133. data/lib/rabbit/theme/rabbit/rabbit.rb +0 -6
  134. data/lib/rabbit/theme/ranguba/ranguba.rb +0 -12
  135. data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +7 -4
  136. data/lib/rabbit/theme/rubykaigi2011/rubykaigi2011.rb +2 -9
  137. data/lib/rabbit/theme/searcher.rb +38 -16
  138. data/lib/rabbit/theme/syntax-highlighting/property.rb +2 -2
  139. data/lib/rabbit/version.rb +19 -0
  140. data/po/en/rabbit.po +1605 -1425
  141. data/po/fr/rabbit.po +1756 -1684
  142. data/po/ja/rabbit.po +2198 -2097
  143. data/po/rabbit.pot +1556 -1419
  144. metadata +34 -100
  145. data/bin/rabbirack +0 -99
  146. data/bin/rabbiter +0 -108
  147. data/bin/rabrick +0 -95
  148. data/bin/rabwii +0 -77
  149. data/lib/rabbit/default-config.rb +0 -24
  150. data/lib/rabbit/div/comment-i.erb +0 -7
  151. data/lib/rabbit/div/comment.erb +0 -45
  152. data/lib/rabbit/div/css.erb +0 -1
  153. data/lib/rabbit/div/js.erb +0 -1
  154. data/lib/rabbit/div/log.erb +0 -5
  155. data/lib/rabbit/div/main-i.erb +0 -24
  156. data/lib/rabbit/div/main.css +0 -40
  157. data/lib/rabbit/div/main.erb +0 -33
  158. data/lib/rabbit/div/navi-i.erb +0 -6
  159. data/lib/rabbit/div/navi.erb +0 -6
  160. data/lib/rabbit/div/prototype.js +0 -4320
  161. data/lib/rabbit/div/slide-i.erb +0 -2
  162. data/lib/rabbit/div/slide.erb +0 -5
  163. data/lib/rabbit/div/tofu.rb +0 -309
  164. data/lib/rabbit/middleware/config.ru +0 -42
  165. data/lib/rabbit/middleware/controller.rb +0 -63
  166. data/lib/rabbit/middleware/public/stylesheets/rabbirack.css +0 -12
  167. data/lib/rabbit/middleware/views/index.haml +0 -13
  168. data/lib/rabbit/middleware/views/layout.haml +0 -8
  169. data/lib/rabbit/post-setup.rb +0 -8
  170. data/lib/rabbit/pre-clean.rb +0 -2
  171. data/lib/rabbit/pre-distclean.rb +0 -2
  172. data/lib/rabbit/theme/twitter-comment/property.rb +0 -4
  173. data/lib/rabbit/theme/twitter-comment/twitter-comment.rb +0 -15
  174. data/lib/rabbit/twitter.rb +0 -239
  175. data/sample/theme-bench-en.hiki +0 -100
  176. data/sample/theme-bench-en.rab +0 -127
  177. data/sample/theme-bench.hiki +0 -101
  178. data/sample/theme-bench.rab +0 -128
  179. data/setup.rb +0 -1585
  180. data/update-mo.rb +0 -20
  181. data/update-po.rb +0 -57
data/lib/rabbit/image.rb CHANGED
@@ -28,7 +28,7 @@ module Rabbit
28
28
  @loader = Base.find_loader(filename).new(filename, props)
29
29
  end
30
30
  end
31
-
31
+
32
32
  class ImageLoader
33
33
  include ImageManipulable
34
34
  end
data/lib/rabbit/logger.rb CHANGED
@@ -7,8 +7,18 @@ module Rabbit
7
7
  dir = ::File.join("rabbit", "logger")
8
8
  require_files_under_directory_in_load_path(dir)
9
9
 
10
- def self.types
11
- collect_classes_under_module(self)
10
+ class << self
11
+ def types
12
+ collect_classes_under_module(self)
13
+ end
14
+
15
+ def default
16
+ if Utils.support_console_output? or !Logger.const_defined?(:GUI)
17
+ Logger::STDERR.new
18
+ else
19
+ Logger::GUI.new
20
+ end
21
+ end
12
22
  end
13
23
  end
14
24
  end
@@ -4,7 +4,25 @@ module Rabbit
4
4
  module Logger
5
5
 
6
6
  module Severity
7
- extend GetText
7
+ class << self
8
+ def names
9
+ MARK_TABLE.sort_by {|key, _| key}.collect {|_, value| value.downcase}
10
+ end
11
+
12
+ def name(level)
13
+ MARK_TABLE[level].downcase
14
+ end
15
+
16
+ def level(name)
17
+ MARK_TABLE.find do |key, value|
18
+ value.downcase == name.downcase
19
+ end[0]
20
+ end
21
+
22
+ def N_(message)
23
+ message
24
+ end
25
+ end
8
26
 
9
27
  DEBUG = 0
10
28
  INFO = 1
@@ -21,65 +39,48 @@ module Rabbit
21
39
  FATAL => N_("FATAL"),
22
40
  UNKNOWN => N_("UNKNOWN"),
23
41
  }
24
-
25
- class << self
26
- def names
27
- MARK_TABLE.sort_by {|key, _| key}.collect {|_, value| value.downcase}
28
- end
29
-
30
- def name(level)
31
- MARK_TABLE[level].downcase
32
- end
33
-
34
- def level(name)
35
- MARK_TABLE.find do |key, value|
36
- value.downcase == name.downcase
37
- end[0]
38
- end
39
- end
40
42
  end
41
43
 
42
44
  module Base
43
- include Severity
44
45
  include GetText
45
46
 
46
47
  attr_accessor :level, :webrick_mode
47
- def initialize(level=INFO, prog_name=nil)
48
+ def initialize(level=Severity::INFO, prog_name=nil)
48
49
  @level = level
49
50
  @prog_name = prog_name
50
51
  @webrick_mode = false
51
52
  end
52
53
 
53
- def debug?; @level <= DEBUG; end
54
- def info?; @level <= INFO; end
55
- def warning?; @level <= WARNING; end
56
- def error?; @level <= ERROR; end
57
- def fatal?; @level <= FATAL; end
58
- def unknown?; @level <= UNKNOWN; end
54
+ def debug?; @level <= Severity::DEBUG; end
55
+ def info?; @level <= Severity::INFO; end
56
+ def warning?; @level <= Severity::WARNING; end
57
+ def error?; @level <= Severity::ERROR; end
58
+ def fatal?; @level <= Severity::FATAL; end
59
+ def unknown?; @level <= Severity::UNKNOWN; end
59
60
 
60
61
  def debug(message_or_error=nil, &block)
61
- log(DEBUG, message_or_error, &block)
62
+ log(Severity::DEBUG, message_or_error, &block)
62
63
  end
63
64
 
64
65
  def info(message_or_error=nil, &block)
65
- log(INFO, message_or_error, &block)
66
+ log(Severity::INFO, message_or_error, &block)
66
67
  end
67
68
 
68
69
  def warning(message_or_error=nil, &block)
69
- log(WARNING, message_or_error, &block)
70
+ log(Severity::WARNING, message_or_error, &block)
70
71
  end
71
72
  alias_method :warn, :warning # for backward compatibility
72
73
 
73
74
  def error(message_or_error=nil, &block)
74
- log(ERROR, message_or_error, &block)
75
+ log(Severity::ERROR, message_or_error, &block)
75
76
  end
76
77
 
77
78
  def fatal(message_or_error=nil, &block)
78
- log(FATAL, message_or_error, &block)
79
+ log(Severity::FATAL, message_or_error, &block)
79
80
  end
80
81
 
81
82
  def unknown(message_or_error=nil, &block)
82
- log(UNKNOWN, message_or_error, &block)
83
+ log(Severity::UNKNOWN, message_or_error, &block)
83
84
  end
84
85
 
85
86
  def <<(message_or_error)
@@ -87,7 +88,7 @@ module Rabbit
87
88
  end
88
89
 
89
90
  def log(severity, message_or_error, prog_name=nil, &block)
90
- severity ||= UNKNOWN
91
+ severity ||= Severity::UNKNOWN
91
92
  prog_name ||= @prog_name
92
93
  if need_log?(severity)
93
94
  if message_or_error.nil? and block_given?
@@ -19,7 +19,7 @@ module Rabbit
19
19
  ::STDERR.puts(format_severity(severity))
20
20
  ::STDERR.print("[#{prog_name}]: ") if prog_name
21
21
  ::STDERR.puts(message)
22
- exit if severity >= FATAL
22
+ exit if severity >= Severity::FATAL
23
23
  end
24
24
 
25
25
  end
data/lib/rabbit/menu.rb CHANGED
@@ -11,8 +11,8 @@ require "rabbit/action"
11
11
 
12
12
  module Rabbit
13
13
  class Menu
14
- include GetText
15
14
  include ERB::Util
15
+ include GetText
16
16
 
17
17
  @@icon = nil
18
18
 
data/lib/rabbit/parser.rb CHANGED
@@ -5,6 +5,8 @@ Rabbit::Utils.require_files_under_directory_in_load_path(dir)
5
5
 
6
6
  module Rabbit
7
7
  module Parser
8
+ include GetText
9
+
8
10
  module_function
9
11
  def parse(canvas, source)
10
12
  parser = Base.find_loader(source)
@@ -9,7 +9,7 @@ module Rabbit
9
9
  module Parser
10
10
  module Ext
11
11
  module Image
12
- ALLOWED_IMG_URL_SCHEME = ['http', 'file', '']
12
+ ALLOWED_IMG_URL_SCHEME = ['http', 'https', 'file', '']
13
13
 
14
14
  module_function
15
15
  def make_image(canvas, uri_str, prop={})
@@ -47,13 +47,22 @@ module Rabbit
47
47
  module Private
48
48
  module_function
49
49
  def image_filename(canvas, uri)
50
- case uri.scheme
51
- when /file/i
50
+ case uri.scheme.to_s.downcase
51
+ when "file"
52
52
  GLib.filename_from_utf8(uri.path)
53
- when /http|ftp/i
53
+ when "http", "https", "ftp"
54
54
  other_uri_filename(canvas, uri)
55
55
  else
56
- related_path_filename(canvas, uri)
56
+ path = Pathname.new(GLib.filename_from_utf8(uri.path))
57
+ return path.to_s if path.absolute?
58
+
59
+ expanded_path = canvas.full_path(path.to_s)
60
+ expanded_uri = URI(expanded_path)
61
+ if expanded_uri.scheme.nil?
62
+ expanded_path
63
+ else
64
+ image_filename(canvas, expanded_uri)
65
+ end
57
66
  end
58
67
  end
59
68
 
@@ -63,21 +72,6 @@ module Rabbit
63
72
  File.join(dir, CGI.escape(key))
64
73
  end
65
74
 
66
- def related_path_filename(canvas, uri)
67
- image_uri = canvas.full_path(GLib.filename_from_utf8(uri.to_s))
68
- filename = nil
69
-
70
- begin
71
- raise URI::InvalidURIError if URI.parse(image_uri).scheme.nil?
72
- filename = tmp_filename(canvas, image_uri)
73
- setup_image_file(canvas, image_uri, filename)
74
- rescue URI::InvalidURIError
75
- filename = image_uri
76
- end
77
-
78
- filename
79
- end
80
-
81
75
  def other_uri_filename(canvas, uri)
82
76
  filename = tmp_filename(canvas, uri.to_s)
83
77
  setup_image_file(canvas, uri, filename)
@@ -0,0 +1,40 @@
1
+ # Copyright (C) 2012 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 "fileutils"
18
+ require "pathname"
19
+
20
+ require "rabbit/gettext"
21
+
22
+ module Rabbit
23
+ module PathManipulatable
24
+ include GetText
25
+
26
+ private
27
+ def create_directory(path)
28
+ @logger.info(_("Creating directory: %s") % path)
29
+ FileUtils.mkdir_p(path)
30
+ end
31
+
32
+ def create_file(path, &block)
33
+ unless Pathname(path).absolute?
34
+ path = File.join(@id, path)
35
+ end
36
+ @logger.info(_("Creating file: %s") % path)
37
+ File.open(path, "w", &block)
38
+ end
39
+ end
40
+ end
data/lib/rabbit/rabbit.rb CHANGED
@@ -1,15 +1,25 @@
1
- begin
2
- require "rabbit/config"
3
- rescue LoadError
4
- require "rabbit/default-config"
5
- end
1
+ # Copyright (C) 2004-2012 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 "rabbit/config"
6
18
 
7
19
  require "rabbit/gettext"
20
+ require "rabbit/version"
8
21
 
9
22
  module Rabbit
10
-
11
- VERSION = "1.0.9"
12
-
13
23
  TMP_DIR_NAME = ".tmp"
14
24
 
15
25
  @@gui_init_procs = []
@@ -3,7 +3,6 @@ require "erb"
3
3
  require "gtk2"
4
4
 
5
5
  require "rabbit/rabbit"
6
- require "rabbit/gettext"
7
6
  require "rabbit/trackball"
8
7
  require "rabbit/renderer/color"
9
8
 
@@ -18,12 +17,12 @@ end
18
17
  module Rabbit
19
18
  module Renderer
20
19
  module Base
20
+ extend Forwardable
21
+
22
+ include ERB::Util
21
23
  include GetText
22
24
  include DirtyCount
23
- include ERB::Util
24
25
 
25
- extend Forwardable
26
-
27
26
  def_delegators(:@canvas, :reload_source)
28
27
 
29
28
  attr_reader :x_dpi, :y_dpi
@@ -1,7 +1,6 @@
1
1
  require "gtk2"
2
2
 
3
3
  require "rabbit/rabbit"
4
- require "rabbit/gettext"
5
4
 
6
5
  module Rabbit
7
6
  module Renderer
@@ -0,0 +1,116 @@
1
+ # Copyright (C) 2012 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 "uri"
18
+ require "digest/sha1"
19
+
20
+ require "nokogiri"
21
+ require "faraday"
22
+
23
+ require "rabbit/gettext"
24
+ require "rabbit/command/rabbit"
25
+
26
+ module Rabbit
27
+ module Task
28
+ class SlideShare
29
+ include GetText
30
+
31
+ BASE_URL = "https://www.slideshare.net"
32
+ API_PATH_PREFIX = "/api/2"
33
+ API_KEY = "NB1B0IzS"
34
+ SHARED_SECRET = "iuTFlPzU"
35
+
36
+ attr_accessor :user, :pdf_path, :title, :description, :tags
37
+ def initialize(logger)
38
+ @logger = logger
39
+ @user = nil
40
+ @pdf_path = nil
41
+ @title = nil
42
+ @description = nil
43
+ @tags = []
44
+ @connection = Faraday.new(:url => BASE_URL) do |builder|
45
+ builder.request :multipart
46
+ builder.request :url_encoded
47
+ builder.response :logger, @logger
48
+ builder.adapter :net_http
49
+ end
50
+ end
51
+
52
+ def upload
53
+ payload = {
54
+ :username => @user,
55
+ :password => password,
56
+ :slideshow_title => @title,
57
+ :slideshow_srcfile => Faraday::UploadIO.new(@pdf_path,
58
+ "application/pdf"),
59
+ :slideshow_description => @description,
60
+ :tags => @tags.join(","),
61
+ }
62
+ payload = common_payload.merge(payload)
63
+ payload.keys.each do |key|
64
+ payload.delete(key) if payload[key].nil?
65
+ end
66
+ parse_response(@connection.post("#{API_PATH_PREFIX}/upload_slideshow",
67
+ payload))
68
+ end
69
+
70
+ private
71
+ def password
72
+ @password ||= read_password(_("Enter password on SlideShare"))
73
+ end
74
+
75
+ def read_password(prompt)
76
+ print("%s [%s]: " % [prompt, @user])
77
+ system("/bin/stty -echo") if $stdin.tty?
78
+ $stdin.gets.chomp
79
+ ensure
80
+ if $stdin.tty?
81
+ system("/bin/stty echo")
82
+ puts
83
+ end
84
+ end
85
+
86
+ def common_payload
87
+ timestamp = Time.now.to_i.to_s
88
+ {
89
+ :api_key => API_KEY,
90
+ :ts => timestamp,
91
+ :hash => Digest::SHA1.hexdigest("#{SHARED_SECRET}#{timestamp}"),
92
+ }
93
+ end
94
+
95
+ def parse_response(http_response)
96
+ @logger.debug(http_response.body)
97
+
98
+ unless http_response.success?
99
+ detail = "#{http_response.status}\n#{http_response.body}"
100
+ @logger.error(_("Failed to upload: %s") % detail)
101
+ return nil
102
+ end
103
+
104
+ puts http_response.body
105
+ response = Nokogiri::XML(http_response.body)
106
+ if response.root.name == "SlideShareServiceError"
107
+ message = response.root.elements[0]
108
+ @logger.error("Failed to upload: %s" % message.text)
109
+ nil
110
+ else
111
+ response.xpath("/SlideShowUploaded/SlideShowID").text.to_i
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end