rabbit 3.0.1 → 3.0.2

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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -1
  3. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  4. data/doc/_config.yml +2 -2
  5. data/doc/_layouts/skeleton.html +0 -7
  6. data/doc/en/install/homebrew.rd +8 -13
  7. data/doc/en/news.rd +67 -0
  8. data/doc/images/screenshots/en/blue-circle-raw.png +0 -0
  9. data/doc/images/screenshots/en/blue-circle.png +0 -0
  10. data/doc/images/screenshots/en/clear-blue-raw.png +0 -0
  11. data/doc/images/screenshots/en/clear-blue.png +0 -0
  12. data/doc/images/screenshots/en/cozmixng-raw.png +0 -0
  13. data/doc/images/screenshots/en/cozmixng.png +0 -0
  14. data/doc/images/screenshots/en/dark-gradation-raw.png +0 -0
  15. data/doc/images/screenshots/en/dark-gradation.png +0 -0
  16. data/doc/images/screenshots/en/day-white-raw.png +0 -0
  17. data/doc/images/screenshots/en/day-white.png +0 -0
  18. data/doc/images/screenshots/en/debian-raw.png +0 -0
  19. data/doc/images/screenshots/en/debian.png +0 -0
  20. data/doc/images/screenshots/en/green-circle-raw.png +0 -0
  21. data/doc/images/screenshots/en/green-circle.png +0 -0
  22. data/doc/images/screenshots/en/night-black-raw.png +0 -0
  23. data/doc/images/screenshots/en/night-black.png +0 -0
  24. data/doc/images/screenshots/en/rabbit-raw.png +0 -0
  25. data/doc/images/screenshots/en/rabbit.png +0 -0
  26. data/doc/images/screenshots/en/ranguba-raw.png +0 -0
  27. data/doc/images/screenshots/en/ranguba.png +0 -0
  28. data/doc/images/screenshots/en/red-frame-raw.png +0 -0
  29. data/doc/images/screenshots/en/red-frame.png +0 -0
  30. data/doc/images/screenshots/en/ruby-gnome2-raw.png +0 -0
  31. data/doc/images/screenshots/en/ruby-gnome2.png +0 -0
  32. data/doc/images/screenshots/en/rubykaigi2011-raw.png +0 -0
  33. data/doc/images/screenshots/en/rubykaigi2011.png +0 -0
  34. data/doc/images/screenshots/ja/blue-circle-raw.png +0 -0
  35. data/doc/images/screenshots/ja/blue-circle.png +0 -0
  36. data/doc/images/screenshots/ja/clear-blue-raw.png +0 -0
  37. data/doc/images/screenshots/ja/clear-blue.png +0 -0
  38. data/doc/images/screenshots/ja/cozmixng-raw.png +0 -0
  39. data/doc/images/screenshots/ja/cozmixng.png +0 -0
  40. data/doc/images/screenshots/ja/dark-gradation-raw.png +0 -0
  41. data/doc/images/screenshots/ja/dark-gradation.png +0 -0
  42. data/doc/images/screenshots/ja/day-white-raw.png +0 -0
  43. data/doc/images/screenshots/ja/day-white.png +0 -0
  44. data/doc/images/screenshots/ja/debian-raw.png +0 -0
  45. data/doc/images/screenshots/ja/debian.png +0 -0
  46. data/doc/images/screenshots/ja/green-circle-raw.png +0 -0
  47. data/doc/images/screenshots/ja/green-circle.png +0 -0
  48. data/doc/images/screenshots/ja/night-black-raw.png +0 -0
  49. data/doc/images/screenshots/ja/night-black.png +0 -0
  50. data/doc/images/screenshots/ja/rabbit-raw.png +0 -0
  51. data/doc/images/screenshots/ja/rabbit.png +0 -0
  52. data/doc/images/screenshots/ja/ranguba-raw.png +0 -0
  53. data/doc/images/screenshots/ja/ranguba.png +0 -0
  54. data/doc/images/screenshots/ja/red-frame-raw.png +0 -0
  55. data/doc/images/screenshots/ja/red-frame.png +0 -0
  56. data/doc/images/screenshots/ja/ruby-gnome2-raw.png +0 -0
  57. data/doc/images/screenshots/ja/ruby-gnome2.png +0 -0
  58. data/doc/images/screenshots/ja/rubykaigi2011-raw.png +0 -0
  59. data/doc/images/screenshots/ja/rubykaigi2011.png +0 -0
  60. data/doc/ja/install/homebrew.rd +8 -12
  61. data/doc/ja/news.rd +67 -0
  62. data/lib/rabbit/canvas.rb +7 -5
  63. data/lib/rabbit/element/base.rb +1 -5
  64. data/lib/rabbit/element/image.rb +70 -4
  65. data/lib/rabbit/error.rb +7 -1
  66. data/lib/rabbit/formatter.rb +1 -1
  67. data/lib/rabbit/gem-pusher.rb +2 -1
  68. data/lib/rabbit/image/base.rb +67 -3
  69. data/lib/rabbit/image/dia.rb +7 -15
  70. data/lib/rabbit/image/mermaid.rb +73 -0
  71. data/lib/rabbit/image/pdf.rb +21 -5
  72. data/lib/rabbit/image.rb +3 -2
  73. data/lib/rabbit/parser/base.rb +2 -1
  74. data/lib/rabbit/parser/ext/blockdiag.rb +16 -14
  75. data/lib/rabbit/parser/ext/image.rb +36 -9
  76. data/lib/rabbit/parser/markdown/converter.rb +36 -30
  77. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +23 -33
  78. data/lib/rabbit/parser/rd/ext/image.rb +23 -4
  79. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +3 -1
  80. data/lib/rabbit/parser/rd.rb +1 -1
  81. data/lib/rabbit/parser/wiki/output.rb +9 -9
  82. data/lib/rabbit/parser.rb +2 -2
  83. data/lib/rabbit/properties.rb +14 -1
  84. data/lib/rabbit/renderer/display/drawing-area-base.rb +1 -1
  85. data/lib/rabbit/slide-configuration.rb +4 -0
  86. data/lib/rabbit/task/slide.rb +4 -31
  87. data/lib/rabbit/theme/background-image-toolkit/background-image-toolkit.rb +38 -0
  88. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  89. data/lib/rabbit/theme/image/image.rb +3 -0
  90. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +7 -2
  91. data/lib/rabbit/theme/image-timer/image-timer.rb +8 -3
  92. data/lib/rabbit/theme/pdf/pdf.rb +1 -1
  93. data/lib/rabbit/utils.rb +25 -2
  94. data/lib/rabbit/version.rb +2 -2
  95. data/po/en/rabbit.edit.po +50 -66
  96. data/po/en/rabbit.po +12 -24
  97. data/po/fr/rabbit.edit.po +50 -66
  98. data/po/fr/rabbit.po +12 -24
  99. data/po/ja/rabbit.edit.po +82 -94
  100. data/po/ja/rabbit.po +18 -30
  101. data/rabbit.gemspec +0 -1
  102. data/sample/rabbit-en.md +13 -0
  103. data/sample/rabbit-en.rd +10 -0
  104. data/sample/rabbit.md +21 -0
  105. data/sample/rabbit.rd +20 -0
  106. data/test/command/test-rabbit.rb +1 -0
  107. data/test/parser/test-markdown.rb +2 -2
  108. data/test/test-slide-configuration.rb +2 -1
  109. metadata +7 -26
  110. data/doc/css/jquery-ui/themes/ui-lightness.css +0 -573
  111. data/doc/javascripts/jquery-ui.js +0 -11544
  112. data/doc/javascripts/jquery.js +0 -7179
  113. data/lib/rabbit/slideshare.rb +0 -192
  114. data/test/test-slideshare.rb +0 -34
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2020 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,6 +14,9 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
+ require "forwardable"
18
+ require "digest/sha2"
19
+
17
20
  require "gdk_pixbuf2"
18
21
 
19
22
  require "rabbit/image-data-loader"
@@ -21,19 +24,40 @@ require "rabbit/properties"
21
24
 
22
25
  module Rabbit
23
26
  module ImageManipulable
24
-
25
27
  class Base
26
28
  extend ModuleLoader
27
29
 
30
+ class << self
31
+ def delegate
32
+ extend Forwardable
33
+
34
+ def_delegators(:@delegated_loader,
35
+ :draw,
36
+ :ensure_resize,
37
+ :height,
38
+ :internal_pixbuf,
39
+ :keep_ratio,
40
+ :keep_ratio=,
41
+ :keep_ratio?,
42
+ :original_height,
43
+ :original_width,
44
+ :pixbuf,
45
+ :resize,
46
+ :update_size,
47
+ :width)
48
+ end
49
+ end
50
+
28
51
  attr_reader :filename
29
52
  attr_reader :properties
30
53
  attr_reader :original_width
31
54
  attr_reader :original_height
32
55
  attr_reader :animation
33
56
 
34
- def initialize(filename, props)
57
+ def initialize(filename, props, canvas: nil)
35
58
  @filename = filename
36
59
  @properties = Properties.new(props)
60
+ @canvas = canvas
37
61
  initialize_keep_ratio
38
62
  @animation = nil
39
63
  @animation_iterator = nil
@@ -200,6 +224,46 @@ module Rabbit
200
224
  }
201
225
  end
202
226
  end
227
+
228
+ # TODO: Move to more suitable location
229
+ def cache_processed_data(canvas, input, extension)
230
+ tmp_dir_name = canvas&.tmp_dir_name
231
+ return yield unless tmp_dir_name
232
+ hash = compute_hash(input)
233
+ cached_path = File.join(tmp_dir_name, "#{hash}.#{extension}")
234
+ unless File.exist?(cached_path)
235
+ processed_path = yield
236
+ FileUtils.cp(processed_path, cached_path)
237
+ end
238
+ cached_path
239
+ end
240
+
241
+ def compute_hash(input)
242
+ digest = Digest::SHA2.new
243
+ add_data = lambda do |data|
244
+ case data
245
+ when Array
246
+ data.each do |element|
247
+ add_data.call(element)
248
+ end
249
+ when Hash
250
+ data.each do |key, value|
251
+ add_data.call(key)
252
+ add_data.call(value)
253
+ end
254
+ when String
255
+ digest << data
256
+ when IO
257
+ loop do
258
+ chunk = data.read(4096)
259
+ break if chunk.nil?
260
+ digest << chunk
261
+ end
262
+ end
263
+ end
264
+ add_data.call(input)
265
+ digest.hexdigest
266
+ end
203
267
  end
204
268
  end
205
269
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2020 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,8 +14,6 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "forwardable"
18
-
19
17
  require "rabbit/image/base"
20
18
 
21
19
  module Rabbit
@@ -26,7 +24,6 @@ module Rabbit
26
24
 
27
25
  DIA_COMMANDS = %w(dia)
28
26
 
29
- extend Forwardable
30
27
  include SystemRunner
31
28
 
32
29
  class << self
@@ -48,26 +45,21 @@ module Rabbit
48
45
  end
49
46
  end
50
47
 
51
- def_delegators(:@svg_loader, :keep_ratio, :keep_ratio?, :keep_ratio=)
52
- def_delegators(:@svg_loader, :pixbuf, :internal_pixbuf)
53
- def_delegators(:@svg_loader, :width, :height)
54
- def_delegators(:@svg_loader, :original_width, :original_height)
55
- def_delegators(:@svg_loader, :resize, :ensure_resize)
56
- def_delegators(:@svg_loader, :update_size)
48
+ delegate
57
49
 
58
- def initialize(filename, props)
59
- init_svg_loader(filename, props)
50
+ def initialize(filename, props, canvas: nil)
51
+ init_delegated_loader(filename, props, canvas)
60
52
  super
61
53
  end
62
54
 
63
55
  private
64
- def init_svg_loader(filename, props)
65
- @svg_file = Tempfile.new(["rabbit-loader-dia", ".svg"])
56
+ def init_delegated_loader(filename, props, canvas)
57
+ @svg_file = Tempfile.new(["rabbit-image-loader-dia", ".svg"])
66
58
  args = ["--export=#{@svg_file.path}"]
67
59
  args << "--filter=svg"
68
60
  args << filename
69
61
  if DIA_COMMANDS.any? {|dia| run(dia, *args)}
70
- @svg_loader = SVG.new(@svg_file.path, props)
62
+ @delegated_loader = SVG.new(@svg_file.path, props)
71
63
  else
72
64
  raise DiaCanNotHandleError.new("dia #{args.join(' ')}",
73
65
  DIA_COMMANDS)
@@ -0,0 +1,73 @@
1
+ # Copyright (C) 2022 Sutou Kouhei <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/image/pdf"
18
+
19
+ module Rabbit
20
+ module ImageManipulable
21
+ class Mermaid < Base
22
+
23
+ unshift_loader(self)
24
+
25
+ include SystemRunner
26
+
27
+ class << self
28
+ def match?(filename)
29
+ File.extname(filename).downcase.end_with?(".mmd")
30
+ end
31
+ end
32
+
33
+ delegate
34
+
35
+ def initialize(filename, props, canvas: nil)
36
+ init_delegated_loader(filename, props, canvas)
37
+ super
38
+ end
39
+
40
+ private
41
+ def init_delegated_loader(filename, props, canvas)
42
+ background_color = props["background_color"] || "transparent"
43
+ pdf_path = File.open(filename, "rb") do |source|
44
+ cache_processed_data(canvas, [source, background_color], "pdf") do
45
+ @pdf_file = Tempfile.new(["rabbit-image-loader-mermaid", ".pdf"])
46
+ command_line = [
47
+ "npx",
48
+ "--yes",
49
+ "--package=@mermaid-js/mermaid-cli",
50
+ "mmdc",
51
+ "--backgroundColor", background_color,
52
+ "--input", filename,
53
+ "--output", @pdf_file.path,
54
+ "--pdfFit",
55
+ ]
56
+ unless SystemRunner.run(*command_line)
57
+ format = _("tried mermaid command: %s")
58
+ additional_info = format % command_line.inspect
59
+ raise MermaidCanNotHandleError.new(command_line.join(' '),
60
+ additional_info)
61
+ end
62
+ @pdf_file.path
63
+ end
64
+ end
65
+ @delegated_loader = PDF.new(pdf_path, props)
66
+ end
67
+
68
+ def load_image
69
+ # do nothing
70
+ end
71
+ end
72
+ end
73
+ end
@@ -1,3 +1,19 @@
1
+ # Copyright (C) 2006-2022 Sutou Kouhei <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
+
1
17
  require "poppler"
2
18
 
3
19
  require "rabbit/gettext"
@@ -36,6 +52,11 @@ module Rabbit
36
52
  @pixbuf ||= to_pixbuf
37
53
  end
38
54
 
55
+ def update_size
56
+ @document = Poppler::Document.new(uri)
57
+ @width, @height = page.size
58
+ end
59
+
39
60
  private
40
61
  def page
41
62
  index = self["page"] || 1
@@ -53,11 +74,6 @@ module Rabbit
53
74
  _page
54
75
  end
55
76
 
56
- def update_size
57
- @document = Poppler::Document.new(uri)
58
- @width, @height = page.size
59
- end
60
-
61
77
  def filename
62
78
  File.expand_path(@filename)
63
79
  end
data/lib/rabbit/image.rb CHANGED
@@ -21,6 +21,7 @@ require "rabbit/image/default"
21
21
  require "rabbit/image/dia"
22
22
  require "rabbit/image/eps"
23
23
  require "rabbit/image/gimp"
24
+ require "rabbit/image/mermaid"
24
25
  require "rabbit/image/pdf"
25
26
  require "rabbit/image/svg"
26
27
 
@@ -37,12 +38,12 @@ module Rabbit
37
38
  def_delegators(:@loader, :properties)
38
39
  alias_method :scale, :resize
39
40
 
40
- def initialize(filename, props=nil, *args, &block)
41
+ def initialize(filename, props=nil, *args, canvas: nil, &block)
41
42
  unless File.exist?(filename)
42
43
  raise ImageFileDoesNotExistError.new(filename)
43
44
  end
44
45
  super(*args, &block)
45
- @loader = Base.find_loader(filename).new(filename, props)
46
+ @loader = Base.find_loader(filename).new(filename, props, canvas: canvas)
46
47
  end
47
48
  end
48
49
 
@@ -5,9 +5,10 @@ module Rabbit
5
5
  class Base
6
6
  extend ModuleLoader
7
7
 
8
- def initialize(canvas, source)
8
+ def initialize(canvas, source, progress: nil)
9
9
  @canvas = canvas
10
10
  @source = source
11
+ @progress = progress
11
12
  end
12
13
  end
13
14
  end
@@ -9,29 +9,31 @@ module Rabbit
9
9
  # "font" is treated as specially.
10
10
  AVAILABLE_VALUE_OPTIONS = []
11
11
  def make_image(path, prop, logger)
12
- image_file = Tempfile.new("rabbit-image-blockdiag")
13
- command = [
14
- "blockdiag",
12
+ image_file = Tempfile.new(["rabbit-image-blockdiag", ".svg"])
13
+ command_line = [
15
14
  "-T", "svg",
16
15
  "-o", image_file.path,
17
16
  ]
18
17
  font = find_font(prop)
19
- command.concat(["-f", font]) if font
18
+ command_line.concat(["-f", font]) if font
20
19
  AVAILABLE_FLAG_OPTIONS.each do |name|
21
- command << "--#{name}" if /\A(?:true|yes)\z/i =~ prop[name].to_s
20
+ command_line << "--#{name}" if /\A(?:true|yes)\z/i =~ prop[name].to_s
22
21
  end
23
22
  AVAILABLE_VALUE_OPTIONS.each do |name|
24
- command.concat(["--#{name}", prop[name]]) if prop.has_key?(name)
23
+ command_line.concat(["--#{name}", prop[name]]) if prop.has_key?(name)
25
24
  end
26
- command << path
27
- if SystemRunner.run(*command)
28
- image_file
29
- else
30
- format = _("tried blockdiag command: %s")
31
- additional_info = format % command.inspect
32
- raise BlockDiagCanNotHandleError.new(command.join(' '),
33
- additional_info)
25
+ command_line << path
26
+ blockdiag_commands = ["blockdiag3", "blockdiag"]
27
+ blockdiag_commands.each do |blockdiag|
28
+ if SystemRunner.run(blockdiag, *command_line)
29
+ return image_file
30
+ end
34
31
  end
32
+ command_line.unshift(blockdiag_commands.first)
33
+ format = _("tried blockdiag command: %s")
34
+ additional_info = format % command_line
35
+ raise BlockDiagCanNotHandleError.new(command_line.join(' '),
36
+ additional_info)
35
37
  end
36
38
 
37
39
  def find_font(prop)
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2007-2018 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2007-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -27,31 +27,58 @@ module Rabbit
27
27
  module Ext
28
28
  module Image
29
29
  module_function
30
- def make_image(canvas, uri_str, prop={})
30
+ def make_image(canvas, uri_str, prop={}, body: nil)
31
31
  path = Private.uri_string_to_image_filename(canvas, uri_str)
32
32
  begin
33
- Element::Image.new(path, prop)
33
+ image = Element::Image.new(path, prop, canvas: canvas)
34
34
  rescue Error
35
35
  canvas.logger.warn($!.message)
36
36
  nil
37
+ else
38
+ if prop["align"] == "right" and body
39
+ if body["background-image"]
40
+ raise ParseError,
41
+ _("multiple right aligns aren't supported.")
42
+ end
43
+ prop.each do |name, value|
44
+ name = name.gsub(/_/, "-")
45
+ next if name == "src"
46
+ property_name = "background-image-#{name}"
47
+ body[property_name] = value
48
+ end
49
+ body["background-image"] = uri_str
50
+ :no_element
51
+ else
52
+ image
53
+ end
37
54
  end
38
55
  end
39
56
 
40
- def make_image_from_file(canvas, source)
41
- src_file = Tempfile.new("rabbit-image-source")
57
+ def make_image_from_file(canvas, source, extension: nil, **options)
58
+ src_basename = "rabbit-image-source"
59
+ src_basename = [src_basename, extension] if extension
60
+ src_file = Tempfile.new(src_basename)
42
61
  src_file.open
43
62
  src_file.print(source)
44
63
  src_file.close
45
64
  image_file = prop = nil
46
65
  begin
47
- image_file, prop = yield(src_file.path)
66
+ image_file, prop = yield(src_file)
48
67
  rescue ImageLoadError
49
68
  canvas.logger.warn($!.message)
50
69
  end
51
70
  return nil if image_file.nil?
52
- image = make_image(canvas, %Q[file://#{image_file.path}], prop)
53
- return nil if image.nil?
54
- image["_src"] = image_file # for protecting from GC
71
+ image = make_image(canvas,
72
+ "file://#{image_file.path}",
73
+ prop,
74
+ **options)
75
+ # Protect image from GC
76
+ case image
77
+ when Element::Image
78
+ image["_src"] = image_file
79
+ when :no_element
80
+ options[:body]["_background-image-src"] = image_file
81
+ end
55
82
  image
56
83
  end
57
84
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2017 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -20,8 +20,8 @@ require "rabbit/gettext"
20
20
  require "rabbit/parser/pause-support"
21
21
  require "rabbit/parser/ext/blockdiag"
22
22
  require "rabbit/parser/ext/escape"
23
- require "rabbit/parser/ext/inline"
24
23
  require "rabbit/parser/ext/image"
24
+ require "rabbit/parser/ext/inline"
25
25
  require "rabbit/parser/ext/rouge"
26
26
  require "rabbit/parser/ext/tex"
27
27
 
@@ -165,9 +165,15 @@ module Rabbit
165
165
  if child_types == [:img]
166
166
  convert_container(element)[0]
167
167
  else
168
- if child_types.include?(:img)
168
+ if child_types.count(:img) > 1
169
169
  raise ParseError,
170
- _("multiple ![alt]{image} in a paragraph isn't supported.")
170
+ _("multiple ![alt]{image}s in a paragraph isn't supported.")
171
+ end
172
+ if child_types.include?(:img)
173
+ message =
174
+ _("![alt]{image} and other contents in a paragraph " \
175
+ "isn't supported: %{types}")
176
+ raise ParseError, message % {types: child_types}
171
177
  end
172
178
  if element.options[:transparent] and child_types == [:text]
173
179
  element.children.first.value.chomp!
@@ -325,12 +331,14 @@ module Rabbit
325
331
  def convert_codeblock_language(element, language, content)
326
332
  case language
327
333
  when "blockdiag"
328
- args = [@canvas, content]
329
- Ext::Image.make_image_from_file(*args) do |src_file_path|
330
- [
331
- Ext::BlockDiag.make_image(src_file_path, element.attr, @canvas),
332
- element.attr,
333
- ]
334
+ make_image_from_file(element, content) do |src_file, prop|
335
+ Ext::BlockDiag.make_image(src_file.path, prop, @canvas)
336
+ end
337
+ when "mermaid"
338
+ make_image_from_file(element,
339
+ content,
340
+ extension: ".mmd") do |src_file, prop|
341
+ src_file
334
342
  end
335
343
  else
336
344
  logger = @canvas.logger
@@ -349,23 +357,11 @@ module Rabbit
349
357
  alt = options.delete("alt")
350
358
  caption = title || alt
351
359
  options["caption"] ||= caption if caption
352
- if options["align"] == "right"
353
- body = @slides.last.body
354
- if body["background-image"]
355
- raise ParseError,
356
- _("multiple ![]('XXX.png'){:align='right'} " + \
357
- "isn't supported.")
358
- end
359
- body["background-image"] = uri
360
- options.each do |name, value|
361
- name = name.to_s.gsub(/_/, "-")
362
- body["background-image-#{name}"] = value
363
- end
364
- :no_element
365
- else
366
- image = Ext::Image.make_image(@canvas, uri, options)
367
- image || text(alt || src)
368
- end
360
+ image = Ext::Image.make_image(@canvas,
361
+ uri,
362
+ options,
363
+ body: @slides.last.body)
364
+ image || text(alt || src)
369
365
  end
370
366
 
371
367
  def convert_em(element)
@@ -376,10 +372,20 @@ module Rabbit
376
372
  Emphasis.new(Emphasis.new(convert_container(element)))
377
373
  end
378
374
 
375
+ def make_image_from_file(element, source, **options)
376
+ Ext::Image.make_image_from_file(@canvas,
377
+ source,
378
+ body: @slides.last.body,
379
+ **options) do |src_file|
380
+ prop = element.attr
381
+ image = yield(src_file, prop)
382
+ [image, prop]
383
+ end
384
+ end
385
+
379
386
  def convert_math(element)
380
- args = [@canvas, element.value]
381
- Ext::Image.make_image_from_file(*args) do |src_file_path|
382
- [Ext::TeX.make_image_by_LaTeX(src_file_path, {}, @canvas), {}]
387
+ make_image_from_file(element, element.value) do |src_file, prop|
388
+ Ext::TeX.make_image_by_LaTeX(src_file.path, prop, @canvas)
383
389
  end
384
390
  end
385
391
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2021 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2022 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -22,14 +22,14 @@ require "rabbit/parser/rd/rt/rt2rabbit-lib"
22
22
  require "rabbit/parser/rd/ext/base"
23
23
  require "rabbit/parser/rd/ext/image"
24
24
  require "rabbit/parser/rd/ext/video"
25
- require "rabbit/parser/ext/enscript"
26
- require "rabbit/parser/ext/tex"
27
25
  require "rabbit/parser/ext/aafigure"
28
26
  require "rabbit/parser/ext/blockdiag"
29
27
  require "rabbit/parser/ext/charty"
30
28
  require "rabbit/parser/ext/coderay"
31
29
  require "rabbit/parser/ext/emacs"
30
+ require "rabbit/parser/ext/enscript"
32
31
  require "rabbit/parser/ext/rouge"
32
+ require "rabbit/parser/ext/tex"
33
33
 
34
34
  module Rabbit
35
35
  module Parser
@@ -55,26 +55,7 @@ module Rabbit
55
55
  return nil unless /\A(?:image|img)\z/i =~ label
56
56
  src, prop = parse_source(source)
57
57
  return nil if prop["src"].nil?
58
-
59
- if prop["align"] == "right"
60
- body = visitor.current_body
61
- if body["background-image"]
62
- raise ParseError,
63
- _("multiple 'align = right' isn't supported.")
64
- end
65
- prop.each do |name, value|
66
- name = name.gsub(/_/, "-")
67
- if name == "src"
68
- property_name = "background-image"
69
- else
70
- property_name = "background-image-#{name}"
71
- end
72
- body[property_name] = value
73
- end
74
- :no_element
75
- else
76
- make_image(visitor, prop["src"], prop)
77
- end
58
+ make_image(visitor, prop["src"], prop, body: visitor.current_body)
78
59
  end
79
60
 
80
61
  def ext_block_verb_video(label, source, content, visitor)
@@ -101,30 +82,30 @@ module Rabbit
101
82
 
102
83
  def ext_block_verb_LaTeX(label, source, content, visitor)
103
84
  return nil unless /\ALaTeX\z/i =~ label
104
- make_image_from_file(source, visitor) do |src_file_path, prop|
105
- Parser::Ext::TeX.make_image_by_LaTeX(src_file_path, prop, visitor)
85
+ make_image_from_file(source, visitor) do |src_file, prop|
86
+ Parser::Ext::TeX.make_image_by_LaTeX(src_file.path, prop, visitor)
106
87
  end
107
88
  end
108
89
 
109
90
  def ext_block_verb_mimeTeX(label, source, content, visitor)
110
91
  return nil unless /\AmimeTeX\z/i =~ label
111
- make_image_from_file(source, visitor) do |src_file_path, prop|
112
- Parser::Ext::TeX.make_image_by_mimeTeX(src_file_path, prop,
92
+ make_image_from_file(source, visitor) do |src_file, prop|
93
+ Parser::Ext::TeX.make_image_by_mimeTeX(src_file.path, prop,
113
94
  visitor)
114
95
  end
115
96
  end
116
97
 
117
98
  def ext_block_verb_aafigure(label, source, content, visitor)
118
99
  return nil unless /\Aaafigure\z/i =~ label
119
- make_image_from_file(source, visitor) do |src_file_path, prop|
120
- Parser::Ext::AAFigure.make_image(src_file_path, prop, visitor)
100
+ make_image_from_file(source, visitor) do |src_file, prop|
101
+ Parser::Ext::AAFigure.make_image(src_file.path, prop, visitor)
121
102
  end
122
103
  end
123
104
 
124
105
  def ext_block_verb_blockdiag(label, source, content, visitor)
125
106
  return nil unless /\Ablockdiag\z/i =~ label
126
- make_image_from_file(source, visitor) do |src_file_path, prop|
127
- Parser::Ext::BlockDiag.make_image(src_file_path, prop, visitor)
107
+ make_image_from_file(source, visitor) do |src_file, prop|
108
+ Parser::Ext::BlockDiag.make_image(src_file.path, prop, visitor)
128
109
  end
129
110
  end
130
111
 
@@ -205,8 +186,17 @@ module Rabbit
205
186
 
206
187
  def ext_block_verb_charty(label, source, content, visitor)
207
188
  return nil unless /\Acharty\z/i =~ label
208
- make_image_from_file(source, visitor) do |src_file_path, prop|
209
- Parser::Ext::Charty.make_image(src_file_path, prop, visitor)
189
+ make_image_from_file(source, visitor) do |src_file, prop|
190
+ Parser::Ext::Charty.make_image(src_file.path, prop, visitor)
191
+ end
192
+ end
193
+
194
+ def ext_block_verb_mermaid(label, source, content, visitor)
195
+ return nil unless /\Amermaid\z/i =~ label
196
+ make_image_from_file(source,
197
+ visitor,
198
+ extension: ".mmd") do |src_file, prop|
199
+ src_file
210
200
  end
211
201
  end
212
202
  end