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.
Files changed (126) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.adoc +262 -7
  3. data/README.adoc +463 -40
  4. data/README_zh-CN.adoc +336 -0
  5. data/Rakefile +3 -7
  6. data/examples/features.adoc +2 -2
  7. data/images/asciidoctor-diagram-classes.png +0 -0
  8. data/images/asciidoctor-diagram-process.png +0 -0
  9. data/lib/asciidoctor-diagram/a2s/converter.rb +55 -0
  10. data/lib/asciidoctor-diagram/a2s/extension.rb +14 -0
  11. data/lib/asciidoctor-diagram/a2s.rb +7 -0
  12. data/lib/asciidoctor-diagram/blockdiag/converter.rb +37 -0
  13. data/lib/asciidoctor-diagram/blockdiag/extension.rb +11 -11
  14. data/lib/asciidoctor-diagram/blockdiag.rb +5 -4
  15. data/lib/asciidoctor-diagram/bpmn/converter.rb +62 -0
  16. data/lib/asciidoctor-diagram/bpmn/extension.rb +14 -0
  17. data/lib/asciidoctor-diagram/bpmn.rb +7 -0
  18. data/lib/asciidoctor-diagram/diagram_converter.rb +19 -0
  19. data/lib/asciidoctor-diagram/diagram_processor.rb +320 -0
  20. data/lib/asciidoctor-diagram/diagram_source.rb +275 -0
  21. data/lib/asciidoctor-diagram/ditaa/converter.rb +86 -0
  22. data/lib/asciidoctor-diagram/ditaa/extension.rb +6 -28
  23. data/lib/asciidoctor-diagram/ditaa.rb +3 -4
  24. data/lib/asciidoctor-diagram/erd/converter.rb +31 -0
  25. data/lib/asciidoctor-diagram/erd/extension.rb +14 -0
  26. data/lib/asciidoctor-diagram/erd.rb +7 -0
  27. data/lib/asciidoctor-diagram/gnuplot/converter.rb +63 -0
  28. data/lib/asciidoctor-diagram/gnuplot/extension.rb +14 -0
  29. data/lib/asciidoctor-diagram/gnuplot.rb +7 -0
  30. data/lib/asciidoctor-diagram/graphviz/converter.rb +32 -0
  31. data/lib/asciidoctor-diagram/graphviz/extension.rb +8 -10
  32. data/lib/asciidoctor-diagram/graphviz.rb +3 -4
  33. data/lib/asciidoctor-diagram/http/server.rb +127 -0
  34. data/lib/asciidoctor-diagram/lilypond/converter.rb +54 -0
  35. data/lib/asciidoctor-diagram/lilypond/extension.rb +14 -0
  36. data/lib/asciidoctor-diagram/lilypond.rb +7 -0
  37. data/lib/asciidoctor-diagram/meme/converter.rb +122 -0
  38. data/lib/asciidoctor-diagram/meme/extension.rb +28 -0
  39. data/lib/asciidoctor-diagram/meme.rb +6 -0
  40. data/lib/asciidoctor-diagram/mermaid/converter.rb +178 -0
  41. data/lib/asciidoctor-diagram/mermaid/extension.rb +14 -0
  42. data/lib/asciidoctor-diagram/mermaid.rb +7 -0
  43. data/lib/asciidoctor-diagram/msc/converter.rb +35 -0
  44. data/lib/asciidoctor-diagram/msc/extension.rb +14 -0
  45. data/lib/asciidoctor-diagram/msc.rb +7 -0
  46. data/lib/asciidoctor-diagram/nomnoml/converter.rb +25 -0
  47. data/lib/asciidoctor-diagram/nomnoml/extension.rb +14 -0
  48. data/lib/asciidoctor-diagram/nomnoml.rb +7 -0
  49. data/lib/asciidoctor-diagram/plantuml/converter.rb +115 -0
  50. data/lib/asciidoctor-diagram/plantuml/extension.rb +14 -20
  51. data/lib/asciidoctor-diagram/plantuml.rb +3 -5
  52. data/lib/asciidoctor-diagram/salt.rb +7 -0
  53. data/lib/asciidoctor-diagram/shaape/converter.rb +25 -0
  54. data/lib/asciidoctor-diagram/shaape/extension.rb +9 -11
  55. data/lib/asciidoctor-diagram/shaape.rb +3 -5
  56. data/lib/asciidoctor-diagram/smcat/converter.rb +44 -0
  57. data/lib/asciidoctor-diagram/smcat/extension.rb +14 -0
  58. data/lib/asciidoctor-diagram/smcat.rb +7 -0
  59. data/lib/asciidoctor-diagram/svgbob/converter.rb +25 -0
  60. data/lib/asciidoctor-diagram/svgbob/extension.rb +14 -0
  61. data/lib/asciidoctor-diagram/svgbob.rb +7 -0
  62. data/lib/asciidoctor-diagram/syntrax/converter.rb +55 -0
  63. data/lib/asciidoctor-diagram/syntrax/extension.rb +14 -0
  64. data/lib/asciidoctor-diagram/syntrax.rb +7 -0
  65. data/lib/asciidoctor-diagram/tikz/converter.rb +56 -0
  66. data/lib/asciidoctor-diagram/tikz/extension.rb +14 -0
  67. data/lib/asciidoctor-diagram/tikz.rb +7 -0
  68. data/lib/asciidoctor-diagram/umlet/converter.rb +24 -0
  69. data/lib/asciidoctor-diagram/umlet/extension.rb +14 -0
  70. data/lib/asciidoctor-diagram/umlet.rb +7 -0
  71. data/lib/asciidoctor-diagram/util/binaryio.rb +20 -0
  72. data/lib/asciidoctor-diagram/util/cli.rb +81 -0
  73. data/lib/asciidoctor-diagram/util/cli_generator.rb +73 -22
  74. data/lib/asciidoctor-diagram/util/gif.rb +21 -0
  75. data/lib/asciidoctor-diagram/util/java.rb +95 -1
  76. data/lib/asciidoctor-diagram/util/java_jruby.rb +14 -20
  77. data/lib/asciidoctor-diagram/util/java_socket.rb +175 -0
  78. data/lib/asciidoctor-diagram/util/pdf.rb +10 -0
  79. data/lib/asciidoctor-diagram/util/platform.rb +97 -0
  80. data/lib/asciidoctor-diagram/util/png.rb +1 -0
  81. data/lib/asciidoctor-diagram/util/svg.rb +4 -3
  82. data/lib/asciidoctor-diagram/util/which.rb +15 -9
  83. data/lib/asciidoctor-diagram/vega/converter.rb +47 -0
  84. data/lib/asciidoctor-diagram/vega/extension.rb +14 -0
  85. data/lib/asciidoctor-diagram/vega.rb +10 -0
  86. data/lib/asciidoctor-diagram/version.rb +1 -1
  87. data/lib/asciidoctor-diagram/wavedrom/converter.rb +50 -0
  88. data/lib/asciidoctor-diagram/wavedrom/extension.rb +14 -0
  89. data/lib/asciidoctor-diagram/wavedrom.rb +7 -0
  90. data/lib/asciidoctor-diagram.rb +22 -5
  91. data/lib/batik-all-1.10.jar +0 -0
  92. data/lib/ditaa-1.3.14.jar +0 -0
  93. data/lib/ditaamini-0.12.jar +0 -0
  94. data/lib/jlatexmath-minimal-1.0.5.jar +0 -0
  95. data/lib/plantuml-1.3.14.jar +0 -0
  96. data/lib/plantuml.jar +0 -0
  97. data/lib/server-1.3.14.jar +0 -0
  98. data/spec/a2s_spec.rb +167 -0
  99. data/spec/blockdiag_spec.rb +55 -24
  100. data/spec/bpmn-example.xml +44 -0
  101. data/spec/bpmn_spec.rb +96 -0
  102. data/spec/ditaa_spec.rb +150 -15
  103. data/spec/erd_spec.rb +289 -0
  104. data/spec/gnuplot_spec.rb +478 -0
  105. data/spec/graphviz_spec.rb +20 -20
  106. data/spec/lilypond_spec.rb +151 -0
  107. data/spec/man.jpg +0 -0
  108. data/spec/meme_spec.rb +67 -0
  109. data/spec/mermaid_spec.rb +336 -0
  110. data/spec/msc_spec.rb +230 -0
  111. data/spec/nomnoml_spec.rb +170 -0
  112. data/spec/plantuml_spec.rb +895 -54
  113. data/spec/shaape_spec.rb +25 -24
  114. data/spec/smcat_spec.rb +164 -0
  115. data/spec/svgbob_spec.rb +167 -0
  116. data/spec/syntrax_spec.rb +228 -0
  117. data/spec/test_helper.rb +88 -9
  118. data/spec/tikz_spec.rb +127 -0
  119. data/spec/umlet_spec.rb +85 -0
  120. data/spec/vega_spec.rb +241 -0
  121. data/spec/wavedrom_spec.rb +214 -0
  122. metadata +130 -35
  123. data/lib/asciidoctor-diagram/plantuml/generator.rb +0 -46
  124. data/lib/asciidoctor-diagram/util/diagram.rb +0 -220
  125. data/lib/asciidoctor-diagram/util/java_rjb.rb +0 -90
  126. 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