asciidoctor-diagram 2.3.1 → 2.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba1fe3f7c564342dde9942ddb021de41fd84e10d2661b0fe29f8e716c960e145
4
- data.tar.gz: 5b504adb1364e2c7a709adebebe54b68af6e5571de5192f3784567178839c24a
3
+ metadata.gz: e68570e8ec8e10bd6815b05ef8a6884716fe9bdeb6da30c30d813fe15eef3514
4
+ data.tar.gz: 426bebf1b41d3f4f3d262a41d90db635f1dffe711de6bde0ac112ffd03b6e496
5
5
  SHA512:
6
- metadata.gz: cd0ce65811837cd0ee3be1b00eb1e3fe8a951f3b4f0e8c94846450489adc8692d80eab616d1a653fc8bfc8444e92b345e9cb79acac007f5ef49e1fae99108553
7
- data.tar.gz: 2289407dc63908392cdcd9bd3e4980b7ec95dd0f2e0ed38f493ea243d62c2f3fa68fff8128b4a3ef7a7dbbc7e46822696551e70b1ef4230f2bf9a7f130a37d49
6
+ metadata.gz: f97b8cad30f43d309e2607c8cbcec8e8f64998de86255ea80e717e5886165632b8e5f0ab97674375cf59edb1249807d2a23c475a9b58de64a611a9182b574ccc
7
+ data.tar.gz: 5d0ff9dd8bed877c2e5db712320779486735b5cc24ea87c0c3623f94a27be949d84849ed6e504e8428535cdf394ffbccaecebdeb4d7e9d98525a8ddf12f66849
data/CHANGELOG.adoc CHANGED
@@ -1,5 +1,15 @@
1
1
  = Asciidoctor-diagram Changelog
2
2
 
3
+ == 2.3.2
4
+
5
+ Enhancements::
6
+
7
+ * Issue #465: Add support for https://pintorajs.vercel.app/[Pintora]
8
+ * Issue #476: Use PlantUML's Smetana layout engine by default if Graphviz cannot be located
9
+ * Issue #477: Improve support for using plantuml.com as PlantUML rendering server
10
+ * Add support for Structurizr JSON workspaces
11
+ * Prefer non-PDF formats when rendering with HTML backend
12
+
3
13
  == 2.3.1
4
14
 
5
15
  Enhancements::
@@ -81,6 +81,13 @@ module Asciidoctor
81
81
  begin
82
82
  source = converter.wrap_source(source)
83
83
 
84
+ if /html/i =~ parent.document.attributes['backend']
85
+ # Move PDF to the back of the list for the HTML backend
86
+ if supported_formats.delete(:pdf)
87
+ supported_formats << :pdf
88
+ end
89
+ end
90
+
84
91
  format = source.attributes.delete('format') || source.global_attr('format', supported_formats[0])
85
92
  format = format.to_sym if format.respond_to?(:to_sym)
86
93
 
@@ -187,17 +194,27 @@ module Asciidoctor
187
194
 
188
195
  options = converter.collect_options(source)
189
196
  result = converter.convert(source, format, options)
190
-
191
- result.force_encoding(params[:encoding])
197
+ if result.is_a? Hash
198
+ image = result[:result]
199
+ extra = result[:extra]
200
+ else
201
+ image = result
202
+ extra = {}
203
+ end
204
+ image.force_encoding(params[:encoding])
192
205
 
193
206
  metadata = source.create_image_metadata
194
207
  metadata[:options] = options
195
208
 
196
209
  allow_image_optimisation = !source.global_opt('nooptimise')
197
- result, metadata[:width], metadata[:height] = params[:decoder].post_process_image(result, allow_image_optimisation)
210
+ image, metadata[:width], metadata[:height] = params[:decoder].post_process_image(image, allow_image_optimisation)
198
211
 
199
212
  FileUtils.mkdir_p(File.dirname(image_file)) unless Dir.exist?(File.dirname(image_file))
200
- File.open(image_file, 'wb') {|f| f.write result}
213
+ File.open(image_file, 'wb') {|f| f.write image}
214
+
215
+ extra.each do |name, data|
216
+ File.open(image_file + ".#{name}", 'wb') {|f| f.write data}
217
+ end
201
218
 
202
219
  if use_cache
203
220
  FileUtils.mkdir_p(File.dirname(metadata_file)) unless Dir.exist?(File.dirname(metadata_file))
@@ -202,14 +202,6 @@ module Asciidoctor
202
202
  name = [name] unless name.is_a?(Enumerable)
203
203
 
204
204
  value = name.lazy.map { |n| @attributes[n] }.reject { |v| v.nil? }.first
205
- if value.nil?
206
- attr_position = config[:positional_attrs] || 1
207
- while value.nil? && !@attributes[attr_position].nil?
208
- if @attributes[attr_position] == name
209
- value = true
210
- end
211
- end
212
- end
213
205
 
214
206
  if value.nil? && inherit
215
207
  inherited_values = name.lazy.map do |n|
@@ -345,4 +337,4 @@ module Asciidoctor
345
337
  end
346
338
  end
347
339
  end
348
- end
340
+ end
@@ -55,6 +55,7 @@ module Asciidoctor
55
55
 
56
56
  code << "\n"
57
57
  code << source.to_s
58
+ code << "\n"
58
59
 
59
60
  generate_stdin_stdout(source.find_command('gnuplot'), code) do |tool|
60
61
  {
@@ -72,7 +72,8 @@ module Asciidoctor
72
72
 
73
73
  get_path = path.dup << '/' << data
74
74
 
75
- if get_path.length > options[:max_get_size]
75
+ host = uri.host
76
+ if (host.nil? || !host.downcase.end_with?('plantuml.com')) && get_path.length > options[:max_get_size]
76
77
  uri.path = path
77
78
  get_uri(uri, code, 'text/plain; charset=utf-8')
78
79
  else
@@ -110,7 +111,11 @@ module Asciidoctor
110
111
  resolved_uri = new_uri
111
112
  end
112
113
 
113
- get_uri(resolved_uri, post_data, post_content_type, attempt + 1)
114
+ if response.code == '307'
115
+ get_uri(resolved_uri, post_data, post_content_type, attempt + 1)
116
+ else
117
+ get_uri(resolved_uri, nil, nil, attempt + 1)
118
+ end
114
119
  else
115
120
  response.value
116
121
  end
@@ -0,0 +1,60 @@
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 PintoraConverter
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[:width] = source.attr('width')
22
+ options[:theme] = source.attr('theme')
23
+ options[:background_color] = source.attr('background-color')
24
+ options[:pixel_ratio] = source.attr('pixel-ratio')
25
+
26
+ options
27
+ end
28
+
29
+ def convert(source, format, options)
30
+ pintora = source.find_command('pintora')
31
+
32
+ generate_file(pintora, 'pintora', format.to_s, source.to_s) do |tool_path, input_path, output_path|
33
+ args = [tool_path, 'render', '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]
34
+
35
+
36
+ if options[:width]
37
+ args << '-w' << options[:width]
38
+ end
39
+
40
+ if options[:theme]
41
+ args << '-t' << options[:theme]
42
+ end
43
+
44
+ if options[:pixel_ratio]
45
+ args << '-p' << options[:pixel_ratio]
46
+ end
47
+
48
+ if options[:background_color]
49
+ args << '-b' << options[:background_color]
50
+ end
51
+
52
+ {
53
+ :args => args,
54
+ :chdir => source.base_dir
55
+ }
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'converter'
2
+ require_relative '../diagram_processor'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ class PintoraBlockProcessor < DiagramBlockProcessor
7
+ use_converter PintoraConverter
8
+ end
9
+
10
+ class PintoraBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter PintoraConverter
12
+ end
13
+
14
+ class PintoraInlineMacroProcessor < DiagramInlineMacroProcessor
15
+ use_converter PintoraConverter
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'pintora/extension'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ block Asciidoctor::Diagram::PintoraBlockProcessor, :pintora
6
+ block_macro Asciidoctor::Diagram::PintoraBlockMacroProcessor, :pintora
7
+ inline_macro Asciidoctor::Diagram::PintoraInlineMacroProcessor, :pintora
8
+ end
@@ -45,6 +45,8 @@ module Asciidoctor
45
45
  theme = source.attr('theme', nil)
46
46
  options[:theme] = theme if theme
47
47
 
48
+ options[:debug] = true if source.opt('debug')
49
+
48
50
  options
49
51
  end
50
52
 
@@ -108,13 +110,15 @@ module Asciidoctor
108
110
  add_theme_header(headers, options[:theme])
109
111
  add_size_limit_header(headers, options[:size_limit])
110
112
 
111
- if options[:smetana]
113
+ dot = source.find_command('dot', :alt_attrs => ['graphvizdot'], :raise_on_error => false)
114
+ if options[:smetana] || !dot
112
115
  headers['X-Graphviz'] = 'smetana'
113
116
  else
114
- dot = source.find_command('dot', :alt_attrs => ['graphvizdot'], :raise_on_error => false)
115
- if dot
116
- headers['X-Graphviz'] = ::Asciidoctor::Diagram::Platform.host_os_path(dot)
117
- end
117
+ headers['X-Graphviz'] = ::Asciidoctor::Diagram::Platform.host_os_path(dot)
118
+ end
119
+
120
+ if options[:debug]
121
+ headers['X-PlantUML-Debug'] = 'true'
118
122
  end
119
123
 
120
124
  response = Java.send_request(
@@ -127,7 +131,37 @@ module Asciidoctor
127
131
  raise Java.create_error("PlantUML image generation failed", response)
128
132
  end
129
133
 
130
- response[:body]
134
+ if response[:headers]['content-type'] =~ /multipart\/form-data;\s*boundary=(.*)/
135
+ boundary = $1
136
+ parts = {}
137
+
138
+ multipart_data = StringIO.new(response[:body])
139
+ while true
140
+ multipart_data.readline
141
+ marker = multipart_data.readline
142
+ if marker.start_with? "--#{boundary}--"
143
+ break
144
+ elsif marker.start_with? "--#{boundary}"
145
+ part = Java.parse_body(multipart_data)
146
+ if part[:headers]['content-disposition'] =~ /form-data;\s*name="([^"]*)"/
147
+ if $1 == 'image'
148
+ parts[:result] = part[:body]
149
+ else
150
+ parts[:extra] ||= {}
151
+ parts[:extra][$1] = part[:body]
152
+ end
153
+ else
154
+ raise "Unexpected multipart content disposition"
155
+ end
156
+ else
157
+ raise "Unexpected multipart boundary"
158
+ end
159
+ end
160
+
161
+ parts
162
+ else
163
+ response[:body]
164
+ end
131
165
  end
132
166
  end
133
167
 
@@ -58,25 +58,34 @@ module Asciidoctor
58
58
  resp[:code] = status_line_parts[1].to_i
59
59
  resp[:reason] = status_line_parts[2]
60
60
 
61
+ resp.merge! parse_body(io)
62
+
63
+ resp
64
+ end
65
+
66
+ def self.parse_body(io)
67
+ body = {}
68
+
69
+ io.set_encoding Encoding::US_ASCII
61
70
  headers = {}
62
71
  until (header = io.readline(CRLF).strip).empty?
63
72
  key, value = header.split ':', 2
64
- headers[key] = value.strip
73
+ headers[key.downcase] = value.strip
65
74
  end
66
75
 
67
- resp[:headers] = headers
76
+ body[:headers] = headers
68
77
 
69
- content_length = headers['Content-Length']
78
+ content_length = headers['content-length']
70
79
  if content_length
71
80
  io.set_encoding Encoding::BINARY
72
- resp[:body] = io.read(content_length.to_i)
81
+ body[:body] = io.read(content_length.to_i)
73
82
  end
74
83
 
75
- resp
84
+ body
76
85
  end
77
86
 
78
87
  def self.create_error(prefix_msg, response)
79
- content_type = response[:headers]['Content-Type'] || 'text/plain'
88
+ content_type = response[:headers]['content-type'] || 'text/plain'
80
89
  if content_type.start_with? 'application/json'
81
90
  json = JSON.parse(response[:body].force_encoding(Encoding::UTF_8))
82
91
  ruby_bt = Kernel.caller(2)
@@ -97,7 +106,6 @@ module Asciidoctor
97
106
  @java_exe
98
107
  end
99
108
 
100
- private
101
109
  def self.find_java
102
110
  case ::Asciidoctor::Diagram::Platform.os
103
111
  when :windows
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module Diagram
3
- VERSION = "2.3.1"
3
+ VERSION = "2.3.2"
4
4
  end
5
5
  end
@@ -19,6 +19,7 @@ require_relative 'asciidoctor-diagram/msc'
19
19
  require_relative 'asciidoctor-diagram/nomnoml'
20
20
  require_relative 'asciidoctor-diagram/penrose'
21
21
  require_relative 'asciidoctor-diagram/pikchr'
22
+ require_relative 'asciidoctor-diagram/pintora'
22
23
  require_relative 'asciidoctor-diagram/plantuml'
23
24
  require_relative 'asciidoctor-diagram/salt'
24
25
  require_relative 'asciidoctor-diagram/shaape'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-diagram
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pepijn Van Eeckhoudt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-16 00:00:00.000000000 Z
11
+ date: 2025-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -196,10 +196,13 @@ files:
196
196
  - lib/asciidoctor-diagram/pikchr.rb
197
197
  - lib/asciidoctor-diagram/pikchr/converter.rb
198
198
  - lib/asciidoctor-diagram/pikchr/extension.rb
199
+ - lib/asciidoctor-diagram/pintora.rb
200
+ - lib/asciidoctor-diagram/pintora/converter.rb
201
+ - lib/asciidoctor-diagram/pintora/extension.rb
199
202
  - lib/asciidoctor-diagram/plantuml.rb
200
203
  - lib/asciidoctor-diagram/plantuml/converter.rb
201
204
  - lib/asciidoctor-diagram/plantuml/extension.rb
202
- - lib/asciidoctor-diagram/plantuml/plantuml-2.2.1.jar
205
+ - lib/asciidoctor-diagram/plantuml/plantuml-2.2.4.jar
203
206
  - lib/asciidoctor-diagram/salt.rb
204
207
  - lib/asciidoctor-diagram/shaape.rb
205
208
  - lib/asciidoctor-diagram/shaape/converter.rb
@@ -211,7 +214,7 @@ files:
211
214
  - lib/asciidoctor-diagram/structurizr/converter.rb
212
215
  - lib/asciidoctor-diagram/structurizr/extension.rb
213
216
  - lib/asciidoctor-diagram/structurizr/renderers.rb
214
- - lib/asciidoctor-diagram/structurizr/structurizr-2.2.0.jar
217
+ - lib/asciidoctor-diagram/structurizr/structurizr-2.2.2.jar
215
218
  - lib/asciidoctor-diagram/svgbob.rb
216
219
  - lib/asciidoctor-diagram/svgbob/converter.rb
217
220
  - lib/asciidoctor-diagram/svgbob/extension.rb
@@ -239,7 +242,7 @@ files:
239
242
  - lib/asciidoctor-diagram/util/pdf.rb
240
243
  - lib/asciidoctor-diagram/util/platform.rb
241
244
  - lib/asciidoctor-diagram/util/png.rb
242
- - lib/asciidoctor-diagram/util/server-2.2.0.jar
245
+ - lib/asciidoctor-diagram/util/server-2.2.3.jar
243
246
  - lib/asciidoctor-diagram/util/svg.rb
244
247
  - lib/asciidoctor-diagram/util/which.rb
245
248
  - lib/asciidoctor-diagram/vega.rb