asciidoctor-diagram 2.0.2 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +78 -1
  3. data/README.adoc +25 -507
  4. data/Rakefile +1 -1
  5. data/docs/antora.yml +3 -0
  6. data/{images → docs/modules/ROOT/images}/asciidoctor-diagram-classes.png +0 -0
  7. data/docs/modules/ROOT/images/asciidoctor-diagram-process.png +0 -0
  8. data/docs/modules/ROOT/pages/index.adoc +21 -0
  9. data/docs/modules/ROOT/partials/advanced.adoc +319 -0
  10. data/docs/modules/ROOT/partials/create_diagram.adoc +132 -0
  11. data/docs/modules/ROOT/partials/generate.adoc +15 -0
  12. data/docs/modules/ROOT/partials/installation.adoc +19 -0
  13. data/docs/modules/ROOT/partials/uris.adoc +40 -0
  14. data/examples/features.adoc +1 -1
  15. data/lib/asciidoctor-diagram.rb +4 -0
  16. data/lib/asciidoctor-diagram/a2s/converter.rb +10 -6
  17. data/lib/asciidoctor-diagram/blockdiag/converter.rb +1 -1
  18. data/lib/asciidoctor-diagram/bpmn/converter.rb +3 -3
  19. data/lib/asciidoctor-diagram/diagram_converter.rb +9 -1
  20. data/lib/asciidoctor-diagram/diagram_processor.rb +92 -48
  21. data/lib/asciidoctor-diagram/diagram_source.rb +71 -24
  22. data/lib/asciidoctor-diagram/diagrams.rb +7 -0
  23. data/lib/asciidoctor-diagram/diagrams/converter.rb +49 -0
  24. data/lib/asciidoctor-diagram/diagrams/extension.rb +14 -0
  25. data/lib/asciidoctor-diagram/ditaa/converter.rb +20 -7
  26. data/lib/asciidoctor-diagram/ditaa/ditaa-1.3.20.jar +0 -0
  27. data/lib/asciidoctor-diagram/dpic.rb +7 -0
  28. data/lib/asciidoctor-diagram/dpic/converter.rb +30 -0
  29. data/lib/asciidoctor-diagram/dpic/extension.rb +14 -0
  30. data/lib/asciidoctor-diagram/gnuplot/converter.rb +8 -8
  31. data/lib/asciidoctor-diagram/graphviz/converter.rb +2 -2
  32. data/lib/asciidoctor-diagram/http/converter.rb +52 -14
  33. data/lib/asciidoctor-diagram/http/server.rb +11 -6
  34. data/lib/asciidoctor-diagram/lilypond/converter.rb +13 -3
  35. data/lib/asciidoctor-diagram/meme/converter.rb +22 -16
  36. data/lib/asciidoctor-diagram/mermaid/converter.rb +45 -14
  37. data/lib/asciidoctor-diagram/msc/converter.rb +2 -2
  38. data/lib/asciidoctor-diagram/pikchr.rb +7 -0
  39. data/lib/asciidoctor-diagram/pikchr/converter.rb +33 -0
  40. data/lib/asciidoctor-diagram/pikchr/extension.rb +14 -0
  41. data/lib/asciidoctor-diagram/plantuml/converter.rb +68 -43
  42. data/lib/asciidoctor-diagram/plantuml/plantuml-1.3.20.jar +0 -0
  43. data/lib/asciidoctor-diagram/smcat/converter.rb +3 -3
  44. data/lib/asciidoctor-diagram/svgbob/converter.rb +6 -2
  45. data/lib/asciidoctor-diagram/symbolator.rb +7 -0
  46. data/lib/asciidoctor-diagram/symbolator/converter.rb +23 -0
  47. data/lib/asciidoctor-diagram/symbolator/extension.rb +14 -0
  48. data/lib/asciidoctor-diagram/syntrax/converter.rb +9 -6
  49. data/lib/asciidoctor-diagram/tikz/converter.rb +20 -1
  50. data/lib/asciidoctor-diagram/umlet/converter.rb +11 -2
  51. data/lib/asciidoctor-diagram/util/cli.rb +16 -1
  52. data/lib/asciidoctor-diagram/util/cli_generator.rb +30 -8
  53. data/lib/asciidoctor-diagram/util/gif.rb +2 -2
  54. data/lib/asciidoctor-diagram/util/java.rb +118 -3
  55. data/lib/asciidoctor-diagram/util/java_jruby.rb +4 -1
  56. data/lib/asciidoctor-diagram/util/java_socket.rb +8 -109
  57. data/lib/asciidoctor-diagram/util/pdf.rb +2 -2
  58. data/lib/asciidoctor-diagram/util/png.rb +2 -2
  59. data/lib/{server-1.3.15.jar → asciidoctor-diagram/util/server-1.3.20.jar} +0 -0
  60. data/lib/asciidoctor-diagram/util/svg.rb +66 -18
  61. data/lib/asciidoctor-diagram/vega/converter.rb +2 -2
  62. data/lib/asciidoctor-diagram/version.rb +1 -1
  63. data/spec/a2s_spec.rb +6 -144
  64. data/spec/blockdiag_spec.rb +6 -204
  65. data/spec/bpmn_spec.rb +52 -92
  66. data/spec/bytefield_spec.rb +6 -144
  67. data/spec/diagrams_spec.rb +23 -0
  68. data/spec/ditaa_spec.rb +6 -144
  69. data/spec/dpic_spec.rb +19 -0
  70. data/spec/erd_spec.rb +6 -203
  71. data/spec/gnuplot_spec.rb +10 -263
  72. data/spec/graphviz_spec.rb +6 -145
  73. data/spec/lilypond_spec.rb +6 -144
  74. data/spec/mermaid_spec.rb +69 -211
  75. data/spec/msc_spec.rb +6 -203
  76. data/spec/nomnoml_spec.rb +7 -145
  77. data/spec/pikchr_spec.rb +69 -0
  78. data/spec/plantuml_spec.rb +63 -553
  79. data/spec/shaape_spec.rb +12 -224
  80. data/spec/shared_examples.rb +603 -0
  81. data/spec/smcat_spec.rb +6 -144
  82. data/spec/svgbob_spec.rb +6 -144
  83. data/spec/symbolator_spec.rb +23 -0
  84. data/spec/syntrax_spec.rb +7 -217
  85. data/spec/test_helper.rb +4 -29
  86. data/spec/tikz_spec.rb +68 -18
  87. data/spec/umlet_spec.rb +3 -59
  88. data/spec/vega_spec.rb +6 -119
  89. data/spec/wavedrom_spec.rb +3 -200
  90. metadata +82 -18
  91. data/README_zh-CN.adoc +0 -336
  92. data/images/asciidoctor-diagram-process.png +0 -0
  93. data/lib/batik-all-1.10.jar +0 -0
  94. data/lib/ditaa-1.3.15.jar +0 -0
  95. data/lib/ditaamini-0.12.jar +0 -0
  96. data/lib/jlatexmath-minimal-1.0.5.jar +0 -0
  97. data/lib/plantuml-1.3.15.jar +0 -0
  98. data/lib/plantuml.jar +0 -0
  99. data/spec/bpmn-example.xml +0 -44
@@ -15,18 +15,26 @@ module Asciidoctor
15
15
  [:png, :svg]
16
16
  end
17
17
 
18
- def collect_options(source, name)
18
+ def native_scaling?
19
+ true
20
+ end
21
+
22
+ def collect_options(source)
19
23
  options = {}
20
24
 
21
- options[:css] = source.attr('css', nil, name)
22
- options[:gantt_config] = source.attr('ganttconfig', nil, name) || source.attr('gantt-config', nil, name)
23
- options[:seq_config] = source.attr('sequenceconfig', nil, name) || source.attr('sequence-config', nil, name)
24
- options[:width] = source.attr('width', nil, name)
25
- options[:height] = source.attr('height', nil, name)
26
- options[:theme] = source.attr('theme', nil, name)
27
- options[:background] = source.attr('background', nil, name)
28
- options[:config] = source.attr('config', nil, name)
29
- options[:puppeteer_config] = source.attr('puppeteerconfig', nil, name) || source.attr('puppeteer-config', nil, name)
25
+ options[:css] = source.attr('css')
26
+ options[:gantt_config] = source.attr(['ganttconfig', 'gantt-config'])
27
+ options[:seq_config] = source.attr(['sequenceconfig', 'sequence-config'])
28
+ options[:width] = source.attr('width')
29
+ options[:height] = source.attr('height')
30
+ options[:scale] = source.attr('scale')
31
+ if options[:scale]
32
+ raise "Mermaid only supports integer scale factors: #{options[:scale]}" unless options[:scale] =~ /^[0-9]+$/
33
+ end
34
+ options[:theme] = source.attr('theme')
35
+ options[:background] = source.attr('background')
36
+ options[:config] = source.attr('config')
37
+ options[:puppeteer_config] = source.attr(['puppeteerconfig', 'puppeteer-config'])
30
38
 
31
39
  options
32
40
  end
@@ -56,9 +64,17 @@ module Asciidoctor
56
64
 
57
65
  opts[:width] = options[:width]
58
66
 
59
- mmdc = source.find_command('mmdc', :raise_on_error => false)
67
+ mmdc = nil
68
+ mmdc_exception = nil
69
+ begin
70
+ mmdc = source.find_command('mmdc')
71
+ rescue => e
72
+ mmdc_exception = e
73
+ end
74
+
60
75
  if mmdc
61
76
  opts[:height] = options[:height]
77
+ opts[:scale] = options[:scale]
62
78
  opts[:theme] = options[:theme]
63
79
  opts[:background] = options[:background]
64
80
  config = options[:config]
@@ -67,8 +83,16 @@ module Asciidoctor
67
83
  end
68
84
  run_mmdc(mmdc, source, format, opts)
69
85
  else
70
- mermaid = source.find_command('mermaid')
71
- run_mermaid(mermaid, source, format, opts)
86
+ begin
87
+ mermaid = source.find_command('mermaid')
88
+ run_mermaid(mermaid, source, format, opts)
89
+ rescue
90
+ if mmdc_exception
91
+ raise mmdc_exception
92
+ else
93
+ raise
94
+ end
95
+ end
72
96
  end
73
97
  end
74
98
 
@@ -93,6 +117,10 @@ module Asciidoctor
93
117
  args << '--height' << options[:height]
94
118
  end
95
119
 
120
+ if options[:scale]
121
+ args << '--scale' << options[:scale]
122
+ end
123
+
96
124
  if options[:background]
97
125
  bg = options[:background]
98
126
  bg = "##{bg}" unless bg[0] == '#'
@@ -134,7 +162,10 @@ module Asciidoctor
134
162
  args << '--puppeteerConfigFile' << Platform.native_path(options[:puppeteer])
135
163
  end
136
164
 
137
- args
165
+ {
166
+ :args => args,
167
+ :env => {'NODE_OPTIONS' => '--unhandled-rejections=strict'}
168
+ }
138
169
  end
139
170
  end
140
171
 
@@ -14,8 +14,8 @@ module Asciidoctor
14
14
  [:png, :svg]
15
15
  end
16
16
 
17
- def collect_options(source, name)
18
- {:font => source.attr('font', nil, name)}
17
+ def collect_options(source)
18
+ {:font => source.attr('font')}
19
19
  end
20
20
 
21
21
  def convert(source, format, options)
@@ -0,0 +1,7 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'pikchr/extension'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ block Asciidoctor::Diagram::PikchrBlockProcessor, :pikchr
6
+ block_macro Asciidoctor::Diagram::PikchrBlockMacroProcessor, :pikchr
7
+ end
@@ -0,0 +1,33 @@
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
+ output = 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
+
24
+ if output.start_with? '<svg'
25
+ output
26
+ else
27
+ error = output.gsub(/<\/?[a-z]+>\n?/i, '')
28
+ raise error
29
+ end
30
+ end
31
+ end
32
+ end
33
+ 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
@@ -1,4 +1,5 @@
1
1
  require_relative '../diagram_converter'
2
+ require 'delegate'
2
3
  require 'uri'
3
4
 
4
5
  module Asciidoctor
@@ -7,30 +8,40 @@ module Asciidoctor
7
8
  class PlantUmlConverter
8
9
  include DiagramConverter
9
10
 
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__)
11
+ CLASSPATH_ENV = 'DIAGRAM_PLANTUML_CLASSPATH'
12
+ LIB_DIR = File.expand_path('../..', File.dirname(__FILE__))
13
+ PLANTUML_JARS = if ENV.has_key?(CLASSPATH_ENV)
14
+ ENV[CLASSPATH_ENV].split(File::PATH_SEPARATOR)
15
+ else
16
+ begin
17
+ require 'asciidoctor-diagram/plantuml/classpath'
18
+ ::Asciidoctor::Diagram::PlantUmlClasspath::JAR_FILES
19
+ rescue LoadError
20
+ raise "Could not load PlantUML. Eiter require 'asciidoctor-diagram-plantuml' or specify the location of the PlantUML JAR(s) using the 'DIAGRAM_PLANTUML_CLASSPATH' environment variable."
21
+ end
22
+ end
23
+
24
+ Java.classpath.concat Dir[File.join(File.dirname(__FILE__), '*.jar')].freeze
25
+ Java.classpath.concat PLANTUML_JARS
26
+
27
+ def wrap_source(source)
28
+ PlantUMLPreprocessedSource.new(source, self.class.tag)
17
29
  end
18
- Java.classpath.concat JARS
19
30
 
20
31
  def supported_formats
21
32
  [:png, :svg, :txt, :atxt, :utxt]
22
33
  end
23
34
 
24
- def collect_options(source, name)
35
+ def collect_options(source)
25
36
  {
26
- :config => source.attr('plantumlconfig', nil, true) || source.attr('config', nil, name)
37
+ :size_limit => source.attr('size-limit', '4096')
27
38
  }
28
39
  end
29
40
 
30
41
  def convert(source, format, options)
31
42
  Java.load
32
43
 
33
- code = preprocess_code(source, self.class.tag)
44
+ code = source.code
34
45
 
35
46
  case format
36
47
  when :png
@@ -49,9 +60,9 @@ module Asciidoctor
49
60
  'Accept' => mime_type
50
61
  }
51
62
 
52
- config_file = options[:config]
53
- if config_file
54
- headers['X-PlantUML-Config'] = File.expand_path(config_file, source.base_dir)
63
+ size_limit = options[:size_limit]
64
+ if size_limit
65
+ headers['X-PlantUML-SizeLimit'] = size_limit
55
66
  end
56
67
 
57
68
  dot = source.find_command('dot', :alt_attrs => ['graphvizdot'], :raise_on_error => false)
@@ -71,35 +82,6 @@ module Asciidoctor
71
82
 
72
83
  response[:body]
73
84
  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'))
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
85
  end
104
86
 
105
87
  class UmlConverter < PlantUmlConverter
@@ -113,5 +95,48 @@ module Asciidoctor
113
95
  'salt'
114
96
  end
115
97
  end
98
+
99
+ class PlantUMLPreprocessedSource < SimpleDelegator
100
+ def initialize(source, tag)
101
+ super(source)
102
+ @tag = tag
103
+ end
104
+
105
+ def code
106
+ @code ||= load_code
107
+ end
108
+
109
+ def load_code
110
+ Java.load
111
+
112
+ code = __getobj__.code
113
+
114
+ code = "@start#{@tag}\n#{code}\n@end#{@tag}" unless code.index("@start") && code.index("@end")
115
+
116
+ headers = {}
117
+
118
+ config_file = attr('plantumlconfig', nil, true) || attr('config')
119
+ if config_file
120
+ headers['X-PlantUML-Config'] = File.expand_path(config_file, base_dir)
121
+ end
122
+
123
+ headers['X-PlantUML-Basedir'] = Platform.native_path(File.expand_path(base_dir))
124
+
125
+ response = Java.send_request(
126
+ :url => '/plantumlpreprocessor',
127
+ :body => code,
128
+ :headers => headers
129
+ )
130
+
131
+ unless response[:code] == 200
132
+ raise Java.create_error("PlantUML preprocessing failed", response)
133
+ end
134
+
135
+ code = response[:body]
136
+ code.force_encoding(Encoding::UTF_8)
137
+
138
+ code
139
+ end
140
+ end
116
141
  end
117
142
  end
@@ -14,10 +14,10 @@ module Asciidoctor
14
14
  [:svg]
15
15
  end
16
16
 
17
- def collect_options(source, name)
17
+ def collect_options(source)
18
18
  {
19
- :direction => source.attr('direction', nil, name),
20
- :engine => source.attr('engine', nil, name)
19
+ :direction => source.attr('direction'),
20
+ :engine => source.attr('engine')
21
21
  }
22
22
  end
23
23
 
@@ -14,6 +14,10 @@ module Asciidoctor
14
14
  [:svg]
15
15
  end
16
16
 
17
+ def native_scaling?
18
+ true
19
+ end
20
+
17
21
  OPTIONS = {
18
22
  :font_family => lambda { |o, v| o << '--font-family' << v if v },
19
23
  :font_size => lambda { |o, v| o << '--font-size' << v if v },
@@ -21,12 +25,12 @@ module Asciidoctor
21
25
  :scale => lambda { |o, v| o << '--scale' << v if v }
22
26
  }
23
27
 
24
- def collect_options(source, name)
28
+ def collect_options(source)
25
29
  options = {}
26
30
 
27
31
  OPTIONS.keys.each do |option|
28
32
  attr_name = option.to_s.tr('_', '-')
29
- options[option] = source.attr(attr_name, nil, name) || source.attr(attr_name, nil, 'svgbob-option')
33
+ options[option] = source.attr(attr_name) || source.attr(attr_name, nil, 'svgbob-option')
30
34
  end
31
35
 
32
36
  options
@@ -0,0 +1,7 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'symbolator/extension'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ block Asciidoctor::Diagram::SymbolatorBlockProcessor, :symbolator
6
+ block_macro Asciidoctor::Diagram::SymbolatorBlockMacroProcessor, :symbolator
7
+ end
@@ -0,0 +1,23 @@
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 SymbolatorConverter
9
+ include DiagramConverter
10
+ include CliGenerator
11
+
12
+ def supported_formats
13
+ [:png, :pdf, :svg]
14
+ end
15
+
16
+ def convert(source, format, options)
17
+ generate_stdin(source.find_command('symbolator'), format.to_s, source.to_s) do |tool_path, output_path|
18
+ [tool_path, "-i-", "-o#{Platform.native_path(output_path)}", "-f#{format.to_s}"]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ class SymbolatorBlockProcessor < DiagramBlockProcessor
7
+ use_converter SymbolatorConverter
8
+ end
9
+
10
+ class SymbolatorBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter SymbolatorConverter
12
+ end
13
+ end
14
+ end
@@ -14,16 +14,15 @@ module Asciidoctor
14
14
  [:png, :svg]
15
15
  end
16
16
 
17
- def collect_options(source, name)
17
+ def collect_options(source)
18
18
  {
19
- :heading => source.attr('heading', nil, name),
20
- :scale => source.attr('scale', nil, name),
21
- :transparent => source.attr('transparent', nil, name),
22
- :style => source.attr('style', nil, name)
19
+ :heading => source.attr('heading'),
20
+ :scale => source.attr('scale'),
21
+ :transparent => source.attr('transparent'),
22
+ :style => source.attr('style-file')
23
23
  }
24
24
  end
25
25
 
26
-
27
26
  def convert(source, format, options)
28
27
  generate_file(source.find_command('syntrax'), 'spec', format.to_s, source.to_s) do |tool_path, input_path, output_path|
29
28
  args = [tool_path, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
@@ -50,6 +49,10 @@ module Asciidoctor
50
49
  args
51
50
  end
52
51
  end
52
+
53
+ def native_scaling?
54
+ true
55
+ end
53
56
  end
54
57
  end
55
58
  end