rabbit 1.0.9 → 2.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.
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