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
@@ -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