rabbit 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Rakefile +27 -0
- data/bin/rabbirack +5 -1
- data/bin/rabbit +1 -1
- data/bin/rabbit-command +1 -1
- data/doc/_layouts/en.html +1 -1
- data/doc/_layouts/ja.html +1 -1
- data/doc/_site/en/development.html +1 -1
- data/doc/_site/en/faq.html +1 -1
- data/doc/_site/en/hiki.html +1 -1
- data/doc/_site/en/how-to-make/hiki.html +1 -1
- data/doc/_site/en/how-to-make/index.html +1 -1
- data/doc/_site/en/how-to-make/pdf.html +1 -1
- data/doc/_site/en/how-to-make/rd.html +1 -1
- data/doc/_site/en/how-to-make/theme.html +1 -1
- data/doc/_site/en/index.html +6 -1
- data/doc/_site/en/install/homebrew.html +1 -1
- data/doc/_site/en/install/index.html +1 -1
- data/doc/_site/en/install/macports.html +1 -1
- data/doc/_site/en/install/windows.html +1 -1
- data/doc/_site/en/news.html +161 -92
- data/doc/_site/en/rd.html +1 -1
- data/doc/_site/en/sample/hiki/rabbit.html +1 -1
- data/doc/_site/en/sample/index.html +1 -1
- data/doc/_site/en/sample/rd/rabbit.html +1 -1
- data/doc/_site/en/slides.html +1 -1
- data/doc/_site/en/usage.html +1 -1
- data/doc/_site/en/users.html +2 -2
- data/doc/_site/images/screenshots/en/blue-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/en/blue-circle.png +0 -0
- data/doc/_site/images/screenshots/en/clear-blue-raw.png +0 -0
- data/doc/_site/images/screenshots/en/clear-blue.png +0 -0
- data/doc/_site/images/screenshots/en/cozmixng-raw.png +0 -0
- data/doc/_site/images/screenshots/en/cozmixng.png +0 -0
- data/doc/_site/images/screenshots/en/dark-gradation-raw.png +0 -0
- data/doc/_site/images/screenshots/en/dark-gradation.png +0 -0
- data/doc/_site/images/screenshots/en/day-white-raw.png +0 -0
- data/doc/_site/images/screenshots/en/day-white.png +0 -0
- data/doc/_site/images/screenshots/en/debian-raw.png +0 -0
- data/doc/_site/images/screenshots/en/debian.png +0 -0
- data/doc/_site/images/screenshots/en/green-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/en/green-circle.png +0 -0
- data/doc/_site/images/screenshots/en/night-black-raw.png +0 -0
- data/doc/_site/images/screenshots/en/night-black.png +0 -0
- data/doc/_site/images/screenshots/en/rabbit-raw.png +0 -0
- data/doc/_site/images/screenshots/en/rabbit.png +0 -0
- data/doc/_site/images/screenshots/en/ranguba-raw.png +0 -0
- data/doc/_site/images/screenshots/en/ranguba.png +0 -0
- data/doc/_site/images/screenshots/en/red-frame-raw.png +0 -0
- data/doc/_site/images/screenshots/en/red-frame.png +0 -0
- data/doc/_site/images/screenshots/en/ruby-gnome2-raw.png +0 -0
- data/doc/_site/images/screenshots/en/ruby-gnome2.png +0 -0
- data/doc/_site/images/screenshots/en/rubykaigi2011-raw.png +0 -0
- data/doc/_site/images/screenshots/en/rubykaigi2011.png +0 -0
- data/doc/_site/images/screenshots/ja/blue-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/blue-circle.png +0 -0
- data/doc/_site/images/screenshots/ja/clear-blue-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/clear-blue.png +0 -0
- data/doc/_site/images/screenshots/ja/cozmixng-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/cozmixng.png +0 -0
- data/doc/_site/images/screenshots/ja/dark-gradation-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/dark-gradation.png +0 -0
- data/doc/_site/images/screenshots/ja/day-white-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/day-white.png +0 -0
- data/doc/_site/images/screenshots/ja/debian-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/debian.png +0 -0
- data/doc/_site/images/screenshots/ja/green-circle-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/green-circle.png +0 -0
- data/doc/_site/images/screenshots/ja/night-black-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/night-black.png +0 -0
- data/doc/_site/images/screenshots/ja/rabbit-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/rabbit.png +0 -0
- data/doc/_site/images/screenshots/ja/ranguba-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/ranguba.png +0 -0
- data/doc/_site/images/screenshots/ja/red-frame-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/red-frame.png +0 -0
- data/doc/_site/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/ruby-gnome2.png +0 -0
- data/doc/_site/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
- data/doc/_site/images/screenshots/ja/rubykaigi2011.png +0 -0
- data/doc/_site/index.html.en +1 -1
- data/doc/_site/index.html.ja +1 -1
- data/doc/_site/ja/about.html +1 -1
- data/doc/_site/ja/development.html +1 -1
- data/doc/_site/ja/faq.html +1 -1
- data/doc/_site/ja/hiki.html +1 -1
- data/doc/_site/ja/how-to-make/hiki.html +1 -1
- data/doc/_site/ja/how-to-make/index.html +1 -1
- data/doc/_site/ja/how-to-make/pdf.html +1 -1
- data/doc/_site/ja/how-to-make/rd.html +1 -1
- data/doc/_site/ja/how-to-make/theme.html +1 -1
- data/doc/_site/ja/index.html +6 -1
- data/doc/_site/ja/install/homebrew.html +1 -1
- data/doc/_site/ja/install/index.html +1 -1
- data/doc/_site/ja/install/macports.html +1 -1
- data/doc/_site/ja/install/windows.html +1 -1
- data/doc/_site/ja/news.html +161 -92
- data/doc/_site/ja/rd.html +1 -1
- data/doc/_site/ja/sample/hiki/rabbit.html +1 -1
- data/doc/_site/ja/sample/index.html +1 -1
- data/doc/_site/ja/sample/rd/rabbit.html +1 -1
- data/doc/_site/ja/slides.html +1 -1
- data/doc/_site/ja/usage.html +1 -1
- data/doc/_site/ja/users.html +1 -1
- data/doc/en/index.rd +3 -0
- data/doc/en/news.rd +73 -0
- data/doc/en/users.rd +1 -1
- 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.en +1 -1
- data/doc/index.html.ja +1 -1
- data/doc/ja/index.rd +3 -0
- data/doc/ja/news.rd +73 -0
- data/lib/rabbit/element/base.rb +6 -3
- data/lib/rabbit/element/text-container-element.rb +1 -1
- data/lib/rabbit/element/text-element.rb +8 -0
- data/lib/rabbit/element/text-renderer.rb +1 -1
- data/lib/rabbit/front.rb +8 -0
- data/lib/rabbit/gettext.rb +3 -6
- data/lib/rabbit/image/pdf.rb +1 -1
- data/lib/rabbit/info-window.rb +64 -2
- data/lib/rabbit/logger/base.rb +3 -2
- data/lib/rabbit/middleware/views/index.haml +2 -2
- data/lib/rabbit/parser.rb +26 -0
- data/lib/rabbit/parser/ext/emacs.rb +7 -2
- data/lib/rabbit/parser/ext/enscript.rb +7 -2
- data/lib/rabbit/parser/markdown.rb +32 -0
- data/lib/rabbit/parser/markdown/converter.rb +257 -0
- data/lib/rabbit/parser/pdf.rb +1 -0
- data/lib/rabbit/parser/rd.rb +1 -0
- data/lib/rabbit/parser/rd/ext/block-verbatim.rb +1 -1
- data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +6 -16
- data/lib/rabbit/parser/wiki.rb +1 -0
- data/lib/rabbit/rabbit.rb +1 -1
- data/lib/rabbit/renderer/engine/cairo.rb +20 -5
- data/lib/rabbit/source/base.rb +12 -2
- data/lib/rabbit/source/file.rb +5 -1
- data/lib/rabbit/source/uri.rb +4 -0
- data/lib/rabbit/theme/default-slide/default-slide.rb +2 -0
- data/lib/rabbit/theme/nari/nari.rb +10 -0
- data/lib/rabbit/theme/slide-footer-info/slide-footer-info.rb +16 -12
- data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
- data/lib/rabbit/theme/syntax-highlighting/syntax-highlighting.rb +2 -0
- data/lib/rabbit/theme/tag/tag.rb +29 -8
- data/lib/rabbit/twitter.rb +17 -9
- data/po/rabbit.pot +124 -116
- data/sample/note.rab +12 -0
- data/sample/pre.rd +14 -3
- data/sample/rabbit-en.hiki +5 -4
- data/sample/rabbit-en.md +379 -0
- data/sample/rabbit-en.rd +5 -3
- data/sample/rabbit.hiki +1 -1
- data/sample/rabbit.md +374 -0
- data/sample/rabbit.rd +3 -1
- data/sample/test.hiki +31 -0
- data/sample/test.rab +30 -0
- metadata +180 -222
data/lib/rabbit/gettext.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
begin
|
2
|
-
|
3
|
-
|
4
|
-
|
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
|
data/lib/rabbit/image/pdf.rb
CHANGED
data/lib/rabbit/info-window.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
data/lib/rabbit/logger/base.rb
CHANGED
@@ -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
|
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)
|
data/lib/rabbit/parser.rb
CHANGED
@@ -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
|