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.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +75 -0
- data/README.adoc +98 -23
- data/examples/features.adoc +2 -2
- data/lib/asciidoctor-diagram.rb +8 -0
- data/lib/asciidoctor-diagram/a2s/converter.rb +59 -0
- data/lib/asciidoctor-diagram/a2s/extension.rb +6 -52
- data/lib/asciidoctor-diagram/blockdiag/converter.rb +37 -0
- data/lib/asciidoctor-diagram/blockdiag/extension.rb +9 -116
- data/lib/asciidoctor-diagram/bpmn.rb +7 -0
- data/lib/asciidoctor-diagram/bpmn/converter.rb +62 -0
- data/lib/asciidoctor-diagram/bpmn/extension.rb +14 -0
- data/lib/asciidoctor-diagram/bytefield.rb +7 -0
- data/lib/asciidoctor-diagram/bytefield/converter.rb +26 -0
- data/lib/asciidoctor-diagram/bytefield/extension.rb +14 -0
- data/lib/asciidoctor-diagram/diagram_converter.rb +23 -0
- data/lib/asciidoctor-diagram/diagram_processor.rb +357 -0
- data/lib/asciidoctor-diagram/diagram_source.rb +322 -0
- data/lib/asciidoctor-diagram/ditaa/converter.rb +90 -0
- data/lib/asciidoctor-diagram/ditaa/extension.rb +6 -71
- data/lib/asciidoctor-diagram/dpic.rb +7 -0
- data/lib/asciidoctor-diagram/dpic/converter.rb +30 -0
- data/lib/asciidoctor-diagram/dpic/extension.rb +14 -0
- data/lib/asciidoctor-diagram/erd/converter.rb +31 -0
- data/lib/asciidoctor-diagram/erd/extension.rb +6 -35
- data/lib/asciidoctor-diagram/gnuplot.rb +7 -0
- data/lib/asciidoctor-diagram/gnuplot/converter.rb +63 -0
- data/lib/asciidoctor-diagram/gnuplot/extension.rb +14 -0
- data/lib/asciidoctor-diagram/graphviz/converter.rb +32 -0
- data/lib/asciidoctor-diagram/graphviz/extension.rb +6 -35
- data/lib/asciidoctor-diagram/http/converter.rb +99 -0
- data/lib/asciidoctor-diagram/http/server.rb +132 -0
- data/lib/asciidoctor-diagram/lilypond.rb +7 -0
- data/lib/asciidoctor-diagram/lilypond/converter.rb +54 -0
- data/lib/asciidoctor-diagram/lilypond/extension.rb +14 -0
- data/lib/asciidoctor-diagram/meme/converter.rb +122 -0
- data/lib/asciidoctor-diagram/meme/extension.rb +5 -107
- data/lib/asciidoctor-diagram/mermaid/converter.rb +179 -0
- data/lib/asciidoctor-diagram/mermaid/extension.rb +6 -159
- data/lib/asciidoctor-diagram/msc/converter.rb +35 -0
- data/lib/asciidoctor-diagram/msc/extension.rb +6 -36
- data/lib/asciidoctor-diagram/nomnoml/converter.rb +25 -0
- data/lib/asciidoctor-diagram/nomnoml/extension.rb +6 -28
- data/lib/asciidoctor-diagram/pikchr.rb +7 -0
- data/lib/asciidoctor-diagram/pikchr/converter.rb +26 -0
- data/lib/asciidoctor-diagram/pikchr/extension.rb +14 -0
- data/lib/asciidoctor-diagram/plantuml/converter.rb +117 -0
- data/lib/asciidoctor-diagram/plantuml/extension.rb +10 -119
- data/lib/asciidoctor-diagram/shaape/converter.rb +25 -0
- data/lib/asciidoctor-diagram/shaape/extension.rb +6 -28
- data/lib/asciidoctor-diagram/smcat.rb +7 -0
- data/lib/asciidoctor-diagram/smcat/converter.rb +44 -0
- data/lib/asciidoctor-diagram/smcat/extension.rb +14 -0
- data/lib/asciidoctor-diagram/svgbob/converter.rb +49 -0
- data/lib/asciidoctor-diagram/svgbob/extension.rb +6 -28
- data/lib/asciidoctor-diagram/symbolator.rb +7 -0
- data/lib/asciidoctor-diagram/symbolator/converter.rb +23 -0
- data/lib/asciidoctor-diagram/symbolator/extension.rb +14 -0
- data/lib/asciidoctor-diagram/syntrax/converter.rb +58 -0
- data/lib/asciidoctor-diagram/syntrax/extension.rb +6 -51
- data/lib/asciidoctor-diagram/tikz/converter.rb +56 -0
- data/lib/asciidoctor-diagram/tikz/extension.rb +6 -60
- data/lib/asciidoctor-diagram/umlet/converter.rb +24 -0
- data/lib/asciidoctor-diagram/umlet/extension.rb +6 -28
- data/lib/asciidoctor-diagram/util/cli.rb +14 -3
- data/lib/asciidoctor-diagram/util/cli_generator.rb +19 -1
- data/lib/asciidoctor-diagram/util/gif.rb +2 -2
- data/lib/asciidoctor-diagram/util/java.rb +1 -1
- data/lib/asciidoctor-diagram/util/java_socket.rb +7 -9
- data/lib/asciidoctor-diagram/util/pdf.rb +2 -2
- data/lib/asciidoctor-diagram/util/png.rb +2 -2
- data/lib/asciidoctor-diagram/util/svg.rb +46 -19
- data/lib/asciidoctor-diagram/util/which.rb +0 -29
- data/lib/asciidoctor-diagram/vega/converter.rb +47 -0
- data/lib/asciidoctor-diagram/vega/extension.rb +6 -44
- data/lib/asciidoctor-diagram/version.rb +1 -1
- data/lib/asciidoctor-diagram/wavedrom/converter.rb +50 -0
- data/lib/asciidoctor-diagram/wavedrom/extension.rb +6 -46
- data/lib/ditaa-1.3.15.jar +0 -0
- data/lib/ditaamini-0.12.jar +0 -0
- data/lib/plantuml-1.3.15.jar +0 -0
- data/lib/plantuml.jar +0 -0
- data/lib/server-1.3.15.jar +0 -0
- data/spec/a2s_spec.rb +2 -140
- data/spec/blockdiag_spec.rb +2 -200
- data/spec/bpmn_spec.rb +56 -0
- data/spec/bytefield_spec.rb +92 -0
- data/spec/ditaa_spec.rb +37 -143
- data/spec/dpic_spec.rb +19 -0
- data/spec/erd_spec.rb +2 -199
- data/spec/gnuplot_spec.rb +225 -0
- data/spec/graphviz_spec.rb +6 -145
- data/spec/lilypond_spec.rb +13 -0
- data/spec/mermaid_spec.rb +35 -200
- data/spec/msc_spec.rb +2 -199
- data/spec/nomnoml_spec.rb +4 -142
- data/spec/pikchr_spec.rb +51 -0
- data/spec/plantuml_spec.rb +24 -507
- data/spec/shaape_spec.rb +9 -221
- data/spec/shared_examples.rb +552 -0
- data/spec/smcat_spec.rb +26 -0
- data/spec/svgbob_spec.rb +2 -140
- data/spec/symbolator_spec.rb +23 -0
- data/spec/syntrax_spec.rb +5 -215
- data/spec/test_helper.rb +1 -18
- data/spec/tikz_spec.rb +4 -24
- data/spec/umlet_spec.rb +2 -58
- data/spec/vega_spec.rb +4 -117
- data/spec/wavedrom_spec.rb +2 -199
- metadata +73 -11
- data/lib/asciidoctor-diagram/extensions.rb +0 -568
- data/lib/ditaa-1.3.13.jar +0 -0
- data/lib/ditaamini-0.11.jar +0 -0
- data/lib/plantuml-1.3.13.jar +0 -0
- data/lib/server-1.3.13.jar +0 -0
@@ -1,167 +1,14 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '../
|
3
|
-
require_relative '../util/cli_generator'
|
4
|
-
require_relative '../util/platform'
|
5
|
-
require_relative '../util/which'
|
1
|
+
require_relative 'converter'
|
2
|
+
require_relative '../diagram_processor'
|
6
3
|
|
7
4
|
module Asciidoctor
|
8
5
|
module Diagram
|
9
|
-
|
10
|
-
|
11
|
-
include CliGenerator
|
12
|
-
include Which
|
13
|
-
|
14
|
-
def self.included(mod)
|
15
|
-
[:png, :svg].each do |f|
|
16
|
-
mod.register_format(f, :image) do |parent, source|
|
17
|
-
mermaid(parent, source, f)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def mermaid(parent_block, source, format)
|
23
|
-
inherit_prefix = name
|
24
|
-
|
25
|
-
options = {}
|
26
|
-
|
27
|
-
css = source.attr('css', nil, inherit_prefix)
|
28
|
-
if css
|
29
|
-
options[:css] = parent_block.normalize_system_path(css, source.base_dir)
|
30
|
-
end
|
31
|
-
|
32
|
-
gantt_config = source.attr('ganttConfig', nil, inherit_prefix) || source.attr('ganttconfig', nil, inherit_prefix)
|
33
|
-
if gantt_config
|
34
|
-
options[:gantt] = parent_block.normalize_system_path(gantt_config, source.base_dir)
|
35
|
-
end
|
36
|
-
|
37
|
-
seq_config = source.attr('sequenceConfig', nil, inherit_prefix) || source.attr('sequenceconfig', nil, inherit_prefix)
|
38
|
-
if seq_config
|
39
|
-
options[:sequence] = parent_block.normalize_system_path(seq_config, source.base_dir)
|
40
|
-
end
|
41
|
-
|
42
|
-
options[:width] = source.attr('width', nil, inherit_prefix)
|
43
|
-
|
44
|
-
mmdc = which(parent_block, 'mmdc', :raise_on_error => false)
|
45
|
-
if mmdc
|
46
|
-
options[:height] = source.attr('height', nil, inherit_prefix)
|
47
|
-
options[:theme] = source.attr('theme', nil, inherit_prefix)
|
48
|
-
options[:background] = source.attr('background', nil, inherit_prefix)
|
49
|
-
config = source.attr('config', nil, inherit_prefix) || source.attr('config', nil, inherit_prefix)
|
50
|
-
if config
|
51
|
-
options[:config] = parent_block.normalize_system_path(config, source.base_dir)
|
52
|
-
end
|
53
|
-
run_mmdc(mmdc, source, format, options)
|
54
|
-
else
|
55
|
-
mermaid = which(parent_block, 'mermaid')
|
56
|
-
run_mermaid(mermaid, parent_block, source, format, options)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
def run_mmdc(mmdc, source, format, options = {})
|
62
|
-
generate_file(mmdc, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
|
63
|
-
args = [tool_path, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
|
64
|
-
|
65
|
-
if options[:css]
|
66
|
-
args << '--cssFile' << Platform.native_path(options[:css])
|
67
|
-
end
|
68
|
-
|
69
|
-
if options[:theme]
|
70
|
-
args << '--theme' << options[:theme]
|
71
|
-
end
|
72
|
-
|
73
|
-
if options[:width]
|
74
|
-
args << '--width' << options[:width]
|
75
|
-
end
|
76
|
-
|
77
|
-
if options[:height]
|
78
|
-
args << '--height' << options[:height]
|
79
|
-
end
|
80
|
-
|
81
|
-
if options[:background]
|
82
|
-
bg = options[:background]
|
83
|
-
bg = "##{bg}" unless bg[0] == '#'
|
84
|
-
args << '--backgroundColor' << bg
|
85
|
-
end
|
86
|
-
|
87
|
-
if options[:config]
|
88
|
-
args << '--configFile' << Platform.native_path(options[:config])
|
89
|
-
elsif options[:gantt] || options[:sequence]
|
90
|
-
mermaidConfig = []
|
91
|
-
|
92
|
-
if options[:gantt]
|
93
|
-
mermaidConfig << "\"gantt\": #{File.read(options[:gantt])}"
|
94
|
-
end
|
95
|
-
|
96
|
-
if options[:sequence]
|
97
|
-
configKey = config['mmdcSequenceConfigKey'] ||= begin
|
98
|
-
version_parts = ::Asciidoctor::Diagram::Cli.run(mmdc, '--version')[:out].split('.').map { |p| p.to_i }
|
99
|
-
major = version_parts[0] || 0
|
100
|
-
minor = version_parts[1] || 0
|
101
|
-
patch = version_parts[2] || 0
|
102
|
-
if major > 0 || (major == 0 && minor > 4) || (major == 0 && minor == 4 && patch > 1)
|
103
|
-
'sequence'
|
104
|
-
else
|
105
|
-
'sequenceDiagram'
|
106
|
-
end
|
107
|
-
end
|
108
|
-
mermaidConfig << "\"#{configKey}\": #{File.read(options[:sequence])}"
|
109
|
-
end
|
110
|
-
|
111
|
-
config_file = "#{input_path}.json"
|
112
|
-
|
113
|
-
File.write(config_file, "{#{mermaidConfig.join ','}}")
|
114
|
-
|
115
|
-
args << '--configFile' << Platform.native_path(config_file)
|
116
|
-
end
|
117
|
-
|
118
|
-
args
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def run_mermaid(mermaid, parent_block, source, format, options = {})
|
123
|
-
config['mermaid>=6'] ||= ::Asciidoctor::Diagram::Cli.run(mermaid, '--version')[:out].split('.')[0].to_i >= 6
|
124
|
-
# Mermaid >= 6.0.0 requires PhantomJS 2.1; older version required 1.9
|
125
|
-
phantomjs = which(parent_block, 'phantomjs', :alt_attrs => [config['mermaid>=6'] ? 'phantomjs_2' : 'phantomjs_19'])
|
126
|
-
|
127
|
-
generate_file(mermaid, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
|
128
|
-
output_dir = File.dirname(output_path)
|
129
|
-
output_file = File.expand_path(File.basename(input_path) + ".#{format.to_s}", output_dir)
|
130
|
-
|
131
|
-
args = [tool_path, '--phantomPath', Platform.native_path(phantomjs), "--#{format.to_s}", '-o', Platform.native_path(output_dir)]
|
132
|
-
|
133
|
-
if options[:css]
|
134
|
-
args << '--css' << Platform.native_path(options[:css])
|
135
|
-
end
|
136
|
-
|
137
|
-
if options[:gantt]
|
138
|
-
args << '--gantt_config' << Platform.native_path(options[:gantt])
|
139
|
-
end
|
140
|
-
|
141
|
-
if options[:sequence]
|
142
|
-
args << '--sequenceConfig' << Platform.native_path(options[:sequence])
|
143
|
-
end
|
144
|
-
|
145
|
-
if options[:width]
|
146
|
-
args << '--width' << options[:width]
|
147
|
-
end
|
148
|
-
|
149
|
-
args << Platform.native_path(input_path)
|
150
|
-
|
151
|
-
{
|
152
|
-
:args => args,
|
153
|
-
:out_file => output_file
|
154
|
-
}
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
class MermaidBlockProcessor < Extensions::DiagramBlockProcessor
|
160
|
-
include Mermaid
|
6
|
+
class MermaidBlockProcessor < DiagramBlockProcessor
|
7
|
+
use_converter MermaidConverter
|
161
8
|
end
|
162
9
|
|
163
|
-
class MermaidBlockMacroProcessor <
|
164
|
-
|
10
|
+
class MermaidBlockMacroProcessor < DiagramBlockMacroProcessor
|
11
|
+
use_converter MermaidConverter
|
165
12
|
end
|
166
13
|
end
|
167
14
|
end
|
@@ -0,0 +1,35 @@
|
|
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 MscgenConverter
|
9
|
+
include DiagramConverter
|
10
|
+
include CliGenerator
|
11
|
+
|
12
|
+
|
13
|
+
def supported_formats
|
14
|
+
[:png, :svg]
|
15
|
+
end
|
16
|
+
|
17
|
+
def collect_options(source)
|
18
|
+
{:font => source.attr('font')}
|
19
|
+
end
|
20
|
+
|
21
|
+
def convert(source, format, options)
|
22
|
+
font = options[:font]
|
23
|
+
|
24
|
+
generate_stdin(source.find_command('mscgen'), format.to_s, source.to_s) do |tool_path, output_path|
|
25
|
+
args = [tool_path, '-o', Platform.native_path(output_path), '-T', format.to_s]
|
26
|
+
if font
|
27
|
+
args << '-F' << font
|
28
|
+
end
|
29
|
+
args << '-'
|
30
|
+
args
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,44 +1,14 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '../
|
3
|
-
require_relative '../util/platform'
|
4
|
-
require_relative '../util/which'
|
1
|
+
require_relative 'converter'
|
2
|
+
require_relative '../diagram_processor'
|
5
3
|
|
6
4
|
module Asciidoctor
|
7
5
|
module Diagram
|
8
|
-
|
9
|
-
|
10
|
-
include CliGenerator
|
11
|
-
include Which
|
12
|
-
|
13
|
-
def self.included(mod)
|
14
|
-
[:png, :svg].each do |f|
|
15
|
-
mod.register_format(f, :image) do |parent, source|
|
16
|
-
mscgen(parent, source, f)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def mscgen(parent, source, format)
|
22
|
-
inherit_prefix = name
|
23
|
-
font = source.attr('font', nil, inherit_prefix)
|
24
|
-
|
25
|
-
generate_stdin(which(parent, 'mscgen'), format.to_s, source.to_s) do |tool_path, output_path|
|
26
|
-
args = [tool_path, '-o', Platform.native_path(output_path), '-T', format.to_s]
|
27
|
-
if font
|
28
|
-
args << '-F' << font
|
29
|
-
end
|
30
|
-
args << '-'
|
31
|
-
args
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class MscBlockProcessor < Extensions::DiagramBlockProcessor
|
37
|
-
include Mscgen
|
6
|
+
class MscBlockProcessor < DiagramBlockProcessor
|
7
|
+
use_converter MscgenConverter
|
38
8
|
end
|
39
9
|
|
40
|
-
class MscBlockMacroProcessor <
|
41
|
-
|
10
|
+
class MscBlockMacroProcessor < DiagramBlockMacroProcessor
|
11
|
+
use_converter MscgenConverter
|
42
12
|
end
|
43
13
|
end
|
44
14
|
end
|
@@ -0,0 +1,25 @@
|
|
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 NomnomlConverter
|
9
|
+
include DiagramConverter
|
10
|
+
include CliGenerator
|
11
|
+
|
12
|
+
|
13
|
+
def supported_formats
|
14
|
+
[:svg]
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def convert(source, format, options)
|
19
|
+
generate_file(source.find_command('nomnoml'), 'nomnoml', format.to_s, source.to_s) do |tool_path, input_path, output_path|
|
20
|
+
[tool_path, Platform.native_path(input_path), Platform.native_path(output_path)]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,36 +1,14 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '../
|
3
|
-
require_relative '../util/platform'
|
4
|
-
require_relative '../util/which'
|
1
|
+
require_relative 'converter'
|
2
|
+
require_relative '../diagram_processor'
|
5
3
|
|
6
4
|
module Asciidoctor
|
7
5
|
module Diagram
|
8
|
-
|
9
|
-
|
10
|
-
include CliGenerator
|
11
|
-
include Which
|
12
|
-
|
13
|
-
def self.included(mod)
|
14
|
-
[:svg].each do |f|
|
15
|
-
mod.register_format(f, :image) do |parent, source|
|
16
|
-
nomnoml(parent, source, f)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def nomnoml(parent, source, format)
|
22
|
-
generate_file(which(parent, 'nomnoml'), 'nomnoml', format.to_s, source.to_s) do |tool_path, input_path, output_path|
|
23
|
-
[tool_path, Platform.native_path(input_path), Platform.native_path(output_path)]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class NomnomlBlockProcessor < Extensions::DiagramBlockProcessor
|
29
|
-
include Nomnoml
|
6
|
+
class NomnomlBlockProcessor < DiagramBlockProcessor
|
7
|
+
use_converter NomnomlConverter
|
30
8
|
end
|
31
9
|
|
32
|
-
class NomnomlBlockMacroProcessor <
|
33
|
-
|
10
|
+
class NomnomlBlockMacroProcessor < DiagramBlockMacroProcessor
|
11
|
+
use_converter NomnomlConverter
|
34
12
|
end
|
35
13
|
end
|
36
14
|
end
|
@@ -0,0 +1,26 @@
|
|
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 PikchrConverter
|
9
|
+
include DiagramConverter
|
10
|
+
include CliGenerator
|
11
|
+
|
12
|
+
|
13
|
+
def supported_formats
|
14
|
+
[:svg]
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert(source, format, options)
|
18
|
+
pikchr_path = source.find_command('pikchr')
|
19
|
+
|
20
|
+
generate_file_stdout(pikchr_path, format.to_s, source.to_s) do |tool_path, input_path|
|
21
|
+
[tool_path, "--svg-only", input_path]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'converter'
|
2
|
+
require_relative '../diagram_processor'
|
3
|
+
|
4
|
+
module Asciidoctor
|
5
|
+
module Diagram
|
6
|
+
class PikchrBlockProcessor < DiagramBlockProcessor
|
7
|
+
use_converter PikchrConverter
|
8
|
+
end
|
9
|
+
|
10
|
+
class PikchrBlockMacroProcessor < DiagramBlockMacroProcessor
|
11
|
+
use_converter PikchrConverter
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require_relative '../diagram_converter'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Asciidoctor
|
5
|
+
module Diagram
|
6
|
+
# @private
|
7
|
+
class PlantUmlConverter
|
8
|
+
include DiagramConverter
|
9
|
+
|
10
|
+
JARS = [
|
11
|
+
'plantuml-1.3.15.jar',
|
12
|
+
'plantuml.jar',
|
13
|
+
'jlatexmath-minimal-1.0.5.jar',
|
14
|
+
'batik-all-1.10.jar'
|
15
|
+
].map do |jar|
|
16
|
+
File.expand_path File.join('../..', jar), File.dirname(__FILE__)
|
17
|
+
end
|
18
|
+
Java.classpath.concat JARS
|
19
|
+
|
20
|
+
def supported_formats
|
21
|
+
[:png, :svg, :txt, :atxt, :utxt]
|
22
|
+
end
|
23
|
+
|
24
|
+
def collect_options(source)
|
25
|
+
{
|
26
|
+
:config => source.attr('plantumlconfig', nil, true) || source.attr('config')
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def convert(source, format, options)
|
31
|
+
Java.load
|
32
|
+
|
33
|
+
code = preprocess_code(source, self.class.tag)
|
34
|
+
|
35
|
+
case format
|
36
|
+
when :png
|
37
|
+
mime_type = 'image/png'
|
38
|
+
when :svg
|
39
|
+
mime_type = 'image/svg+xml'
|
40
|
+
when :txt, :utxt
|
41
|
+
mime_type = 'text/plain;charset=utf-8'
|
42
|
+
when :atxt
|
43
|
+
mime_type = 'text/plain'
|
44
|
+
else
|
45
|
+
raise "Unsupported format: #{format}"
|
46
|
+
end
|
47
|
+
|
48
|
+
headers = {
|
49
|
+
'Accept' => mime_type
|
50
|
+
}
|
51
|
+
|
52
|
+
config_file = options[:config]
|
53
|
+
if config_file
|
54
|
+
headers['X-PlantUML-Config'] = File.expand_path(config_file, source.base_dir)
|
55
|
+
end
|
56
|
+
|
57
|
+
dot = source.find_command('dot', :alt_attrs => ['graphvizdot'], :raise_on_error => false)
|
58
|
+
if dot
|
59
|
+
headers['X-Graphviz'] = ::Asciidoctor::Diagram::Platform.host_os_path(dot)
|
60
|
+
end
|
61
|
+
|
62
|
+
response = Java.send_request(
|
63
|
+
:url => '/plantuml',
|
64
|
+
:body => code,
|
65
|
+
:headers => headers
|
66
|
+
)
|
67
|
+
|
68
|
+
unless response[:code] == 200
|
69
|
+
raise Java.create_error("PlantUML image generation failed", response)
|
70
|
+
end
|
71
|
+
|
72
|
+
response[:body]
|
73
|
+
end
|
74
|
+
|
75
|
+
def preprocess_code(source, tag)
|
76
|
+
code = source.to_s
|
77
|
+
|
78
|
+
code = "@start#{tag}\n#{code}\n@end#{tag}" unless code.index("@start") && code.index("@end")
|
79
|
+
|
80
|
+
code.gsub!(/(?<=<img:)[^>]+(?=>)/) do |match|
|
81
|
+
resolve_path(match, source, source.attr('imagesdir', nil, false))
|
82
|
+
end
|
83
|
+
|
84
|
+
code.gsub!(/(?:(?<=!include\s)|(?<=!includesub\s))\s*[^<][^!\n\r]+/) do |match|
|
85
|
+
resolve_path(match.lstrip, source, source.base_dir)
|
86
|
+
end
|
87
|
+
|
88
|
+
code
|
89
|
+
end
|
90
|
+
|
91
|
+
def resolve_path(path, source, base_dir)
|
92
|
+
if path =~ ::URI::ABS_URI
|
93
|
+
uri = ::URI.parse(path)
|
94
|
+
if uri.scheme == 'file'
|
95
|
+
source.resolve_path(uri.path, base_dir)
|
96
|
+
else
|
97
|
+
path
|
98
|
+
end
|
99
|
+
else
|
100
|
+
source.resolve_path(path, base_dir)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class UmlConverter < PlantUmlConverter
|
106
|
+
def self.tag
|
107
|
+
'uml'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class SaltConverter < PlantUmlConverter
|
112
|
+
def self.tag
|
113
|
+
'salt'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|