asciidoctor-diagram 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.adoc +262 -7
- data/README.adoc +463 -40
- data/README_zh-CN.adoc +336 -0
- data/Rakefile +3 -7
- data/examples/features.adoc +2 -2
- data/images/asciidoctor-diagram-classes.png +0 -0
- data/images/asciidoctor-diagram-process.png +0 -0
- data/lib/asciidoctor-diagram/a2s/converter.rb +55 -0
- data/lib/asciidoctor-diagram/a2s/extension.rb +14 -0
- data/lib/asciidoctor-diagram/a2s.rb +7 -0
- data/lib/asciidoctor-diagram/blockdiag/converter.rb +37 -0
- data/lib/asciidoctor-diagram/blockdiag/extension.rb +11 -11
- data/lib/asciidoctor-diagram/blockdiag.rb +5 -4
- data/lib/asciidoctor-diagram/bpmn/converter.rb +62 -0
- data/lib/asciidoctor-diagram/bpmn/extension.rb +14 -0
- data/lib/asciidoctor-diagram/bpmn.rb +7 -0
- data/lib/asciidoctor-diagram/diagram_converter.rb +19 -0
- data/lib/asciidoctor-diagram/diagram_processor.rb +320 -0
- data/lib/asciidoctor-diagram/diagram_source.rb +275 -0
- data/lib/asciidoctor-diagram/ditaa/converter.rb +86 -0
- data/lib/asciidoctor-diagram/ditaa/extension.rb +6 -28
- data/lib/asciidoctor-diagram/ditaa.rb +3 -4
- data/lib/asciidoctor-diagram/erd/converter.rb +31 -0
- data/lib/asciidoctor-diagram/erd/extension.rb +14 -0
- data/lib/asciidoctor-diagram/erd.rb +7 -0
- data/lib/asciidoctor-diagram/gnuplot/converter.rb +63 -0
- data/lib/asciidoctor-diagram/gnuplot/extension.rb +14 -0
- data/lib/asciidoctor-diagram/gnuplot.rb +7 -0
- data/lib/asciidoctor-diagram/graphviz/converter.rb +32 -0
- data/lib/asciidoctor-diagram/graphviz/extension.rb +8 -10
- data/lib/asciidoctor-diagram/graphviz.rb +3 -4
- data/lib/asciidoctor-diagram/http/server.rb +127 -0
- data/lib/asciidoctor-diagram/lilypond/converter.rb +54 -0
- data/lib/asciidoctor-diagram/lilypond/extension.rb +14 -0
- data/lib/asciidoctor-diagram/lilypond.rb +7 -0
- data/lib/asciidoctor-diagram/meme/converter.rb +122 -0
- data/lib/asciidoctor-diagram/meme/extension.rb +28 -0
- data/lib/asciidoctor-diagram/meme.rb +6 -0
- data/lib/asciidoctor-diagram/mermaid/converter.rb +178 -0
- data/lib/asciidoctor-diagram/mermaid/extension.rb +14 -0
- data/lib/asciidoctor-diagram/mermaid.rb +7 -0
- data/lib/asciidoctor-diagram/msc/converter.rb +35 -0
- data/lib/asciidoctor-diagram/msc/extension.rb +14 -0
- data/lib/asciidoctor-diagram/msc.rb +7 -0
- data/lib/asciidoctor-diagram/nomnoml/converter.rb +25 -0
- data/lib/asciidoctor-diagram/nomnoml/extension.rb +14 -0
- data/lib/asciidoctor-diagram/nomnoml.rb +7 -0
- data/lib/asciidoctor-diagram/plantuml/converter.rb +115 -0
- data/lib/asciidoctor-diagram/plantuml/extension.rb +14 -20
- data/lib/asciidoctor-diagram/plantuml.rb +3 -5
- data/lib/asciidoctor-diagram/salt.rb +7 -0
- data/lib/asciidoctor-diagram/shaape/converter.rb +25 -0
- data/lib/asciidoctor-diagram/shaape/extension.rb +9 -11
- data/lib/asciidoctor-diagram/shaape.rb +3 -5
- data/lib/asciidoctor-diagram/smcat/converter.rb +44 -0
- data/lib/asciidoctor-diagram/smcat/extension.rb +14 -0
- data/lib/asciidoctor-diagram/smcat.rb +7 -0
- data/lib/asciidoctor-diagram/svgbob/converter.rb +25 -0
- data/lib/asciidoctor-diagram/svgbob/extension.rb +14 -0
- data/lib/asciidoctor-diagram/svgbob.rb +7 -0
- data/lib/asciidoctor-diagram/syntrax/converter.rb +55 -0
- data/lib/asciidoctor-diagram/syntrax/extension.rb +14 -0
- data/lib/asciidoctor-diagram/syntrax.rb +7 -0
- data/lib/asciidoctor-diagram/tikz/converter.rb +56 -0
- data/lib/asciidoctor-diagram/tikz/extension.rb +14 -0
- data/lib/asciidoctor-diagram/tikz.rb +7 -0
- data/lib/asciidoctor-diagram/umlet/converter.rb +24 -0
- data/lib/asciidoctor-diagram/umlet/extension.rb +14 -0
- data/lib/asciidoctor-diagram/umlet.rb +7 -0
- data/lib/asciidoctor-diagram/util/binaryio.rb +20 -0
- data/lib/asciidoctor-diagram/util/cli.rb +81 -0
- data/lib/asciidoctor-diagram/util/cli_generator.rb +73 -22
- data/lib/asciidoctor-diagram/util/gif.rb +21 -0
- data/lib/asciidoctor-diagram/util/java.rb +95 -1
- data/lib/asciidoctor-diagram/util/java_jruby.rb +14 -20
- data/lib/asciidoctor-diagram/util/java_socket.rb +175 -0
- data/lib/asciidoctor-diagram/util/pdf.rb +10 -0
- data/lib/asciidoctor-diagram/util/platform.rb +97 -0
- data/lib/asciidoctor-diagram/util/png.rb +1 -0
- data/lib/asciidoctor-diagram/util/svg.rb +4 -3
- data/lib/asciidoctor-diagram/util/which.rb +15 -9
- data/lib/asciidoctor-diagram/vega/converter.rb +47 -0
- data/lib/asciidoctor-diagram/vega/extension.rb +14 -0
- data/lib/asciidoctor-diagram/vega.rb +10 -0
- data/lib/asciidoctor-diagram/version.rb +1 -1
- data/lib/asciidoctor-diagram/wavedrom/converter.rb +50 -0
- data/lib/asciidoctor-diagram/wavedrom/extension.rb +14 -0
- data/lib/asciidoctor-diagram/wavedrom.rb +7 -0
- data/lib/asciidoctor-diagram.rb +22 -5
- data/lib/batik-all-1.10.jar +0 -0
- data/lib/ditaa-1.3.14.jar +0 -0
- data/lib/ditaamini-0.12.jar +0 -0
- data/lib/jlatexmath-minimal-1.0.5.jar +0 -0
- data/lib/plantuml-1.3.14.jar +0 -0
- data/lib/plantuml.jar +0 -0
- data/lib/server-1.3.14.jar +0 -0
- data/spec/a2s_spec.rb +167 -0
- data/spec/blockdiag_spec.rb +55 -24
- data/spec/bpmn-example.xml +44 -0
- data/spec/bpmn_spec.rb +96 -0
- data/spec/ditaa_spec.rb +150 -15
- data/spec/erd_spec.rb +289 -0
- data/spec/gnuplot_spec.rb +478 -0
- data/spec/graphviz_spec.rb +20 -20
- data/spec/lilypond_spec.rb +151 -0
- data/spec/man.jpg +0 -0
- data/spec/meme_spec.rb +67 -0
- data/spec/mermaid_spec.rb +336 -0
- data/spec/msc_spec.rb +230 -0
- data/spec/nomnoml_spec.rb +170 -0
- data/spec/plantuml_spec.rb +895 -54
- data/spec/shaape_spec.rb +25 -24
- data/spec/smcat_spec.rb +164 -0
- data/spec/svgbob_spec.rb +167 -0
- data/spec/syntrax_spec.rb +228 -0
- data/spec/test_helper.rb +88 -9
- data/spec/tikz_spec.rb +127 -0
- data/spec/umlet_spec.rb +85 -0
- data/spec/vega_spec.rb +241 -0
- data/spec/wavedrom_spec.rb +214 -0
- metadata +130 -35
- data/lib/asciidoctor-diagram/plantuml/generator.rb +0 -46
- data/lib/asciidoctor-diagram/util/diagram.rb +0 -220
- data/lib/asciidoctor-diagram/util/java_rjb.rb +0 -90
- data/lib/ditaamini0_9.jar +0 -0
@@ -1,220 +0,0 @@
|
|
1
|
-
require 'asciidoctor/extensions'
|
2
|
-
require 'digest'
|
3
|
-
require 'json'
|
4
|
-
require 'fileutils'
|
5
|
-
require_relative 'java'
|
6
|
-
require_relative 'png'
|
7
|
-
require_relative 'svg'
|
8
|
-
|
9
|
-
module Asciidoctor
|
10
|
-
module Diagram
|
11
|
-
def self.define_processors(name, &init)
|
12
|
-
block = Class.new(Asciidoctor::Extensions::BlockProcessor) do
|
13
|
-
class << self
|
14
|
-
include FormatRegistry
|
15
|
-
end
|
16
|
-
include DiagramProcessor
|
17
|
-
|
18
|
-
option :pos_attrs, ['target', 'format']
|
19
|
-
option :contexts, [:listing, :literal, :open]
|
20
|
-
option :content_model, :simple
|
21
|
-
|
22
|
-
def process(parent, reader, attributes)
|
23
|
-
generate_block(parent, ReaderSource.new(reader), attributes)
|
24
|
-
end
|
25
|
-
|
26
|
-
self.instance_eval &init
|
27
|
-
end
|
28
|
-
|
29
|
-
block_macro = Class.new(Asciidoctor::Extensions::BlockMacroProcessor) do
|
30
|
-
class << self
|
31
|
-
include FormatRegistry
|
32
|
-
end
|
33
|
-
include DiagramProcessor
|
34
|
-
|
35
|
-
option :pos_attrs, ['target', 'format']
|
36
|
-
|
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))
|
40
|
-
|
41
|
-
generate_block(parent, source, attributes)
|
42
|
-
end
|
43
|
-
|
44
|
-
self.instance_eval &init
|
45
|
-
end
|
46
|
-
|
47
|
-
Asciidoctor::Diagram.const_set("#{name}Block", block)
|
48
|
-
Asciidoctor::Diagram.const_set("#{name}BlockMacro", block_macro)
|
49
|
-
end
|
50
|
-
|
51
|
-
module FormatRegistry
|
52
|
-
#
|
53
|
-
# Registers a supported format. The first registered format becomes the default format for the block processor.
|
54
|
-
#
|
55
|
-
# +format+ is a symbol with the format name
|
56
|
-
# +type+ is a symbol and should be either :image or :literal
|
57
|
-
# +block+ is a block that produces the diagrams from code. The block receives the parent asciidoc block and the diagram code as arguments
|
58
|
-
#
|
59
|
-
def register_format(format, type, &block)
|
60
|
-
unless @default_format
|
61
|
-
@default_format = format
|
62
|
-
end
|
63
|
-
|
64
|
-
formats[format] = {
|
65
|
-
:type => type,
|
66
|
-
:generator => block
|
67
|
-
}
|
68
|
-
end
|
69
|
-
|
70
|
-
def formats
|
71
|
-
@formats ||= {}
|
72
|
-
end
|
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
|
-
|
113
|
-
def create_image_block(parent, source, attributes, format, generator_info)
|
114
|
-
target = attributes.delete('target')
|
115
|
-
|
116
|
-
image_name = "#{target || ('diag-' + source.checksum)}.#{format}"
|
117
|
-
image_dir = File.expand_path(parent.document.attributes['imagesdir'] || '', parent.document.attributes['outdir'] || parent.document.attributes['docdir'])
|
118
|
-
image_file = File.expand_path(image_name, image_dir)
|
119
|
-
metadata_file = File.expand_path("#{image_name}.cache", image_dir)
|
120
|
-
|
121
|
-
if File.exists? metadata_file
|
122
|
-
metadata = File.open(metadata_file, 'r') { |f| JSON.load f }
|
123
|
-
else
|
124
|
-
metadata = {}
|
125
|
-
end
|
126
|
-
|
127
|
-
if source.should_process?(image_file, metadata['checksum'])
|
128
|
-
params = IMAGE_PARAMS[format]
|
129
|
-
|
130
|
-
result = generator_info[:generator].call(source.code, parent)
|
131
|
-
|
132
|
-
result.force_encoding(params[:encoding])
|
133
|
-
|
134
|
-
metadata = {'checksum' => source.checksum}
|
135
|
-
metadata['width'], metadata['height'] = params[:decoder].get_image_size(result)
|
136
|
-
|
137
|
-
FileUtils.mkdir_p(image_dir) unless Dir.exists?(image_dir)
|
138
|
-
File.open(image_file, 'wb') { |f| f.write result }
|
139
|
-
File.open(metadata_file, 'w') { |f| JSON.dump(metadata, f) }
|
140
|
-
end
|
141
|
-
|
142
|
-
attributes['target'] = image_name
|
143
|
-
if /html/i =~ parent.document.attributes['backend']
|
144
|
-
attributes['width'] ||= metadata['width'] if metadata['width']
|
145
|
-
attributes['height'] ||= metadata['height'] if metadata['height']
|
146
|
-
end
|
147
|
-
attributes['alt'] ||= if title_text = attributes['title']
|
148
|
-
title_text
|
149
|
-
elsif target
|
150
|
-
(File.basename target, (File.extname target) || '').tr '_-', ' '
|
151
|
-
else
|
152
|
-
'Diagram'
|
153
|
-
end
|
154
|
-
|
155
|
-
Asciidoctor::Block.new parent, :image, :content_model => :empty, :attributes => attributes
|
156
|
-
end
|
157
|
-
|
158
|
-
def create_literal_block(parent, source, attributes, generator_info)
|
159
|
-
attributes.delete('target')
|
160
|
-
|
161
|
-
result = generator_info[:generator].call(source.code, parent)
|
162
|
-
|
163
|
-
result.force_encoding(Encoding::UTF_8)
|
164
|
-
Asciidoctor::Block.new parent, :literal, :code => result, :attributes => attributes
|
165
|
-
end
|
166
|
-
|
167
|
-
def code_checksum(code)
|
168
|
-
md5 = Digest::MD5.new
|
169
|
-
md5 << code
|
170
|
-
md5.hexdigest
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
class Source
|
175
|
-
def checksum
|
176
|
-
@checksum ||= compute_checksum(code)
|
177
|
-
end
|
178
|
-
|
179
|
-
def should_process?(image_file, old_checksum)
|
180
|
-
!File.exists?(image_file) || (newer_than?(image_file) && old_checksum != checksum)
|
181
|
-
end
|
182
|
-
|
183
|
-
private
|
184
|
-
|
185
|
-
def compute_checksum(code)
|
186
|
-
md5 = Digest::MD5.new
|
187
|
-
md5 << code
|
188
|
-
md5.hexdigest
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
class ReaderSource < Source
|
193
|
-
def initialize(reader)
|
194
|
-
@reader = reader
|
195
|
-
end
|
196
|
-
|
197
|
-
def newer_than?(image_file)
|
198
|
-
true
|
199
|
-
end
|
200
|
-
|
201
|
-
def code
|
202
|
-
@code ||= @reader.lines.join("\n")
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
class FileSource < Source
|
207
|
-
def initialize(file_name)
|
208
|
-
@file_name = file_name
|
209
|
-
end
|
210
|
-
|
211
|
-
def newer_than?(image_file)
|
212
|
-
File.mtime(@file_name) > File.mtime(image_file)
|
213
|
-
end
|
214
|
-
|
215
|
-
def code
|
216
|
-
@code ||= File.read(@file_name)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'rjb'
|
2
|
-
|
3
|
-
module Asciidoctor
|
4
|
-
module Diagram
|
5
|
-
module Java
|
6
|
-
INITAWT_JAR_PATH = File.expand_path File.join('..', 'initawt.jar'), File.dirname(__FILE__)
|
7
|
-
|
8
|
-
module Package
|
9
|
-
def method_missing(meth, *args, &block)
|
10
|
-
raise "No arguments expected" unless args.empty?
|
11
|
-
raise "No block expected" if block
|
12
|
-
|
13
|
-
name = meth.to_s
|
14
|
-
@proxies ||= {}
|
15
|
-
@proxies[name] ||= create_java_proxy(name)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def create_java_proxy(name)
|
21
|
-
qualified_name = @name ? "#{@name}.#{name}" : name
|
22
|
-
if name =~ /^[[:upper:]]/
|
23
|
-
Package.create_class(qualified_name)
|
24
|
-
else
|
25
|
-
Package.create_package(qualified_name)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.create_class(name)
|
30
|
-
::Rjb.import(name)
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.create_package(name)
|
34
|
-
package = Module.new
|
35
|
-
package.extend Package
|
36
|
-
package.instance_variable_set :@name, name
|
37
|
-
package.instance_variable_set :@parent, name
|
38
|
-
package
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.classpath
|
43
|
-
@classpath ||= []
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.load
|
47
|
-
if @loaded
|
48
|
-
return
|
49
|
-
end
|
50
|
-
|
51
|
-
Rjb::load(classpath.join(File::PATH_SEPARATOR))
|
52
|
-
|
53
|
-
# On OS X using AWT from JNI is extremely deadlock prone. Enabling AWT headless mode resolves this issue. We're
|
54
|
-
# never actually going to display an AWT GUI, so this should be fairly safe.
|
55
|
-
Rjb::import('java.lang.System').setProperty 'java.awt.headless', 'true'
|
56
|
-
|
57
|
-
@loaded = true
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.array_to_java_array(array, type)
|
61
|
-
# Rjb does not require an explicit conversion of a Ruby Array containing Ruby Strings to a Ruby Array containing
|
62
|
-
# Java Strings. It handles this implicitly when calling Java methods.
|
63
|
-
array
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.string_from_java_bytes(bytes)
|
67
|
-
# Rjb implictly converts Java byte arrays to Ruby Strings so nothing needs to be done here
|
68
|
-
bytes
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.method_missing(meth, *args, &block)
|
72
|
-
raise "No arguments expected" unless args.empty?
|
73
|
-
raise "No block expected" if block
|
74
|
-
|
75
|
-
load
|
76
|
-
|
77
|
-
@root_package ||= Package.send(:create_package, nil)
|
78
|
-
@root_package.send(meth, *args)
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.new_object(java_class, signature = nil, *args)
|
82
|
-
if signature
|
83
|
-
java_class.new_with_sig(signature, *args)
|
84
|
-
else
|
85
|
-
java_class.new(*args)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
data/lib/ditaamini0_9.jar
DELETED
Binary file
|