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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ed05ad18a6da6febe775f07fda8713b77fe25a82
4
- data.tar.gz: c2ba98ed53a5405b4e95ce72f03d4c7158e7b561
3
+ metadata.gz: 74838c060f09bcfe7603faef3aeee8c075cecaec
4
+ data.tar.gz: cb315faf5b140f071a6f7a0fdb748e366d5eefae
5
5
  SHA512:
6
- metadata.gz: 655e2240b3fa83d06d3e379281cfda32158965b4254ba9b9e4125ec520b064a87fffa59c220d058e0cd0947b3c516970429ea839c686152058d777b782a7a7c9
7
- data.tar.gz: 36ded3b76a7980587dd546f52ce1f64ae39ff87c51ac2d8e88be6d46ee1881944b302e890967c1b32716b3cae6a067f1400f57c328d3768791e1255caad0052d
6
+ metadata.gz: 131fb3f8a3cecb232601c72424240c284996bfeef9a66c64bc3d88c6e0a1aab48299c2baa5935d1d3ed54ceca85b912716ae10dea48c21950ce6d5ff3b76f960
7
+ data.tar.gz: 4d096215c18e27b7fdfbb4bccd131c6e94699c9fb572c1f5f00e9df196a2c0d81390dd84c70dfbef3153a9cfe8d7c3598fd15f6f14d53979b93fe44130f82589
@@ -6,6 +6,20 @@ Enhancements::
6
6
 
7
7
  * Updated to Asciidoctor 1.5.0
8
8
 
9
+ == 1.1.6
10
+
11
+ Enhancements::
12
+
13
+ * Updated PlantUML to revision 8002 (23/07U/2014)
14
+ * Add support for Shaape diagrams (requires Shaape to be installed separately)
15
+ * Add support for Blockdiag diagrams (requires Blockdiag to be installed separately)
16
+ * Add support for Actdiag diagrams (requires Actdiag to be installed separately)
17
+ * Add support for Seqdiag diagrams (requires Seqdiag to be installed separately)
18
+ * Add support for Nwdiag diagrams (requires Nwdiag to be installed separately)
19
+
20
+ Bug Fixes::
21
+ * Issue #38: Resolved Graphviz syntax errors with certain diagrams
22
+
9
23
  == 1.1.5
10
24
 
11
25
  Enhancements::
@@ -1,3 +1,5 @@
1
+ require 'asciidoctor-diagram/blockdiag'
1
2
  require 'asciidoctor-diagram/ditaa'
2
3
  require 'asciidoctor-diagram/graphviz'
3
- require 'asciidoctor-diagram/plantuml'
4
+ require 'asciidoctor-diagram/plantuml'
5
+ require 'asciidoctor-diagram/shaape'
@@ -0,0 +1,8 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'version'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ require_relative 'blockdiag/extension'
6
+ block Asciidoctor::Diagram::BlockDiagBlock, :blockdiag
7
+ block_macro Asciidoctor::Diagram::BlockDiagBlockMacro, :blockdiag
8
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../util/cli_generator'
2
+ require_relative '../util/diagram'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ ['BlockDiag', 'SeqDiag', 'ActDiag', 'NwDiag', 'RackDiag', 'PacketDiag'].each do |tool|
7
+ define_processors(tool) do
8
+ [:png, :svg].each do |f|
9
+ register_format(f, :image) do |c, p|
10
+ CliGenerator.generate(tool.downcase, p, c) do |tool_path, output_path|
11
+ [tool_path, '-o', output_path, "-T#{f.to_s}", '-']
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,37 +1,35 @@
1
1
  require_relative '../util/diagram'
2
- require_relative 'generator'
2
+ require_relative '../util/java'
3
3
 
4
4
  module Asciidoctor
5
5
  module Diagram
6
- module DitaaBase
7
- include DitaaGenerator
6
+ module DitaaGenerator
7
+ DITAA_JAR_PATH = File.expand_path File.join('../..', 'ditaamini0_9.jar'), File.dirname(__FILE__)
8
+ Java.classpath << DITAA_JAR_PATH
8
9
 
9
- private
10
+ def self.ditaa(code)
11
+ Java.load
10
12
 
11
- def register_formats
12
- register_format(:png, :image) do |c|
13
- ditaa(c)
14
- end
15
- end
16
- end
13
+ args = ['-e', 'UTF-8']
14
+
15
+ bytes = code.encode(Encoding::UTF_8).bytes.to_a
16
+ bis = Java.new_object(Java.java.io.ByteArrayInputStream, '[B', Java.array_to_java_array(bytes, :byte))
17
+ bos = Java.new_object(Java.java.io.ByteArrayOutputStream)
18
+ result_code = Java.org.stathissideris.ascii2image.core.CommandLineConverter.convert(Java.array_to_java_array(args, :string), bis, bos)
19
+ bis.close
20
+ bos.close
17
21
 
18
- class DitaaBlock < Asciidoctor::Extensions::BlockProcessor
19
- include DiagramProcessorBase
20
- include DitaaBase
22
+ result = Java.string_from_java_bytes(bos.toByteArray)
21
23
 
22
- def initialize name = nil, config = {}
23
- super
24
- register_formats()
24
+ raise "Ditaa image generation failed: #{result}" unless result_code == 0
25
+
26
+ result
25
27
  end
26
28
  end
27
29
 
28
- class DitaaBlockMacro < Asciidoctor::Extensions::BlockMacroProcessor
29
- include DiagramProcessorBase
30
- include DitaaBase
31
-
32
- def initialize name = nil, config = {}
33
- super
34
- register_formats()
30
+ define_processors('Ditaa') do
31
+ register_format(:png, :image) do |c|
32
+ DitaaGenerator.ditaa(c)
35
33
  end
36
34
  end
37
35
  end
@@ -1,41 +1,16 @@
1
+ require_relative '../util/cli_generator'
1
2
  require_relative '../util/diagram'
2
- require_relative '../plantuml/generator'
3
3
 
4
4
  module Asciidoctor
5
5
  module Diagram
6
- module GraphvizBase
7
- include PlantUmlGenerator
8
-
9
- private
10
-
11
- def register_formats
12
- register_format(:png, :image) do |c, p|
13
- plantuml(p, c, 'dot')
14
- end
15
- register_format(:svg, :image) do |c, p|
16
- plantuml(p, c, 'dot', '-tsvg')
6
+ define_processors('Graphviz') do
7
+ [:png, :svg].each do |f|
8
+ register_format(f, :image) do |c, p|
9
+ CliGenerator.generate('dot', p, c) do |tool_path, output_path|
10
+ [tool_path, "-o#{output_path}", "-T#{f.to_s}"]
11
+ end
17
12
  end
18
13
  end
19
14
  end
20
-
21
- class GraphvizBlock < Asciidoctor::Extensions::BlockProcessor
22
- include DiagramProcessorBase
23
- include GraphvizBase
24
-
25
- def initialize name = nil, config = {}
26
- super
27
- register_formats()
28
- end
29
- end
30
-
31
- class GraphvizBlockMacro < Asciidoctor::Extensions::BlockMacroProcessor
32
- include DiagramProcessorBase
33
- include GraphvizBase
34
-
35
- def initialize name = nil, config = {}
36
- super
37
- register_formats()
38
- end
39
- end
40
15
  end
41
16
  end
@@ -3,41 +3,25 @@ require_relative 'generator'
3
3
 
4
4
  module Asciidoctor
5
5
  module Diagram
6
- module PlantUmlBase
7
- include PlantUmlGenerator
8
-
9
- private
10
-
11
- def register_formats()
12
- register_format(:png, :image) do |c, p|
13
- plantuml(p, c, 'uml')
14
- end
15
- register_format(:svg, :image) do |c, p|
16
- plantuml(p, c, 'uml', '-tsvg')
6
+ define_processors('PlantUml') do
7
+ def config_args(parent)
8
+ config_args = []
9
+ config = parent.document.attributes['plantumlconfig']
10
+ if config
11
+ config_args += ['-config', File.expand_path(config, parent.document.attributes['docdir'])]
17
12
  end
18
- register_format(:txt, :literal) do |c, p|
19
- plantuml(p, c, 'uml', '-tutxt')
20
- end
21
- end
22
- end
23
13
 
24
- class PlantUmlBlock < Asciidoctor::Extensions::BlockProcessor
25
- include DiagramProcessorBase
26
- include PlantUmlBase
27
-
28
- def initialize name = nil, config = {}
29
- super
30
- register_formats()
14
+ config_args
31
15
  end
32
- end
33
-
34
- class PlantUmlBlockMacro < Asciidoctor::Extensions::BlockMacroProcessor
35
- include DiagramProcessorBase
36
- include PlantUmlBase
37
16
 
38
- def initialize name = nil, config = {}
39
- super
40
- register_formats()
17
+ register_format(:png, :image) do |c, p|
18
+ PlantUmlGenerator.plantuml(p, c, 'uml', *config_args(p))
19
+ end
20
+ register_format(:svg, :image) do |c, p|
21
+ PlantUmlGenerator.plantuml(p, c, 'uml', '-tsvg', *config_args(p))
22
+ end
23
+ register_format(:txt, :literal) do |c, p|
24
+ PlantUmlGenerator.plantuml(p, c, 'uml', '-tutxt', *config_args(p))
41
25
  end
42
26
  end
43
27
  end
@@ -1,4 +1,5 @@
1
1
  require_relative '../util/java'
2
+ require_relative '../util/which'
2
3
 
3
4
  module Asciidoctor
4
5
  module Diagram
@@ -8,10 +9,10 @@ module Asciidoctor
8
9
  PLANTUML_JAR_PATH = File.expand_path File.join('../..', 'plantuml.jar'), File.dirname(__FILE__)
9
10
  Java.classpath << PLANTUML_JAR_PATH
10
11
 
11
- def plantuml(parent, code, tag, *flags)
12
+ def self.plantuml(parent, code, tag, *flags)
12
13
  unless @graphvizdot
13
14
  @graphvizdot = parent.document.attributes['graphvizdot']
14
- @graphvizdot = which('dot') unless @graphvizdot && File.executable?(@graphvizdot)
15
+ @graphvizdot = ::Asciidoctor::Diagram.which('dot') unless @graphvizdot && File.executable?(@graphvizdot)
15
16
  raise "Could not find the Graphviz 'dot' executable in PATH; add it to the PATH or specify its location using the 'graphvizdot' document attribute" unless @graphvizdot
16
17
  end
17
18
 
@@ -40,17 +41,6 @@ module Asciidoctor
40
41
  ps.close
41
42
  Java.string_from_java_bytes(bos.toByteArray)
42
43
  end
43
-
44
- def which(cmd)
45
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
46
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
47
- exts.each { |ext|
48
- exe = File.join(path, "#{cmd}#{ext}")
49
- return exe if File.executable? exe
50
- }
51
- end
52
- nil
53
- end
54
44
  end
55
45
  end
56
46
  end
@@ -0,0 +1,9 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'version'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ require_relative 'shaape/extension'
6
+
7
+ block Asciidoctor::Diagram::ShaapeBlock, :shaape
8
+ block_macro Asciidoctor::Diagram::ShaapeBlockMacro, :shaape
9
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../util/cli_generator'
2
+ require_relative '../util/diagram'
3
+
4
+ module Asciidoctor
5
+ module Diagram
6
+ define_processors('Shaape') do
7
+ [:png, :svg].each do |f|
8
+ register_format(f, :image) do |c, p|
9
+ CliGenerator.generate('shaape', p, c) do |tool_path, output_path|
10
+ [tool_path, '-o', output_path, '-t', f.to_s, '-']
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ require 'tempfile'
2
+
3
+ require_relative '../util/java'
4
+ require_relative '../util/which'
5
+
6
+ module Asciidoctor
7
+ module Diagram
8
+ module CliGenerator
9
+ def self.generate(tool, parent, code)
10
+ tool_var = '@' + tool
11
+
12
+ tool_path = instance_variable_get(tool_var)
13
+ unless tool_path
14
+ tool_path = parent.document.attributes[tool]
15
+ tool_path = ::Asciidoctor::Diagram.which(tool) unless tool_path && File.executable?(tool_path)
16
+ raise "Could not find the '#{tool}' executable in PATH; add it to the PATH or specify its location using the 'shaape' document attribute" unless tool_path
17
+ instance_variable_set(tool_var, tool_path)
18
+ end
19
+
20
+ target_file = Tempfile.new(tool)
21
+ begin
22
+ target_file.close
23
+
24
+ args = yield tool_path, target_file.path
25
+
26
+ IO.popen(args, "w") do |io|
27
+ io.write code
28
+ end
29
+ result_code = $?
30
+
31
+ raise "#{tool} image generation failed" unless result_code == 0
32
+
33
+ File.read(target_file.path)
34
+ ensure
35
+ target_file.unlink
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -8,69 +8,47 @@ require_relative 'svg'
8
8
 
9
9
  module Asciidoctor
10
10
  module Diagram
11
- module DiagramProcessorBase
12
- IMAGE_PARAMS = {
13
- :svg => {
14
- :encoding => Encoding::UTF_8,
15
- :decoder => SVG
16
- },
17
- :png => {
18
- :encoding => Encoding::ASCII_8BIT,
19
- :decoder => PNG
20
- }
21
- }
22
-
23
- def self.included(base)
24
- base.option :pos_attrs, ['target', 'format']
25
-
26
- if base.ancestors.include?(Asciidoctor::Extensions::BlockProcessor)
27
- base.option :contexts, [:listing, :literal, :open]
28
- base.option :content_model, :simple
29
-
30
- base.instance_eval do
31
- alias_method :process, :process_block
32
- end
33
- else
34
- base.instance_eval do
35
- alias_method :process, :process_macro
36
- end
11
+ def self.define_processors(name, &init)
12
+ block = Class.new(Asciidoctor::Extensions::BlockProcessor) do
13
+ class << self
14
+ include FormatRegistry
37
15
  end
16
+ include DiagramProcessor
38
17
 
39
- end
40
-
41
- def process_macro(parent, target, attributes)
42
- source = FileSource.new(File.expand_path(target, parent.document.attributes['docdir']))
43
- attributes['target'] ||= File.basename(target, File.extname(target))
18
+ option :pos_attrs, ['target', 'format']
19
+ option :contexts, [:listing, :literal, :open]
20
+ option :content_model, :simple
44
21
 
45
- generate_block(parent, source, attributes)
46
- end
22
+ def process(parent, reader, attributes)
23
+ generate_block(parent, ReaderSource.new(reader), attributes)
24
+ end
47
25
 
48
- def process_block(parent, reader, attributes)
49
- generate_block(parent, ReaderSource.new(reader), attributes)
26
+ self.instance_eval &init
50
27
  end
51
28
 
52
- def generate_block(parent, source, attributes)
53
- format = attributes.delete('format') || @default_format
54
- format = format.to_sym if format.respond_to?(:to_sym)
55
-
56
- raise "Format undefined" unless format
29
+ block_macro = Class.new(Asciidoctor::Extensions::BlockMacroProcessor) do
30
+ class << self
31
+ include FormatRegistry
32
+ end
33
+ include DiagramProcessor
57
34
 
58
- generator_info = formats[format]
35
+ option :pos_attrs, ['target', 'format']
59
36
 
60
- raise "#{self.class.name} does not support output format #{format}" unless generator_info
37
+ def process(parent, target, attributes)
38
+ source = FileSource.new(File.expand_path(target, parent.document.attributes['docdir']))
39
+ attributes['target'] ||= File.basename(target, File.extname(target))
61
40
 
62
- case generator_info[:type]
63
- when :image
64
- create_image_block(parent, source, attributes, format, generator_info)
65
- when :literal
66
- create_literal_block(parent, source, attributes, generator_info)
67
- else
68
- raise "Unsupported output format: #{format}"
41
+ generate_block(parent, source, attributes)
69
42
  end
43
+
44
+ self.instance_eval &init
70
45
  end
71
46
 
72
- private
47
+ Asciidoctor::Diagram.const_set("#{name}Block", block)
48
+ Asciidoctor::Diagram.const_set("#{name}BlockMacro", block_macro)
49
+ end
73
50
 
51
+ module FormatRegistry
74
52
  #
75
53
  # Registers a supported format. The first registered format becomes the default format for the block processor.
76
54
  #
@@ -93,6 +71,45 @@ module Asciidoctor
93
71
  @formats ||= {}
94
72
  end
95
73
 
74
+ def default_format
75
+ @default_format
76
+ end
77
+ end
78
+
79
+ module DiagramProcessor
80
+ IMAGE_PARAMS = {
81
+ :svg => {
82
+ :encoding => Encoding::UTF_8,
83
+ :decoder => SVG
84
+ },
85
+ :png => {
86
+ :encoding => Encoding::ASCII_8BIT,
87
+ :decoder => PNG
88
+ }
89
+ }
90
+
91
+ private
92
+
93
+ def generate_block(parent, source, attributes)
94
+ format = attributes.delete('format') || self.class.default_format
95
+ format = format.to_sym if format.respond_to?(:to_sym)
96
+
97
+ raise "Format undefined" unless format
98
+
99
+ generator_info = self.class.formats[format]
100
+
101
+ raise "#{self.class.name} does not support output format #{format}" unless generator_info
102
+
103
+ case generator_info[:type]
104
+ when :image
105
+ create_image_block(parent, source, attributes, format, generator_info)
106
+ when :literal
107
+ create_literal_block(parent, source, attributes, generator_info)
108
+ else
109
+ raise "Unsupported output format: #{format}"
110
+ end
111
+ end
112
+
96
113
  def create_image_block(parent, source, attributes, format, generator_info)
97
114
  target = attributes.delete('target')
98
115