asciidoctor-diagram 1.5.18 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of asciidoctor-diagram might be problematic. Click here for more details.

Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +66 -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 +55 -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 +19 -0
  17. data/lib/asciidoctor-diagram/diagram_processor.rb +345 -0
  18. data/lib/asciidoctor-diagram/diagram_source.rb +306 -0
  19. data/lib/asciidoctor-diagram/ditaa/converter.rb +86 -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 +127 -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 +55 -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 +38 -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/bpmn-example.xml +44 -0
  85. data/spec/bpmn_spec.rb +96 -0
  86. data/spec/bytefield_spec.rb +230 -0
  87. data/spec/ditaa_spec.rb +32 -0
  88. data/spec/dpic_spec.rb +74 -0
  89. data/spec/gnuplot_spec.rb +478 -0
  90. data/spec/lilypond_spec.rb +151 -0
  91. data/spec/mermaid_spec.rb +33 -1
  92. data/spec/pikchr_spec.rb +106 -0
  93. data/spec/plantuml_spec.rb +90 -1
  94. data/spec/smcat_spec.rb +164 -0
  95. data/spec/symbolator_spec.rb +200 -0
  96. data/spec/test_helper.rb +0 -18
  97. metadata +73 -11
  98. data/lib/asciidoctor-diagram/extensions.rb +0 -568
  99. data/lib/ditaa-1.3.13.jar +0 -0
  100. data/lib/ditaamini-0.11.jar +0 -0
  101. data/lib/plantuml-1.3.13.jar +0 -0
  102. data/lib/server-1.3.13.jar +0 -0
@@ -1,59 +1,14 @@
1
- require_relative '../extensions'
2
- require_relative '../util/cli_generator'
3
- require_relative '../util/platform'
4
- require_relative '../util/which'
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
5
3
 
6
4
  module Asciidoctor
7
5
  module Diagram
8
- # @private
9
- module Syntrax
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
- syntrax(parent, source, f)
17
- end
18
- end
19
- end
20
-
21
- def syntrax(parent, source, format)
22
- inherit_prefix = name
23
-
24
- generate_file(which(parent, 'syntrax'), 'spec', format.to_s, source.to_s) do |tool_path, input_path, output_path|
25
- args = [tool_path, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
26
-
27
- title = source.attr('heading', nil, inherit_prefix)
28
- if title
29
- args << '--title' << title
30
- end
31
-
32
- scale = source.attr('scale', nil, inherit_prefix)
33
- if scale
34
- args << '--scale' << scale
35
- end
36
-
37
- transparent = source.attr('transparent', nil, inherit_prefix)
38
- if transparent == 'true'
39
- args << '--transparent'
40
- end
41
- style = source.attr('style', nil, inherit_prefix)
42
- if style
43
- args << '--style' << style
44
- end
45
-
46
- args
47
- end
48
- end
49
- end
50
-
51
- class SyntraxBlockProcessor < Extensions::DiagramBlockProcessor
52
- include Syntrax
6
+ class SyntraxBlockProcessor < DiagramBlockProcessor
7
+ use_converter SyntraxConverter
53
8
  end
54
9
 
55
- class SyntraxBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
56
- include Syntrax
10
+ class SyntraxBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter SyntraxConverter
57
12
  end
58
13
  end
59
14
  end
@@ -0,0 +1,56 @@
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 TikZConverter
9
+ include DiagramConverter
10
+ include CliGenerator
11
+
12
+ def supported_formats
13
+ [:pdf, :svg]
14
+ end
15
+
16
+
17
+ def convert(source, format, options)
18
+ latexpath = source.find_command('pdflatex')
19
+
20
+ if format == :svg
21
+ svgpath = source.find_command('pdf2svg')
22
+ else
23
+ svgpath = nil
24
+ end
25
+
26
+ latex = <<'END'
27
+ \documentclass[border=2bp, tikz]{standalone}
28
+ \usepackage{tikz}
29
+ \begin{document}
30
+ \begingroup
31
+ \tikzset{every picture/.style={scale=1}}
32
+ END
33
+ latex << source.to_s
34
+ latex << <<'END'
35
+ \endgroup
36
+ \end{document}
37
+ END
38
+
39
+ pdf = generate_file(latexpath, 'tex', 'pdf', latex) do |tool_path, input_path, output_path|
40
+ {
41
+ :args => [tool_path, '-shell-escape', '-file-line-error', '-interaction=nonstopmode', '-output-directory', Platform.native_path(File.dirname(output_path)), Platform.native_path(input_path)],
42
+ :out_file => "#{File.dirname(input_path)}/#{File.basename(input_path, '.*')}.pdf"
43
+ }
44
+ end
45
+
46
+ if svgpath
47
+ generate_file(svgpath, 'pdf', 'svg', pdf) do |tool_path, input_path, output_path|
48
+ [tool_path, Platform.native_path(input_path), Platform.native_path(output_path)]
49
+ end
50
+ else
51
+ pdf
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,68 +1,14 @@
1
- require_relative '../extensions'
2
- require_relative '../util/cli_generator'
3
- require_relative '../util/platform'
4
- require_relative '../util/which'
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
5
3
 
6
4
  module Asciidoctor
7
5
  module Diagram
8
- # @private
9
- module TikZ
10
- include CliGenerator
11
- include Which
12
-
13
- def self.included(mod)
14
- [:pdf, :svg].each do |f|
15
- mod.register_format(f, :image) do |parent, source|
16
- tikz(parent, source, f)
17
- end
18
- end
19
- end
20
-
21
- def tikz(parent, source, format)
22
- latexpath = which(parent, 'pdflatex')
23
-
24
- if format == :svg
25
- svgpath = which(parent, 'pdf2svg')
26
- else
27
- svgpath = nil
28
- end
29
-
30
- latex = <<'END'
31
- \documentclass[border=2bp]{standalone}
32
- \usepackage{tikz}
33
- \begin{document}
34
- \begingroup
35
- \tikzset{every picture/.style={scale=1}}
36
- END
37
- latex << source.to_s
38
- latex << <<'END'
39
- \endgroup
40
- \end{document}
41
- END
42
-
43
- pdf = generate_file(latexpath, 'tex', 'pdf', latex) do |tool_path, input_path, output_path|
44
- {
45
- :args => [tool_path, '-shell-escape', '-file-line-error', '-interaction=nonstopmode', '-output-directory', Platform.native_path(File.dirname(output_path)), Platform.native_path(input_path)],
46
- :out_file => "#{File.dirname(input_path)}/#{File.basename(input_path, '.*')}.pdf"
47
- }
48
- end
49
-
50
- if svgpath
51
- generate_file(svgpath, 'pdf', 'svg', pdf) do |tool_path, input_path, output_path|
52
- [tool_path, Platform.native_path(File.dirname(input_path)), Platform.native_path(File.dirname(output_path))]
53
- end
54
- else
55
- pdf
56
- end
57
- end
58
- end
59
-
60
- class TikZBlockProcessor < Extensions::DiagramBlockProcessor
61
- include TikZ
6
+ class TikZBlockProcessor < DiagramBlockProcessor
7
+ use_converter TikZConverter
62
8
  end
63
9
 
64
- class TikZBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
65
- include TikZ
10
+ class TikZBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter TikZConverter
66
12
  end
67
13
  end
68
14
  end
@@ -0,0 +1,24 @@
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 UmletConverter
9
+ include DiagramConverter
10
+ include CliGenerator
11
+
12
+
13
+ def supported_formats
14
+ [:svg, :png, :pdf, :gif]
15
+ end
16
+
17
+ def convert(source, format, options)
18
+ generate_file(source.find_command('umlet'), 'uxf', format.to_s, source.to_s) do |tool_path, input_path, output_path|
19
+ [tool_path, '-action=convert', "-format=#{format.to_s}", "-filename=#{Platform.native_path(input_path)}", "-output=#{Platform.native_path(output_path)}"]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,36 +1,14 @@
1
- require_relative '../extensions'
2
- require_relative '../util/cli_generator'
3
- require_relative '../util/platform'
4
- require_relative '../util/which'
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
5
3
 
6
4
  module Asciidoctor
7
5
  module Diagram
8
- # @private
9
- module Umlet
10
- include CliGenerator
11
- include Which
12
-
13
- def self.included(mod)
14
- [:svg, :png, :pdf, :gif].each do |f|
15
- mod.register_format(f, :image) do |parent, source|
16
- umlet(parent, source, f)
17
- end
18
- end
19
- end
20
-
21
- def umlet(parent, source, format)
22
- generate_file(which(parent, 'umlet'), 'uxf', format.to_s, source.to_s) do |tool_path, input_path, output_path|
23
- [tool_path, '-action=convert', "-format=#{format.to_s}", "-filename=#{Platform.native_path(input_path)}", "-output=#{Platform.native_path(output_path)}"]
24
- end
25
- end
26
- end
27
-
28
- class UmletBlockProcessor < Extensions::DiagramBlockProcessor
29
- include Umlet
6
+ class UmletBlockProcessor < DiagramBlockProcessor
7
+ use_converter UmletConverter
30
8
  end
31
9
 
32
- class UmletBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
33
- include Umlet
10
+ class UmletBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter UmletConverter
34
12
  end
35
13
  end
36
14
  end
@@ -9,7 +9,7 @@ module Asciidoctor
9
9
  require_relative 'java'
10
10
 
11
11
  def self.run(*args)
12
- opts = args.pop if args.last.is_a? Hash
12
+ opts = args.pop.dup if args.last.is_a? Hash
13
13
  in_data = opts && opts[:stdin_data]
14
14
 
15
15
  pb = java.lang.ProcessBuilder.new(*args)
@@ -61,12 +61,23 @@ module Asciidoctor
61
61
  require 'open3'
62
62
 
63
63
  def self.run(*args)
64
- stdout, stderr, status = Open3.capture3(*args)
64
+ if Hash === args.last
65
+ opts = args.pop.dup
66
+ else
67
+ opts = {}
68
+ end
69
+
70
+ # When the first argument is an array, we force capture3 (or better the underlying Kernel#spawn)
71
+ # to use a non-shell execution variant.
72
+ cmd = File.basename(args[0])
73
+ args[0] = [args[0], cmd]
74
+
75
+ stdout, stderr, status = Open3.capture3(*args, opts)
65
76
 
66
77
  exit = status.exitstatus
67
78
 
68
79
  if exit != 0
69
- raise "#{File.basename(args[0])} failed: #{stdout.empty? ? stderr : stdout}"
80
+ raise "#{cmd} failed: #{stdout.empty? ? stderr : stdout}"
70
81
  end
71
82
 
72
83
  {
@@ -1,3 +1,4 @@
1
+ require 'asciidoctor/logging'
1
2
  require 'tempfile'
2
3
  require_relative 'cli'
3
4
 
@@ -5,6 +6,8 @@ module Asciidoctor
5
6
  module Diagram
6
7
  # @private
7
8
  module CliGenerator
9
+ include Asciidoctor::Logging
10
+
8
11
  def generate_stdin(tool, format, code)
9
12
  tool_name = File.basename(tool)
10
13
 
@@ -26,7 +29,7 @@ module Asciidoctor
26
29
  else
27
30
  opts = [tool]
28
31
  end
29
- generate(opts, :stdout, :stdin_data => code)
32
+ generate(opts, :stdout, :stdin_data => code, :binmode => true)
30
33
  end
31
34
 
32
35
  def generate_file(tool, input_ext, output_ext, code)
@@ -51,6 +54,20 @@ module Asciidoctor
51
54
  end
52
55
  end
53
56
 
57
+ def generate_file_stdout(tool, input_ext, code)
58
+ tool_name = File.basename(tool)
59
+
60
+ source_file = Tempfile.new([tool_name, ".#{input_ext}"])
61
+ begin
62
+ File.write(source_file.path, code)
63
+
64
+ opts = yield tool, source_file.path
65
+ generate(opts, :stdout)
66
+ ensure
67
+ source_file.unlink
68
+ end
69
+ end
70
+
54
71
  private
55
72
  def generate(opts, target_file, open3_opts = {})
56
73
  case opts
@@ -64,6 +81,7 @@ module Asciidoctor
64
81
  raise "Block passed to generate_file should return an Array or a Hash"
65
82
  end
66
83
 
84
+ logger.debug "Executing #{args} with options #{open3_opts}"
67
85
  result = ::Asciidoctor::Diagram::Cli.run(*args, open3_opts)
68
86
 
69
87
  data = target_file == :stdout ? result[:out] : read_result(target_file, out_file)
@@ -7,14 +7,14 @@ module Asciidoctor
7
7
  GIF87A_SIGNATURE = 'GIF87a'.force_encoding(Encoding::ASCII_8BIT)
8
8
  GIF89A_SIGNATURE = 'GIF89a'.force_encoding(Encoding::ASCII_8BIT)
9
9
 
10
- def self.get_image_size(data)
10
+ def self.post_process_image(data)
11
11
  bio = BinaryIO.new(data)
12
12
  gif_signature = bio.read_string(6)
13
13
  raise "Invalid GIF signature" unless gif_signature == GIF87A_SIGNATURE || gif_signature == GIF89A_SIGNATURE
14
14
 
15
15
  width = bio.read_uint16_le
16
16
  height = bio.read_uint16_le
17
- [width, height]
17
+ [data, width, height]
18
18
  end
19
19
  end
20
20
  end
@@ -6,7 +6,7 @@ module Asciidoctor
6
6
  module Java
7
7
  def self.classpath
8
8
  @classpath ||= [
9
- File.expand_path(File.join('../..', 'server-1.3.13.jar'), File.dirname(__FILE__))
9
+ File.expand_path(File.join('../..', 'server-1.3.15.jar'), File.dirname(__FILE__))
10
10
  ]
11
11
  end
12
12
 
@@ -9,28 +9,25 @@ module Asciidoctor
9
9
  # @private
10
10
  module Java
11
11
  class CommandServer
12
- attr_reader :port
13
-
14
12
  def initialize(java, classpath)
15
13
  args = []
16
14
  args << '-Djava.awt.headless=true'
17
15
  args << '-Djava.net.useSystemProxies=true'
18
16
  args << '-cp'
19
17
  args << classpath.flatten.map { |jar| ::Asciidoctor::Diagram::Platform.host_os_path(jar).strip }.join(::Asciidoctor::Diagram::Platform.host_os_path_separator)
20
- args << 'org.asciidoctor.diagram.CommandServer'
18
+ args << 'org.asciidoctor.diagram.StdInOutCommandServer'
21
19
 
22
- @server = IO.popen([java, *args])
23
- @port = @server.readline.strip.to_i
24
- @client = TCPSocket.new 'localhost', port
20
+ @server = IO.popen([java, *args], 'r+b')
25
21
  end
26
22
 
27
23
  def io
28
- @client
24
+ @server
29
25
  end
30
26
 
31
27
  def shutdown
32
28
  # KILL is a bit heavy handed, but TERM does not seem to shut down the JVM on Windows.
33
29
  Process.kill('KILL', @server.pid)
30
+ @server.close
34
31
  end
35
32
  end
36
33
 
@@ -60,8 +57,9 @@ module Asciidoctor
60
57
 
61
58
  def self.send_request(req)
62
59
  svr = instance
63
- headers = req[:headers] ||= {}
64
- headers['Host'] = "localhost:#{svr.port}"
60
+ req[:headers] ||= {}
61
+ # headers = req[:headers] ||= {}
62
+ # headers['Host'] = "localhost:#{svr.port}"
65
63
  format_request(req, svr.io)
66
64
  parse_response(svr.io)
67
65
  end
@@ -2,8 +2,8 @@ module Asciidoctor
2
2
  module Diagram
3
3
  # @private
4
4
  module PDF
5
- def self.get_image_size(_)
6
- nil
5
+ def self.post_process_image(data)
6
+ [data, nil, nil]
7
7
  end
8
8
  end
9
9
  end
@@ -6,7 +6,7 @@ module Asciidoctor
6
6
  module PNG
7
7
  PNG_SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10].pack('CCCCCCCC')
8
8
 
9
- def self.get_image_size(data)
9
+ def self.post_process_image(data)
10
10
  bio = BinaryIO.new(data)
11
11
  png_signature = bio.read_string(8)
12
12
  raise "Invalid PNG signature" unless png_signature == PNG_SIGNATURE
@@ -18,7 +18,7 @@ module Asciidoctor
18
18
 
19
19
  width = bio.read_uint32_be
20
20
  height = bio.read_uint32_be
21
- [width, height]
21
+ [data, width, height]
22
22
  end
23
23
  end
24
24
  end