asciidoctor-diagram 2.0.4 → 2.0.5
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 +14 -0
- data/lib/asciidoctor-diagram/diagram_processor.rb +37 -20
- data/lib/asciidoctor-diagram/mermaid/converter.rb +13 -0
- data/lib/asciidoctor-diagram/tikz/converter.rb +20 -1
- data/lib/asciidoctor-diagram/umlet/converter.rb +11 -2
- data/lib/asciidoctor-diagram/util/java.rb +113 -0
- data/lib/asciidoctor-diagram/util/java_socket.rb +1 -111
- data/lib/asciidoctor-diagram/version.rb +1 -1
- data/spec/mermaid_spec.rb +30 -12
- data/spec/shared_examples.rb +61 -10
- data/spec/tikz_spec.rb +70 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 682b06be01eb9a3aa29f735c134fe97e813db674f3e7d4a76ae86dcc8241e826
|
4
|
+
data.tar.gz: fdf1252fc4f30c1ec56a64bb1928306f1b73341b81442c233111e1fdf8bbc038
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0b928e103aef0f5123cd3a3810c210d28c626493bf536ec7e0ed4363e761df0c2fa23ec8a2a5bbb6c4cc748c2a66d13a846e2d5c06a9b38405d8c7ec0148569
|
7
|
+
data.tar.gz: 1387ead776db0d3df332fb585e99be44eb49245f1b32d8be5275034d0de6e9fb89e1085ca485a6336be9e190119e193d6bdebefe44dcfa51eacb277739ee8a91
|
data/CHANGELOG.adoc
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
= Asciidoctor-diagram Changelog
|
2
2
|
|
3
|
+
== 2.0.5
|
4
|
+
|
5
|
+
Enhancements::
|
6
|
+
|
7
|
+
* Improve internal target path resolution logic
|
8
|
+
* TikZ diagrams can now add content to the LaTeX preamble by setting the `preamble` block attribute to `true`.
|
9
|
+
The preamble and diagram should be separated by a line consisting of `\~~~~`. (@colbyn)
|
10
|
+
* The `scale` attribute is now passed on to Mermaid. (@gustav-b)
|
11
|
+
* Issue #271: Launch UMLet directly using `java` instead of using the UMLet wrapper scripts or executables
|
12
|
+
|
13
|
+
Bug Fixes::
|
14
|
+
|
15
|
+
* Issue #294: Treat the first positional parameter of diagram block macros as the desired output format rather than as the target.
|
16
|
+
|
3
17
|
== 2.0.4
|
4
18
|
|
5
19
|
Enhancements::
|
@@ -144,10 +144,9 @@ module Asciidoctor
|
|
144
144
|
|
145
145
|
def create_image_block(parent, source, format, converter)
|
146
146
|
image_name = "#{source.image_name}.#{format}"
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
metadata_file = parent.normalize_system_path "#{image_name}.cache", cache_dir
|
147
|
+
|
148
|
+
image_file = parent.normalize_system_path(image_name, image_output_dir(parent))
|
149
|
+
metadata_file = parent.normalize_system_path("#{image_name}.cache", cache_dir(source, parent))
|
151
150
|
|
152
151
|
if File.exist? metadata_file
|
153
152
|
metadata = File.open(metadata_file, 'r') {|f| JSON.load(f, nil, :symbolize_names => true, :create_additions => false) }
|
@@ -185,7 +184,7 @@ module Asciidoctor
|
|
185
184
|
end
|
186
185
|
|
187
186
|
scale = image_attributes['scale']
|
188
|
-
if !converter.native_scaling? && scalematch = /(
|
187
|
+
if !converter.native_scaling? && scalematch = /([0-9]+(?:\.[0-9]+)?)/.match(scale)
|
189
188
|
scale_factor = scalematch[1].to_f
|
190
189
|
else
|
191
190
|
scale_factor = 1.0
|
@@ -244,11 +243,11 @@ module Asciidoctor
|
|
244
243
|
node.set_attr('target', image_name)
|
245
244
|
|
246
245
|
if source.global_attr('autoimagesdir')
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
246
|
+
image_path = Pathname.new(image_file)
|
247
|
+
output_path = Pathname.new(parent.normalize_system_path(output_dir(parent)))
|
248
|
+
|
249
|
+
imagesdir = image_path.relative_path_from(output_path).dirname.to_s
|
250
|
+
node.set_attr('imagesdir', imagesdir)
|
252
251
|
end
|
253
252
|
end
|
254
253
|
|
@@ -265,25 +264,43 @@ module Asciidoctor
|
|
265
264
|
end
|
266
265
|
end
|
267
266
|
|
267
|
+
# Returns the image output directory as an absolute path
|
268
268
|
def image_output_dir(parent)
|
269
|
-
|
269
|
+
images_out_dir = parent.attr('imagesoutdir', nil, true)
|
270
270
|
|
271
|
-
if
|
272
|
-
|
271
|
+
if images_out_dir
|
272
|
+
resolve_path(parent, images_out_dir)
|
273
273
|
else
|
274
|
-
base_dir = output_base_dir(parent)
|
275
274
|
images_dir = parent.attr('imagesdir', nil, true)
|
275
|
+
output_dir = output_dir(parent)
|
276
|
+
resolve_path(parent, images_dir, output_dir)
|
276
277
|
end
|
278
|
+
end
|
277
279
|
|
278
|
-
|
280
|
+
# Returns the cache directory as an absolute path
|
281
|
+
def cache_dir(source, parent)
|
282
|
+
cache_dir = source.global_attr('cachedir')
|
283
|
+
if cache_dir
|
284
|
+
resolve_path(parent, cache_dir)
|
285
|
+
else
|
286
|
+
output_dir = output_dir(parent)
|
287
|
+
resolve_path(parent, '.asciidoctor/diagram', output_dir)
|
288
|
+
end
|
279
289
|
end
|
280
290
|
|
281
|
-
|
282
|
-
|
291
|
+
# Returns the general output directory for Asciidoctor as an absolute path
|
292
|
+
def output_dir(parent)
|
293
|
+
resolve_path(parent, parent.attr('outdir', nil, true) || doc_option(parent.document, :to_dir))
|
283
294
|
end
|
284
295
|
|
285
|
-
def
|
286
|
-
|
296
|
+
def resolve_path(parent, path, base_dir = nil)
|
297
|
+
if path.nil?
|
298
|
+
# Resolve the base dir itself
|
299
|
+
parent.document.path_resolver.system_path(base_dir)
|
300
|
+
else
|
301
|
+
# Resolve the path with respect to the base dir
|
302
|
+
parent.document.path_resolver.system_path(path, base_dir)
|
303
|
+
end
|
287
304
|
end
|
288
305
|
|
289
306
|
def create_literal_block(parent, source, format, converter)
|
@@ -335,7 +352,7 @@ module Asciidoctor
|
|
335
352
|
include DiagramProcessor
|
336
353
|
|
337
354
|
def self.inherited(subclass)
|
338
|
-
subclass.name_positional_attributes ['
|
355
|
+
subclass.name_positional_attributes ['format']
|
339
356
|
end
|
340
357
|
|
341
358
|
def apply_target_subs(parent, target)
|
@@ -15,6 +15,10 @@ module Asciidoctor
|
|
15
15
|
[:png, :svg]
|
16
16
|
end
|
17
17
|
|
18
|
+
def native_scaling?
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
18
22
|
def collect_options(source)
|
19
23
|
options = {}
|
20
24
|
|
@@ -23,6 +27,10 @@ module Asciidoctor
|
|
23
27
|
options[:seq_config] = source.attr(['sequenceconfig', 'sequence-config'])
|
24
28
|
options[:width] = source.attr('width')
|
25
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
|
26
34
|
options[:theme] = source.attr('theme')
|
27
35
|
options[:background] = source.attr('background')
|
28
36
|
options[:config] = source.attr('config')
|
@@ -60,6 +68,7 @@ module Asciidoctor
|
|
60
68
|
node = source.find_command('node', :raise_on_error => false)
|
61
69
|
if mmdc && node
|
62
70
|
opts[:height] = options[:height]
|
71
|
+
opts[:scale] = options[:scale]
|
63
72
|
opts[:theme] = options[:theme]
|
64
73
|
opts[:background] = options[:background]
|
65
74
|
config = options[:config]
|
@@ -94,6 +103,10 @@ module Asciidoctor
|
|
94
103
|
args << '--height' << options[:height]
|
95
104
|
end
|
96
105
|
|
106
|
+
if options[:scale]
|
107
|
+
args << '--scale' << options[:scale]
|
108
|
+
end
|
109
|
+
|
97
110
|
if options[:background]
|
98
111
|
bg = options[:background]
|
99
112
|
bg = "##{bg}" unless bg[0] == '#'
|
@@ -13,6 +13,11 @@ module Asciidoctor
|
|
13
13
|
[:pdf, :svg]
|
14
14
|
end
|
15
15
|
|
16
|
+
def collect_options(source)
|
17
|
+
{
|
18
|
+
:preamble => source.attr('preamble') == 'true'
|
19
|
+
}
|
20
|
+
end
|
16
21
|
|
17
22
|
def convert(source, format, options)
|
18
23
|
latexpath = source.find_command('pdflatex')
|
@@ -23,14 +28,28 @@ module Asciidoctor
|
|
23
28
|
svgpath = nil
|
24
29
|
end
|
25
30
|
|
31
|
+
if options[:preamble]
|
32
|
+
preamble, body = source.to_s.split(/^~~~~$/, 2)
|
33
|
+
unless body
|
34
|
+
body = preamble
|
35
|
+
preamble = ''
|
36
|
+
end
|
37
|
+
else
|
38
|
+
preamble = ''
|
39
|
+
body = source.to_s
|
40
|
+
end
|
41
|
+
|
26
42
|
latex = <<'END'
|
27
43
|
\documentclass[border=2bp, tikz]{standalone}
|
28
44
|
\usepackage{tikz}
|
45
|
+
END
|
46
|
+
latex << preamble
|
47
|
+
latex << <<'END'
|
29
48
|
\begin{document}
|
30
49
|
\begingroup
|
31
50
|
\tikzset{every picture/.style={scale=1}}
|
32
51
|
END
|
33
|
-
latex <<
|
52
|
+
latex << body
|
34
53
|
latex << <<'END'
|
35
54
|
\endgroup
|
36
55
|
\end{document}
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative '../diagram_converter'
|
2
2
|
require_relative '../util/cli_generator'
|
3
3
|
require_relative '../util/platform'
|
4
|
+
require_relative '../util/java'
|
4
5
|
|
5
6
|
module Asciidoctor
|
6
7
|
module Diagram
|
@@ -15,8 +16,16 @@ module Asciidoctor
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def convert(source, format, options)
|
18
|
-
|
19
|
-
|
19
|
+
java = ::Asciidoctor::Diagram::Java.java
|
20
|
+
|
21
|
+
umlet = source.find_command('umlet')
|
22
|
+
ext = File.extname(umlet)
|
23
|
+
if ext == '' || ext != '.jar'
|
24
|
+
umlet = File.expand_path(File.basename(umlet, '.*') + '.jar', File.dirname(umlet))
|
25
|
+
end
|
26
|
+
|
27
|
+
generate_file(java, 'uxf', format.to_s, source.to_s) do |tool_path, input_path, output_path|
|
28
|
+
[tool_path, '-jar', Platform.native_path(umlet), '-action=convert', "-format=#{format.to_s}", "-filename=#{Platform.native_path(input_path)}", "-output=#{Platform.native_path(output_path)}"]
|
20
29
|
end
|
21
30
|
end
|
22
31
|
end
|
@@ -88,6 +88,119 @@ module Asciidoctor
|
|
88
88
|
raise "#{prefix_msg}: #{response[:reason]}"
|
89
89
|
end
|
90
90
|
end
|
91
|
+
|
92
|
+
def self.java
|
93
|
+
@java_exe ||= find_java
|
94
|
+
raise "Could not find Java executable" unless @java_exe
|
95
|
+
@java_exe
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def self.find_java
|
100
|
+
case ::Asciidoctor::Diagram::Platform.os
|
101
|
+
when :windows
|
102
|
+
path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
|
103
|
+
when :macosx
|
104
|
+
path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(::Asciidoctor::Diagram::Cli.run('/usr/libexec/java_home')[:out].strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
|
105
|
+
else
|
106
|
+
path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.path_to(java_home, java_binary)
|
111
|
+
exe_path = File.expand_path(java_binary, java_home)
|
112
|
+
if File.executable?(exe_path)
|
113
|
+
exe_path
|
114
|
+
else
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
JDK_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit'
|
120
|
+
JRE_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment'
|
121
|
+
|
122
|
+
def self.registry_lookup
|
123
|
+
registry_current(JRE_KEY) || registry_current(JDK_KEY) || registry_any()
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.registry_current(key)
|
127
|
+
current_version = registry_query(key, 'CurrentVersion')
|
128
|
+
if current_version
|
129
|
+
java_home = registry_query("#{key}\\#{current_version}", 'JavaHome')
|
130
|
+
java_exe(java_home)
|
131
|
+
else
|
132
|
+
nil
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.registry_any()
|
137
|
+
java_homes = registry_query('HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft', 'JavaHome', :recursive => true).values
|
138
|
+
java_homes.map { |path| java_exe(path) }.find { |exe| !exe.nil? }
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.java_exe(java_home)
|
142
|
+
java = File.expand_path('bin/java.exe', java_home)
|
143
|
+
|
144
|
+
if File.executable?(java)
|
145
|
+
java
|
146
|
+
else
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.registry_query(key, value = nil, opts = {})
|
152
|
+
args = ['reg', 'query']
|
153
|
+
args << key
|
154
|
+
args << '/v' << value unless value.nil?
|
155
|
+
args << '/s' if opts[:recursive]
|
156
|
+
|
157
|
+
begin
|
158
|
+
lines = ::Asciidoctor::Diagram::Cli.run(*args)[:out].lines.reject { |l| l.strip.empty? }.each
|
159
|
+
rescue
|
160
|
+
lines = [].each
|
161
|
+
end
|
162
|
+
|
163
|
+
result = {}
|
164
|
+
|
165
|
+
while true
|
166
|
+
begin
|
167
|
+
begin
|
168
|
+
k = lines.next
|
169
|
+
rescue StopIteration
|
170
|
+
break
|
171
|
+
end
|
172
|
+
|
173
|
+
unless k.start_with? key
|
174
|
+
next
|
175
|
+
end
|
176
|
+
|
177
|
+
v = nil
|
178
|
+
begin
|
179
|
+
v = lines.next.strip if lines.peek.start_with?(' ')
|
180
|
+
rescue StopIteration
|
181
|
+
break
|
182
|
+
end
|
183
|
+
|
184
|
+
if !k.valid_encoding? || (v && !v.valid_encoding?)
|
185
|
+
next
|
186
|
+
end
|
187
|
+
|
188
|
+
if v && (md = /([^\s]+)\s+(REG_[^\s]+)\s+(.+)/.match(v))
|
189
|
+
v_name = md[1]
|
190
|
+
v_value = md[3]
|
191
|
+
result["#{k}\\#{v_name}"] = v_value
|
192
|
+
else
|
193
|
+
result[k] = v
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
if value && !opts[:recursive]
|
199
|
+
result.values[0]
|
200
|
+
else
|
201
|
+
result
|
202
|
+
end
|
203
|
+
end
|
91
204
|
end
|
92
205
|
end
|
93
206
|
end
|
@@ -41,11 +41,8 @@ module Asciidoctor
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.instance
|
44
|
-
@java_exe ||= find_java
|
45
|
-
raise "Could not find Java executable" unless @java_exe
|
46
|
-
|
47
44
|
unless defined?(@command_server) && @command_server
|
48
|
-
server = CommandServer.new(
|
45
|
+
server = CommandServer.new(java, classpath)
|
49
46
|
@command_server = server
|
50
47
|
at_exit do
|
51
48
|
server.shutdown
|
@@ -63,113 +60,6 @@ module Asciidoctor
|
|
63
60
|
format_request(req, svr.io)
|
64
61
|
parse_response(svr.io)
|
65
62
|
end
|
66
|
-
|
67
|
-
private
|
68
|
-
def self.find_java
|
69
|
-
case ::Asciidoctor::Diagram::Platform.os
|
70
|
-
when :windows
|
71
|
-
path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
|
72
|
-
when :macosx
|
73
|
-
path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(::Asciidoctor::Diagram::Cli.run('/usr/libexec/java_home')[:out].strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
|
74
|
-
else
|
75
|
-
path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def self.path_to(java_home, java_binary)
|
80
|
-
exe_path = File.expand_path(java_binary, java_home)
|
81
|
-
if File.executable?(exe_path)
|
82
|
-
exe_path
|
83
|
-
else
|
84
|
-
nil
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
JDK_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit'
|
89
|
-
JRE_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment'
|
90
|
-
|
91
|
-
def self.registry_lookup
|
92
|
-
registry_current(JRE_KEY) || registry_current(JDK_KEY) || registry_any()
|
93
|
-
end
|
94
|
-
|
95
|
-
def self.registry_current(key)
|
96
|
-
current_version = registry_query(key, 'CurrentVersion')
|
97
|
-
if current_version
|
98
|
-
java_home = registry_query("#{key}\\#{current_version}", 'JavaHome')
|
99
|
-
java_exe(java_home)
|
100
|
-
else
|
101
|
-
nil
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def self.registry_any()
|
106
|
-
java_homes = registry_query('HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft', 'JavaHome', :recursive => true).values
|
107
|
-
java_homes.map { |path| java_exe(path) }.find { |exe| !exe.nil? }
|
108
|
-
end
|
109
|
-
|
110
|
-
def self.java_exe(java_home)
|
111
|
-
java = File.expand_path('bin/java.exe', java_home)
|
112
|
-
|
113
|
-
if File.executable?(java)
|
114
|
-
java
|
115
|
-
else
|
116
|
-
nil
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def self.registry_query(key, value = nil, opts = {})
|
121
|
-
args = ['reg', 'query']
|
122
|
-
args << key
|
123
|
-
args << '/v' << value unless value.nil?
|
124
|
-
args << '/s' if opts[:recursive]
|
125
|
-
|
126
|
-
begin
|
127
|
-
lines = ::Asciidoctor::Diagram::Cli.run(*args)[:out].lines.reject { |l| l.strip.empty? }.each
|
128
|
-
rescue
|
129
|
-
lines = [].each
|
130
|
-
end
|
131
|
-
|
132
|
-
result = {}
|
133
|
-
|
134
|
-
while true
|
135
|
-
begin
|
136
|
-
begin
|
137
|
-
k = lines.next
|
138
|
-
rescue StopIteration
|
139
|
-
break
|
140
|
-
end
|
141
|
-
|
142
|
-
unless k.start_with? key
|
143
|
-
next
|
144
|
-
end
|
145
|
-
|
146
|
-
v = nil
|
147
|
-
begin
|
148
|
-
v = lines.next.strip if lines.peek.start_with?(' ')
|
149
|
-
rescue StopIteration
|
150
|
-
break
|
151
|
-
end
|
152
|
-
|
153
|
-
if !k.valid_encoding? || (v && !v.valid_encoding?)
|
154
|
-
next
|
155
|
-
end
|
156
|
-
|
157
|
-
if v && (md = /([^\s]+)\s+(REG_[^\s]+)\s+(.+)/.match(v))
|
158
|
-
v_name = md[1]
|
159
|
-
v_value = md[3]
|
160
|
-
result["#{k}\\#{v_name}"] = v_value
|
161
|
-
else
|
162
|
-
result[k] = v
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
if value && !opts[:recursive]
|
168
|
-
result.values[0]
|
169
|
-
else
|
170
|
-
result
|
171
|
-
end
|
172
|
-
end
|
173
63
|
end
|
174
64
|
end
|
175
65
|
end
|
data/spec/mermaid_spec.rb
CHANGED
@@ -10,10 +10,6 @@ eos
|
|
10
10
|
|
11
11
|
describe Asciidoctor::Diagram::MermaidBlockMacroProcessor do
|
12
12
|
include_examples "block_macro", :mermaid, code, [:png, :svg]
|
13
|
-
end
|
14
|
-
|
15
|
-
describe Asciidoctor::Diagram::MermaidBlockProcessor do
|
16
|
-
include_examples "block", :mermaid, code, [:png, :svg]
|
17
13
|
|
18
14
|
it "should respect the sequenceConfig attribute" do
|
19
15
|
seq_diag = <<-eos
|
@@ -43,8 +39,8 @@ Doc Writer <doc@example.com>
|
|
43
39
|
|
44
40
|
== First Section
|
45
41
|
|
46
|
-
mermaid::mermaid.txt["with_config", sequenceConfig="seqconfig.txt"]
|
47
|
-
mermaid::mermaid.txt["without_config"]
|
42
|
+
mermaid::mermaid.txt[target="with_config", sequenceConfig="seqconfig.txt"]
|
43
|
+
mermaid::mermaid.txt[target="without_config"]
|
48
44
|
eos
|
49
45
|
|
50
46
|
load_asciidoc doc
|
@@ -69,8 +65,8 @@ Doc Writer <doc@example.com>
|
|
69
65
|
|
70
66
|
== First Section
|
71
67
|
|
72
|
-
mermaid::mermaid.txt["with_width", width="700"]
|
73
|
-
mermaid::mermaid.txt["without_width"]
|
68
|
+
mermaid::mermaid.txt[target="with_width", width="700"]
|
69
|
+
mermaid::mermaid.txt[target="without_width"]
|
74
70
|
eos
|
75
71
|
|
76
72
|
load_asciidoc doc
|
@@ -95,8 +91,8 @@ Doc Writer <doc@example.com>
|
|
95
91
|
|
96
92
|
== First Section
|
97
93
|
|
98
|
-
mermaid::mermaid.txt["default", format="svg"]
|
99
|
-
mermaid::mermaid.txt["dark", format="svg", theme="dark"]
|
94
|
+
mermaid::mermaid.txt[target="default", format="svg"]
|
95
|
+
mermaid::mermaid.txt[target="dark", format="svg", theme="dark"]
|
100
96
|
eos
|
101
97
|
|
102
98
|
load_asciidoc doc
|
@@ -127,8 +123,8 @@ Doc Writer <doc@example.com>
|
|
127
123
|
|
128
124
|
== First Section
|
129
125
|
|
130
|
-
mermaid::mermaid.txt["with_config", puppeteerConfig="pptrconfig.txt"]
|
131
|
-
mermaid::mermaid.txt["without_config"]
|
126
|
+
mermaid::mermaid.txt[target="with_config", puppeteerConfig="pptrconfig.txt"]
|
127
|
+
mermaid::mermaid.txt[target="without_config"]
|
132
128
|
eos
|
133
129
|
|
134
130
|
load_asciidoc doc
|
@@ -137,3 +133,25 @@ mermaid::mermaid.txt["without_config"]
|
|
137
133
|
expect(File.size('with_config.png')).to be File.size('without_config.png')
|
138
134
|
end
|
139
135
|
end
|
136
|
+
|
137
|
+
describe Asciidoctor::Diagram::MermaidBlockProcessor do
|
138
|
+
include_examples "block", :mermaid, code, [:png, :svg]
|
139
|
+
|
140
|
+
it "should report unsupported scaling factors" do
|
141
|
+
doc = <<-eos
|
142
|
+
= Hello, Mermaid!
|
143
|
+
Doc Writer <doc@example.com>
|
144
|
+
|
145
|
+
== First Section
|
146
|
+
|
147
|
+
[mermaid, scale=1.5]
|
148
|
+
----
|
149
|
+
sequenceDiagram
|
150
|
+
Alice->>John: Hello John, how are you?
|
151
|
+
John-->>Alice: Great!
|
152
|
+
----
|
153
|
+
eos
|
154
|
+
|
155
|
+
expect { load_asciidoc doc }.to raise_error(/support.*scale/i)
|
156
|
+
end
|
157
|
+
end
|
data/spec/shared_examples.rb
CHANGED
@@ -12,7 +12,7 @@ Doc Writer <doc@example.com>
|
|
12
12
|
|
13
13
|
== First Section
|
14
14
|
|
15
|
-
#{name}::#{name}.txt[
|
15
|
+
#{name}::#{name}.txt[#{format}]
|
16
16
|
eos
|
17
17
|
|
18
18
|
d = load_asciidoc doc
|
@@ -35,7 +35,7 @@ Doc Writer <doc@example.com>
|
|
35
35
|
|
36
36
|
== First Section
|
37
37
|
|
38
|
-
#{name}::#{name}.txt[
|
38
|
+
#{name}::#{name}.txt[#{format}]
|
39
39
|
eos
|
40
40
|
|
41
41
|
d = load_asciidoc doc
|
@@ -165,8 +165,8 @@ Doc Writer <doc@example.com>
|
|
165
165
|
|
166
166
|
== First Section
|
167
167
|
|
168
|
-
#{name}::#{name}.txt["foobar"]
|
169
|
-
#{name}::#{name}.txt["foobaz"]
|
168
|
+
#{name}::#{name}.txt[target="foobar"]
|
169
|
+
#{name}::#{name}.txt[target="foobaz"]
|
170
170
|
eos
|
171
171
|
|
172
172
|
load_asciidoc doc
|
@@ -184,8 +184,8 @@ Doc Writer <doc@example.com>
|
|
184
184
|
|
185
185
|
== First Section
|
186
186
|
|
187
|
-
#{name}::#{name}.txt["test/foobar"]
|
188
|
-
#{name}::#{name}.txt["test2/foobaz"]
|
187
|
+
#{name}::#{name}.txt[target="test/foobar"]
|
188
|
+
#{name}::#{name}.txt[target="test2/foobaz"]
|
189
189
|
eos
|
190
190
|
|
191
191
|
load_asciidoc doc
|
@@ -415,6 +415,29 @@ Doc Writer <doc@example.com>
|
|
415
415
|
expect(File.exist?(File.expand_path(target, 'foo'))).to be true
|
416
416
|
end
|
417
417
|
|
418
|
+
it 'should write files to to_dir if set in safe mode' do
|
419
|
+
doc = <<-eos
|
420
|
+
= Hello, #{name}!
|
421
|
+
Doc Writer <doc@example.com>
|
422
|
+
|
423
|
+
== First Section
|
424
|
+
|
425
|
+
[#{name}]
|
426
|
+
----
|
427
|
+
#{code}
|
428
|
+
----
|
429
|
+
eos
|
430
|
+
|
431
|
+
to_dir = File.expand_path('foo')
|
432
|
+
d = load_asciidoc doc, {:to_dir => to_dir, :safe => :safe}
|
433
|
+
b = d.find { |bl| bl.context == :image }
|
434
|
+
|
435
|
+
target = b.attributes['target']
|
436
|
+
expect(target).to_not be_nil
|
437
|
+
expect(File.exist?(target)).to be false
|
438
|
+
expect(File.exist?(File.expand_path(target, to_dir))).to be true
|
439
|
+
end
|
440
|
+
|
418
441
|
it 'should write files to to_dir if set when embedded in table' do
|
419
442
|
doc = <<-eos
|
420
443
|
= Hello, #{name}!
|
@@ -466,6 +489,32 @@ Doc Writer <doc@example.com>
|
|
466
489
|
expect(File.exist?(File.expand_path(target, 'foo'))).to be false
|
467
490
|
end
|
468
491
|
|
492
|
+
it 'should write files to imagesoutdir if set in safe mode' do
|
493
|
+
doc = <<-eos
|
494
|
+
= Hello, #{name}!
|
495
|
+
Doc Writer <doc@example.com>
|
496
|
+
|
497
|
+
== First Section
|
498
|
+
|
499
|
+
[#{name}]
|
500
|
+
----
|
501
|
+
#{code}
|
502
|
+
----
|
503
|
+
eos
|
504
|
+
|
505
|
+
out_dir = File.expand_path('foo')
|
506
|
+
images_out_dir = File.expand_path('bar')
|
507
|
+
|
508
|
+
d = load_asciidoc doc, {:attributes => {'imagesoutdir' => images_out_dir, 'outdir' => out_dir}, :safe => :safe}
|
509
|
+
b = d.find { |bl| bl.context == :image }
|
510
|
+
|
511
|
+
target = b.attributes['target']
|
512
|
+
expect(target).to_not be_nil
|
513
|
+
expect(File.exist?(target)).to be false
|
514
|
+
expect(File.exist?(File.expand_path(target, images_out_dir))).to be true
|
515
|
+
expect(File.exist?(File.expand_path(target, out_dir))).to be false
|
516
|
+
end
|
517
|
+
|
469
518
|
it 'should omit width/height attributes when generating docbook' do
|
470
519
|
doc = <<-eos
|
471
520
|
= Hello, #{name}!
|
@@ -522,7 +571,7 @@ Doc Writer <doc@example.com>
|
|
522
571
|
|
523
572
|
== First Section
|
524
573
|
|
525
|
-
[#{name}]
|
574
|
+
[#{name}, target="unscaled"]
|
526
575
|
----
|
527
576
|
#{code}
|
528
577
|
----
|
@@ -534,7 +583,7 @@ Doc Writer <doc@example.com>
|
|
534
583
|
|
535
584
|
== First Section
|
536
585
|
|
537
|
-
[#{name}, scale="
|
586
|
+
[#{name}, scale="2", target="scaled"]
|
538
587
|
----
|
539
588
|
#{code}
|
540
589
|
----
|
@@ -546,7 +595,9 @@ Doc Writer <doc@example.com>
|
|
546
595
|
d = load_asciidoc scaled_doc, :attributes => {'backend' => 'html5'}
|
547
596
|
scaled_image = d.find { |bl| bl.context == :image }
|
548
597
|
|
549
|
-
|
550
|
-
|
598
|
+
unless formats[0] == :pdf
|
599
|
+
expect(scaled_image.attributes['width']).to be_within(1).of(unscaled_image.attributes['width'] * 2)
|
600
|
+
expect(scaled_image.attributes['height']).to be_within(1).of(unscaled_image.attributes['height'] * 2)
|
601
|
+
end
|
551
602
|
end
|
552
603
|
end
|
data/spec/tikz_spec.rb
CHANGED
@@ -104,4 +104,74 @@ end
|
|
104
104
|
|
105
105
|
describe Asciidoctor::Diagram::TikZBlockProcessor, :broken_on_travis, :broken_on_windows do
|
106
106
|
include_examples "block", :tikz, code, [:pdf]
|
107
|
+
|
108
|
+
it "should support the preamble attribute" do
|
109
|
+
File.write("tikz.txt", code)
|
110
|
+
|
111
|
+
doc = <<'eos'
|
112
|
+
= Hello, tikz!
|
113
|
+
Doc Writer <doc@example.com>
|
114
|
+
|
115
|
+
== First Section
|
116
|
+
|
117
|
+
[tikz, preamble="true"]
|
118
|
+
----
|
119
|
+
\usepackage{tkz-euclide}
|
120
|
+
\usepackage{etoolbox}
|
121
|
+
\usepackage{MnSymbol}
|
122
|
+
\usetikzlibrary{angles,patterns,calc}
|
123
|
+
\usepackage[most]{tcolorbox}
|
124
|
+
\usepackage{pgfplots}
|
125
|
+
\pgfplotsset{compat=1.7}
|
126
|
+
~~~~
|
127
|
+
\begin{tikzpicture}
|
128
|
+
\tikzset{>=stealth}
|
129
|
+
% draw axises and labels. We store a single coordinate to have the
|
130
|
+
% direction of the x axis
|
131
|
+
\draw[->] (-4,0) -- ++(8,0) coordinate (X) node[below] {$x$};
|
132
|
+
\draw[->] (0,-4) -- ++(0,8) node[left] {$y$};
|
133
|
+
|
134
|
+
\newcommand\CircleRadius{3cm}
|
135
|
+
\draw (0,0) circle (\CircleRadius);
|
136
|
+
% special method of noting the position of a point
|
137
|
+
\coordinate (P) at (-495:\CircleRadius);
|
138
|
+
|
139
|
+
\draw[thick]
|
140
|
+
(0,0)
|
141
|
+
coordinate (O) % store origin
|
142
|
+
node[] {} % label
|
143
|
+
--
|
144
|
+
node[below left, pos=1] {$P(-\frac{\sqrt{2}}{2}, -\frac{\sqrt{2}}{2})$} % some labels
|
145
|
+
node[below right, midway] {$r$}
|
146
|
+
(P)
|
147
|
+
--
|
148
|
+
node[midway,left] {$y$}
|
149
|
+
(P |- O) coordinate (Px) % projection onto horizontal line through
|
150
|
+
% O, saved for later
|
151
|
+
--
|
152
|
+
node[midway, below] {$x$}
|
153
|
+
cycle % closed path
|
154
|
+
|
155
|
+
% pic trick is from the angles library, requires the three points of
|
156
|
+
% the marked angle to be named
|
157
|
+
|
158
|
+
pic [] {angle=X--O--P};
|
159
|
+
\draw[->,red] (5mm, 0mm) arc (0:-495:5mm) node[midway,xshift=-4mm,yshift=3.5mm] {$-495^\circ$};
|
160
|
+
% right angle marker
|
161
|
+
\draw ($(Px)+(0.3, 0)$) -- ++(0, -0.3) -- ++(-0.3,0);
|
162
|
+
\end{tikzpicture}
|
163
|
+
----
|
164
|
+
eos
|
165
|
+
|
166
|
+
d = load_asciidoc doc
|
167
|
+
expect(d).to_not be_nil
|
168
|
+
|
169
|
+
b = d.find { |bl| bl.context == :image }
|
170
|
+
expect(b).to_not be_nil
|
171
|
+
|
172
|
+
expect(b.content_model).to eq :empty
|
173
|
+
|
174
|
+
target = b.attributes['target']
|
175
|
+
expect(target).to_not be_nil
|
176
|
+
end
|
107
177
|
end
|
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.0.
|
4
|
+
version: 2.0.5
|
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: 2020-
|
11
|
+
date: 2020-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
239
239
|
- !ruby/object:Gem::Version
|
240
240
|
version: '0'
|
241
241
|
requirements: []
|
242
|
-
rubygems_version: 3.
|
242
|
+
rubygems_version: 3.1.4
|
243
243
|
signing_key:
|
244
244
|
specification_version: 4
|
245
245
|
summary: An extension for asciidoctor that adds support for UML diagram generation
|