asciidoctor-diagram 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|