asciidoctor-diagram 1.2.0.preview.5 → 1.2.0

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.
@@ -4,34 +4,30 @@ module Asciidoctor
4
4
  module Diagram
5
5
  module SVG
6
6
  def self.get_image_size(data)
7
- get_from_style(data) || get_from_viewport(data)
8
- end
9
-
10
- private
11
-
12
- SVG_STYLE_REGEX = /style\s*=\s*"width:(?<width>\d+)px;height:(?<height>\d+)px/
7
+ if m = START_TAG_REGEX.match(data)
8
+ start_tag = m[0]
9
+ if (w = WIDTH_REGEX.match(start_tag)) && (h = HEIGHT_REGEX.match(start_tag))
10
+ width = w[:value].to_i * to_px_factor(w[:unit])
11
+ height = h[:value].to_i * to_px_factor(h[:unit])
12
+ return [width.to_i, height.to_i]
13
+ end
13
14
 
14
- def self.get_from_style(data)
15
- match_data = SVG_STYLE_REGEX.match(data)
16
- if match_data
17
- [match_data[:width].to_i, match_data[:height].to_i]
18
- else
19
- nil
15
+ if v = VIEWBOX_REGEX.match(start_tag)
16
+ width = v[:width]
17
+ height = v[:height]
18
+ return [width.to_i, height.to_i]
19
+ end
20
20
  end
21
+
22
+ nil
21
23
  end
22
24
 
23
- SVG_VIEWPORT_REGEX = /<svg width="(?<width>\d+)(?<width_unit>[a-zA-Z]+)" height="(?<height>\d+)(?<height_unit>[a-zA-Z]+)"/
25
+ private
24
26
 
25
- def self.get_from_viewport(data)
26
- match_data = SVG_VIEWPORT_REGEX.match(data)
27
- if match_data
28
- width = match_data[:width].to_i * to_px_factor(match_data[:width_unit])
29
- height = match_data[:height].to_i * to_px_factor(match_data[:height_unit])
30
- [width.to_i, height.to_i]
31
- else
32
- nil
33
- end
34
- end
27
+ START_TAG_REGEX = /<svg[^>]*>/
28
+ WIDTH_REGEX = /width="(?<value>\d+)(?<unit>[a-zA-Z]+)"/
29
+ HEIGHT_REGEX = /height="(?<value>\d+)(?<unit>[a-zA-Z]+)"/
30
+ VIEWBOX_REGEX = /viewBox="\d+ \d+ (?<width>\d+) (?<height>\d+)"/
35
31
 
36
32
  def self.to_px_factor(unit)
37
33
  case unit
@@ -0,0 +1,14 @@
1
+ module Asciidoctor
2
+ module Diagram
3
+ def self.which(cmd)
4
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
5
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
6
+ exts.each { |ext|
7
+ exe = File.join(path, "#{cmd}#{ext}")
8
+ return exe if File.executable? exe
9
+ }
10
+ end
11
+ nil
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module Diagram
3
- VERSION = "1.2.0.preview.5"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
Binary file
@@ -0,0 +1,183 @@
1
+ require_relative 'test_helper'
2
+
3
+ code = <<-eos
4
+ blockdiag {
5
+ A -> B -> C -> D;
6
+ A -> E -> F -> G;
7
+ }
8
+ eos
9
+
10
+ describe Asciidoctor::Diagram::BlockDiagBlockMacro do
11
+ it "should generate PNG images when format is set to 'png'" do
12
+ File.write('blockdiag.txt', code)
13
+
14
+ doc = <<-eos
15
+ = Hello, BlockDiag!
16
+ Doc Writer <doc@example.com>
17
+
18
+ == First Section
19
+
20
+ blockdiag::blockdiag.txt[format="png"]
21
+ eos
22
+
23
+ d = Asciidoctor.load StringIO.new(doc)
24
+ expect(d).to_not be_nil
25
+
26
+ b = d.find { |b| b.context == :image }
27
+ expect(b).to_not be_nil
28
+
29
+ expect(b.content_model).to eq :empty
30
+
31
+ target = b.attributes['target']
32
+ expect(target).to_not be_nil
33
+ expect(target).to match /\.png$/
34
+ expect(File.exists?(target)).to be true
35
+
36
+ expect(b.attributes['width']).to_not be_nil
37
+ expect(b.attributes['height']).to_not be_nil
38
+ end
39
+ end
40
+
41
+ describe Asciidoctor::Diagram::BlockDiagBlock do
42
+ it "should generate PNG images when format is set to 'png'" do
43
+ doc = <<-eos
44
+ = Hello, BlockDiag!
45
+ Doc Writer <doc@example.com>
46
+
47
+ == First Section
48
+
49
+ [blockdiag, format="png"]
50
+ ----
51
+ #{code}
52
+ ----
53
+ eos
54
+
55
+ d = Asciidoctor.load StringIO.new(doc)
56
+ expect(d).to_not be_nil
57
+
58
+ b = d.find { |b| b.context == :image }
59
+ expect(b).to_not be_nil
60
+
61
+ expect(b.content_model).to eq :empty
62
+
63
+ target = b.attributes['target']
64
+ expect(target).to_not be_nil
65
+ expect(target).to match /\.png$/
66
+ expect(File.exists?(target)).to be true
67
+
68
+ expect(b.attributes['width']).to_not be_nil
69
+ expect(b.attributes['height']).to_not be_nil
70
+ end
71
+
72
+ it "should generate SVG images when format is set to 'svg'" do
73
+ doc = <<-eos
74
+ = Hello, BlockDiag!
75
+ Doc Writer <doc@example.com>
76
+
77
+ == First Section
78
+
79
+ [blockdiag, format="svg"]
80
+ ----
81
+ #{code}
82
+ ----
83
+ eos
84
+
85
+ d = Asciidoctor.load StringIO.new(doc)
86
+ expect(d).to_not be_nil
87
+
88
+ b = d.find { |b| b.context == :image }
89
+ expect(b).to_not be_nil
90
+
91
+ expect(b.content_model).to eq :empty
92
+
93
+ target = b.attributes['target']
94
+ expect(target).to_not be_nil
95
+ expect(target).to match /\.svg/
96
+ expect(File.exists?(target)).to be true
97
+
98
+ expect(b.attributes['width']).to_not be_nil
99
+ expect(b.attributes['height']).to_not be_nil
100
+ end
101
+
102
+ it "should raise an error when when format is set to an invalid value" do
103
+ doc = <<-eos
104
+ = Hello, BlockDiag!
105
+ Doc Writer <doc@example.com>
106
+
107
+ == First Section
108
+
109
+ [blockdiag, format="foobar"]
110
+ ----
111
+ ----
112
+ eos
113
+
114
+ expect { Asciidoctor.load StringIO.new(doc) }.to raise_error /support.*format/i
115
+ end
116
+
117
+ it "should not regenerate images when source has not changed" do
118
+ File.write('blockdiag.txt', code)
119
+
120
+ doc = <<-eos
121
+ = Hello, BlockDiag!
122
+ Doc Writer <doc@example.com>
123
+
124
+ == First Section
125
+
126
+ blockdiag::blockdiag.txt
127
+
128
+ [blockdiag, format="png"]
129
+ ----
130
+ #{code}
131
+ ----
132
+ eos
133
+
134
+ d = Asciidoctor.load StringIO.new(doc)
135
+ b = d.find { |b| b.context == :image }
136
+ target = b.attributes['target']
137
+ mtime1 = File.mtime(target)
138
+
139
+ sleep 1
140
+
141
+ d = Asciidoctor.load StringIO.new(doc)
142
+
143
+ mtime2 = File.mtime(target)
144
+
145
+ expect(mtime2).to eq mtime1
146
+ end
147
+
148
+ it "should handle two block macros with the same source" do
149
+ File.write('blockdiag.txt', code)
150
+
151
+ doc = <<-eos
152
+ = Hello, BlockDiag!
153
+ Doc Writer <doc@example.com>
154
+
155
+ == First Section
156
+
157
+ blockdiag::blockdiag.txt[]
158
+ blockdiag::blockdiag.txt[]
159
+ eos
160
+
161
+ Asciidoctor.load StringIO.new(doc)
162
+ expect(File.exists?('blockdiag.png')).to be true
163
+ end
164
+
165
+ it "should respect target attribute in block macros" do
166
+ File.write('blockdiag.txt', code)
167
+
168
+ doc = <<-eos
169
+ = Hello, BlockDiag!
170
+ Doc Writer <doc@example.com>
171
+
172
+ == First Section
173
+
174
+ blockdiag::blockdiag.txt["foobar"]
175
+ blockdiag::blockdiag.txt["foobaz"]
176
+ eos
177
+
178
+ Asciidoctor.load StringIO.new(doc)
179
+ expect(File.exists?('foobar.png')).to be true
180
+ expect(File.exists?('foobaz.png')).to be true
181
+ expect(File.exists?('blockdiag.png')).to be false
182
+ end
183
+ end
@@ -36,7 +36,7 @@ ditaa::ditaa.txt[format="png"]
36
36
  target = b.attributes['target']
37
37
  expect(target).to_not be_nil
38
38
  expect(target).to match /\.png$/
39
- expect(File.exists?(target)).to be_true
39
+ expect(File.exists?(target)).to be true
40
40
 
41
41
  expect(b.attributes['width']).to_not be_nil
42
42
  expect(b.attributes['height']).to_not be_nil
@@ -76,7 +76,7 @@ Doc Writer <doc@example.com>
76
76
  target = b.attributes['target']
77
77
  expect(target).to_not be_nil
78
78
  expect(target).to match /\.png$/
79
- expect(File.exists?(target)).to be_true
79
+ expect(File.exists?(target)).to be true
80
80
 
81
81
  expect(b.attributes['width']).to_not be_nil
82
82
  expect(b.attributes['height']).to_not be_nil
@@ -116,6 +116,6 @@ Doc Writer <doc@example.com>
116
116
  expect(b).to_not be_nil
117
117
  target = b.attributes['target']
118
118
  expect(target).to match /\.png$/
119
- expect(File.exists?(target)).to be_true
119
+ expect(File.exists?(target)).to be true
120
120
  end
121
121
  end
@@ -35,7 +35,7 @@ graphviz::graphviz.txt[format="png"]
35
35
  target = b.attributes['target']
36
36
  expect(target).to_not be_nil
37
37
  expect(target).to match /\.png$/
38
- expect(File.exists?(target)).to be_true
38
+ expect(File.exists?(target)).to be true
39
39
 
40
40
  expect(b.attributes['width']).to_not be_nil
41
41
  expect(b.attributes['height']).to_not be_nil
@@ -74,7 +74,7 @@ digraph foo {
74
74
  target = b.attributes['target']
75
75
  expect(target).to_not be_nil
76
76
  expect(target).to match /\.png$/
77
- expect(File.exists?(target)).to be_true
77
+ expect(File.exists?(target)).to be true
78
78
 
79
79
  expect(b.attributes['width']).to_not be_nil
80
80
  expect(b.attributes['height']).to_not be_nil
@@ -111,7 +111,7 @@ digraph foo {
111
111
  target = b.attributes['target']
112
112
  expect(target).to_not be_nil
113
113
  expect(target).to match /\.svg$/
114
- expect(File.exists?(target)).to be_true
114
+ expect(File.exists?(target)).to be true
115
115
 
116
116
  expect(b.attributes['width']).to_not be_nil
117
117
  expect(b.attributes['height']).to_not be_nil
@@ -131,4 +131,29 @@ Doc Writer <doc@example.com>
131
131
 
132
132
  expect { Asciidoctor.load StringIO.new(doc) }.to raise_error /support.*format/i
133
133
  end
134
+
135
+ it "should support single line digraphs" do
136
+ doc = <<-eos
137
+ = Hello, graphviz!
138
+ Doc Writer <doc@example.com>
139
+
140
+ == First Section
141
+
142
+ [graphviz]
143
+ ----
144
+ digraph g { rankdir=LR; Text->Graphviz->Image }
145
+ ----
146
+ eos
147
+
148
+ d = Asciidoctor.load StringIO.new(doc)
149
+ expect(d).to_not be_nil
150
+
151
+ b = d.find { |b| b.context == :image }
152
+ expect(b).to_not be_nil
153
+
154
+ expect(b.content_model).to eq :empty
155
+
156
+ target = b.attributes['target']
157
+ expect(File.exists?(target)).to be true
158
+ end
134
159
  end
@@ -31,7 +31,7 @@ plantuml::plantuml.txt[format="png"]
31
31
  target = b.attributes['target']
32
32
  expect(target).to_not be_nil
33
33
  expect(target).to match /\.png$/
34
- expect(File.exists?(target)).to be_true
34
+ expect(File.exists?(target)).to be true
35
35
 
36
36
  expect(b.attributes['width']).to_not be_nil
37
37
  expect(b.attributes['height']).to_not be_nil
@@ -66,7 +66,7 @@ User --> (Use the application) : Label
66
66
  target = b.attributes['target']
67
67
  expect(target).to_not be_nil
68
68
  expect(target).to match /\.png$/
69
- expect(File.exists?(target)).to be_true
69
+ expect(File.exists?(target)).to be true
70
70
 
71
71
  expect(b.attributes['width']).to_not be_nil
72
72
  expect(b.attributes['height']).to_not be_nil
@@ -99,7 +99,7 @@ User --> (Use the application) : Label
99
99
  target = b.attributes['target']
100
100
  expect(target).to_not be_nil
101
101
  expect(target).to match /\.svg/
102
- expect(File.exists?(target)).to be_true
102
+ expect(File.exists?(target)).to be true
103
103
 
104
104
  expect(b.attributes['width']).to_not be_nil
105
105
  expect(b.attributes['height']).to_not be_nil
@@ -176,7 +176,7 @@ ArrowColor #DEADBE
176
176
 
177
177
  target = b.attributes['target']
178
178
  expect(target).to_not be_nil
179
- expect(File.exists?(target)).to be_true
179
+ expect(File.exists?(target)).to be true
180
180
 
181
181
  svg = File.read(target)
182
182
  expect(svg).to match /<path.*fill="#DEADBE"/
@@ -243,7 +243,7 @@ plantuml::plantuml.txt[]
243
243
  eos
244
244
 
245
245
  Asciidoctor.load StringIO.new(doc)
246
- expect(File.exists?('plantuml.png')).to be_true
246
+ expect(File.exists?('plantuml.png')).to be true
247
247
  end
248
248
 
249
249
  it "should respect target attribute in block macros" do
@@ -267,9 +267,9 @@ plantuml::plantuml.txt["foobaz"]
267
267
  eos
268
268
 
269
269
  Asciidoctor.load StringIO.new(doc)
270
- expect(File.exists?('foobar.png')).to be_true
271
- expect(File.exists?('foobaz.png')).to be_true
272
- expect(File.exists?('plantuml.png')).to be_false
270
+ expect(File.exists?('foobar.png')).to be true
271
+ expect(File.exists?('foobaz.png')).to be true
272
+ expect(File.exists?('plantuml.png')).to be false
273
273
  end
274
274
 
275
275
 
@@ -293,8 +293,8 @@ Foo1 -> Foo2 : To boundary
293
293
 
294
294
  target = b.attributes['target']
295
295
  expect(target).to_not be_nil
296
- expect(File.exists?(target)).to be_false
297
- expect(File.exists?(File.expand_path(target, 'foo'))).to be_true
296
+ expect(File.exists?(target)).to be false
297
+ expect(File.exists?(File.expand_path(target, 'foo'))).to be true
298
298
  end
299
299
 
300
300
  it "should omit width/height attributes when generating docbook" do
@@ -317,7 +317,7 @@ User -> (Start)
317
317
  expect(b).to_not be_nil
318
318
 
319
319
  target = b.attributes['target']
320
- expect(File.exists?(target)).to be_true
320
+ expect(File.exists?(target)).to be true
321
321
 
322
322
  expect(b.attributes['width']).to be_nil
323
323
  expect(b.attributes['height']).to be_nil
@@ -0,0 +1,227 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe Asciidoctor::Diagram::ShaapeBlockMacro do
4
+ it "should generate PNG images when format is set to 'png'" do
5
+ code = <<-eos
6
+ +--------+ +-------------+
7
+ | | \\ /
8
+ | Hello |---> \\ Goodbye /
9
+ | ;) | / \\
10
+ | | / \\
11
+ +--------+ +-------------+
12
+ eos
13
+
14
+ File.write('shaape.txt', code)
15
+
16
+ doc = <<-eos
17
+ = Hello, Shaape!
18
+ Doc Writer <doc@example.com>
19
+
20
+ == First Section
21
+
22
+ shaape::shaape.txt[format="png"]
23
+ eos
24
+
25
+ d = Asciidoctor.load StringIO.new(doc)
26
+ expect(d).to_not be_nil
27
+
28
+ b = d.find { |b| b.context == :image }
29
+ expect(b).to_not be_nil
30
+
31
+ expect(b.content_model).to eq :empty
32
+
33
+ target = b.attributes['target']
34
+ expect(target).to_not be_nil
35
+ expect(target).to match /\.png$/
36
+ expect(File.exists?(target)).to be true
37
+
38
+ expect(b.attributes['width']).to_not be_nil
39
+ expect(b.attributes['height']).to_not be_nil
40
+ end
41
+ end
42
+
43
+ describe Asciidoctor::Diagram::ShaapeBlock do
44
+ it "should generate PNG images when format is set to 'png'" do
45
+ doc = <<-eos
46
+ = Hello, Shaape!
47
+ Doc Writer <doc@example.com>
48
+
49
+ == First Section
50
+
51
+ [shaape, format="png"]
52
+ ----
53
+ +--------+ +-------------+
54
+ | | \\ /
55
+ | Hello |---> \\ Goodbye /
56
+ | ;) | / \\
57
+ | | / \\
58
+ +--------+ +-------------+
59
+ ----
60
+ eos
61
+
62
+ d = Asciidoctor.load StringIO.new(doc)
63
+ expect(d).to_not be_nil
64
+
65
+ b = d.find { |b| b.context == :image }
66
+ expect(b).to_not be_nil
67
+
68
+ expect(b.content_model).to eq :empty
69
+
70
+ target = b.attributes['target']
71
+ expect(target).to_not be_nil
72
+ expect(target).to match /\.png$/
73
+ expect(File.exists?(target)).to be true
74
+
75
+ expect(b.attributes['width']).to_not be_nil
76
+ expect(b.attributes['height']).to_not be_nil
77
+ end
78
+
79
+ it "should generate SVG images when format is set to 'svg'" do
80
+ doc = <<-eos
81
+ = Hello, Shaape!
82
+ Doc Writer <doc@example.com>
83
+
84
+ == First Section
85
+
86
+ [shaape, format="svg"]
87
+ ----
88
+ +--------+ +-------------+
89
+ | | \\ /
90
+ | Hello |---> \\ Goodbye /
91
+ | ;) | / \\
92
+ | | / \\
93
+ +--------+ +-------------+
94
+ ----
95
+ eos
96
+
97
+ d = Asciidoctor.load StringIO.new(doc)
98
+ expect(d).to_not be_nil
99
+
100
+ b = d.find { |b| b.context == :image }
101
+ expect(b).to_not be_nil
102
+
103
+ expect(b.content_model).to eq :empty
104
+
105
+ target = b.attributes['target']
106
+ expect(target).to_not be_nil
107
+ expect(target).to match /\.svg/
108
+ expect(File.exists?(target)).to be true
109
+
110
+ expect(b.attributes['width']).to_not be_nil
111
+ expect(b.attributes['height']).to_not be_nil
112
+ end
113
+
114
+ it "should raise an error when when format is set to an invalid value" do
115
+ doc = <<-eos
116
+ = Hello, Shaape!
117
+ Doc Writer <doc@example.com>
118
+
119
+ == First Section
120
+
121
+ [shaape, format="foobar"]
122
+ ----
123
+ ----
124
+ eos
125
+
126
+ expect { Asciidoctor.load StringIO.new(doc) }.to raise_error /support.*format/i
127
+ end
128
+
129
+ it "should not regenerate images when source has not changed" do
130
+ code = <<-eos
131
+ +--------+ +-------------+
132
+ | | \\ /
133
+ | Hello |---> \\ Goodbye /
134
+ | ;) | / \\
135
+ | | / \\
136
+ +--------+ +-------------+
137
+ eos
138
+
139
+ File.write('shaape.txt', code)
140
+
141
+ doc = <<-eos
142
+ = Hello, Shaape!
143
+ Doc Writer <doc@example.com>
144
+
145
+ == First Section
146
+
147
+ shaape::shaape.txt
148
+
149
+ [shaape, format="png"]
150
+ ----
151
+ +--------+
152
+ | |
153
+ | Hello |
154
+ | ;) |
155
+ | |
156
+ +--------+
157
+ ----
158
+ eos
159
+
160
+ d = Asciidoctor.load StringIO.new(doc)
161
+ b = d.find { |b| b.context == :image }
162
+ target = b.attributes['target']
163
+ mtime1 = File.mtime(target)
164
+
165
+ sleep 1
166
+
167
+ d = Asciidoctor.load StringIO.new(doc)
168
+
169
+ mtime2 = File.mtime(target)
170
+
171
+ expect(mtime2).to eq mtime1
172
+ end
173
+
174
+ it "should handle two block macros with the same source" do
175
+ code = <<-eos
176
+ +--------+ +-------------+
177
+ | | \\ /
178
+ | Hello |---> \\ Goodbye /
179
+ | ;) | / \\
180
+ | | / \\
181
+ +--------+ +-------------+
182
+ eos
183
+
184
+ File.write('shaape.txt', code)
185
+
186
+ doc = <<-eos
187
+ = Hello, Shaape!
188
+ Doc Writer <doc@example.com>
189
+
190
+ == First Section
191
+
192
+ shaape::shaape.txt[]
193
+ shaape::shaape.txt[]
194
+ eos
195
+
196
+ Asciidoctor.load StringIO.new(doc)
197
+ expect(File.exists?('shaape.png')).to be true
198
+ end
199
+
200
+ it "should respect target attribute in block macros" do
201
+ code = <<-eos
202
+ +--------+ +-------------+
203
+ | | \\ /
204
+ | Hello |---> \\ Goodbye /
205
+ | ;) | / \\
206
+ | | / \\
207
+ +--------+ +-------------+
208
+ eos
209
+
210
+ File.write('shaape.txt', code)
211
+
212
+ doc = <<-eos
213
+ = Hello, Shaape!
214
+ Doc Writer <doc@example.com>
215
+
216
+ == First Section
217
+
218
+ shaape::shaape.txt["foobar"]
219
+ shaape::shaape.txt["foobaz"]
220
+ eos
221
+
222
+ Asciidoctor.load StringIO.new(doc)
223
+ expect(File.exists?('foobar.png')).to be true
224
+ expect(File.exists?('foobaz.png')).to be true
225
+ expect(File.exists?('shaape.png')).to be false
226
+ end
227
+ end