asciidoctor-diagram 1.5.18 → 2.0.4

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +75 -0
  3. data/README.adoc +98 -23
  4. data/examples/features.adoc +2 -2
  5. data/lib/asciidoctor-diagram.rb +8 -0
  6. data/lib/asciidoctor-diagram/a2s/converter.rb +59 -0
  7. data/lib/asciidoctor-diagram/a2s/extension.rb +6 -52
  8. data/lib/asciidoctor-diagram/blockdiag/converter.rb +37 -0
  9. data/lib/asciidoctor-diagram/blockdiag/extension.rb +9 -116
  10. data/lib/asciidoctor-diagram/bpmn.rb +7 -0
  11. data/lib/asciidoctor-diagram/bpmn/converter.rb +62 -0
  12. data/lib/asciidoctor-diagram/bpmn/extension.rb +14 -0
  13. data/lib/asciidoctor-diagram/bytefield.rb +7 -0
  14. data/lib/asciidoctor-diagram/bytefield/converter.rb +26 -0
  15. data/lib/asciidoctor-diagram/bytefield/extension.rb +14 -0
  16. data/lib/asciidoctor-diagram/diagram_converter.rb +23 -0
  17. data/lib/asciidoctor-diagram/diagram_processor.rb +357 -0
  18. data/lib/asciidoctor-diagram/diagram_source.rb +322 -0
  19. data/lib/asciidoctor-diagram/ditaa/converter.rb +90 -0
  20. data/lib/asciidoctor-diagram/ditaa/extension.rb +6 -71
  21. data/lib/asciidoctor-diagram/dpic.rb +7 -0
  22. data/lib/asciidoctor-diagram/dpic/converter.rb +30 -0
  23. data/lib/asciidoctor-diagram/dpic/extension.rb +14 -0
  24. data/lib/asciidoctor-diagram/erd/converter.rb +31 -0
  25. data/lib/asciidoctor-diagram/erd/extension.rb +6 -35
  26. data/lib/asciidoctor-diagram/gnuplot.rb +7 -0
  27. data/lib/asciidoctor-diagram/gnuplot/converter.rb +63 -0
  28. data/lib/asciidoctor-diagram/gnuplot/extension.rb +14 -0
  29. data/lib/asciidoctor-diagram/graphviz/converter.rb +32 -0
  30. data/lib/asciidoctor-diagram/graphviz/extension.rb +6 -35
  31. data/lib/asciidoctor-diagram/http/converter.rb +99 -0
  32. data/lib/asciidoctor-diagram/http/server.rb +132 -0
  33. data/lib/asciidoctor-diagram/lilypond.rb +7 -0
  34. data/lib/asciidoctor-diagram/lilypond/converter.rb +54 -0
  35. data/lib/asciidoctor-diagram/lilypond/extension.rb +14 -0
  36. data/lib/asciidoctor-diagram/meme/converter.rb +122 -0
  37. data/lib/asciidoctor-diagram/meme/extension.rb +5 -107
  38. data/lib/asciidoctor-diagram/mermaid/converter.rb +179 -0
  39. data/lib/asciidoctor-diagram/mermaid/extension.rb +6 -159
  40. data/lib/asciidoctor-diagram/msc/converter.rb +35 -0
  41. data/lib/asciidoctor-diagram/msc/extension.rb +6 -36
  42. data/lib/asciidoctor-diagram/nomnoml/converter.rb +25 -0
  43. data/lib/asciidoctor-diagram/nomnoml/extension.rb +6 -28
  44. data/lib/asciidoctor-diagram/pikchr.rb +7 -0
  45. data/lib/asciidoctor-diagram/pikchr/converter.rb +26 -0
  46. data/lib/asciidoctor-diagram/pikchr/extension.rb +14 -0
  47. data/lib/asciidoctor-diagram/plantuml/converter.rb +117 -0
  48. data/lib/asciidoctor-diagram/plantuml/extension.rb +10 -119
  49. data/lib/asciidoctor-diagram/shaape/converter.rb +25 -0
  50. data/lib/asciidoctor-diagram/shaape/extension.rb +6 -28
  51. data/lib/asciidoctor-diagram/smcat.rb +7 -0
  52. data/lib/asciidoctor-diagram/smcat/converter.rb +44 -0
  53. data/lib/asciidoctor-diagram/smcat/extension.rb +14 -0
  54. data/lib/asciidoctor-diagram/svgbob/converter.rb +49 -0
  55. data/lib/asciidoctor-diagram/svgbob/extension.rb +6 -28
  56. data/lib/asciidoctor-diagram/symbolator.rb +7 -0
  57. data/lib/asciidoctor-diagram/symbolator/converter.rb +23 -0
  58. data/lib/asciidoctor-diagram/symbolator/extension.rb +14 -0
  59. data/lib/asciidoctor-diagram/syntrax/converter.rb +58 -0
  60. data/lib/asciidoctor-diagram/syntrax/extension.rb +6 -51
  61. data/lib/asciidoctor-diagram/tikz/converter.rb +56 -0
  62. data/lib/asciidoctor-diagram/tikz/extension.rb +6 -60
  63. data/lib/asciidoctor-diagram/umlet/converter.rb +24 -0
  64. data/lib/asciidoctor-diagram/umlet/extension.rb +6 -28
  65. data/lib/asciidoctor-diagram/util/cli.rb +14 -3
  66. data/lib/asciidoctor-diagram/util/cli_generator.rb +19 -1
  67. data/lib/asciidoctor-diagram/util/gif.rb +2 -2
  68. data/lib/asciidoctor-diagram/util/java.rb +1 -1
  69. data/lib/asciidoctor-diagram/util/java_socket.rb +7 -9
  70. data/lib/asciidoctor-diagram/util/pdf.rb +2 -2
  71. data/lib/asciidoctor-diagram/util/png.rb +2 -2
  72. data/lib/asciidoctor-diagram/util/svg.rb +46 -19
  73. data/lib/asciidoctor-diagram/util/which.rb +0 -29
  74. data/lib/asciidoctor-diagram/vega/converter.rb +47 -0
  75. data/lib/asciidoctor-diagram/vega/extension.rb +6 -44
  76. data/lib/asciidoctor-diagram/version.rb +1 -1
  77. data/lib/asciidoctor-diagram/wavedrom/converter.rb +50 -0
  78. data/lib/asciidoctor-diagram/wavedrom/extension.rb +6 -46
  79. data/lib/ditaa-1.3.15.jar +0 -0
  80. data/lib/ditaamini-0.12.jar +0 -0
  81. data/lib/plantuml-1.3.15.jar +0 -0
  82. data/lib/plantuml.jar +0 -0
  83. data/lib/server-1.3.15.jar +0 -0
  84. data/spec/a2s_spec.rb +2 -140
  85. data/spec/blockdiag_spec.rb +2 -200
  86. data/spec/bpmn_spec.rb +56 -0
  87. data/spec/bytefield_spec.rb +92 -0
  88. data/spec/ditaa_spec.rb +37 -143
  89. data/spec/dpic_spec.rb +19 -0
  90. data/spec/erd_spec.rb +2 -199
  91. data/spec/gnuplot_spec.rb +225 -0
  92. data/spec/graphviz_spec.rb +6 -145
  93. data/spec/lilypond_spec.rb +13 -0
  94. data/spec/mermaid_spec.rb +35 -200
  95. data/spec/msc_spec.rb +2 -199
  96. data/spec/nomnoml_spec.rb +4 -142
  97. data/spec/pikchr_spec.rb +51 -0
  98. data/spec/plantuml_spec.rb +24 -507
  99. data/spec/shaape_spec.rb +9 -221
  100. data/spec/shared_examples.rb +552 -0
  101. data/spec/smcat_spec.rb +26 -0
  102. data/spec/svgbob_spec.rb +2 -140
  103. data/spec/symbolator_spec.rb +23 -0
  104. data/spec/syntrax_spec.rb +5 -215
  105. data/spec/test_helper.rb +1 -18
  106. data/spec/tikz_spec.rb +4 -24
  107. data/spec/umlet_spec.rb +2 -58
  108. data/spec/vega_spec.rb +4 -117
  109. data/spec/wavedrom_spec.rb +2 -199
  110. metadata +73 -11
  111. data/lib/asciidoctor-diagram/extensions.rb +0 -568
  112. data/lib/ditaa-1.3.13.jar +0 -0
  113. data/lib/ditaamini-0.11.jar +0 -0
  114. data/lib/plantuml-1.3.13.jar +0 -0
  115. data/lib/server-1.3.13.jar +0 -0
@@ -0,0 +1,7 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'lilypond/extension'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ block Asciidoctor::Diagram::LilypondBlockProcessor, :lilypond
6
+ block_macro Asciidoctor::Diagram::LilypondBlockMacroProcessor, :lilypond
7
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../diagram_converter'
2
+ require_relative '../util/cli_generator'
3
+ require_relative '../util/platform'
4
+
5
+ module Asciidoctor
6
+ module Diagram
7
+ # @private
8
+ class LilypondConverter
9
+ include DiagramConverter
10
+ include CliGenerator
11
+
12
+
13
+ def supported_formats
14
+ [:png, :pdf]
15
+ end
16
+
17
+ def collect_options(source)
18
+ {
19
+ :resolution => source.attr('resolution')
20
+ }
21
+ end
22
+
23
+ def convert(source, format, options)
24
+ code = <<-EOF
25
+ \\paper{
26
+ oddFooterMarkup=##f
27
+ oddHeaderMarkup=##f
28
+ bookTitleMarkup=##f
29
+ scoreTitleMarkup=##f
30
+ }
31
+
32
+ EOF
33
+ code << source.to_s
34
+
35
+ resolution = options[:resolution]
36
+
37
+ generate_stdin(source.find_command('lilypond'), format.to_s, code) do |tool_path, output_path|
38
+ args = [tool_path, '-daux-files=#f', '-dbackend=eps', '-dno-gs-load-fonts', '-dinclude-eps-fonts', '-o', Platform.native_path(output_path), '-f', format.to_s]
39
+
40
+ args << '-dsafe'
41
+ args << "-dresolution=#{resolution}" if resolution
42
+ args << "-dpixmap-format=pngalpha" if format == :png
43
+
44
+ args << '-'
45
+
46
+ {
47
+ :args => args,
48
+ :out_file => "#{output_path}.#{format.to_s}"
49
+ }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'converter'
2
+ require_relative '../diagram_processor'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ class LilypondBlockProcessor < DiagramBlockProcessor
7
+ use_converter LilypondConverter
8
+ end
9
+
10
+ class LilypondBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter LilypondConverter
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,122 @@
1
+ require_relative '../diagram_converter'
2
+ require_relative '../util/cli_generator'
3
+ require 'tempfile'
4
+ require 'open3'
5
+
6
+ module Asciidoctor
7
+ module Diagram
8
+ # @private
9
+ class MemeConverter
10
+ include DiagramConverter
11
+
12
+
13
+ def supported_formats
14
+ [:png, :gif]
15
+ end
16
+
17
+
18
+ def collect_options(source)
19
+ bg_img = source.attr('background')
20
+ raise "background attribute is required" unless bg_img
21
+
22
+ options = source.attr('options', '').split(',')
23
+
24
+ {
25
+ :bg_img => bg_img,
26
+ :top_label => source.attr('top'),
27
+ :bottom_label => source.attr('bottom'),
28
+ :fill_color => source.attr(['fillcolor', 'fill-color']),
29
+ :stroke_color => source.attr(['strokecolor', 'stroke-color']),
30
+ :stroke_width => source.attr(['strokewidth', 'stroke-width']),
31
+ :font => source.attr('font', 'Impact'),
32
+ :noupcase => options.include?('noupcase'),
33
+ }
34
+ end
35
+
36
+ def convert(source, format, options)
37
+ convert = source.find_command('convert')
38
+ identify = source.find_command('identify')
39
+
40
+ bg_img = options[:bg_img]
41
+ raise "background attribute is required" unless bg_img
42
+
43
+ bg_img = source.resolve_path(bg_img, source.attr('imagesdir'))
44
+
45
+ top_label = options[:top_label]
46
+ bottom_label = options[:bottom_label]
47
+ fill_color = options[:fill_color] || 'white'
48
+ stroke_color = options[:stroke_color] || 'black'
49
+ stroke_width = options[:stroke_width] || '2'
50
+ font = options[:font] || 'Impact'
51
+ noupcase = options[:noupcase]
52
+
53
+ dimensions = Cli.run(identify, '-format', '%w %h', bg_img)[:out].match(/(?<w>\d+) (?<h>\d+)/)
54
+ bg_width = dimensions['w'].to_i
55
+ bg_height = dimensions['h'].to_i
56
+ label_width = bg_width
57
+ label_height = bg_height / 5
58
+
59
+ if top_label
60
+ top_img = Tempfile.new(['meme', '.png'])
61
+ Cli.run(
62
+ convert,
63
+ '-background', 'none',
64
+ '-fill', fill_color,
65
+ '-stroke', stroke_color,
66
+ '-strokewidth', stroke_width,
67
+ '-font', font,
68
+ '-size', "#{label_width}x#{label_height}",
69
+ '-gravity', 'north',
70
+ "label:#{prepare_label(top_label, noupcase)}",
71
+ top_img.path
72
+ )
73
+ else
74
+ top_img = nil
75
+ end
76
+
77
+ if bottom_label
78
+ bottom_img = Tempfile.new(['meme', '.png'])
79
+ Cli.run(
80
+ convert,
81
+ '-background', 'none',
82
+ '-fill', fill_color,
83
+ '-stroke', stroke_color,
84
+ '-strokewidth', stroke_width,
85
+ '-font', font,
86
+ '-size', "#{label_width}x#{label_height}",
87
+ '-gravity', 'south',
88
+ "label:#{prepare_label(bottom_label, noupcase)}",
89
+ bottom_img.path
90
+ )
91
+ else
92
+ bottom_img = nil
93
+ end
94
+
95
+ final_img = Tempfile.new(['meme', ".#{format.to_s}"])
96
+
97
+ args = [convert, bg_img]
98
+ if top_img
99
+ args << top_img.path << '-geometry' << '+0+0' << '-composite'
100
+ end
101
+
102
+ if bottom_img
103
+ args << bottom_img.path << '-geometry' << "+0+#{bg_height - label_height}" << '-composite'
104
+ end
105
+
106
+ args << final_img.path
107
+
108
+ Cli.run(*args)
109
+
110
+ File.binread(final_img)
111
+ end
112
+
113
+ private
114
+
115
+ def prepare_label(label, noupcase)
116
+ label = label.upcase unless noupcase
117
+ label = label.gsub(' // ', '\n')
118
+ label
119
+ end
120
+ end
121
+ end
122
+ end
@@ -1,112 +1,10 @@
1
- require_relative '../extensions'
2
- require_relative '../util/cli_generator'
3
- require_relative '../util/which'
4
- require 'tempfile'
5
- require 'open3'
1
+ require_relative 'converter'
2
+ require_relative '../diagram_processor'
6
3
 
7
4
  module Asciidoctor
8
5
  module Diagram
9
- # @private
10
- module Meme
11
- include Which
12
-
13
- def self.included(mod)
14
- [:png, :gif].each do |format|
15
- mod.register_format(format, :image) do |parent, source|
16
- meme(parent, source, format)
17
- end
18
- end
19
- end
20
-
21
- def meme(parent_block, source, format)
22
- convert = which(parent_block, 'convert')
23
- identify = which(parent_block, 'identify')
24
- inherit_prefix = name
25
-
26
- bg_img = source.attr('background', nil, inherit_prefix)
27
- raise "background attribute is required" unless bg_img
28
-
29
- bg_img = parent_block.normalize_system_path(bg_img, parent_block.attr('imagesdir'))
30
-
31
- top_label = source.attr('top')
32
- bottom_label = source.attr('bottom')
33
- fill_color = source.attr('fillColor', 'white', inherit_prefix)
34
- stroke_color = source.attr('strokeColor', 'black', inherit_prefix)
35
- stroke_width = source.attr('strokeWidth', '2', inherit_prefix)
36
- font = source.attr('font', 'Impact', inherit_prefix)
37
- options = source.attr('options', '', inherit_prefix).split(',')
38
- noupcase = options.include?('noupcase')
39
-
40
- dimensions = Cli.run(identify, '-format', '%w %h', bg_img)[:out].match(/(?<w>\d+) (?<h>\d+)/)
41
- bg_width = dimensions['w'].to_i
42
- bg_height = dimensions['h'].to_i
43
- label_width = bg_width
44
- label_height = bg_height / 5
45
-
46
- if top_label
47
- top_img = Tempfile.new(['meme', '.png'])
48
- Cli.run(
49
- convert,
50
- '-background', 'none',
51
- '-fill', fill_color,
52
- '-stroke', stroke_color,
53
- '-strokewidth', stroke_width,
54
- '-font', font,
55
- '-size', "#{label_width}x#{label_height}",
56
- '-gravity', 'north',
57
- "label:#{prepare_label(top_label, noupcase)}",
58
- top_img.path
59
- )
60
- else
61
- top_img = nil
62
- end
63
-
64
- if bottom_label
65
- bottom_img = Tempfile.new(['meme', '.png'])
66
- Cli.run(
67
- convert,
68
- '-background', 'none',
69
- '-fill', fill_color,
70
- '-stroke', stroke_color,
71
- '-strokewidth', stroke_width,
72
- '-font', font,
73
- '-size', "#{label_width}x#{label_height}",
74
- '-gravity', 'south',
75
- "label:#{prepare_label(bottom_label, noupcase)}",
76
- bottom_img.path
77
- )
78
- else
79
- bottom_img = nil
80
- end
81
-
82
- final_img = Tempfile.new(['meme', ".#{format.to_s}"])
83
-
84
- args = [convert, bg_img]
85
- if top_img
86
- args << top_img.path << '-geometry'<< '+0+0' << '-composite'
87
- end
88
-
89
- if bottom_img
90
- args << bottom_img.path << '-geometry'<< "+0+#{bg_height - label_height}" << '-composite'
91
- end
92
-
93
- args << final_img.path
94
-
95
- Cli.run(*args)
96
-
97
- File.binread(final_img)
98
- end
99
-
100
- private
101
- def prepare_label(label, noupcase)
102
- label = label.upcase unless noupcase
103
- label = label.gsub(' // ', '\n')
104
- label
105
- end
106
- end
107
-
108
- class MemeBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
109
- include Meme
6
+ class MemeBlockMacroProcessor < DiagramBlockMacroProcessor
7
+ use_converter MemeConverter
110
8
 
111
9
  class StringReader
112
10
  def initialize(str)
@@ -123,7 +21,7 @@ module Asciidoctor
123
21
  def create_source(parent, target, attributes)
124
22
  attributes = attributes.dup
125
23
  attributes['background'] = apply_target_subs(parent, target)
126
- ::Asciidoctor::Diagram::Extensions::ReaderSource.new(parent, StringReader.new(''), attributes)
24
+ ::Asciidoctor::Diagram::ReaderSource.new(self, parent, StringReader.new(''), attributes)
127
25
  end
128
26
  end
129
27
  end
@@ -0,0 +1,179 @@
1
+ require_relative '../diagram_converter'
2
+ require_relative '../util/cli'
3
+ require_relative '../util/cli_generator'
4
+ require_relative '../util/platform'
5
+
6
+ module Asciidoctor
7
+ module Diagram
8
+ # @private
9
+ class MermaidConverter
10
+ include DiagramConverter
11
+ include CliGenerator
12
+
13
+
14
+ def supported_formats
15
+ [:png, :svg]
16
+ end
17
+
18
+ def collect_options(source)
19
+ options = {}
20
+
21
+ options[:css] = source.attr('css')
22
+ options[:gantt_config] = source.attr(['ganttconfig', 'gantt-config'])
23
+ options[:seq_config] = source.attr(['sequenceconfig', 'sequence-config'])
24
+ options[:width] = source.attr('width')
25
+ options[:height] = source.attr('height')
26
+ options[:theme] = source.attr('theme')
27
+ options[:background] = source.attr('background')
28
+ options[:config] = source.attr('config')
29
+ options[:puppeteer_config] = source.attr(['puppeteerconfig', 'puppeteer-config'])
30
+
31
+ options
32
+ end
33
+
34
+ def convert(source, format, options)
35
+ opts = {}
36
+
37
+ css = options[:css]
38
+ if css
39
+ opts[:css] = source.resolve_path(css)
40
+ end
41
+
42
+ gantt_config = options[:gantt_config]
43
+ if gantt_config
44
+ opts[:gantt] = source.resolve_path(gantt_config)
45
+ end
46
+
47
+ seq_config = options[:seq_config]
48
+ if seq_config
49
+ opts[:sequence] = source.resolve_path(seq_config)
50
+ end
51
+
52
+ puppeteer_config = options[:puppeteer_config]
53
+ if puppeteer_config
54
+ opts[:puppeteer] = source.resolve_path(puppeteer_config)
55
+ end
56
+
57
+ opts[:width] = options[:width]
58
+
59
+ mmdc = source.find_command('mmdc', :raise_on_error => false)
60
+ node = source.find_command('node', :raise_on_error => false)
61
+ if mmdc && node
62
+ opts[:height] = options[:height]
63
+ opts[:theme] = options[:theme]
64
+ opts[:background] = options[:background]
65
+ config = options[:config]
66
+ if config
67
+ opts[:config] = source.resolve_path(config)
68
+ end
69
+ run_mmdc(node, mmdc, source, format, opts)
70
+ else
71
+ mermaid = source.find_command('mermaid')
72
+ run_mermaid(mermaid, source, format, opts)
73
+ end
74
+ end
75
+
76
+ private
77
+ def run_mmdc(node, mmdc, source, format, options = {})
78
+ generate_file(node, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
79
+ args = [tool_path, '--unhandled-rejections=strict', mmdc, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
80
+
81
+ if options[:css]
82
+ args << '--cssFile' << Platform.native_path(options[:css])
83
+ end
84
+
85
+ if options[:theme]
86
+ args << '--theme' << options[:theme]
87
+ end
88
+
89
+ if options[:width]
90
+ args << '--width' << options[:width]
91
+ end
92
+
93
+ if options[:height]
94
+ args << '--height' << options[:height]
95
+ end
96
+
97
+ if options[:background]
98
+ bg = options[:background]
99
+ bg = "##{bg}" unless bg[0] == '#'
100
+ args << '--backgroundColor' << bg
101
+ end
102
+
103
+ if options[:config]
104
+ args << '--configFile' << Platform.native_path(options[:config])
105
+ elsif options[:gantt] || options[:sequence]
106
+ mermaidConfig = []
107
+
108
+ if options[:gantt]
109
+ mermaidConfig << "\"gantt\": #{File.read(options[:gantt])}"
110
+ end
111
+
112
+ if options[:sequence]
113
+ configKey = source.config['mmdcSequenceConfigKey'] ||= begin
114
+ version_parts = ::Asciidoctor::Diagram::Cli.run(mmdc, '--version')[:out].split('.').map { |p| p.to_i }
115
+ major = version_parts[0] || 0
116
+ minor = version_parts[1] || 0
117
+ patch = version_parts[2] || 0
118
+ if major > 0 || (major == 0 && minor > 4) || (major == 0 && minor == 4 && patch > 1)
119
+ 'sequence'
120
+ else
121
+ 'sequenceDiagram'
122
+ end
123
+ end
124
+ mermaidConfig << "\"#{configKey}\": #{File.read(options[:sequence])}"
125
+ end
126
+
127
+ config_file = "#{input_path}.json"
128
+
129
+ File.write(config_file, "{#{mermaidConfig.join ','}}")
130
+
131
+ args << '--configFile' << Platform.native_path(config_file)
132
+ end
133
+
134
+ if options[:puppeteer]
135
+ args << '--puppeteerConfigFile' << Platform.native_path(options[:puppeteer])
136
+ end
137
+
138
+ args
139
+ end
140
+ end
141
+
142
+ def run_mermaid(mermaid, source, format, options = {})
143
+ source.config['mermaid>=6'] ||= ::Asciidoctor::Diagram::Cli.run(mermaid, '--version')[:out].split('.')[0].to_i >= 6
144
+ # Mermaid >= 6.0.0 requires PhantomJS 2.1; older version required 1.9
145
+ phantomjs = source.find_command('phantomjs', :alt_attrs => [source.config['mermaid>=6'] ? 'phantomjs_2' : 'phantomjs_19'])
146
+
147
+ generate_file(mermaid, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
148
+ output_dir = File.dirname(output_path)
149
+ output_file = File.expand_path(File.basename(input_path) + ".#{format.to_s}", output_dir)
150
+
151
+ args = [tool_path, '--phantomPath', Platform.native_path(phantomjs), "--#{format.to_s}", '-o', Platform.native_path(output_dir)]
152
+
153
+ if options[:css]
154
+ args << '--css' << Platform.native_path(options[:css])
155
+ end
156
+
157
+ if options[:gantt]
158
+ args << '--gantt_config' << Platform.native_path(options[:gantt])
159
+ end
160
+
161
+ if options[:sequence]
162
+ args << '--sequenceConfig' << Platform.native_path(options[:sequence])
163
+ end
164
+
165
+ if options[:width]
166
+ args << '--width' << options[:width]
167
+ end
168
+
169
+ args << Platform.native_path(input_path)
170
+
171
+ {
172
+ :args => args,
173
+ :out_file => output_file
174
+ }
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end