rabbit 1.0.4 → 1.0.5

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 (207) hide show
  1. data/Gemfile +1 -0
  2. data/Rakefile +27 -0
  3. data/bin/rabbirack +5 -1
  4. data/bin/rabbit +1 -1
  5. data/bin/rabbit-command +1 -1
  6. data/doc/_layouts/en.html +1 -1
  7. data/doc/_layouts/ja.html +1 -1
  8. data/doc/_site/en/development.html +1 -1
  9. data/doc/_site/en/faq.html +1 -1
  10. data/doc/_site/en/hiki.html +1 -1
  11. data/doc/_site/en/how-to-make/hiki.html +1 -1
  12. data/doc/_site/en/how-to-make/index.html +1 -1
  13. data/doc/_site/en/how-to-make/pdf.html +1 -1
  14. data/doc/_site/en/how-to-make/rd.html +1 -1
  15. data/doc/_site/en/how-to-make/theme.html +1 -1
  16. data/doc/_site/en/index.html +6 -1
  17. data/doc/_site/en/install/homebrew.html +1 -1
  18. data/doc/_site/en/install/index.html +1 -1
  19. data/doc/_site/en/install/macports.html +1 -1
  20. data/doc/_site/en/install/windows.html +1 -1
  21. data/doc/_site/en/news.html +161 -92
  22. data/doc/_site/en/rd.html +1 -1
  23. data/doc/_site/en/sample/hiki/rabbit.html +1 -1
  24. data/doc/_site/en/sample/index.html +1 -1
  25. data/doc/_site/en/sample/rd/rabbit.html +1 -1
  26. data/doc/_site/en/slides.html +1 -1
  27. data/doc/_site/en/usage.html +1 -1
  28. data/doc/_site/en/users.html +2 -2
  29. data/doc/_site/images/screenshots/en/blue-circle-raw.png +0 -0
  30. data/doc/_site/images/screenshots/en/blue-circle.png +0 -0
  31. data/doc/_site/images/screenshots/en/clear-blue-raw.png +0 -0
  32. data/doc/_site/images/screenshots/en/clear-blue.png +0 -0
  33. data/doc/_site/images/screenshots/en/cozmixng-raw.png +0 -0
  34. data/doc/_site/images/screenshots/en/cozmixng.png +0 -0
  35. data/doc/_site/images/screenshots/en/dark-gradation-raw.png +0 -0
  36. data/doc/_site/images/screenshots/en/dark-gradation.png +0 -0
  37. data/doc/_site/images/screenshots/en/day-white-raw.png +0 -0
  38. data/doc/_site/images/screenshots/en/day-white.png +0 -0
  39. data/doc/_site/images/screenshots/en/debian-raw.png +0 -0
  40. data/doc/_site/images/screenshots/en/debian.png +0 -0
  41. data/doc/_site/images/screenshots/en/green-circle-raw.png +0 -0
  42. data/doc/_site/images/screenshots/en/green-circle.png +0 -0
  43. data/doc/_site/images/screenshots/en/night-black-raw.png +0 -0
  44. data/doc/_site/images/screenshots/en/night-black.png +0 -0
  45. data/doc/_site/images/screenshots/en/rabbit-raw.png +0 -0
  46. data/doc/_site/images/screenshots/en/rabbit.png +0 -0
  47. data/doc/_site/images/screenshots/en/ranguba-raw.png +0 -0
  48. data/doc/_site/images/screenshots/en/ranguba.png +0 -0
  49. data/doc/_site/images/screenshots/en/red-frame-raw.png +0 -0
  50. data/doc/_site/images/screenshots/en/red-frame.png +0 -0
  51. data/doc/_site/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  52. data/doc/_site/images/screenshots/en/ruby-gnome2.png +0 -0
  53. data/doc/_site/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  54. data/doc/_site/images/screenshots/en/rubykaigi2011.png +0 -0
  55. data/doc/_site/images/screenshots/ja/blue-circle-raw.png +0 -0
  56. data/doc/_site/images/screenshots/ja/blue-circle.png +0 -0
  57. data/doc/_site/images/screenshots/ja/clear-blue-raw.png +0 -0
  58. data/doc/_site/images/screenshots/ja/clear-blue.png +0 -0
  59. data/doc/_site/images/screenshots/ja/cozmixng-raw.png +0 -0
  60. data/doc/_site/images/screenshots/ja/cozmixng.png +0 -0
  61. data/doc/_site/images/screenshots/ja/dark-gradation-raw.png +0 -0
  62. data/doc/_site/images/screenshots/ja/dark-gradation.png +0 -0
  63. data/doc/_site/images/screenshots/ja/day-white-raw.png +0 -0
  64. data/doc/_site/images/screenshots/ja/day-white.png +0 -0
  65. data/doc/_site/images/screenshots/ja/debian-raw.png +0 -0
  66. data/doc/_site/images/screenshots/ja/debian.png +0 -0
  67. data/doc/_site/images/screenshots/ja/green-circle-raw.png +0 -0
  68. data/doc/_site/images/screenshots/ja/green-circle.png +0 -0
  69. data/doc/_site/images/screenshots/ja/night-black-raw.png +0 -0
  70. data/doc/_site/images/screenshots/ja/night-black.png +0 -0
  71. data/doc/_site/images/screenshots/ja/rabbit-raw.png +0 -0
  72. data/doc/_site/images/screenshots/ja/rabbit.png +0 -0
  73. data/doc/_site/images/screenshots/ja/ranguba-raw.png +0 -0
  74. data/doc/_site/images/screenshots/ja/ranguba.png +0 -0
  75. data/doc/_site/images/screenshots/ja/red-frame-raw.png +0 -0
  76. data/doc/_site/images/screenshots/ja/red-frame.png +0 -0
  77. data/doc/_site/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  78. data/doc/_site/images/screenshots/ja/ruby-gnome2.png +0 -0
  79. data/doc/_site/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  80. data/doc/_site/images/screenshots/ja/rubykaigi2011.png +0 -0
  81. data/doc/_site/index.html.en +1 -1
  82. data/doc/_site/index.html.ja +1 -1
  83. data/doc/_site/ja/about.html +1 -1
  84. data/doc/_site/ja/development.html +1 -1
  85. data/doc/_site/ja/faq.html +1 -1
  86. data/doc/_site/ja/hiki.html +1 -1
  87. data/doc/_site/ja/how-to-make/hiki.html +1 -1
  88. data/doc/_site/ja/how-to-make/index.html +1 -1
  89. data/doc/_site/ja/how-to-make/pdf.html +1 -1
  90. data/doc/_site/ja/how-to-make/rd.html +1 -1
  91. data/doc/_site/ja/how-to-make/theme.html +1 -1
  92. data/doc/_site/ja/index.html +6 -1
  93. data/doc/_site/ja/install/homebrew.html +1 -1
  94. data/doc/_site/ja/install/index.html +1 -1
  95. data/doc/_site/ja/install/macports.html +1 -1
  96. data/doc/_site/ja/install/windows.html +1 -1
  97. data/doc/_site/ja/news.html +161 -92
  98. data/doc/_site/ja/rd.html +1 -1
  99. data/doc/_site/ja/sample/hiki/rabbit.html +1 -1
  100. data/doc/_site/ja/sample/index.html +1 -1
  101. data/doc/_site/ja/sample/rd/rabbit.html +1 -1
  102. data/doc/_site/ja/slides.html +1 -1
  103. data/doc/_site/ja/usage.html +1 -1
  104. data/doc/_site/ja/users.html +1 -1
  105. data/doc/en/index.rd +3 -0
  106. data/doc/en/news.rd +73 -0
  107. data/doc/en/users.rd +1 -1
  108. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  109. data/doc/images/screenshots/en/blue-circle.png +0 -0
  110. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  111. data/doc/images/screenshots/en/clear-blue.png +0 -0
  112. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  113. data/doc/images/screenshots/en/cozmixng.png +0 -0
  114. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  115. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  116. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  117. data/doc/images/screenshots/en/day-white.png +0 -0
  118. data/doc/images/screenshots/en/debian-raw.png +0 -0
  119. data/doc/images/screenshots/en/debian.png +0 -0
  120. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  121. data/doc/images/screenshots/en/green-circle.png +0 -0
  122. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  123. data/doc/images/screenshots/en/night-black.png +0 -0
  124. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  125. data/doc/images/screenshots/en/rabbit.png +0 -0
  126. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  127. data/doc/images/screenshots/en/ranguba.png +0 -0
  128. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  129. data/doc/images/screenshots/en/red-frame.png +0 -0
  130. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  131. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  132. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  133. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  134. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  135. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  136. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  137. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  138. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  139. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  140. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  141. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  142. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  143. data/doc/images/screenshots/ja/day-white.png +0 -0
  144. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  145. data/doc/images/screenshots/ja/debian.png +0 -0
  146. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  147. data/doc/images/screenshots/ja/green-circle.png +0 -0
  148. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  149. data/doc/images/screenshots/ja/night-black.png +0 -0
  150. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  151. data/doc/images/screenshots/ja/rabbit.png +0 -0
  152. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  153. data/doc/images/screenshots/ja/ranguba.png +0 -0
  154. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  155. data/doc/images/screenshots/ja/red-frame.png +0 -0
  156. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  157. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  158. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  159. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  160. data/doc/index.html.en +1 -1
  161. data/doc/index.html.ja +1 -1
  162. data/doc/ja/index.rd +3 -0
  163. data/doc/ja/news.rd +73 -0
  164. data/lib/rabbit/element/base.rb +6 -3
  165. data/lib/rabbit/element/text-container-element.rb +1 -1
  166. data/lib/rabbit/element/text-element.rb +8 -0
  167. data/lib/rabbit/element/text-renderer.rb +1 -1
  168. data/lib/rabbit/front.rb +8 -0
  169. data/lib/rabbit/gettext.rb +3 -6
  170. data/lib/rabbit/image/pdf.rb +1 -1
  171. data/lib/rabbit/info-window.rb +64 -2
  172. data/lib/rabbit/logger/base.rb +3 -2
  173. data/lib/rabbit/middleware/views/index.haml +2 -2
  174. data/lib/rabbit/parser.rb +26 -0
  175. data/lib/rabbit/parser/ext/emacs.rb +7 -2
  176. data/lib/rabbit/parser/ext/enscript.rb +7 -2
  177. data/lib/rabbit/parser/markdown.rb +32 -0
  178. data/lib/rabbit/parser/markdown/converter.rb +257 -0
  179. data/lib/rabbit/parser/pdf.rb +1 -0
  180. data/lib/rabbit/parser/rd.rb +1 -0
  181. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +1 -1
  182. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +6 -16
  183. data/lib/rabbit/parser/wiki.rb +1 -0
  184. data/lib/rabbit/rabbit.rb +1 -1
  185. data/lib/rabbit/renderer/engine/cairo.rb +20 -5
  186. data/lib/rabbit/source/base.rb +12 -2
  187. data/lib/rabbit/source/file.rb +5 -1
  188. data/lib/rabbit/source/uri.rb +4 -0
  189. data/lib/rabbit/theme/default-slide/default-slide.rb +2 -0
  190. data/lib/rabbit/theme/nari/nari.rb +10 -0
  191. data/lib/rabbit/theme/slide-footer-info/slide-footer-info.rb +16 -12
  192. data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
  193. data/lib/rabbit/theme/syntax-highlighting/syntax-highlighting.rb +2 -0
  194. data/lib/rabbit/theme/tag/tag.rb +29 -8
  195. data/lib/rabbit/twitter.rb +17 -9
  196. data/po/rabbit.pot +124 -116
  197. data/sample/note.rab +12 -0
  198. data/sample/pre.rd +14 -3
  199. data/sample/rabbit-en.hiki +5 -4
  200. data/sample/rabbit-en.md +379 -0
  201. data/sample/rabbit-en.rd +5 -3
  202. data/sample/rabbit.hiki +1 -1
  203. data/sample/rabbit.md +374 -0
  204. data/sample/rabbit.rd +3 -1
  205. data/sample/test.hiki +31 -0
  206. data/sample/test.rab +30 -0
  207. metadata +180 -222
@@ -1,10 +1,7 @@
1
1
  begin
2
- begin
3
- require "gettext"
4
- rescue LoadError
5
- require "rubygems"
6
- require "gettext"
7
- end
2
+ require "rubygems"
3
+ raise LoadError if Gem.respond_to?(:_deprecated_all_load_paths)
4
+ require "gettext"
8
5
  module GetText
9
6
  if ::GetText::TextDomainManager.respond_to?(:textdomain)
10
7
  alias _gettext gettext
@@ -69,7 +69,7 @@ module Rabbit
69
69
  w = original_width
70
70
  h = original_height
71
71
  pixbuf = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, w, h)
72
- page.render_to_pixbuf(0, 0, w, h, 1.0, 0, pixbuf)
72
+ page.render(0, 0, w, h, 1.0, 0, pixbuf)
73
73
  pixbuf
74
74
  end
75
75
  end
@@ -58,6 +58,7 @@ module Rabbit
58
58
  def moved(index)
59
59
  return unless showing?
60
60
  check_timer
61
+ update_note_text if on_note_mode?
61
62
  adjust_slide(index)
62
63
  end
63
64
 
@@ -95,7 +96,11 @@ module Rabbit
95
96
  end
96
97
  @window.title = _("%s: Information window") % @canvas.title
97
98
  @window.set_default_size(width, height) if width and height
98
- init_widgets(width, height)
99
+ if on_note_mode?
100
+ init_widgets_on_note_mode(width, height)
101
+ else
102
+ init_widgets(width, height)
103
+ end
99
104
  init_menu
100
105
  attach_key(@window)
101
106
  attach_menu(@window)
@@ -136,6 +141,34 @@ module Rabbit
136
141
  @outer_box.show
137
142
  end
138
143
 
144
+ def init_widgets_on_note_mode(width, height)
145
+ init_timer_label(width * (1.0 / 5.0), height * (2.0 / 5.0))
146
+ init_note_text(width * (5.0 / 5.0), height * (3.0 / 5.0))
147
+ @outer_box = Gtk::VBox.new
148
+
149
+ current_box = Gtk::HBox.new
150
+ current_box.pack_start(@timer_label, false, false)
151
+ @previous_canvas.attach_to(nil, @window, current_box) do |container, widget|
152
+ widget.set_size_request(width * (1.0 / 5.0), height * (2.0 / 5.0))
153
+ container.pack_start(widget, true, true, 10)
154
+ end
155
+ @current_canvas.attach_to(nil, @window, current_box) do |container, widget|
156
+ widget.set_size_request(width * (2.0 / 5.0), height * (2.0 / 5.0))
157
+ container.pack_start(widget, true, true)
158
+ end
159
+ @next_canvas.attach_to(nil, @window, current_box) do |container, widget|
160
+ widget.set_size_request(width * (1.0 / 5.0), height * (2.0 / 5.0))
161
+ container.pack_end(widget, true, true, 10)
162
+ end
163
+ @outer_box.pack_start(current_box, false, false)
164
+
165
+ bottom_box = Gtk::HBox.new
166
+ bottom_box.pack_start(@note_label, false, true, 20)
167
+ @outer_box.pack_start(bottom_box, true, false)
168
+
169
+ @outer_box.show
170
+ end
171
+
139
172
  def init_canvas_widgets
140
173
  @canvas_widgets = Gtk::HBox.new
141
174
  @current_canvas.attach_to(nil, @window, @canvas_widgets)
@@ -150,6 +183,18 @@ module Rabbit
150
183
  check_timer
151
184
  end
152
185
 
186
+ def init_note_text(width, height)
187
+ @note_label = Gtk::Label.new
188
+ @note_label.justify = :left
189
+ @note_label.wrap = true
190
+ @note_label.markup = markupped_note_text(width, height)
191
+ @note_label.set_size_request(width, height)
192
+ end
193
+
194
+ def update_note_text
195
+ @note_label.markup = markupped_note_text
196
+ end
197
+
153
198
  def check_timer
154
199
  return if @timer_started
155
200
 
@@ -163,7 +208,8 @@ module Rabbit
163
208
  width ||= @window.size[0] * (1.0 / 3.0)
164
209
  height ||= @window.size[1] * (1.0 / 3.0)
165
210
  attrs = {}
166
- attrs["font_desc"] = ((height * 200) / Pango::SCALE).to_s
211
+ font_size = on_note_mode? ? 100 : 200
212
+ attrs["font_desc"] = ((height * font_size) / Pango::SCALE).to_s
167
213
  rest_time = @canvas.rest_time
168
214
  attrs["foreground"] = "red" if rest_time and rest_time < 0
169
215
  "<span #{@canvas.to_attrs(attrs)}>#{h timer_label}</span>"
@@ -178,6 +224,18 @@ module Rabbit
178
224
  end
179
225
  end
180
226
 
227
+ def markupped_note_text(width=nil, height=nil)
228
+ height ||= @window.size[1] * (3.0 / 5.0)
229
+ if @canvas.current_slide["note"]
230
+ text = @canvas.current_slide["note"].gsub(/\\n/, "\n")
231
+ else
232
+ text = ""
233
+ end
234
+ attrs = {}
235
+ attrs["font_desc"] = ((height * 40) / Pango::SCALE).to_s
236
+ "<span #{@canvas.to_attrs(attrs)}>#{text}</span>"
237
+ end
238
+
181
239
  def update_source
182
240
  each do |canvas|
183
241
  source = Source::Memory.new("UTF-8", @canvas.logger)
@@ -205,5 +263,9 @@ module Rabbit
205
263
  def each(&block)
206
264
  [@previous_canvas, @current_canvas, @next_canvas].each(&block)
207
265
  end
266
+
267
+ def on_note_mode?
268
+ @canvas.slides.any? {|slide| slide["note"]}
269
+ end
208
270
  end
209
271
  end
@@ -64,10 +64,11 @@ module Rabbit
64
64
  def info(message_or_error=nil, &block)
65
65
  log(INFO, message_or_error, &block)
66
66
  end
67
-
68
- def warn(message_or_error=nil, &block)
67
+
68
+ def warning(message_or_error=nil, &block)
69
69
  log(WARNING, message_or_error, &block)
70
70
  end
71
+ alias_method :warn, :warning # for backward compatibility
71
72
 
72
73
  def error(message_or_error=nil, &block)
73
74
  log(ERROR, message_or_error, &block)
@@ -1,12 +1,12 @@
1
1
  %ul
2
2
  %li
3
- - if @rabbit.have_next_slide?
3
+ - if @rabbit.have_next?
4
4
  %a(href="/pages/next")
5
5
  .navi 次へ
6
6
  - else
7
7
  .navi 次へ
8
8
  %li
9
- - if @rabbit.have_previous_slide?
9
+ - if @rabbit.have_previous?
10
10
  %a(href="/pages/previous")
11
11
  .navi 前へ
12
12
  - else
@@ -20,5 +20,31 @@ module Rabbit
20
20
  def normalize_property_name(name)
21
21
  name.gsub(/_/, "-").strip
22
22
  end
23
+
24
+ class SlidePropertySetter
25
+ def initialize(slide)
26
+ @slide = slide
27
+ end
28
+
29
+ def apply(element)
30
+ return unless element.is_a?(Element::DescriptionList)
31
+ element.each do |item|
32
+ name = Parser.normalize_property_name(item.term.text)
33
+ @slide[name] = item.content.text.strip
34
+ end
35
+ end
36
+ end
37
+
38
+ class NoteSetter
39
+ def initialize(slide)
40
+ @slide = slide
41
+ end
42
+
43
+ def apply(element)
44
+ return unless element.is_a?(Element::Paragraph)
45
+ @slide['note'] ||= ""
46
+ @slide['note'] << element.text
47
+ end
48
+ end
23
49
  end
24
50
  end
@@ -1,5 +1,3 @@
1
- require 'nokogiri'
2
-
3
1
  require 'rabbit/utils'
4
2
  require 'rabbit/parser/ext/escape'
5
3
 
@@ -12,6 +10,13 @@ module Rabbit
12
10
 
13
11
  module_function
14
12
  def highlight(text, logger, mode_line=nil)
13
+ begin
14
+ require 'nokogiri'
15
+ rescue
16
+ logger.warning("Syntax highlight by Emacs requires nokogiri.")
17
+ return nil
18
+ end
19
+
15
20
  src_file = Tempfile.new("rabbit-emacs")
16
21
  src_file.open
17
22
  src_file.print("#{mode_line}\n") if mode_line
@@ -1,5 +1,3 @@
1
- require 'nokogiri'
2
-
3
1
  require 'rabbit/utils'
4
2
  require 'rabbit/parser/ext/escape'
5
3
 
@@ -35,6 +33,13 @@ module Rabbit
35
33
  end
36
34
 
37
35
  def highlight(lang, text, logger)
36
+ begin
37
+ require 'nokogiri'
38
+ rescue
39
+ logger.warning("Syntax highlight by enscript requires nokogiri.")
40
+ return nil
41
+ end
42
+
38
43
  src_file = Tempfile.new("rabbit-enscript")
39
44
  src_file.open
40
45
  src_file.print(text)
@@ -0,0 +1,32 @@
1
+ require "kramdown"
2
+
3
+ require "rabbit/parser/base"
4
+
5
+ module Rabbit
6
+ module Parser
7
+ class Markdown < Base
8
+ end
9
+ end
10
+ end
11
+
12
+ require "rabbit/parser/markdown/converter"
13
+
14
+ module Rabbit
15
+ module Parser
16
+ class Markdown
17
+ unshift_loader(self)
18
+ class << self
19
+ def match?(source)
20
+ /\Amd\z/i =~ source.extension.to_s
21
+ end
22
+ end
23
+
24
+ include Element
25
+ def parse
26
+ document = Kramdown::Document.new(@source.read)
27
+ converter = Converter.new(@canvas)
28
+ converter.convert(document.root)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,257 @@
1
+ module Rabbit
2
+ module Parser
3
+ class Markdown
4
+ class Converter
5
+ include Element
6
+
7
+ def initialize(canvas)
8
+ @canvas = canvas
9
+ @slides = []
10
+ @slide = nil
11
+ @slide_property_mode = false
12
+ end
13
+
14
+ def convert(element)
15
+ __send__("convert_#{element.type}", element)
16
+ end
17
+
18
+ private
19
+ def convert_container(element)
20
+ elements = []
21
+ element.children.each do |child|
22
+ element = convert(child)
23
+ case element
24
+ when nil, :no_element
25
+ # ignore
26
+ else
27
+ elements << element
28
+ end
29
+ end
30
+ elements
31
+ end
32
+
33
+ def convert_root(element)
34
+ target = nil
35
+ mode = :ignore
36
+ require 'pp'
37
+ convert_container(element).each do |content|
38
+ case content
39
+ when :no_element
40
+ next
41
+ when nil
42
+ mode = :ignore
43
+ when Slide
44
+ target = content.body
45
+ @canvas << content
46
+ mode = :display
47
+ when TitleSlide
48
+ target = content
49
+ @canvas << content
50
+ mode = :display
51
+ when SlidePropertySetter, NoteSetter
52
+ target = content
53
+ mode = :property
54
+ else
55
+ case mode
56
+ when :display
57
+ target << content
58
+ when :property
59
+ target.apply(content)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def convert_header(element)
66
+ slide, @slide = @slide, nil
67
+ contents = convert_container(element)
68
+ case element.options[:level]
69
+ when 1
70
+ if @slides.empty?
71
+ @slide = TitleSlide.new(Title.new(contents))
72
+ else
73
+ @slide = Slide.new(HeadLine.new(contents))
74
+ @slide << Body.new
75
+ end
76
+ @slides << @slide
77
+ @slide
78
+ when 2
79
+ if /\Anote\z/i =~ contents.first.text
80
+ NoteSetter.new(@slides.last)
81
+ else
82
+ SlidePropertySetter.new(@slides.last)
83
+ end
84
+ else
85
+ nil
86
+ end
87
+ end
88
+
89
+ def text(content)
90
+ Text.new(Parser::Ext::Escape.escape_meta_character(content))
91
+ end
92
+
93
+ def convert_text(element)
94
+ text(element.value)
95
+ end
96
+
97
+ def convert_blank(element)
98
+ :no_element
99
+ end
100
+
101
+ def convert_dl(element)
102
+ list = DescriptionList.new
103
+ term = nil
104
+ content = nil
105
+ convert_container(element).each do |item|
106
+ case item
107
+ when DescriptionTerm
108
+ list << DescriptionListItem.new(term, content) if term
109
+ term = item
110
+ when DescriptionContent
111
+ content = item
112
+ end
113
+ end
114
+ list << DescriptionListItem.new(term, content) if term
115
+ list
116
+ end
117
+
118
+ def convert_dt(element)
119
+ DescriptionTerm.new(Paragraph.new(convert_container(element)))
120
+ end
121
+
122
+ def convert_dd(element)
123
+ DescriptionContent.new(convert_container(element))
124
+ end
125
+
126
+ def convert_p(element)
127
+ if element.children.collect {|child| child.type} == [:img]
128
+ convert_container(element)[0]
129
+ else
130
+ if element.children.any? {|child| child.type == :img}
131
+ raise ParseError,
132
+ _("multiple ![alt]{image} in a paragraph isn't supported.")
133
+ else
134
+ Paragraph.new(convert_container(element))
135
+ end
136
+ end
137
+ end
138
+
139
+ def convert_ul(element)
140
+ ItemList.new(convert_container(element))
141
+ end
142
+
143
+ def convert_li(element)
144
+ ItemListItem.new(convert_container(element))
145
+ end
146
+
147
+ def convert_smart_quote(element)
148
+ Text.new(Parser::Ext::Entity::TABLE[element.value.to_s])
149
+ end
150
+
151
+ def convert_typographic_sym(element)
152
+ Text.new(Parser::Ext::Entity::TABLE[element.value.to_s])
153
+ end
154
+
155
+ def convert_table(element)
156
+ table = Table.new
157
+ convert_container(element).each do |item|
158
+ table << item
159
+ end
160
+ table
161
+ end
162
+
163
+ def convert_thead(element)
164
+ in_table_header do
165
+ TableHead.new(convert_container(element))
166
+ end
167
+ end
168
+
169
+ def in_table_header
170
+ in_table_header, @in_table_header = @in_table_header, true
171
+ yield
172
+ ensure
173
+ @in_table_header = in_table_header
174
+ end
175
+
176
+ def convert_tbody(element)
177
+ TableBody.new(convert_container(element))
178
+ end
179
+
180
+ def convert_tr(element)
181
+ TableRow.new(convert_container(element))
182
+ end
183
+
184
+ def convert_td(element)
185
+ if @in_table_header
186
+ header = TableHeader.new(convert_container(element))
187
+ def header.default_align
188
+ Pango::Layout::ALIGN_CENTER
189
+ end
190
+ header
191
+ else
192
+ TableCell.new(convert_container(element))
193
+ end
194
+ end
195
+
196
+ def convert_comment(element)
197
+ :no_element
198
+ end
199
+
200
+ def convert_codeblock(element)
201
+ content = element.value.chomp
202
+ lang = element.attr["lang"]
203
+ if lang
204
+ highlighted = Ext::CodeRay.highlight(lang, content, @canvas.logger)
205
+ return highlighted if highlighted
206
+ end
207
+ PreformattedBlock.new(PreformattedText.new(text(content)))
208
+ end
209
+
210
+ def convert_blockquote(element)
211
+ BlockQuote.new(convert_container(element))
212
+ end
213
+
214
+ def convert_img(element)
215
+ options = element.attr.dup
216
+ uri = options.delete("src")
217
+ title = options.delete("title")
218
+ alt = options.delete("alt")
219
+ caption = title || alt
220
+ options["caption"] ||= caption if caption
221
+ if options["align"] == "right"
222
+ body = @slides.last.body
223
+ if body["background-image"]
224
+ raise ParseError,
225
+ _("multiple ![]('XXX.png'){:align='right'} " + \
226
+ "isn't supported.")
227
+ end
228
+ body["background-image"] = uri
229
+ options.each do |name, value|
230
+ name = name.to_s.gsub(/_/, '-')
231
+ body["background-image-#{name}"] = value
232
+ end
233
+ :no_element
234
+ else
235
+ image = Ext::Image.make_image(@canvas, uri, options)
236
+ image || text(alt || src)
237
+ end
238
+ end
239
+
240
+ def convert_em(element)
241
+ Emphasis.new(Emphasis.new(convert_container(element)))
242
+ end
243
+
244
+ def convert_strong(element)
245
+ Emphasis.new(Emphasis.new(convert_container(element)))
246
+ end
247
+
248
+ def convert_math(element)
249
+ args = [@canvas, element.value]
250
+ Ext::Image.make_image_from_file(*args) do |src_file_path|
251
+ [Ext::TeX.make_image_by_LaTeX(src_file_path, {}, @canvas), {}]
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end