asciidoctor-plantuml 0.0.16 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe7b55f293e7f815c3107f7cb42b8118b2f5cbcc2d46ddc04c003c8e855ae2ff
4
- data.tar.gz: ded1cc190a25eca2b172fc459a4f77d4f629e484f0112b5d1693686433d2197c
3
+ metadata.gz: 06c1cf16fb57543cec6f90c9d907894ebe6c8b8888396f5cfeb9305340f130c1
4
+ data.tar.gz: 82488d9c4c5431c9244e0ad834bfbb2ae88ef1fe38146cca7d369352f967ff4f
5
5
  SHA512:
6
- metadata.gz: ce55a9ec6de14f336fb5330b2a0f5d9369236c8c213fa306a59ba0f14aaddab50a40412ffc3156b16bb6e742ba8b50238f4c06768e22b7def34eedea9d4da0e9
7
- data.tar.gz: 9aa54dd2b91d173bf8225581bacb82cc2c6b2d8316ceea4f948959cb8696acb0f7f045b01c9f97a80c2476a3d7bc20fae75099c51936420c3763e581bc1bb379
6
+ metadata.gz: 71e3258bc87c722dc6c393129ca5b5984c4ac45f4ea3f6c7ef49907d9dc71c605a1650852bcf6b6f9201115179f3672724883eaa6db0947dca387bb1a7ecf47c
7
+ data.tar.gz: 41993506e615c6ce9180b5677d2bb40a83e18b33abae1b1d16e96ed5b0493d773a747659a4c08be24a13728ac0303e3c63f31ea194b109decec8f0148f7ef79f
@@ -6,4 +6,5 @@ require_relative 'asciidoctor_plantuml/plantuml'
6
6
 
7
7
  Asciidoctor::Extensions.register do
8
8
  block Asciidoctor::PlantUml::BlockProcessor, :plantuml
9
+ block_macro Asciidoctor::PlantUml::BlockMacroProcessor, :plantuml
9
10
  end
@@ -78,23 +78,48 @@ module Asciidoctor
78
78
  txt_enabled? || png_enabled? || svg_enabled?
79
79
  end
80
80
 
81
- def plantuml_content_format(code, format, attrs = {})
82
- if %w[png svg txt].include?(format) &&
83
- method("#{format}_enabled?").call
84
- method("plantuml_#{format}_content").call(code, format, attrs)
81
+ def plantuml_content_format(parent, code, format, attrs = {})
82
+ content = code.read
83
+
84
+ # honor subs attributes
85
+ # e.g. replace asciidoc variables
86
+ subs = attrs['subs']
87
+ content = parent.apply_subs(content, parent.resolve_subs(subs)) if subs
88
+
89
+ # add @start... and @end... if missing
90
+ content = "@startuml\n#{content}\n@enduml" unless content =~ /^@start.*@end[a-z]*$/m
91
+
92
+ # insert global plantuml config after first line
93
+ config_path = parent.attr('plantuml-include', '', true)
94
+ begin
95
+ content = insert_config_to_content(parent, config_path, content, attrs) unless config_path.empty?
96
+ rescue StandardError => e
97
+ return plantuml_invalid_file(config_path, e.message, attrs)
98
+ end
99
+
100
+ if %w[png svg txt].include?(format) && method("#{format}_enabled?").call
101
+ method("plantuml_#{format}_content").call(content, format, attrs)
85
102
  else
86
103
  plantuml_invalid_content(format, attrs)
87
104
  end
88
105
  end
89
106
 
90
- def plantuml_content(code, attrs = {})
107
+ def plantuml_content(parent, code, attrs = {})
91
108
  format = attrs['format'] || DEFAULT_FORMAT
92
109
 
93
110
  return plantuml_disabled_content(code, attrs) unless enabled?
94
111
 
95
112
  return plantuml_server_unavailable_content(server_url, attrs) unless valid_uri?(server_url)
96
113
 
97
- plantuml_content_format(code, format, attrs)
114
+ plantuml_content_format(parent, code, format, attrs)
115
+ end
116
+
117
+ def plantuml_content_from_file(parent, source_file, attrs = {})
118
+ File.open(source_file) do |f|
119
+ return plantuml_content(parent, f, attrs)
120
+ end
121
+ rescue StandardError => e
122
+ plantuml_invalid_file(source_file, e.message, attrs)
98
123
  end
99
124
 
100
125
  # Compression code used to generate PlantUML URLs. Taken directly from
@@ -113,8 +138,25 @@ module Asciidoctor
113
138
  join_paths(server_url, "#{format}/", result).to_s
114
139
  end
115
140
 
141
+ def create_plantuml_block(parent, content, attrs)
142
+ Asciidoctor::Block.new parent, :pass, {
143
+ content_model: :raw,
144
+ source: content,
145
+ subs: :default
146
+ }.merge(attrs)
147
+ end
148
+
116
149
  private
117
150
 
151
+ def insert_config_to_content(parent, config_path, content, attrs)
152
+ File.open(config_path) do |file|
153
+ config = file.read
154
+ subs = attrs['subs']
155
+ config = parent.apply_subs(config, parent.resolve_subs(subs)) if subs
156
+ return content.dup.insert(content.index("\n"), "\n#{config}") unless config.empty?
157
+ end
158
+ end
159
+
118
160
  def plantuml_txt_content(code, format, attrs = {})
119
161
  url = gen_url(code, format)
120
162
  URI(url).open do |f|
@@ -180,6 +222,11 @@ module Asciidoctor
180
222
  _plantuml_error_content(code, attrs)
181
223
  end
182
224
 
225
+ def plantuml_invalid_file(file, error, attrs = {})
226
+ error = "PlantUML Error: Could not parse \"#{file}\": #{error}"
227
+ _plantuml_error_content(error, attrs)
228
+ end
229
+
183
230
  def _plantuml_error_content(error, attrs = {})
184
231
  content = '<div class="listingblock">'
185
232
  content += '<div class="content">'
@@ -263,25 +310,21 @@ module Asciidoctor
263
310
  content_model :simple
264
311
 
265
312
  def process(parent, target, attrs)
266
- lines = target.lines
267
-
268
- lines = ['@startuml'] + target.lines unless target.lines[0] =~ /@startuml/
269
-
270
- lines += ['@enduml'] unless target.lines[-1] =~ /@enduml/
271
-
272
- content = Processor.plantuml_content(lines.join("\n"), attrs)
273
-
274
- create_plantuml_block(parent, content, attrs)
313
+ content = Processor.plantuml_content(parent, target, attrs)
314
+ Processor.create_plantuml_block(parent, content, attrs)
275
315
  end
316
+ end
276
317
 
277
- private
318
+ # PlantUML BlockMacroProcessor
319
+ class BlockMacroProcessor < Asciidoctor::Extensions::BlockMacroProcessor
320
+ use_dsl
321
+ named :plantuml
278
322
 
279
- def create_plantuml_block(parent, content, attrs)
280
- Asciidoctor::Block.new parent, :pass, {
281
- content_model: :raw,
282
- source: content,
283
- subs: :default
284
- }.merge(attrs)
323
+ def process(parent, target, attrs)
324
+ base_dir = parent.document.base_dir
325
+ source_file = parent.document.path_resolver.system_path(target, base_dir, base_dir)
326
+ content = Processor.plantuml_content_from_file(parent, source_file, attrs)
327
+ Processor.create_plantuml_block(parent, content, attrs)
285
328
  end
286
329
  end
287
330
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Asciidoctor
4
4
  module PlantUML
5
- VERSION = '0.0.16'
5
+ VERSION = '0.1.0'
6
6
  end
7
7
  end
@@ -0,0 +1,3 @@
1
+ skinparam monochrome true
2
+ skinparam backgroundColor transparent
3
+ skinparam style strictuml
@@ -0,0 +1,4 @@
1
+ @startuml
2
+ User -> (Start)
3
+ User --> (Use the application) : Label
4
+ @enduml
@@ -184,10 +184,69 @@ DOC_SVG = <<~ENDOFSTRING
184
184
  ----
185
185
  ENDOFSTRING
186
186
 
187
+ DOC_BLOCK_MACRO = <<~ENDOFSTRING
188
+ = Hello PlantUML!
189
+
190
+ .Title Of this
191
+ plantuml::test/fixtures/test.puml[]
192
+ ENDOFSTRING
193
+
194
+ DOC_BLOCK_MACRO_MISSING_FILE = <<~ENDOFSTRING
195
+ = Hello PlantUML!
196
+
197
+ .Title Of this
198
+ plantuml::test/fixtures/missing.puml[]
199
+ ENDOFSTRING
200
+
201
+ DOC_SUBS_ATTRIBUTES = <<~ENDOFSTRING
202
+ = Hello PlantUML!
203
+ :text: Label
204
+
205
+ [plantuml, format="png", subs="attributes+"]
206
+ .Title Of this
207
+ ----
208
+ User -> (Start)
209
+ User --> (Use the application) : {text}
210
+ ----
211
+ ENDOFSTRING
212
+
213
+ DOC_CONFIG_INCLUDE = <<~ENDOFSTRING
214
+ = Hello PlantUML!
215
+ :plantuml-include: test/fixtures/config.puml
216
+
217
+ [plantuml, format="png"]
218
+ .Title Of this
219
+ ----
220
+ User -> (Start)
221
+ User --> (Use the application) : Label
222
+ ----
223
+ ENDOFSTRING
224
+
225
+ DOC_CONFIG_INCLUDE_MISSING_FILE = <<~ENDOFSTRING
226
+ = Hello PlantUML!
227
+ :plantuml-include: test/fixtures/missing.puml
228
+
229
+ [plantuml, format="png"]
230
+ .Title Of this
231
+ ----
232
+ User -> (Start)
233
+ User --> (Use the application) : Label
234
+ ----
235
+ ENDOFSTRING
236
+
237
+ DOC_CONFIG_INCLUDE_MACRO_BLOCK = <<~ENDOFSTRING
238
+ = Hello PlantUML!
239
+ :plantuml-include: test/fixtures/config.puml
240
+
241
+ [plantuml, format="png"]
242
+ plantuml::test/fixtures/test.puml[]
243
+ ENDOFSTRING
244
+
187
245
  class PlantUmlTest < Test::Unit::TestCase
188
246
  GENURL = 'http://localhost:8080/plantuml/png/U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
189
247
  GENURL2 = 'http://localhost:8080/plantuml/png/U9npA2v9B2efpStXYdRszmqmZ8NGHh4mleAkdGAAa15G22Pc7Clba9gN0jGE00W75Cm0'
190
248
  GENURL_ENCODING = 'http://localhost:8080/plantuml/png/~1U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
249
+ GENURL_CONFIG = 'http://localhost:8080/plantuml/png/~1U9nDZJ4Emp08HVUSWh4PUe4ELQIktQeUW3YeiMA31NZexKEg3bc-Fly1Vp97zLxBO5lcXeeLgh2aLQKIk7OwaHdJzb7fl3oaY0P6ja34Vjeo_nOArPn-dzz62jSxN5v7r_YVZo0S-4g0hPMSqBFm23Tuuanbc8YNEDy1SzOwlG00'
191
250
  SVGGENURL = 'http://localhost:8080/plantuml/svg/~1U9npA2v9B2efpStX2YrEBLBGjLFG20Q9Q4Bv804WIw4a8rKXiQ0W9pCviIGpFqzJmKh19p4fDOVB8JKl1QWT05kd5wq0'
192
251
 
193
252
  def setup
@@ -302,6 +361,76 @@ class PlantUmlTest < Test::Unit::TestCase
302
361
  assert_equal GENURL_ENCODING, element['src']
303
362
  end
304
363
 
364
+ def test_plantuml_block_macro_processor
365
+ html = ::Asciidoctor.convert(StringIO.new(DOC_BLOCK_MACRO), backend: 'html5')
366
+ page = Nokogiri::HTML(html)
367
+
368
+ elements = page.css('img.plantuml')
369
+
370
+ assert_equal elements.size, 1
371
+
372
+ element = elements.first
373
+
374
+ assert_equal GENURL, element['src']
375
+ end
376
+
377
+ def test_should_show_file_error
378
+ html = ::Asciidoctor.convert(StringIO.new(DOC_BLOCK_MACRO_MISSING_FILE), backend: 'html5')
379
+ page = Nokogiri::HTML(html)
380
+
381
+ elements = page.css('pre.plantuml-error')
382
+ assert_equal elements.size, 1
383
+ assert_includes html, 'No such file or directory'
384
+ end
385
+
386
+ def test_plantuml_subs_attributes
387
+ html = ::Asciidoctor.convert(StringIO.new(DOC_SUBS_ATTRIBUTES), backend: 'html5')
388
+ page = Nokogiri::HTML(html)
389
+
390
+ elements = page.css('img.plantuml')
391
+
392
+ assert_equal elements.size, 1
393
+
394
+ element = elements.first
395
+
396
+ assert_equal GENURL_ENCODING, element['src']
397
+ end
398
+
399
+ def test_plantuml_config_include
400
+ html = ::Asciidoctor.convert(StringIO.new(DOC_CONFIG_INCLUDE), backend: 'html5')
401
+ page = Nokogiri::HTML(html)
402
+
403
+ elements = page.css('img.plantuml')
404
+
405
+ assert_equal elements.size, 1
406
+
407
+ element = elements.first
408
+
409
+ assert_equal GENURL_CONFIG, element['src']
410
+ end
411
+
412
+ def test_plantuml_config_include_missing_file
413
+ html = ::Asciidoctor.convert(StringIO.new(DOC_CONFIG_INCLUDE_MISSING_FILE), backend: 'html5')
414
+ page = Nokogiri::HTML(html)
415
+
416
+ elements = page.css('pre.plantuml-error')
417
+ assert_equal elements.size, 1
418
+ assert_includes html, 'No such file or directory'
419
+ end
420
+
421
+ def test_plantuml_config_include_macro_block
422
+ html = ::Asciidoctor.convert(StringIO.new(DOC_CONFIG_INCLUDE_MACRO_BLOCK), backend: 'html5')
423
+ page = Nokogiri::HTML(html)
424
+
425
+ elements = page.css('img.plantuml')
426
+
427
+ assert_equal elements.size, 1
428
+
429
+ element = elements.first
430
+
431
+ assert_equal GENURL_CONFIG, element['src']
432
+ end
433
+
305
434
  def test_plantuml_id_attribute
306
435
  html = ::Asciidoctor.convert(StringIO.new(DOC_ID), backend: 'html5')
307
436
  page = Nokogiri::HTML(html)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-plantuml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Horacio Sanson
@@ -110,6 +110,8 @@ files:
110
110
  - lib/asciidoctor-plantuml.rb
111
111
  - lib/asciidoctor_plantuml/plantuml.rb
112
112
  - lib/asciidoctor_plantuml/version.rb
113
+ - test/fixtures/config.puml
114
+ - test/fixtures/test.puml
113
115
  - test/test_plantuml.rb
114
116
  homepage: https://github.com/hsanson/asciidoctor-plantuml
115
117
  licenses:
@@ -136,4 +138,6 @@ signing_key:
136
138
  specification_version: 4
137
139
  summary: Asciidoctor support for PlantUML diagrams.
138
140
  test_files:
141
+ - test/fixtures/config.puml
142
+ - test/fixtures/test.puml
139
143
  - test/test_plantuml.rb