asciidoctor-plantuml 0.0.8 → 0.0.13
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 +5 -5
- data/lib/asciidoctor-plantuml.rb +3 -1
- data/lib/asciidoctor_plantuml/plantuml.rb +295 -0
- data/lib/asciidoctor_plantuml/version.rb +7 -0
- data/test/test_plantuml.rb +332 -157
- metadata +50 -17
- data/lib/asciidoctor-plantuml/plantuml.rb +0 -286
- data/lib/asciidoctor-plantuml/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: de8d640d579d7d3c4171db4f02210fbe508868d8c70de10d4ce1a622bc8b14b1
|
4
|
+
data.tar.gz: a86d4afa322bf30c3f074c7c53e38dab0dcabf52df340ba685bae463143aa41f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e81d9655d877bc2d53492d954f08e7176e5c8da48eb0ac82d693368092684781fb173ae8b36baacab5f71f974d12596036c9dd6fccd3c3752a7ebcfcafe1384
|
7
|
+
data.tar.gz: 69eba0374e2621ca0abbb100154fd8f4627e09bbd5192d09feea79315f16a7486309deb60c76042b174068b61de29ae6294d1ac001582391b8d03907dfea4422
|
data/lib/asciidoctor-plantuml.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'asciidoctor'
|
2
4
|
require 'asciidoctor/extensions'
|
3
|
-
require_relative '
|
5
|
+
require_relative 'asciidoctor_plantuml/plantuml'
|
4
6
|
|
5
7
|
Asciidoctor::Extensions.register do
|
6
8
|
block Asciidoctor::PlantUml::BlockProcessor, :plantuml
|
@@ -0,0 +1,295 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
require 'open-uri'
|
5
|
+
require 'zlib'
|
6
|
+
require 'open-uri'
|
7
|
+
require 'net/http'
|
8
|
+
|
9
|
+
module Asciidoctor
|
10
|
+
# PlantUML Module
|
11
|
+
module PlantUml
|
12
|
+
# PlantUML Configuration
|
13
|
+
class Configuration
|
14
|
+
DEFAULT_URL = ENV['PLANTUML_URL'] || ''
|
15
|
+
DEFAULT_ENCODING = ENV['PLANTUML_ENCODING'] || 'legacy'
|
16
|
+
|
17
|
+
attr_accessor :url, :txt_enable, :svg_enable, :png_enable, :encoding
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@url = DEFAULT_URL
|
21
|
+
@txt_enable = true
|
22
|
+
@svg_enable = true
|
23
|
+
@png_enable = true
|
24
|
+
@encoding = DEFAULT_ENCODING
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
attr_writer :configuration
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.configuration
|
33
|
+
@configuration ||= Configuration.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.configure
|
37
|
+
yield(configuration)
|
38
|
+
end
|
39
|
+
|
40
|
+
# PlantUML Processor
|
41
|
+
class Processor
|
42
|
+
FORMATS = %w[png svg txt].freeze
|
43
|
+
DEFAULT_FORMAT = FORMATS[0]
|
44
|
+
|
45
|
+
ENCODINGS = %w[legacy deflate].freeze
|
46
|
+
DEFAULT_ENCODING = ENCODINGS[0]
|
47
|
+
|
48
|
+
ENCODINGS_MAGIC_STRINGS_MAP = Hash.new('')
|
49
|
+
ENCODINGS_MAGIC_STRINGS_MAP['deflate'] = '~1'
|
50
|
+
|
51
|
+
URI_SCHEMES_REGEXP = ::URI::DEFAULT_PARSER.make_regexp(%w[http https])
|
52
|
+
|
53
|
+
class << self
|
54
|
+
def valid_format?(format)
|
55
|
+
FORMATS.include?(format)
|
56
|
+
end
|
57
|
+
|
58
|
+
def valid_encoding?(encoding)
|
59
|
+
ENCODINGS.include?(encoding)
|
60
|
+
end
|
61
|
+
|
62
|
+
def server_url
|
63
|
+
PlantUml.configuration.url
|
64
|
+
end
|
65
|
+
|
66
|
+
def txt_enabled?
|
67
|
+
PlantUml.configuration.txt_enable
|
68
|
+
end
|
69
|
+
|
70
|
+
def png_enabled?
|
71
|
+
PlantUml.configuration.png_enable
|
72
|
+
end
|
73
|
+
|
74
|
+
def svg_enabled?
|
75
|
+
PlantUml.configuration.svg_enable
|
76
|
+
end
|
77
|
+
|
78
|
+
def enabled?
|
79
|
+
txt_enabled? || png_enabled? || svg_enabled?
|
80
|
+
end
|
81
|
+
|
82
|
+
def plantuml_content_format(code, format, attrs = {})
|
83
|
+
if %w[png svg txt].include?(format) &&
|
84
|
+
method("#{format}_enabled?").call
|
85
|
+
method("plantuml_#{format}_content").call(code, format, attrs)
|
86
|
+
else
|
87
|
+
plantuml_invalid_content(format, attrs)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def plantuml_content(code, attrs = {})
|
92
|
+
format = attrs['format'] || DEFAULT_FORMAT
|
93
|
+
|
94
|
+
return plantuml_disabled_content(code, attrs) unless enabled?
|
95
|
+
|
96
|
+
unless valid_uri?(server_url)
|
97
|
+
return plantuml_server_unavailable_content(server_url, attrs)
|
98
|
+
end
|
99
|
+
|
100
|
+
plantuml_content_format(code, format, attrs)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Compression code used to generate PlantUML URLs. Taken directly from
|
104
|
+
# the transcoder class in the PlantUML java code.
|
105
|
+
def gen_url(text, format)
|
106
|
+
result = ''
|
107
|
+
result += encoding_magic_prefix
|
108
|
+
compressed_data = Zlib::Deflate.deflate(text)
|
109
|
+
compressed_data.chars.each_slice(3) do |bytes|
|
110
|
+
# print bytes[0], ' ' , bytes[1] , ' ' , bytes[2]
|
111
|
+
b1 = bytes[0].nil? ? 0 : (bytes[0].ord & 0xFF)
|
112
|
+
b2 = bytes[1].nil? ? 0 : (bytes[1].ord & 0xFF)
|
113
|
+
b3 = bytes[2].nil? ? 0 : (bytes[2].ord & 0xFF)
|
114
|
+
result += append3bytes(b1, b2, b3)
|
115
|
+
end
|
116
|
+
join_paths(server_url, "#{format}/", result).to_s
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def plantuml_txt_content(code, format, attrs = {})
|
122
|
+
url = gen_url(code, format)
|
123
|
+
URI(url).open do |f|
|
124
|
+
plantuml_ascii_content(f.read, attrs)
|
125
|
+
end
|
126
|
+
rescue OpenURI::HTTPError, Errno::ECONNREFUSED, SocketError
|
127
|
+
plantuml_png_content(code, format, attrs)
|
128
|
+
end
|
129
|
+
|
130
|
+
def plantuml_ascii_content(code, attrs = {})
|
131
|
+
content = '<div class="listingblock">'
|
132
|
+
content += '<div class="content">'
|
133
|
+
content += '<pre '
|
134
|
+
content += "id=\"#{attrs['id']}\" " if attrs['id']
|
135
|
+
content += 'class="plantuml">\n'
|
136
|
+
content += code
|
137
|
+
content += '</pre>'
|
138
|
+
content += '</div>'
|
139
|
+
content + '</div>'
|
140
|
+
end
|
141
|
+
|
142
|
+
def plantuml_png_content(code, format, attrs = {})
|
143
|
+
content = '<div class="imageblock">'
|
144
|
+
content += '<div class="content">'
|
145
|
+
content += '<img '
|
146
|
+
content += "id=\"#{attrs['id']}\" " if attrs['id']
|
147
|
+
content += 'class="plantuml" '
|
148
|
+
content += "width=\"#{attrs['width']}\" " if attrs['width']
|
149
|
+
content += "height=\"#{attrs['height']}\" " if attrs['height']
|
150
|
+
content += "alt=\"#{attrs['alt']}\" " if attrs['alt']
|
151
|
+
content += "src=\"#{gen_url(code, format)}\" />"
|
152
|
+
content += '</div>'
|
153
|
+
content + '</div>'
|
154
|
+
end
|
155
|
+
|
156
|
+
def plantuml_svg_content(code, format, attrs = {})
|
157
|
+
content = '<div class="imageblock">'
|
158
|
+
content += '<div class="content">'
|
159
|
+
content += '<object type="image/svg+xml" '
|
160
|
+
content += "data=\"#{gen_url(code, format)}\" "
|
161
|
+
content += "id=\"#{attrs['id']}\" " if attrs['id']
|
162
|
+
content += "width=\"#{attrs['width']}\" " if attrs['width']
|
163
|
+
content += "height=\"#{attrs['height']}\" " if attrs['height']
|
164
|
+
content += '>'
|
165
|
+
attrs['id'] = 'fallback_' + attrs['id'] if attrs['id']
|
166
|
+
content += plantuml_png_content(code, format, attrs)
|
167
|
+
content += '</object>'
|
168
|
+
content += '</div>'
|
169
|
+
content + '</div>'
|
170
|
+
end
|
171
|
+
|
172
|
+
def plantuml_invalid_content(format, attrs = {})
|
173
|
+
error = "PlantUML Error: Invalid format \"#{format}\""
|
174
|
+
_plantuml_error_content(error, attrs)
|
175
|
+
end
|
176
|
+
|
177
|
+
def plantuml_server_unavailable_content(url, attrs = {})
|
178
|
+
error = "Error: cannot connect to PlantUML server at \"#{url}\""
|
179
|
+
_plantuml_error_content(error, attrs)
|
180
|
+
end
|
181
|
+
|
182
|
+
def plantuml_disabled_content(code, attrs = {})
|
183
|
+
_plantuml_error_content(code, attrs)
|
184
|
+
end
|
185
|
+
|
186
|
+
def _plantuml_error_content(error, attrs = {})
|
187
|
+
content = '<div class="listingblock">'
|
188
|
+
content += '<div class="content">'
|
189
|
+
content += '<pre '
|
190
|
+
content += "id=\"#{attrs['id']}\" " if attrs['id']
|
191
|
+
content += 'class="plantuml plantuml-error">\n'
|
192
|
+
content += error
|
193
|
+
content += '</pre>'
|
194
|
+
content += '</div>'
|
195
|
+
content + '</div>'
|
196
|
+
end
|
197
|
+
|
198
|
+
def encode6bit(bit)
|
199
|
+
return ('0'.ord + bit).chr if bit < 10
|
200
|
+
|
201
|
+
bit -= 10
|
202
|
+
return ('A'.ord + bit).chr if bit < 26
|
203
|
+
|
204
|
+
bit -= 26
|
205
|
+
return ('a'.ord + bit).chr if bit < 26
|
206
|
+
|
207
|
+
bit -= 26
|
208
|
+
return '-' if bit.zero?
|
209
|
+
|
210
|
+
return '_' if bit == 1
|
211
|
+
|
212
|
+
'?'
|
213
|
+
end
|
214
|
+
|
215
|
+
def append3bytes(bit1, bit2, bit3)
|
216
|
+
c1 = bit1 >> 2
|
217
|
+
c2 = ((bit1 & 0x3) << 4) | (bit2 >> 4)
|
218
|
+
c3 = ((bit2 & 0xF) << 2) | (bit3 >> 6)
|
219
|
+
c4 = bit3 & 0x3F
|
220
|
+
encode6bit(c1 & 0x3F).chr +
|
221
|
+
encode6bit(c2 & 0x3F).chr +
|
222
|
+
encode6bit(c3 & 0x3F).chr +
|
223
|
+
encode6bit(c4 & 0x3F).chr
|
224
|
+
end
|
225
|
+
|
226
|
+
def encoding_magic_prefix
|
227
|
+
ENCODINGS_MAGIC_STRINGS_MAP[PlantUml.configuration.encoding]
|
228
|
+
end
|
229
|
+
|
230
|
+
# Make a call to the PlantUML server with the simplest diagram possible
|
231
|
+
# to check if the server is available or not.
|
232
|
+
def check_server(check_url)
|
233
|
+
response = Net::HTTP.get_response(URI(check_url))
|
234
|
+
response.is_a?(Net::HTTPSuccess)
|
235
|
+
rescue OpenURI::HTTPError, Errno::ECONNREFUSED, SocketError
|
236
|
+
false
|
237
|
+
end
|
238
|
+
|
239
|
+
def valid_uri?(uri)
|
240
|
+
!(uri =~ /\A#{URI_SCHEMES_REGEXP}\z/).nil?
|
241
|
+
end
|
242
|
+
|
243
|
+
def join_paths(*paths, separator: '/')
|
244
|
+
paths = paths.compact.reject(&:empty?)
|
245
|
+
last = paths.length - 1
|
246
|
+
paths.each_with_index.map do |path, index|
|
247
|
+
expand_path(path, index, last, separator)
|
248
|
+
end.join
|
249
|
+
end
|
250
|
+
|
251
|
+
def expand_path(path, current, last, separator)
|
252
|
+
path = path[1..-1] if path.start_with?(separator) && current.zero?
|
253
|
+
|
254
|
+
unless path.end_with?(separator) || current == last
|
255
|
+
path = [path, separator]
|
256
|
+
end
|
257
|
+
|
258
|
+
path
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
# PlantUML BlockProcessor
|
264
|
+
class BlockProcessor < Asciidoctor::Extensions::BlockProcessor
|
265
|
+
use_dsl
|
266
|
+
named :plantuml
|
267
|
+
on_context :listing, :literal
|
268
|
+
content_model :simple
|
269
|
+
|
270
|
+
def process(parent, target, attrs)
|
271
|
+
lines = target.lines
|
272
|
+
|
273
|
+
unless target.lines[0] =~ /@startuml/
|
274
|
+
lines = ['@startuml'] + target.lines
|
275
|
+
end
|
276
|
+
|
277
|
+
lines += ['@enduml'] unless target.lines[-1] =~ /@enduml/
|
278
|
+
|
279
|
+
content = Processor.plantuml_content(lines.join("\n"), attrs)
|
280
|
+
|
281
|
+
create_plantuml_block(parent, content, attrs)
|
282
|
+
end
|
283
|
+
|
284
|
+
private
|
285
|
+
|
286
|
+
def create_plantuml_block(parent, content, attrs)
|
287
|
+
Asciidoctor::Block.new parent, :pass, {
|
288
|
+
content_model: :raw,
|
289
|
+
source: content,
|
290
|
+
subs: :default
|
291
|
+
}.merge(attrs)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
data/test/test_plantuml.rb
CHANGED
@@ -1,133 +1,221 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
[
|
24
|
-
|
25
|
-
|
26
|
-
User -> (Start)
|
27
|
-
User --> (Use the application) : Label
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
=
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
[
|
68
|
-
----
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
[
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
User
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
----
|
98
|
-
|
99
|
-
|
100
|
-
----
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
----
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'asciidoctor'
|
5
|
+
require 'stringio'
|
6
|
+
require 'nokogiri'
|
7
|
+
require 'asciidoctor-plantuml'
|
8
|
+
|
9
|
+
DOC_BASIC = <<~ENDOFSTRING
|
10
|
+
= Hello PlantUML!
|
11
|
+
|
12
|
+
[plantuml, format="png"]
|
13
|
+
.Title Of this
|
14
|
+
----
|
15
|
+
User -> (Start)
|
16
|
+
User --> (Use the application) : Label
|
17
|
+
----
|
18
|
+
ENDOFSTRING
|
19
|
+
|
20
|
+
DOC_BASIC_LITERAL = <<~ENDOFSTRING
|
21
|
+
= Hello PlantUML!
|
22
|
+
|
23
|
+
[plantuml, format="png"]
|
24
|
+
.Title Of this
|
25
|
+
....
|
26
|
+
User -> (Start)
|
27
|
+
User --> (Use the application) : Label
|
28
|
+
....
|
29
|
+
ENDOFSTRING
|
30
|
+
|
31
|
+
DOC_BASIC2 = <<~ENDOFSTRING
|
32
|
+
= Hello PlantUML!
|
33
|
+
|
34
|
+
[plantuml, format="png"]
|
35
|
+
.Title Of this
|
36
|
+
[[fig-xref]]
|
37
|
+
----
|
38
|
+
@startuml
|
39
|
+
User -> (Start)
|
40
|
+
User --> (Use the application) : Label
|
41
|
+
@enduml
|
42
|
+
----
|
43
|
+
ENDOFSTRING
|
44
|
+
|
45
|
+
DOC_BASIC2_LITERAL = <<~ENDOFSTRING
|
46
|
+
= Hello PlantUML!
|
47
|
+
|
48
|
+
[plantuml, format="png"]
|
49
|
+
.Title Of this
|
50
|
+
[[fig-xref]]
|
51
|
+
....
|
52
|
+
@startuml
|
53
|
+
User -> (Start)
|
54
|
+
User --> (Use the application) : Label
|
55
|
+
@enduml
|
56
|
+
....
|
57
|
+
ENDOFSTRING
|
58
|
+
|
59
|
+
DOC_BASIC3 = <<~ENDOFSTRING
|
60
|
+
= Hello Compound PlantUML!
|
61
|
+
|
62
|
+
[plantuml, format="png"]
|
63
|
+
----
|
64
|
+
[COMP1]
|
65
|
+
[COMP2]
|
66
|
+
[COMP1] -> [COMP2]
|
67
|
+
[COMP2] --> [COMP3]
|
68
|
+
----
|
69
|
+
ENDOFSTRING
|
70
|
+
|
71
|
+
DOC_BASIC3_LITERAL = <<~ENDOFSTRING
|
72
|
+
= Hello Compound PlantUML!
|
73
|
+
|
74
|
+
[plantuml, format="png"]
|
75
|
+
....
|
76
|
+
[COMP1]
|
77
|
+
[COMP2]
|
78
|
+
[COMP1] -> [COMP2]
|
79
|
+
[COMP2] --> [COMP3]
|
80
|
+
....
|
81
|
+
ENDOFSTRING
|
82
|
+
|
83
|
+
DOC_ID = <<~ENDOFSTRING
|
84
|
+
= Hello PlantUML!
|
85
|
+
|
86
|
+
[plantuml, format="png", id="myId"]
|
87
|
+
----
|
88
|
+
User -> (Start)
|
89
|
+
User --> (Use the application) : Label
|
90
|
+
----
|
91
|
+
ENDOFSTRING
|
92
|
+
|
93
|
+
DOC_DIM = <<~ENDOFSTRING
|
94
|
+
= Hello PlantUML!
|
95
|
+
|
96
|
+
[plantuml, format="png", width="100px", height="50px"]
|
97
|
+
----
|
98
|
+
User -> (Start)
|
99
|
+
User --> (Use the application) : Label
|
100
|
+
----
|
101
|
+
ENDOFSTRING
|
102
|
+
|
103
|
+
DOC_ALT = <<~ENDOFSTRING
|
104
|
+
= Hello PlantUML!
|
105
|
+
|
106
|
+
[plantuml, format="png", alt="alt"]
|
107
|
+
----
|
108
|
+
User -> (Start)
|
109
|
+
User --> (Use the application) : Label
|
110
|
+
----
|
111
|
+
ENDOFSTRING
|
112
|
+
|
113
|
+
DOC_BAD_FORMAT = <<~ENDOFSTRING
|
114
|
+
= Hello PlantUML!
|
115
|
+
|
116
|
+
[plantuml, format="jpg"]
|
117
|
+
----
|
118
|
+
User -> (Start)
|
119
|
+
User --> (Use the application) : Label
|
120
|
+
----
|
121
|
+
ENDOFSTRING
|
122
|
+
|
123
|
+
DOC_MULTI = <<~ENDOFSTRING
|
124
|
+
= Hello PlantUML!
|
125
|
+
|
126
|
+
[plantuml, format="png"]
|
127
|
+
----
|
128
|
+
User -> (Start)
|
129
|
+
User --> (Use the application) : Label
|
130
|
+
----
|
131
|
+
|
132
|
+
[plantuml, format="png"]
|
133
|
+
----
|
134
|
+
User -> (Start)
|
135
|
+
User --> (Use the application) : Label
|
136
|
+
----
|
137
|
+
|
138
|
+
[plantuml, format="txt"]
|
139
|
+
----
|
140
|
+
User -> (Start)
|
141
|
+
User --> (Use the application) : Label
|
142
|
+
----
|
143
|
+
ENDOFSTRING
|
144
|
+
|
145
|
+
DOC_MULTI_LITERAL = <<~ENDOFSTRING
|
146
|
+
= Hello PlantUML!
|
147
|
+
|
148
|
+
[plantuml, format="png"]
|
149
|
+
....
|
150
|
+
User -> (Start)
|
151
|
+
User --> (Use the application) : Label
|
152
|
+
....
|
153
|
+
|
154
|
+
[plantuml, format="png"]
|
155
|
+
....
|
156
|
+
User -> (Start)
|
157
|
+
User --> (Use the application) : Label
|
158
|
+
....
|
159
|
+
|
160
|
+
[plantuml, format="txt"]
|
161
|
+
....
|
162
|
+
User -> (Start)
|
163
|
+
User --> (Use the application) : Label
|
164
|
+
....
|
165
|
+
ENDOFSTRING
|
166
|
+
|
167
|
+
DOC_TXT = <<~ENDOFSTRING
|
168
|
+
= Hello PlantUML!
|
169
|
+
|
170
|
+
[plantuml, format="txt"]
|
171
|
+
----
|
172
|
+
User -> (Start)
|
173
|
+
User --> (Use the application) : Label
|
174
|
+
----
|
175
|
+
ENDOFSTRING
|
176
|
+
|
177
|
+
DOC_SVG = <<~ENDOFSTRING
|
178
|
+
= Hello PlantUML!
|
179
|
+
|
180
|
+
[plantuml, format="svg"]
|
181
|
+
----
|
182
|
+
User -> (Start)
|
183
|
+
User --> (Use the application) : Label
|
184
|
+
----
|
185
|
+
ENDOFSTRING
|
115
186
|
|
116
187
|
class PlantUmlTest < Test::Unit::TestCase
|
117
|
-
|
118
|
-
|
119
|
-
|
188
|
+
GENURL = 'http://localhost:8080/plantuml/png/U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
|
189
|
+
GENURL2 = 'http://localhost:8080/plantuml/png/U9npA2v9B2efpStXYdRszmqmZ8NGHh4mleAkdGAAa15G22Pc7Clba9gN0jGE00W75Cm0'
|
190
|
+
GENURL_ENCODING = 'http://localhost:8080/plantuml/png/~1U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
|
191
|
+
SVGGENURL = 'http://localhost:8080/plantuml/svg/~1U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
|
120
192
|
|
121
193
|
def setup
|
122
194
|
Asciidoctor::PlantUml.configure do |c|
|
123
|
-
c.url =
|
195
|
+
c.url = 'http://localhost:8080/plantuml'
|
124
196
|
c.txt_enable = true
|
197
|
+
c.png_enable = true
|
198
|
+
c.svg_enable = true
|
125
199
|
end
|
126
200
|
end
|
127
201
|
|
128
202
|
def test_plantuml_block_processor
|
203
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend: 'html5')
|
204
|
+
page = Nokogiri::HTML(html)
|
205
|
+
|
206
|
+
elements = page.css('img.plantuml')
|
207
|
+
|
208
|
+
assert_equal elements.size, 1
|
129
209
|
|
130
|
-
|
210
|
+
element = elements.first
|
211
|
+
|
212
|
+
assert_equal GENURL, element['src']
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_plantuml_block_literal_processor
|
216
|
+
html = ::Asciidoctor.convert(
|
217
|
+
StringIO.new(DOC_BASIC_LITERAL), backend: 'html5'
|
218
|
+
)
|
131
219
|
page = Nokogiri::HTML(html)
|
132
220
|
|
133
221
|
elements = page.css('img.plantuml')
|
@@ -136,11 +224,28 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
136
224
|
|
137
225
|
element = elements.first
|
138
226
|
|
139
|
-
assert_equal GENURL, element[
|
227
|
+
assert_equal GENURL, element['src']
|
140
228
|
end
|
141
229
|
|
142
230
|
def test_plantuml_block_processor2
|
143
|
-
html = ::Asciidoctor.convert(
|
231
|
+
html = ::Asciidoctor.convert(
|
232
|
+
StringIO.new(DOC_BASIC2), backend: 'html5'
|
233
|
+
)
|
234
|
+
page = Nokogiri::HTML(html)
|
235
|
+
|
236
|
+
elements = page.css('img.plantuml')
|
237
|
+
|
238
|
+
assert_equal elements.size, 1
|
239
|
+
|
240
|
+
element = elements.first
|
241
|
+
|
242
|
+
assert_equal GENURL, element['src']
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_plantuml_block_literal_processor2
|
246
|
+
html = ::Asciidoctor.convert(
|
247
|
+
StringIO.new(DOC_BASIC2_LITERAL), backend: 'html5'
|
248
|
+
)
|
144
249
|
page = Nokogiri::HTML(html)
|
145
250
|
|
146
251
|
elements = page.css('img.plantuml')
|
@@ -149,11 +254,11 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
149
254
|
|
150
255
|
element = elements.first
|
151
256
|
|
152
|
-
assert_equal GENURL, element[
|
257
|
+
assert_equal GENURL, element['src']
|
153
258
|
end
|
154
259
|
|
155
260
|
def test_plantuml_block_processor3
|
156
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC3), backend:
|
261
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC3), backend: 'html5')
|
157
262
|
page = Nokogiri::HTML(html)
|
158
263
|
|
159
264
|
elements = page.css('img.plantuml')
|
@@ -162,26 +267,55 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
162
267
|
|
163
268
|
element = elements.first
|
164
269
|
|
165
|
-
assert_equal GENURL2, element[
|
270
|
+
assert_equal GENURL2, element['src']
|
166
271
|
end
|
167
272
|
|
168
|
-
def
|
273
|
+
def test_plantuml_block_literal_processor3
|
274
|
+
html = ::Asciidoctor.convert(
|
275
|
+
StringIO.new(DOC_BASIC3_LITERAL), backend: 'html5'
|
276
|
+
)
|
277
|
+
page = Nokogiri::HTML(html)
|
169
278
|
|
170
|
-
|
279
|
+
elements = page.css('img.plantuml')
|
280
|
+
|
281
|
+
assert_equal elements.size, 1
|
282
|
+
|
283
|
+
element = elements.first
|
284
|
+
|
285
|
+
assert_equal GENURL2, element['src']
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_plantuml_block_processor_encoding
|
289
|
+
Asciidoctor::PlantUml.configure do |c|
|
290
|
+
c.encoding = 'deflate'
|
291
|
+
end
|
292
|
+
|
293
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend: 'html5')
|
171
294
|
page = Nokogiri::HTML(html)
|
172
295
|
|
173
296
|
elements = page.css('img.plantuml')
|
174
297
|
|
175
298
|
assert_equal elements.size, 1
|
299
|
+
|
176
300
|
element = elements.first
|
177
301
|
|
178
|
-
assert_equal
|
302
|
+
assert_equal GENURL_ENCODING, element['src']
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_plantuml_id_attribute
|
306
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_ID), backend: 'html5')
|
307
|
+
page = Nokogiri::HTML(html)
|
179
308
|
|
309
|
+
elements = page.css('img.plantuml')
|
310
|
+
|
311
|
+
assert_equal elements.size, 1
|
312
|
+
element = elements.first
|
313
|
+
|
314
|
+
assert_equal 'myId', element['id']
|
180
315
|
end
|
181
316
|
|
182
317
|
def test_plantuml_dimension_attribute
|
183
|
-
|
184
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_DIM), backend: "html5")
|
318
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_DIM), backend: 'html5')
|
185
319
|
page = Nokogiri::HTML(html)
|
186
320
|
|
187
321
|
elements = page.css('img.plantuml')
|
@@ -189,14 +323,12 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
189
323
|
assert_equal elements.size, 1
|
190
324
|
element = elements.first
|
191
325
|
|
192
|
-
assert_equal
|
193
|
-
assert_equal
|
194
|
-
|
326
|
+
assert_equal '100px', element['width']
|
327
|
+
assert_equal '50px', element['height']
|
195
328
|
end
|
196
329
|
|
197
330
|
def test_plantuml_alt_attribute
|
198
|
-
|
199
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_ALT), backend: "html5")
|
331
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_ALT), backend: 'html5')
|
200
332
|
page = Nokogiri::HTML(html)
|
201
333
|
|
202
334
|
elements = page.css('img.plantuml')
|
@@ -204,23 +336,20 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
204
336
|
assert_equal elements.size, 1
|
205
337
|
element = elements.first
|
206
338
|
|
207
|
-
assert_equal
|
208
|
-
|
339
|
+
assert_equal 'alt', element['alt']
|
209
340
|
end
|
210
341
|
|
211
342
|
def test_should_show_bad_format
|
212
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_BAD_FORMAT), backend:
|
343
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BAD_FORMAT), backend: 'html5')
|
213
344
|
|
214
345
|
page = Nokogiri::HTML(html)
|
215
346
|
|
216
347
|
elements = page.css('pre.plantuml-error')
|
217
348
|
assert_equal elements.size, 1
|
218
|
-
|
219
349
|
end
|
220
350
|
|
221
|
-
def
|
222
|
-
|
223
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_MULTI), backend: "html5")
|
351
|
+
def test_plantuml_multiple_listing
|
352
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_MULTI), backend: 'html5')
|
224
353
|
page = Nokogiri::HTML(html)
|
225
354
|
|
226
355
|
elements = page.css('img.plantuml')
|
@@ -228,72 +357,118 @@ class PlantUmlTest < Test::Unit::TestCase
|
|
228
357
|
|
229
358
|
elements = page.css('.plantuml-error')
|
230
359
|
assert_equal elements.size, 0
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_plantuml_multiple_literal
|
363
|
+
html = ::Asciidoctor.convert(
|
364
|
+
StringIO.new(DOC_MULTI_LITERAL), backend: 'html5'
|
365
|
+
)
|
366
|
+
page = Nokogiri::HTML(html)
|
367
|
+
|
368
|
+
elements = page.css('img.plantuml')
|
369
|
+
assert elements.size >= 2
|
231
370
|
|
371
|
+
elements = page.css('.plantuml-error')
|
372
|
+
assert_equal elements.size, 0
|
232
373
|
end
|
233
374
|
|
234
375
|
def test_plantuml_bad_server
|
235
|
-
|
236
376
|
Asciidoctor::PlantUml.configure do |c|
|
237
|
-
c.url =
|
377
|
+
c.url = 'http://nonexistent.com/plantuml'
|
238
378
|
end
|
239
379
|
|
240
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_MULTI), backend:
|
380
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_MULTI), backend: 'html5')
|
241
381
|
page = Nokogiri::HTML(html)
|
242
382
|
|
243
383
|
elements = page.css('img.plantuml')
|
244
|
-
assert_equal elements.size
|
384
|
+
assert_equal 3, elements.size
|
245
385
|
|
246
386
|
elements = page.css('.plantuml-error')
|
247
|
-
assert_equal elements.size
|
387
|
+
assert_equal 0, elements.size
|
248
388
|
end
|
249
389
|
|
250
390
|
def test_plantuml_invalid_uri
|
251
|
-
|
252
391
|
Asciidoctor::PlantUml.configure do |c|
|
253
|
-
c.url =
|
392
|
+
c.url = 'ftp://test.com'
|
254
393
|
end
|
255
394
|
|
256
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend:
|
395
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend: 'html5')
|
257
396
|
page = Nokogiri::HTML(html)
|
258
397
|
elements = page.css('pre.plantuml-error')
|
259
398
|
assert_equal elements.size, 1
|
260
399
|
end
|
261
400
|
|
262
401
|
def test_plantuml_nil_uri
|
263
|
-
|
264
402
|
Asciidoctor::PlantUml.configure do |c|
|
265
403
|
c.url = nil
|
266
404
|
end
|
267
405
|
|
268
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend:
|
406
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend: 'html5')
|
269
407
|
page = Nokogiri::HTML(html)
|
270
408
|
elements = page.css('pre.plantuml-error')
|
271
409
|
assert_equal elements.size, 1
|
272
410
|
end
|
273
411
|
|
274
412
|
def test_plantuml_empty_uri
|
275
|
-
|
276
413
|
Asciidoctor::PlantUml.configure do |c|
|
277
|
-
c.url =
|
414
|
+
c.url = ''
|
278
415
|
end
|
279
416
|
|
280
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend:
|
417
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC), backend: 'html5')
|
281
418
|
page = Nokogiri::HTML(html)
|
282
419
|
elements = page.css('pre.plantuml-error')
|
283
420
|
assert_equal elements.size, 1
|
284
421
|
end
|
285
422
|
|
286
423
|
def test_disable_txt
|
287
|
-
|
288
424
|
Asciidoctor::PlantUml.configure do |c|
|
289
|
-
c.url =
|
425
|
+
c.url = 'http://localhost:8080/plantuml'
|
290
426
|
c.txt_enable = false
|
291
427
|
end
|
292
428
|
|
293
|
-
html = ::Asciidoctor.convert(StringIO.new(DOC_TXT), backend:
|
429
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_TXT), backend: 'html5')
|
430
|
+
page = Nokogiri::HTML(html)
|
431
|
+
elements = page.css('pre.plantuml-error')
|
432
|
+
assert_equal elements.size, 1
|
433
|
+
end
|
434
|
+
|
435
|
+
def test_svg
|
436
|
+
Asciidoctor::PlantUml.configure do |c|
|
437
|
+
c.url = 'http://localhost:8080/plantuml'
|
438
|
+
c.svg_enable = true
|
439
|
+
end
|
440
|
+
|
441
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_SVG), backend: 'html5')
|
442
|
+
page = Nokogiri::HTML(html)
|
443
|
+
elements = page.css("object[type='image/svg+xml']")
|
444
|
+
assert_equal elements.size, 1
|
445
|
+
|
446
|
+
element = elements.first
|
447
|
+
|
448
|
+
assert_equal SVGGENURL, element['data']
|
449
|
+
end
|
450
|
+
|
451
|
+
def test_disable_svg
|
452
|
+
Asciidoctor::PlantUml.configure do |c|
|
453
|
+
c.url = 'http://localhost:8080/plantuml'
|
454
|
+
c.svg_enable = false
|
455
|
+
end
|
456
|
+
|
457
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_SVG), backend: 'html5')
|
294
458
|
page = Nokogiri::HTML(html)
|
295
459
|
elements = page.css('pre.plantuml-error')
|
296
460
|
assert_equal elements.size, 1
|
461
|
+
end
|
297
462
|
|
463
|
+
def test_disable_png
|
464
|
+
Asciidoctor::PlantUml.configure do |c|
|
465
|
+
c.url = 'http://localhost:8080/plantuml'
|
466
|
+
c.png_enable = false
|
467
|
+
end
|
468
|
+
|
469
|
+
html = ::Asciidoctor.convert(StringIO.new(DOC_BASIC_LITERAL), backend: 'html5')
|
470
|
+
page = Nokogiri::HTML(html)
|
471
|
+
elements = page.css('pre.plantuml-error')
|
472
|
+
assert_equal elements.size, 1
|
298
473
|
end
|
299
474
|
end
|