asciidoctor-diagram 1.5.5 → 1.5.6
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 +20 -3
- data/README.adoc +29 -2
- data/Rakefile +0 -5
- data/lib/asciidoctor-diagram.rb +3 -0
- data/lib/asciidoctor-diagram/blockdiag/extension.rb +2 -1
- data/lib/asciidoctor-diagram/extensions.rb +25 -6
- data/lib/asciidoctor-diagram/graphviz/extension.rb +3 -1
- data/lib/asciidoctor-diagram/meme/extension.rb +7 -6
- data/lib/asciidoctor-diagram/mermaid/extension.rb +5 -4
- data/lib/asciidoctor-diagram/msc.rb +8 -0
- data/lib/asciidoctor-diagram/msc/extension.rb +44 -0
- data/lib/asciidoctor-diagram/plantuml/extension.rb +2 -1
- data/lib/asciidoctor-diagram/svgbob.rb +8 -0
- data/lib/asciidoctor-diagram/svgbob/extension.rb +38 -0
- data/lib/asciidoctor-diagram/syntrax.rb +8 -0
- data/lib/asciidoctor-diagram/syntrax/extension.rb +54 -0
- data/lib/asciidoctor-diagram/version.rb +1 -1
- data/spec/blockdiag_spec.rb +2 -2
- data/spec/msc_spec.rb +230 -0
- data/spec/plantuml_spec.rb +119 -14
- data/spec/shaape_spec.rb +2 -2
- data/spec/svgbob_spec.rb +167 -0
- data/spec/syntrax_spec.rb +228 -0
- data/spec/test_helper.rb +7 -0
- metadata +14 -2
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative '../extensions'
|
2
|
+
require_relative '../util/cli_generator'
|
3
|
+
require_relative '../util/platform'
|
4
|
+
require_relative '../util/which'
|
5
|
+
|
6
|
+
module Asciidoctor
|
7
|
+
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
|
+
scale = source.attr('scale', nil, inherit_prefix)
|
28
|
+
if scale
|
29
|
+
args << '--scale' << scale
|
30
|
+
end
|
31
|
+
|
32
|
+
transparent = source.attr('transparent', nil, inherit_prefix)
|
33
|
+
if transparent == 'true'
|
34
|
+
args << '--transparent'
|
35
|
+
end
|
36
|
+
style = source.attr('style', nil, inherit_prefix)
|
37
|
+
if style
|
38
|
+
args << '--style' << style
|
39
|
+
end
|
40
|
+
|
41
|
+
args
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class SyntraxBlockProcessor < Extensions::DiagramBlockProcessor
|
47
|
+
include Syntrax
|
48
|
+
end
|
49
|
+
|
50
|
+
class SyntraxBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
|
51
|
+
include Syntrax
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/spec/blockdiag_spec.rb
CHANGED
@@ -7,7 +7,7 @@ blockdiag {
|
|
7
7
|
}
|
8
8
|
eos
|
9
9
|
|
10
|
-
describe Asciidoctor::Diagram::BlockDiagBlockMacroProcessor do
|
10
|
+
describe Asciidoctor::Diagram::BlockDiagBlockMacroProcessor, :broken_on_appveyor do
|
11
11
|
it "should generate PNG images when format is set to 'png'" do
|
12
12
|
File.write('blockdiag.txt', code)
|
13
13
|
|
@@ -38,7 +38,7 @@ blockdiag::blockdiag.txt[format="png"]
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
describe Asciidoctor::Diagram::BlockDiagBlockProcessor do
|
41
|
+
describe Asciidoctor::Diagram::BlockDiagBlockProcessor, :broken_on_appveyor do
|
42
42
|
it "should generate PNG images when format is set to 'png'" do
|
43
43
|
doc = <<-eos
|
44
44
|
= Hello, BlockDiag!
|
data/spec/msc_spec.rb
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
code = <<-eos
|
4
|
+
# MSC for some fictional process
|
5
|
+
msc {
|
6
|
+
hscale = "2";
|
7
|
+
|
8
|
+
a,b,c;
|
9
|
+
|
10
|
+
a->b [ label = "ab()" ] ;
|
11
|
+
b->c [ label = "bc(TRUE)"];
|
12
|
+
c=>c [ label = "process(1)" ];
|
13
|
+
c=>c [ label = "process(2)" ];
|
14
|
+
...;
|
15
|
+
c=>c [ label = "process(n)" ];
|
16
|
+
c=>c [ label = "process(END)" ];
|
17
|
+
a<<=c [ label = "callback()"];
|
18
|
+
--- [ label = "If more to run", ID="*" ];
|
19
|
+
a->a [ label = "next()"];
|
20
|
+
a->c [ label = "ac1()\nac2()"];
|
21
|
+
b<-c [ label = "cb(TRUE)"];
|
22
|
+
b->b [ label = "stalled(...)"];
|
23
|
+
a<-b [ label = "ab() = FALSE"];
|
24
|
+
}
|
25
|
+
eos
|
26
|
+
|
27
|
+
describe Asciidoctor::Diagram::MscBlockMacroProcessor, :broken_on_windows do
|
28
|
+
it "should generate PNG images when format is set to 'png'" do
|
29
|
+
File.write('msc.txt', code)
|
30
|
+
|
31
|
+
doc = <<-eos
|
32
|
+
= Hello, Msc!
|
33
|
+
Doc Writer <doc@example.com>
|
34
|
+
|
35
|
+
== First Section
|
36
|
+
|
37
|
+
msc::msc.txt[format="png"]
|
38
|
+
eos
|
39
|
+
|
40
|
+
d = load_asciidoc doc
|
41
|
+
expect(d).to_not be_nil
|
42
|
+
|
43
|
+
b = d.find { |bl| bl.context == :image }
|
44
|
+
expect(b).to_not be_nil
|
45
|
+
|
46
|
+
expect(b.content_model).to eq :empty
|
47
|
+
|
48
|
+
target = b.attributes['target']
|
49
|
+
expect(target).to_not be_nil
|
50
|
+
expect(target).to match(/\.png$/)
|
51
|
+
expect(File.exist?(target)).to be true
|
52
|
+
|
53
|
+
expect(b.attributes['width']).to_not be_nil
|
54
|
+
expect(b.attributes['height']).to_not be_nil
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should generate SVG images when format is set to 'svg'" do
|
58
|
+
File.write('msc.txt', code)
|
59
|
+
|
60
|
+
doc = <<-eos
|
61
|
+
= Hello, Msc!
|
62
|
+
Doc Writer <doc@example.com>
|
63
|
+
|
64
|
+
== First Section
|
65
|
+
|
66
|
+
msc::msc.txt[format="svg"]
|
67
|
+
eos
|
68
|
+
|
69
|
+
d = load_asciidoc doc
|
70
|
+
expect(d).to_not be_nil
|
71
|
+
|
72
|
+
b = d.find { |bl| bl.context == :image }
|
73
|
+
expect(b).to_not be_nil
|
74
|
+
|
75
|
+
expect(b.content_model).to eq :empty
|
76
|
+
|
77
|
+
target = b.attributes['target']
|
78
|
+
expect(target).to_not be_nil
|
79
|
+
expect(target).to match(/\.svg/)
|
80
|
+
expect(File.exist?(target)).to be true
|
81
|
+
|
82
|
+
expect(b.attributes['width']).to_not be_nil
|
83
|
+
expect(b.attributes['height']).to_not be_nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe Asciidoctor::Diagram::MscBlockProcessor, :broken_on_windows do
|
88
|
+
it "should generate PNG images when format is set to 'png'" do
|
89
|
+
doc = <<-eos
|
90
|
+
= Hello, Msc!
|
91
|
+
Doc Writer <doc@example.com>
|
92
|
+
|
93
|
+
== First Section
|
94
|
+
|
95
|
+
[msc, format="png"]
|
96
|
+
----
|
97
|
+
#{code}
|
98
|
+
----
|
99
|
+
eos
|
100
|
+
|
101
|
+
d = load_asciidoc doc
|
102
|
+
expect(d).to_not be_nil
|
103
|
+
|
104
|
+
b = d.find { |bl| bl.context == :image }
|
105
|
+
expect(b).to_not be_nil
|
106
|
+
|
107
|
+
expect(b.content_model).to eq :empty
|
108
|
+
|
109
|
+
target = b.attributes['target']
|
110
|
+
expect(target).to_not be_nil
|
111
|
+
expect(target).to match(/\.png$/)
|
112
|
+
expect(File.exist?(target)).to be true
|
113
|
+
|
114
|
+
expect(b.attributes['width']).to_not be_nil
|
115
|
+
expect(b.attributes['height']).to_not be_nil
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should generate SVG images when format is set to 'svg'" do
|
119
|
+
doc = <<-eos
|
120
|
+
= Hello, Msc!
|
121
|
+
Doc Writer <doc@example.com>
|
122
|
+
|
123
|
+
== First Section
|
124
|
+
|
125
|
+
[msc, format="svg"]
|
126
|
+
----
|
127
|
+
#{code}
|
128
|
+
----
|
129
|
+
eos
|
130
|
+
|
131
|
+
d = load_asciidoc doc
|
132
|
+
expect(d).to_not be_nil
|
133
|
+
|
134
|
+
b = d.find { |bl| bl.context == :image }
|
135
|
+
expect(b).to_not be_nil
|
136
|
+
|
137
|
+
expect(b.content_model).to eq :empty
|
138
|
+
|
139
|
+
target = b.attributes['target']
|
140
|
+
expect(target).to_not be_nil
|
141
|
+
expect(target).to match(/\.svg/)
|
142
|
+
expect(File.exist?(target)).to be true
|
143
|
+
|
144
|
+
expect(b.attributes['width']).to_not be_nil
|
145
|
+
expect(b.attributes['height']).to_not be_nil
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should raise an error when when format is set to an invalid value" do
|
149
|
+
doc = <<-eos
|
150
|
+
= Hello, Msc!
|
151
|
+
Doc Writer <doc@example.com>
|
152
|
+
|
153
|
+
== First Section
|
154
|
+
|
155
|
+
[msc, format="foobar"]
|
156
|
+
----
|
157
|
+
----
|
158
|
+
eos
|
159
|
+
|
160
|
+
expect { load_asciidoc doc }.to raise_error(/support.*format/i)
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should not regenerate images when source has not changed" do
|
164
|
+
File.write('msc.txt', code)
|
165
|
+
|
166
|
+
doc = <<-eos
|
167
|
+
= Hello, Msc!
|
168
|
+
Doc Writer <doc@example.com>
|
169
|
+
|
170
|
+
== First Section
|
171
|
+
|
172
|
+
msc::msc.txt
|
173
|
+
|
174
|
+
[msc, format="png"]
|
175
|
+
----
|
176
|
+
#{code}
|
177
|
+
----
|
178
|
+
eos
|
179
|
+
|
180
|
+
d = load_asciidoc doc
|
181
|
+
b = d.find { |bl| bl.context == :image }
|
182
|
+
expect(b).to_not be_nil
|
183
|
+
target = b.attributes['target']
|
184
|
+
mtime1 = File.mtime(target)
|
185
|
+
|
186
|
+
sleep 1
|
187
|
+
|
188
|
+
d = load_asciidoc doc
|
189
|
+
|
190
|
+
mtime2 = File.mtime(target)
|
191
|
+
|
192
|
+
expect(mtime2).to eq mtime1
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should handle two block macros with the same source" do
|
196
|
+
File.write('msc.txt', code)
|
197
|
+
|
198
|
+
doc = <<-eos
|
199
|
+
= Hello, Msc!
|
200
|
+
Doc Writer <doc@example.com>
|
201
|
+
|
202
|
+
== First Section
|
203
|
+
|
204
|
+
msc::msc.txt[]
|
205
|
+
msc::msc.txt[]
|
206
|
+
eos
|
207
|
+
|
208
|
+
load_asciidoc doc
|
209
|
+
expect(File.exist?('msc.png')).to be true
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should respect target attribute in block macros" do
|
213
|
+
File.write('msc.txt', code)
|
214
|
+
|
215
|
+
doc = <<-eos
|
216
|
+
= Hello, Msc!
|
217
|
+
Doc Writer <doc@example.com>
|
218
|
+
|
219
|
+
== First Section
|
220
|
+
|
221
|
+
msc::msc.txt["foobar"]
|
222
|
+
msc::msc.txt["foobaz"]
|
223
|
+
eos
|
224
|
+
|
225
|
+
load_asciidoc doc
|
226
|
+
expect(File.exist?('foobar.png')).to be true
|
227
|
+
expect(File.exist?('foobaz.png')).to be true
|
228
|
+
expect(File.exist?('msc.png')).to be false
|
229
|
+
end
|
230
|
+
end
|
data/spec/plantuml_spec.rb
CHANGED
@@ -73,7 +73,7 @@ plantuml::plantuml.txt[format="png"]
|
|
73
73
|
expect(b.attributes['height']).to_not be_nil
|
74
74
|
end
|
75
75
|
|
76
|
-
it 'should support substitutions' do
|
76
|
+
it 'should support substitutions in diagram code' do
|
77
77
|
code = <<-eos
|
78
78
|
class {parent-class}
|
79
79
|
class {child-class}
|
@@ -102,7 +102,7 @@ plantuml::plantuml.txt[format="svg", subs=attributes+]
|
|
102
102
|
target = b.attributes['target']
|
103
103
|
expect(File.exist?(target)).to be true
|
104
104
|
|
105
|
-
content = File.read(target)
|
105
|
+
content = File.read(target, :encoding => Encoding::UTF_8)
|
106
106
|
expect(content).to include('ParentClass')
|
107
107
|
expect(content).to include('ChildClass')
|
108
108
|
end
|
@@ -137,11 +137,45 @@ plantuml::{file}.txt[format="svg", subs=attributes+]
|
|
137
137
|
target = b.attributes['target']
|
138
138
|
expect(File.exist?(target)).to be true
|
139
139
|
|
140
|
-
content = File.read(target)
|
140
|
+
content = File.read(target, :encoding => Encoding::UTF_8)
|
141
141
|
expect(content).to include('ParentClass')
|
142
142
|
expect(content).to include('ChildClass')
|
143
143
|
end
|
144
144
|
|
145
|
+
it 'should support substitutions in the format attribute' do
|
146
|
+
code = <<-eos
|
147
|
+
class Parent
|
148
|
+
class Child
|
149
|
+
Parent <|-- Child
|
150
|
+
eos
|
151
|
+
|
152
|
+
File.write('plantuml.txt', code)
|
153
|
+
|
154
|
+
doc = <<-eos
|
155
|
+
= Hello, PlantUML!
|
156
|
+
Doc Writer <doc@example.com>
|
157
|
+
:file: plantuml
|
158
|
+
:plantumlformat: png
|
159
|
+
|
160
|
+
== First Section
|
161
|
+
|
162
|
+
plantuml::{file}.txt[format="{plantumlformat}", subs=attributes+]
|
163
|
+
eos
|
164
|
+
|
165
|
+
d = load_asciidoc doc, :attributes => {'backend' => 'html5'}
|
166
|
+
expect(d).to_not be_nil
|
167
|
+
|
168
|
+
b = d.find { |bl| bl.context == :image }
|
169
|
+
expect(b).to_not be_nil
|
170
|
+
|
171
|
+
target = b.attributes['target']
|
172
|
+
expect(target).to match(/\.png$/)
|
173
|
+
expect(File.exist?(target)).to be true
|
174
|
+
|
175
|
+
expect(b.attributes['width']).to_not be_nil
|
176
|
+
expect(b.attributes['height']).to_not be_nil
|
177
|
+
end
|
178
|
+
|
145
179
|
it 'should resolve !include directives with relative paths' do
|
146
180
|
included = <<-eos
|
147
181
|
interface List
|
@@ -166,12 +200,50 @@ Doc Writer <doc@example.com>
|
|
166
200
|
|
167
201
|
== First Section
|
168
202
|
|
169
|
-
plantuml::dir/plantuml.txt[format="
|
203
|
+
plantuml::dir/plantuml.txt[format="svg", subs=attributes+]
|
170
204
|
eos
|
171
205
|
|
172
|
-
load_asciidoc doc, :attributes => {'backend' => 'html5'}
|
206
|
+
d = load_asciidoc doc, :attributes => {'backend' => 'html5'}
|
207
|
+
|
208
|
+
expect(d).to_not be_nil
|
209
|
+
|
210
|
+
b = d.find { |bl| bl.context == :image }
|
211
|
+
expect(b).to_not be_nil
|
212
|
+
|
213
|
+
target = b.attributes['target']
|
214
|
+
expect(File.exist?(target)).to be true
|
173
215
|
|
174
|
-
|
216
|
+
content = File.read(target, :encoding => Encoding::UTF_8)
|
217
|
+
expect(content).to_not include('!include')
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'should generate blocks with figure captions' do
|
221
|
+
code = <<-eos
|
222
|
+
User -> (Start)
|
223
|
+
User --> (Use the application) : Label
|
224
|
+
|
225
|
+
:Main Admin: ---> (Use the application) : Another label
|
226
|
+
eos
|
227
|
+
|
228
|
+
File.write('plantuml.txt', code)
|
229
|
+
|
230
|
+
doc = <<-eos
|
231
|
+
= Hello, PlantUML!
|
232
|
+
Doc Writer <doc@example.com>
|
233
|
+
|
234
|
+
== First Section
|
235
|
+
|
236
|
+
.This is a UML diagram
|
237
|
+
plantuml::plantuml.txt[format="png"]
|
238
|
+
eos
|
239
|
+
|
240
|
+
d = load_asciidoc doc
|
241
|
+
expect(d).to_not be_nil
|
242
|
+
|
243
|
+
b = d.find { |bl| bl.context == :image }
|
244
|
+
expect(b).to_not be_nil
|
245
|
+
|
246
|
+
expect(b.caption).to match /Figure \d+/
|
175
247
|
end
|
176
248
|
end
|
177
249
|
|
@@ -288,11 +360,12 @@ Doc Writer <doc@example.com>
|
|
288
360
|
doc = <<-eos
|
289
361
|
= Hello, PlantUML!
|
290
362
|
Doc Writer <doc@example.com>
|
291
|
-
:
|
363
|
+
:plantuml-config: test.config
|
364
|
+
:plantuml-format: svg
|
292
365
|
|
293
366
|
== First Section
|
294
367
|
|
295
|
-
[plantuml
|
368
|
+
[plantuml]
|
296
369
|
----
|
297
370
|
actor Foo1
|
298
371
|
boundary Foo2
|
@@ -315,7 +388,7 @@ ArrowColor #DEADBE
|
|
315
388
|
expect(target).to_not be_nil
|
316
389
|
expect(File.exist?(target)).to be true
|
317
390
|
|
318
|
-
svg = File.read(target)
|
391
|
+
svg = File.read(target, :encoding => Encoding::UTF_8)
|
319
392
|
expect(svg).to match(/<path.*fill="#DEADBE"/)
|
320
393
|
end
|
321
394
|
|
@@ -510,6 +583,29 @@ User -> (Start)
|
|
510
583
|
expect(b.attributes['height']).to be_nil
|
511
584
|
end
|
512
585
|
|
586
|
+
it 'should generate blocks with figure captions' do
|
587
|
+
doc = <<-eos
|
588
|
+
= Hello, PlantUML!
|
589
|
+
Doc Writer <doc@example.com>
|
590
|
+
|
591
|
+
== First Section
|
592
|
+
|
593
|
+
.Caption for my UML diagram
|
594
|
+
[plantuml, format="png"]
|
595
|
+
----
|
596
|
+
User -> (Start)
|
597
|
+
----
|
598
|
+
eos
|
599
|
+
|
600
|
+
d = load_asciidoc doc
|
601
|
+
expect(d).to_not be_nil
|
602
|
+
|
603
|
+
b = d.find { |bl| bl.context == :image }
|
604
|
+
expect(b).to_not be_nil
|
605
|
+
|
606
|
+
expect(b.caption).to match /Figure \d+/
|
607
|
+
end
|
608
|
+
|
513
609
|
it 'should support salt diagrams using salt block type' do
|
514
610
|
doc = <<-eos
|
515
611
|
= Hello, PlantUML!
|
@@ -683,7 +779,7 @@ List : void clear()
|
|
683
779
|
eos
|
684
780
|
|
685
781
|
Dir.mkdir('dir')
|
686
|
-
File.write('dir/
|
782
|
+
File.write('dir/List.iuml', included)
|
687
783
|
|
688
784
|
creole_doc = <<-eos
|
689
785
|
= Hello, PlantUML!
|
@@ -691,16 +787,25 @@ Doc Writer <doc@example.com>
|
|
691
787
|
|
692
788
|
== First Section
|
693
789
|
|
694
|
-
[plantuml, format="
|
790
|
+
[plantuml, format="svg"]
|
695
791
|
----
|
696
792
|
!include dir/List.iuml
|
697
793
|
List <|.. ArrayList
|
698
794
|
----
|
699
795
|
eos
|
700
796
|
|
701
|
-
load_asciidoc creole_doc, :attributes => {'backend' => 'html5'}
|
797
|
+
d = load_asciidoc creole_doc, :attributes => {'backend' => 'html5'}
|
798
|
+
|
799
|
+
expect(d).to_not be_nil
|
800
|
+
|
801
|
+
b = d.find { |bl| bl.context == :image }
|
802
|
+
expect(b).to_not be_nil
|
803
|
+
|
804
|
+
target = b.attributes['target']
|
805
|
+
expect(File.exist?(target)).to be true
|
702
806
|
|
703
|
-
|
807
|
+
content = File.read(target, :encoding => Encoding::UTF_8)
|
808
|
+
expect(content).to_not include('!include')
|
704
809
|
end
|
705
810
|
|
706
811
|
it 'should support substitutions' do
|
@@ -726,7 +831,7 @@ class {child-class}
|
|
726
831
|
target = b.attributes['target']
|
727
832
|
expect(File.exist?(target)).to be true
|
728
833
|
|
729
|
-
content = File.read(target)
|
834
|
+
content = File.read(target, :encoding => Encoding::UTF_8)
|
730
835
|
expect(content).to include('ParentClass')
|
731
836
|
expect(content).to include('ChildClass')
|
732
837
|
end
|