asciidoctor-diagram 1.3.0.preview.1 → 1.3.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: ec30717e348b864e01a962749e47514a55c1106c
4
- data.tar.gz: 3d85e72167829121d471faa6f20586cc2eb1eab4
3
+ metadata.gz: 3a2f204cc0c29acb26136512bd4a8d50b94eb19d
4
+ data.tar.gz: 0115d195b3546f4ab1a1967a45891769b4d28fb5
5
5
  SHA512:
6
- metadata.gz: daedbb3ba7ef2bc7517ba7c67052a6ee9e468adf5a5ca710bbc3ca80f3dbdf078748b679696d95f791121e651f920d25bdf039e88ace183fde759f32c18b75ba
7
- data.tar.gz: ff54af102f2a7d21eefa591f4db10985826c97f2eff4044bb305a91f2c0cc888f5d965fddea4bba4f75ad96ed03baa2f5bcca8edf6e952d664c5cd8663183cd7
6
+ metadata.gz: 8bedbbef25acb0ea9d0617b67521f8b92f57a66a730f58b35090e221936cc3ee3a1ff76af260f78f7ccec6e88467188744b048e9997701c46d667e37f2f142f6
7
+ data.tar.gz: fc0668cb0299126c80f392efccba75c8eda819a835e69b3c27c99fd57c50d1d4b312271bba3cbae7cbebf34a23dbd56a7adfd470a7a48fe8079fb3b4ae210345
data/CHANGELOG.adoc CHANGED
@@ -8,7 +8,15 @@ Enhancements::
8
8
  * Add support for Actdiag diagrams (requires Actdiag to be installed separately)
9
9
  * Add support for Seqdiag diagrams (requires Seqdiag to be installed separately)
10
10
  * Add support for Nwdiag diagrams (requires Nwdiag to be installed separately)
11
- * Updated PlantUML to revision 8004 (23/08/2014)
11
+ * Updated PlantUML to revision 8021 (14/03/2015)
12
+ * Remove dependency on RJB to simplify installation
13
+ * Add diagram scaling support using the scale attribute
14
+ * Add Ditaa command line option support using the options attribute
15
+
16
+ Bug Fixes::
17
+
18
+ * Issue #49: Resolve issue that made Java 6 installation prompt appear on Mac OS X
19
+ * Issue #51: Resolved issue where PNG files generated by Graphviz were not processed correctly on Windows
12
20
 
13
21
  == 1.2.0
14
22
 
data/README.adoc CHANGED
@@ -14,6 +14,12 @@ The extension takes care of running the diagram processor to generate the images
14
14
 
15
15
  This gem was inspired by the https://code.google.com/p/asciidoc-plantuml/[AsciiDoc PlantUML filter] for AsciiDoc Python.
16
16
 
17
+ == Status
18
+
19
+ image:https://travis-ci.org/asciidoctor/asciidoctor-diagram.svg?branch=master["Linux Build Status", link="https://travis-ci.org/asciidoctor/asciidoctor-diagram"]
20
+
21
+ image:https://ci.appveyor.com/api/projects/status/4r4gkk5gy3igs6nh/branch/master?svg=true["Windows Build Status", link="https://ci.appveyor.com/project/asciidoctor/asciidoctor-diagram"]
22
+
17
23
  == Installation
18
24
 
19
25
  Add this line to your application's Gemfile:
@@ -91,6 +97,12 @@ The diagram blocks support the following attributes:
91
97
  . `target` (or 2nd position): the basename of the file to generate. If not specified an auto-generated name will be used.
92
98
  . `format` (or 3rd position): the output format. PlantUML blocks support `png`, `svg` and `txt`. Graphviz, Shaape and BlockDiag support `png` and `svg`. Ditaa only supports `png`.
93
99
 
100
+ Once you have all of this in place and your original AsciiDoc file contains a diagram block, it's time to build it into an HTML file with Asciidoctor Diagram magic!
101
+ When executing Asciidoctor, you must reference the Adciidoctor Diagram library, otherwise your diagam blocks won't be recognized as such. When executing Asciidoctor from the command line, do it using the -r parameter to reference this external library:
102
+
103
+ $ asciidoctor -r asciidoctor-diagram doc.adoc
104
+
105
+
94
106
  == Contributing
95
107
 
96
108
  . Fork it
data/Rakefile CHANGED
@@ -1,13 +1,14 @@
1
1
  require 'rubygems/package_task'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
- RSpec::Core::RakeTask.new(:test)
4
+ test = RSpec::Core::RakeTask.new(:test)
5
+
6
+ if ENV['APPVEYOR']
7
+ # Exclude diagram types that require external libraries that are difficult to build on Windows.
8
+ test.exclude_pattern = 'spec/**/{blockdiag,shaape}_spec.rb'
9
+ end
5
10
 
6
11
  task :default => :test
7
12
 
8
- ['ruby', 'java'].map do |platform|
9
- $platform = platform
10
- Gem::Specification.reset
11
- spec = Gem::Specification.load('asciidoctor-diagram.gemspec')
12
- Gem::PackageTask.new(spec) { |task| }
13
- end
13
+ spec = Gem::Specification.load('asciidoctor-diagram.gemspec')
14
+ Gem::PackageTask.new(spec) { |task| }
@@ -1,3 +1,5 @@
1
+ require 'set'
2
+
1
3
  require_relative '../extensions'
2
4
  require_relative '../util/java'
3
5
 
@@ -5,31 +7,81 @@ module Asciidoctor
5
7
  module Diagram
6
8
  # @private
7
9
  module Ditaa
8
- DITAA_JAR_PATH = File.expand_path File.join('../..', 'ditaamini0_9.jar'), File.dirname(__FILE__)
9
- Java.classpath << DITAA_JAR_PATH
10
+ JARS = ['ditaamini-0.10.jar'].map do |jar|
11
+ File.expand_path File.join('../..', jar), File.dirname(__FILE__)
12
+ end
13
+ Java.classpath.concat JARS
10
14
 
11
- def ditaa(code)
15
+ def ditaa(code, source)
12
16
  Java.load
13
17
 
14
- args = ['-e', 'UTF-8']
18
+ response = Java.send_request(
19
+ :url => '/ditaa',
20
+ :body => code,
21
+ :headers => {
22
+ 'X-Options' => source.options
23
+ }
24
+ )
25
+
26
+ unless response[:code] == 200
27
+ raise "Ditaa image generation failed: #{response[:reason]} #{response[:body]}"
28
+ end
29
+
30
+ response[:body]
31
+ end
15
32
 
16
- bytes = code.encode(Encoding::UTF_8).bytes.to_a
17
- bis = Java.new_object(Java.java.io.ByteArrayInputStream, '[B', Java.array_to_java_array(bytes, :byte))
18
- bos = Java.new_object(Java.java.io.ByteArrayOutputStream)
19
- result_code = Java.org.stathissideris.ascii2image.core.CommandLineConverter.convert(Java.array_to_java_array(args, :string), bis, bos)
20
- bis.close
21
- bos.close
33
+ def self.included(mod)
34
+ mod.register_format(:png, :image) do |c, _, source|
35
+ ditaa(c.to_s, source)
36
+ end
37
+ end
22
38
 
23
- result = Java.string_from_java_bytes(bos.toByteArray)
39
+ def create_source(parent, reader, attributes)
40
+ source = super(parent, reader, attributes)
41
+ source.extend DitaaSource
24
42
 
25
- raise "Ditaa image generation failed: #{result}" unless result_code == 0
43
+ source.init_ditaa_options(parent, attributes)
26
44
 
27
- result
45
+ source
28
46
  end
29
47
 
30
- def self.included(mod)
31
- mod.register_format(:png, :image) do |c|
32
- ditaa(c.to_s)
48
+ module DitaaSource
49
+ attr_reader :options
50
+
51
+ OPTIONS = {
52
+ 'scale' => lambda { |o, v| o << '--scale' << v if v },
53
+ 'tabs' => lambda { |o, v| o << '--tabs' << v if v },
54
+ 'background' => lambda { |o, v| o << '--background' << v if v },
55
+ 'antialias' => lambda { |o, v| o << '--no-antialias' if v == 'false' },
56
+ 'separation' => lambda { |o, v| o << '--no-separation' if v == 'false'},
57
+ 'round-corners' => lambda { |o, v| o << '--round-corners' if v == 'true'},
58
+ 'shadows' => lambda { |o, v| o << '--no-shadows' if v == 'false'},
59
+ 'debug' => lambda { |o, v| o << '--debug' if v == 'true'},
60
+ 'fixed-slope' => lambda { |o, v| o << '--fixed-slope' if v == 'true'},
61
+ 'transparent' => lambda { |o, v| o << '--transparent' if v == 'true'}
62
+ }
63
+
64
+ def init_ditaa_options(parent, attributes)
65
+ global_attributes = parent.document.attributes
66
+
67
+ options = []
68
+
69
+ OPTIONS.keys.each do |key|
70
+ value = attributes.delete(key) || global_attributes["ditaa-option-#{key}"]
71
+ OPTIONS[key].call(options, value)
72
+ end
73
+
74
+ @options = options.join(' ')
75
+ end
76
+
77
+ def should_process?(image_file, image_metadata)
78
+ super(image_file, image_metadata) || image_metadata['options'] != @options
79
+ end
80
+
81
+ def create_image_metadata
82
+ metadata = super
83
+ metadata['options'] = @options
84
+ metadata
33
85
  end
34
86
  end
35
87
  end
@@ -27,6 +27,8 @@ module Asciidoctor
27
27
  # File.read(source.to_s)
28
28
  # end
29
29
  def register_format(format, type, &block)
30
+ raise "Unsupported output type: #{type}" unless type == :image || type == :literal
31
+
30
32
  unless @default_format
31
33
  @default_format = format
32
34
  end
@@ -35,7 +37,7 @@ module Asciidoctor
35
37
  :type => type,
36
38
  :generator => block
37
39
  }
38
- end
40
+ end
39
41
 
40
42
  # Returns the registered formats
41
43
  #
@@ -82,9 +84,9 @@ module Asciidoctor
82
84
  # @param attributes [Hash] the attributes of the block or block macro
83
85
  # @return [Asciidoctor::AbstractBlock] a new block that replaces the original block or block macro
84
86
  def process(parent, reader_or_target, attributes)
85
- source = create_source(parent, reader_or_target, attributes)
87
+ source = create_source(parent, reader_or_target, attributes.dup)
86
88
 
87
- format = attributes.delete('format') || self.class.default_format
89
+ format = source.attributes.delete('format') || self.class.default_format
88
90
  format = format.to_sym if format.respond_to?(:to_sym)
89
91
 
90
92
  raise "Format undefined" unless format
@@ -93,13 +95,19 @@ module Asciidoctor
93
95
 
94
96
  raise "#{self.class.name} does not support output format #{format}" unless generator_info
95
97
 
96
- case generator_info[:type]
97
- when :image
98
- create_image_block(parent, source, attributes, format, generator_info)
99
- when :literal
100
- create_literal_block(parent, source, attributes, generator_info)
101
- else
102
- raise "Unsupported output format: #{format}"
98
+ begin
99
+ case generator_info[:type]
100
+ when :literal
101
+ create_literal_block(parent, source, generator_info)
102
+ else
103
+ create_image_block(parent, source, format, generator_info)
104
+ end
105
+ rescue => e
106
+ text = "Failed to generate image: #{e.message}"
107
+ warn %(asciidoctor-diagram: ERROR: #{text})
108
+ text << "\n"
109
+ text << source.code
110
+ Asciidoctor::Block.new parent, :listing, :source => text, :attributes => attributes
103
111
  end
104
112
  end
105
113
 
@@ -121,10 +129,9 @@ module Asciidoctor
121
129
  end
122
130
 
123
131
  private
124
- def create_image_block(parent, source, attributes, format, generator_info)
132
+ def create_image_block(parent, source, format, generator_info)
125
133
  image_name = "#{source.image_name}.#{format}"
126
- outdir = parent.document.attr('imagesoutdir') || parent.document.attr('outdir')
127
- image_dir = parent.normalize_system_path parent.document.attr 'imagesdir', outdir
134
+ image_dir = image_output_dir(parent)
128
135
  image_file = parent.normalize_system_path image_name, image_dir
129
136
  metadata_file = parent.normalize_system_path "#{image_name}.cache", image_dir
130
137
 
@@ -134,10 +141,12 @@ module Asciidoctor
134
141
  metadata = {}
135
142
  end
136
143
 
144
+ image_attributes = source.attributes
145
+
137
146
  if !File.exists?(image_file) || source.should_process?(image_file, metadata)
138
147
  params = IMAGE_PARAMS[format]
139
148
 
140
- result = instance_exec(source, parent, &generator_info[:generator])
149
+ result = instance_exec(source, parent, source, &generator_info[:generator])
141
150
 
142
151
  result.force_encoding(params[:encoding])
143
152
 
@@ -149,16 +158,29 @@ module Asciidoctor
149
158
  File.open(metadata_file, 'w') { |f| JSON.dump(metadata, f) }
150
159
  end
151
160
 
152
- image_attributes = attributes.dup
153
161
  image_attributes['target'] = image_name
162
+
163
+ scale = image_attributes['scale']
164
+ if scalematch = /(\d+(?:\.\d+))/.match(scale)
165
+ scale_factor = scalematch[1].to_f
166
+ else
167
+ scale_factor = 1.0
168
+ end
169
+
154
170
  if /html/i =~ parent.document.attributes['backend']
155
- image_attributes['width'] ||= metadata['width'] if metadata['width']
156
- image_attributes['height'] ||= metadata['height'] if metadata['height']
171
+ image_attributes.delete('scale')
172
+ if metadata['width'] && !image_attributes['width']
173
+ image_attributes['width'] = (metadata['width'] * scale_factor).to_i
174
+ end
175
+ if metadata['height'] && !image_attributes['height']
176
+ image_attributes['height'] = (metadata['height'] * scale_factor).to_i
177
+ end
157
178
  end
158
- image_attributes['alt'] ||= if title_text = attributes['title']
179
+
180
+ image_attributes['alt'] ||= if title_text = image_attributes['title']
159
181
  title_text
160
- elsif target = attributes['target']
161
- (File.basename target, (File.extname target) || '').tr '_-', ' '
182
+ elsif target = image_attributes['target']
183
+ (File.basename(target, File.extname(target)) || '').tr '_-', ' '
162
184
  else
163
185
  'Diagram'
164
186
  end
@@ -166,8 +188,33 @@ module Asciidoctor
166
188
  Asciidoctor::Block.new parent, :image, :content_model => :empty, :attributes => image_attributes
167
189
  end
168
190
 
169
- def create_literal_block(parent, source, attributes, generator_info)
170
- literal_attributes = attributes.dup
191
+ def scale(size, factor)
192
+ if match = /(\d+)(.*)/.match(size)
193
+ value = match[1].to_i
194
+ unit = match[2]
195
+ (value * factor).to_i.to_s + unit
196
+ else
197
+ size
198
+ end
199
+ end
200
+
201
+ def image_output_dir(parent)
202
+ document = parent.document
203
+
204
+ images_dir = document.attr('imagesoutdir')
205
+
206
+ if images_dir
207
+ base_dir = nil
208
+ else
209
+ base_dir = document.attr('outdir') || (document.respond_to?(:options) && document.options[:to_dir])
210
+ images_dir = document.attr('imagesdir')
211
+ end
212
+
213
+ parent.normalize_system_path(images_dir, base_dir)
214
+ end
215
+
216
+ def create_literal_block(parent, source, generator_info)
217
+ literal_attributes = source.attributes
171
218
  literal_attributes.delete('target')
172
219
 
173
220
  result = instance_exec(source, parent, &generator_info[:generator])
@@ -207,7 +254,7 @@ module Asciidoctor
207
254
  #
208
255
  # @return [FileSource] a FileSource
209
256
  def create_source(parent, target, attributes)
210
- FileSource.new(File.expand_path(target, parent.document.attributes['docdir']), attributes)
257
+ FileSource.new(File.expand_path(target, parent.document.base_dir), attributes)
211
258
  end
212
259
  end
213
260
 
@@ -256,6 +303,8 @@ module Asciidoctor
256
303
  class BasicSource
257
304
  include DiagramSource
258
305
 
306
+ attr_reader :attributes
307
+
259
308
  def initialize(attributes)
260
309
  @attributes = attributes
261
310
  end
@@ -317,7 +366,9 @@ module Asciidoctor
317
366
  end
318
367
 
319
368
  def code
320
- @code ||= File.read(@file_name)
369
+ lines = File.readlines(@file_name)
370
+ lines = ::Asciidoctor::Helpers.normalize_lines(lines)
371
+ @code ||= lines.join("\n")
321
372
  end
322
373
  end
323
374
  end
@@ -6,70 +6,80 @@ module Asciidoctor
6
6
  module PlantUml
7
7
  private
8
8
 
9
- PLANTUML_JAR_PATH = File.expand_path File.join('../..', 'plantuml.jar'), File.dirname(__FILE__)
10
- Java.classpath << PLANTUML_JAR_PATH
11
-
12
- def plantuml(parent, code, tag, *flags)
13
- unless @graphvizdot
14
- @graphvizdot = parent.document.attributes['dot']
15
- @graphvizdot = ::Asciidoctor::Diagram.which('dot') unless @graphvizdot && File.executable?(@graphvizdot)
16
- raise "Could not find the Graphviz 'dot' executable in PATH; add it to the PATH or specify its location using the 'dot' document attribute" unless @graphvizdot
17
- end
9
+ JARS = ['plantuml.jar'].map do |jar|
10
+ File.expand_path File.join('../..', jar), File.dirname(__FILE__)
11
+ end
12
+ Java.classpath.concat JARS
18
13
 
14
+ def plantuml(parent, code, tag, mime_type)
19
15
  Java.load
20
16
 
21
17
  code = "@start#{tag}\n#{code}\n@end#{tag}" unless code.index "@start#{tag}"
22
18
 
23
- flags += ['-charset', 'UTF-8', '-failonerror', '-graphvizdot', @graphvizdot]
19
+ headers = {
20
+ 'Accept' => mime_type
21
+ }
24
22
 
25
23
  config_file = parent.document.attributes['plantumlconfig']
26
24
  if config_file
27
- flags += ['-config', File.expand_path(config_file, parent.document.attributes['docdir'])]
25
+ headers['X-PlantUML-Config'] = File.expand_path(config_file, parent.document.attributes['docdir'])
28
26
  end
29
27
 
30
- option = Java.new_object( Java.net.sourceforge.plantuml.Option, '[Ljava.lang.String;', Java.array_to_java_array(flags, :string) )
31
- source_reader = Java.new_object( Java.net.sourceforge.plantuml.SourceStringReader,
32
- 'Lnet.sourceforge.plantuml.preproc.Defines;Ljava.lang.String;Ljava.util.List;',
33
- Java.new_object( Java.net.sourceforge.plantuml.preproc.Defines ),
34
- code,
35
- option.getConfig()
28
+ response = Java.send_request(
29
+ :url => '/plantuml',
30
+ :body => code,
31
+ :headers => headers
36
32
  )
37
33
 
38
- bos = Java.new_object( Java.java.io.ByteArrayOutputStream )
39
- ps = Java.new_object( Java.java.io.PrintStream, 'Ljava.io.OutputStream;', bos )
40
- source_reader.generateImage(ps, 0, option.getFileFormatOption())
41
- ps.close
42
- Java.string_from_java_bytes(bos.toByteArray)
43
- end
44
-
45
- def config_args(parent)
46
- config_args = []
47
- config = parent.document.attributes['plantumlconfig']
48
- if config
49
- config_args += ['-config', File.expand_path(config, parent.document.attributes['docdir'])]
34
+ unless response[:code] == 200
35
+ raise "PlantUML image generation failed: #{response[:reason]} #{response[:body]}"
50
36
  end
51
37
 
52
- config_args
38
+ response[:body]
53
39
  end
54
40
 
55
41
  def self.included(mod)
56
42
  mod.register_format(:png, :image) do |c, p|
57
- plantuml(p, c.to_s, 'uml', *config_args(p))
43
+ plantuml(p, c.to_s, mod.tag, 'image/png')
58
44
  end
59
45
  mod.register_format(:svg, :image) do |c, p|
60
- plantuml(p, c.to_s, 'uml', '-tsvg', *config_args(p))
46
+ plantuml(p, c.to_s, mod.tag, 'image/svg+xml')
61
47
  end
62
48
  mod.register_format(:txt, :literal) do |c, p|
63
- plantuml(p, c.to_s, 'uml', '-tutxt', *config_args(p))
49
+ plantuml(p, c.to_s, mod.tag, 'text/plain;charset=utf-8')
64
50
  end
65
51
  end
66
52
  end
67
53
 
68
54
  class PlantUmlBlockProcessor < Extensions::DiagramBlockProcessor
55
+ def self.tag
56
+ 'uml'
57
+ end
58
+
69
59
  include PlantUml
70
60
  end
71
61
 
72
62
  class PlantUmlBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
63
+ def self.tag
64
+ 'uml'
65
+ end
66
+
67
+ include PlantUml
68
+ end
69
+
70
+ class SaltBlockProcessor < Extensions::DiagramBlockProcessor
71
+ def self.tag
72
+ 'salt'
73
+ end
74
+
75
+ include PlantUml
76
+ end
77
+
78
+ class SaltBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
79
+ def self.tag
80
+ 'salt'
81
+ end
82
+
73
83
  include PlantUml
74
84
  end
75
85
  end
@@ -0,0 +1,9 @@
1
+ require 'asciidoctor/extensions'
2
+ require_relative 'version'
3
+
4
+ Asciidoctor::Extensions.register do
5
+ require_relative 'plantuml/extension'
6
+
7
+ block Asciidoctor::Diagram::SaltBlockProcessor, :salt
8
+ block_macro Asciidoctor::Diagram::SaltBlockMacroProcessor, :salt
9
+ end
@@ -31,7 +31,7 @@ module Asciidoctor
31
31
 
32
32
  raise "#{tool} image generation failed" unless result_code == 0
33
33
 
34
- File.read(target_file.path)
34
+ File.binread(target_file.path)
35
35
  ensure
36
36
  target_file.unlink
37
37
  end
@@ -1,5 +1,81 @@
1
+ module Asciidoctor
2
+ module Diagram
3
+ # @private
4
+ module Java
5
+ def self.classpath
6
+ @classpath ||= [
7
+ File.expand_path(File.join('../..', 'asciidoctor-diagram-java-1.3.4.jar'), File.dirname(__FILE__))
8
+ ]
9
+ end
10
+
11
+ CRLF = "\r\n".encode(Encoding::US_ASCII)
12
+
13
+ def self.format_request(req, io)
14
+ io.set_encoding Encoding::US_ASCII
15
+ io.write "POST #{req[:url]} HTTP/1.1"
16
+ io.write CRLF
17
+
18
+ headers = req[:headers]
19
+ if headers
20
+ headers.each_pair do |key, value|
21
+ io.write "#{key}: #{value}"
22
+ io.write CRLF
23
+ end
24
+ end
25
+
26
+ if req[:body]
27
+ unless headers && headers['Content-Length']
28
+ io.write 'Content-Length: '
29
+ io.write req[:body].bytesize.to_s
30
+ io.write CRLF
31
+ end
32
+
33
+ unless headers && headers['Content-Type']
34
+ io.write 'Content-Type: text/plain; charset='
35
+ io.write req[:body].encoding.name
36
+ io.write CRLF
37
+ end
38
+ end
39
+
40
+ io.write CRLF
41
+
42
+ io.set_encoding Encoding::BINARY
43
+ io.write req[:body]
44
+ end
45
+
46
+ STATUS_LINE = Regexp.new("HTTP/1.1 (\\d+) (.*)\r\n".encode(Encoding::US_ASCII))
47
+
48
+ def self.parse_response(io)
49
+ resp = {}
50
+
51
+ io.set_encoding Encoding::US_ASCII
52
+ status_line = io.readline(CRLF)
53
+ status_line_parts = STATUS_LINE.match status_line
54
+ resp[:code] = status_line_parts[1].to_i
55
+ resp[:reason] = status_line_parts[2]
56
+
57
+ headers = {}
58
+ until (header = io.readline(CRLF).strip).empty?
59
+ key, value = header.split ':', 2
60
+ headers[key] = value.strip
61
+ end
62
+
63
+ resp[:headers] = headers
64
+
65
+ content_length = headers['Content-Length']
66
+ if content_length
67
+ io.set_encoding Encoding::BINARY
68
+ resp[:body] = io.read(content_length.to_i)
69
+ end
70
+
71
+ resp
72
+ end
73
+ end
74
+ end
75
+ end
76
+
1
77
  if RUBY_PLATFORM == "java"
2
78
  require_relative 'java_jruby'
3
79
  else
4
- require_relative 'java_rjb'
80
+ require_relative 'java_socket'
5
81
  end
@@ -1,40 +1,33 @@
1
1
  require 'java'
2
+ require 'stringio'
2
3
 
3
4
  module Asciidoctor
4
5
  module Diagram
5
6
  # @private
6
7
  module Java
7
- def self.classpath
8
- @classpath ||= []
9
- end
10
-
11
8
  def self.load
12
9
  if @loaded
13
10
  return
14
11
  end
15
12
 
16
- classpath.each { |j| require j }
13
+ classpath.flatten.each { |j| require j }
17
14
  @loaded = true
18
15
  end
19
16
 
20
- def self.array_to_java_array(array, type)
21
- array.to_java(type)
22
- end
17
+ def self.send_request(req)
18
+ cp = ::Java.org.asciidoctor.diagram.CommandProcessor.new()
23
19
 
24
- def self.string_from_java_bytes(bytes)
25
- String.from_java_bytes(bytes)
26
- end
20
+ req_io = StringIO.new
21
+ format_request(req, req_io)
22
+ req_io.close
27
23
 
28
- def self.method_missing(meth, *args, &block)
29
- raise "No arguments expected" unless args.empty?
30
- raise "No block expected" if block
24
+ response = cp.processRequest(req_io.string.to_java_bytes)
31
25
 
32
- load
33
- ::Java.send(meth)
34
- end
26
+ resp_io = StringIO.new(String.from_java_bytes(response))
27
+ resp = parse_response(resp_io)
28
+ resp_io.close
35
29
 
36
- def self.new_object(java_class, signature = nil, *args)
37
- java_class.new(*args)
30
+ resp
38
31
  end
39
32
  end
40
33
  end
@@ -0,0 +1,107 @@
1
+ require 'socket'
2
+
3
+ require_relative 'which'
4
+
5
+ module Asciidoctor
6
+ module Diagram
7
+ # @private
8
+ module Java
9
+ class CommandServer
10
+ attr_reader :port
11
+
12
+ def initialize(java, classpath)
13
+ args = []
14
+ args << '-Djava.awt.headless=true'
15
+ args << '-cp'
16
+ args << classpath.flatten.join(File::PATH_SEPARATOR)
17
+ args << 'org.asciidoctor.diagram.CommandServer'
18
+
19
+ @server = IO.popen([java, *args])
20
+ @port = @server.readline.strip.to_i
21
+ @client = TCPSocket.new 'localhost', port
22
+ end
23
+
24
+ def io
25
+ @client
26
+ end
27
+
28
+ def shutdown
29
+ # KILL is a bit heavy handed, but TERM does not seem to shut down the JVM on Windows.
30
+ Process.kill('KILL', @server.pid)
31
+ end
32
+ end
33
+
34
+ def self.load
35
+ if @loaded
36
+ return
37
+ end
38
+
39
+ instance
40
+ @loaded = true
41
+ end
42
+
43
+ def self.instance
44
+ @java_exe ||= find_java
45
+ raise "Could not find Java executable" unless @java_exe
46
+
47
+ unless @command_server
48
+ server = CommandServer.new(@java_exe, classpath)
49
+ @command_server = server
50
+ at_exit do
51
+ server.shutdown
52
+ end
53
+ end
54
+
55
+ @command_server
56
+ end
57
+
58
+ def self.send_request(req)
59
+ svr = instance
60
+ headers = req[:headers] ||= {}
61
+ headers['Host'] = "localhost:#{svr.port}"
62
+ format_request(req, svr.io)
63
+ parse_response(svr.io)
64
+ end
65
+
66
+ private
67
+ def self.find_java
68
+ if /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
69
+ # Windows
70
+ path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram.which('java')
71
+ elsif /darwin/ =~ RUBY_PLATFORM
72
+ # Mac
73
+ path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(`/usr/libexec/java_home`.strip, 'bin/java') || ::Asciidoctor::Diagram.which('java')
74
+ else
75
+ # Other unix-like system
76
+ path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram.which('java')
77
+ end
78
+ end
79
+
80
+ def self.path_to(java_home, java_binary)
81
+ exe_path = File.expand_path(java_binary, java_home)
82
+ if File.executable?(exe_path)
83
+ exe_path
84
+ else
85
+ nil
86
+ end
87
+ end
88
+
89
+ def self.registry_lookup
90
+ key_re = /^HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\.*\\([0-9\.]+)/
91
+ value_re = /\s*JavaHome\s*REG_SZ\s*(.*)/
92
+ result = `reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft" /s /v JavaHome`.lines.map { |l| l.strip }
93
+ vms = result.each_slice(3).map do |_, key, value|
94
+ key_match = key_re.match(key)
95
+ value_match = value_re.match(value)
96
+ if key_match && value_match
97
+ [key_match[1].split('.').map { |v| v.to_i }, value_match[1]]
98
+ else
99
+ nil
100
+ end
101
+ end.reject { |v| v.nil? }.sort_by { |v| v[0] }
102
+ java_exes = vms.map { |version, path| File.expand_path('bin/java.exe', path) }.select { |exe| File.executable?(exe) }
103
+ java_exes && java_exes[0]
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module Diagram
3
- VERSION = "1.3.0.preview.1"
3
+ VERSION = "1.3.0"
4
4
  end
5
5
  end
@@ -2,4 +2,5 @@ require 'asciidoctor-diagram/blockdiag'
2
2
  require 'asciidoctor-diagram/ditaa'
3
3
  require 'asciidoctor-diagram/graphviz'
4
4
  require 'asciidoctor-diagram/plantuml'
5
+ require 'asciidoctor-diagram/salt'
5
6
  require 'asciidoctor-diagram/shaape'
Binary file
data/lib/plantuml.jar CHANGED
Binary file
data/spec/ditaa_spec.rb CHANGED
@@ -118,4 +118,72 @@ Doc Writer <doc@example.com>
118
118
  expect(target).to match /\.png$/
119
119
  expect(File.exists?(target)).to be true
120
120
  end
121
+
122
+ it "should support ditaa options as attributes" do
123
+ doc = <<-eos
124
+ :ditaa-option-antialias: false
125
+ :ditaa-option-round-corners: true
126
+ = Hello, PlantUML!
127
+ Doc Writer <doc@example.com>
128
+
129
+ == First Section
130
+
131
+ [ditaa, shadows=false, separation=false, round-corners=false, scale=2.3]
132
+ ----
133
+ +--------+ +-------+ +-------+
134
+ | | --+ ditaa +--> | |
135
+ | Text | +-------+ |diagram|
136
+ |Document| |!magic!| | |
137
+ | {d}| | | | |
138
+ +---+----+ +-------+ +-------+
139
+ : ^
140
+ | Lots of work |
141
+ +-------------------------+
142
+ ----
143
+ eos
144
+
145
+ d = Asciidoctor.load StringIO.new(doc)
146
+ expect(d).to_not be_nil
147
+
148
+ b = d.find { |b| b.context == :image }
149
+ expect(b).to_not be_nil
150
+ target = b.attributes['target']
151
+ expect(target).to match /\.png$/
152
+ expect(File.exists?(target)).to be true
153
+ end
154
+
155
+ it "should regenerate images when options change" do
156
+ doc = <<-eos
157
+ = Hello, PlantUML!
158
+ Doc Writer <doc@example.com>
159
+
160
+ == First Section
161
+
162
+ [ditaa, {opts}]
163
+ ----
164
+ +--------+ +-------+ +-------+
165
+ | | --+ ditaa +--> | |
166
+ | Text | +-------+ |diagram|
167
+ |Document| |!magic!| | |
168
+ | {d}| | | | |
169
+ +---+----+ +-------+ +-------+
170
+ : ^
171
+ | Lots of work |
172
+ +-------------------------+
173
+ ----
174
+ eos
175
+
176
+ d = Asciidoctor.load StringIO.new(doc.sub('{opts}', 'shadow=false'))
177
+ b = d.find { |b| b.context == :image }
178
+ target = b.attributes['target']
179
+ mtime1 = File.mtime(target)
180
+
181
+ sleep 1
182
+
183
+ d = Asciidoctor.load StringIO.new(doc.sub('{opts}', 'round-corners=true'))
184
+
185
+ mtime2 = File.mtime(target)
186
+
187
+ expect(mtime2).to be > mtime1
188
+ end
121
189
  end
@@ -297,6 +297,31 @@ Foo1 -> Foo2 : To boundary
297
297
  expect(File.exists?(File.expand_path(target, 'foo'))).to be true
298
298
  end
299
299
 
300
+ it "should write files to imagesoutdir if set" do
301
+ doc = <<-eos
302
+ = Hello, PlantUML!
303
+ Doc Writer <doc@example.com>
304
+
305
+ == First Section
306
+
307
+ [plantuml, format="svg"]
308
+ ----
309
+ actor Foo1
310
+ boundary Foo2
311
+ Foo1 -> Foo2 : To boundary
312
+ ----
313
+ eos
314
+
315
+ d = Asciidoctor.load StringIO.new(doc), {:attributes => {'imagesoutdir' => 'bar', 'outdir' => 'foo'}}
316
+ b = d.find { |b| b.context == :image }
317
+
318
+ target = b.attributes['target']
319
+ expect(target).to_not be_nil
320
+ expect(File.exists?(target)).to be false
321
+ expect(File.exists?(File.expand_path(target, 'bar'))).to be true
322
+ expect(File.exists?(File.expand_path(target, 'foo'))).to be false
323
+ end
324
+
300
325
  it "should omit width/height attributes when generating docbook" do
301
326
  doc = <<-eos
302
327
  = Hello, PlantUML!
@@ -310,7 +335,7 @@ User -> (Start)
310
335
  ----
311
336
  eos
312
337
 
313
- d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'docbook5' }
338
+ d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'docbook5'}
314
339
  expect(d).to_not be_nil
315
340
 
316
341
  b = d.find { |b| b.context == :image }
@@ -322,4 +347,142 @@ User -> (Start)
322
347
  expect(b.attributes['width']).to be_nil
323
348
  expect(b.attributes['height']).to be_nil
324
349
  end
350
+
351
+ it "should support salt diagrams using salt block type" do
352
+ doc = <<-eos
353
+ = Hello, PlantUML!
354
+ Doc Writer <doc@example.com>
355
+
356
+ == First Section
357
+
358
+ [salt, format="png"]
359
+ ----
360
+ {
361
+ Just plain text
362
+ [This is my button]
363
+ () Unchecked radio
364
+ (X) Checked radio
365
+ [] Unchecked box
366
+ [X] Checked box
367
+ "Enter text here "
368
+ ^This is a droplist^
369
+ }
370
+ ----
371
+ eos
372
+
373
+ d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'docbook5'}
374
+ expect(d).to_not be_nil
375
+
376
+ b = d.find { |b| b.context == :image }
377
+ expect(b).to_not be_nil
378
+
379
+ target = b.attributes['target']
380
+ expect(File.exists?(target)).to be true
381
+
382
+ expect(b.attributes['width']).to be_nil
383
+ expect(b.attributes['height']).to be_nil
384
+ end
385
+
386
+ it "should support salt diagrams using plantuml block type" do
387
+ doc = <<-eos
388
+ = Hello, PlantUML!
389
+ Doc Writer <doc@example.com>
390
+
391
+ == First Section
392
+
393
+ [plantuml, format="png"]
394
+ ----
395
+ salt
396
+ {
397
+ Just plain text
398
+ [This is my button]
399
+ () Unchecked radio
400
+ (X) Checked radio
401
+ [] Unchecked box
402
+ [X] Checked box
403
+ "Enter text here "
404
+ ^This is a droplist^
405
+ }
406
+ ----
407
+ eos
408
+
409
+ d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'docbook5'}
410
+ expect(d).to_not be_nil
411
+
412
+ b = d.find { |b| b.context == :image }
413
+ expect(b).to_not be_nil
414
+
415
+ target = b.attributes['target']
416
+ expect(File.exists?(target)).to be true
417
+
418
+ expect(b.attributes['width']).to be_nil
419
+ expect(b.attributes['height']).to be_nil
420
+ end
421
+
422
+ it "should support salt diagrams containing tree widgets" do
423
+ doc = <<-eos
424
+ = Hello, PlantUML!
425
+ Doc Writer <doc@example.com>
426
+
427
+ == First Section
428
+
429
+ [plantuml, format="png"]
430
+ ----
431
+ salt
432
+ {
433
+ {T
434
+ +A
435
+ ++a
436
+ }
437
+ }
438
+ ----
439
+ eos
440
+
441
+ d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'docbook5'}
442
+ expect(d).to_not be_nil
443
+
444
+ b = d.find { |b| b.context == :image }
445
+ expect(b).to_not be_nil
446
+
447
+ target = b.attributes['target']
448
+ expect(File.exists?(target)).to be true
449
+
450
+ expect(b.attributes['width']).to be_nil
451
+ expect(b.attributes['height']).to be_nil
452
+ end
453
+
454
+ it "should support scaling diagrams" do
455
+ doc = <<-eos
456
+ = Hello, PlantUML!
457
+ Doc Writer <doc@example.com>
458
+
459
+ == First Section
460
+
461
+ [plantuml, format="png"]
462
+ ----
463
+ A -> B
464
+ ----
465
+ eos
466
+
467
+ scaled_doc = <<-eos
468
+ = Hello, PlantUML!
469
+ Doc Writer <doc@example.com>
470
+
471
+ == First Section
472
+
473
+ [plantuml, format="png", scale="1.5"]
474
+ ----
475
+ A -> B
476
+ ----
477
+ eos
478
+
479
+ d = Asciidoctor.load StringIO.new(doc), :attributes => {'backend' => 'html5'}
480
+ unscaled_image = d.find { |b| b.context == :image }
481
+
482
+ d = Asciidoctor.load StringIO.new(scaled_doc), :attributes => {'backend' => 'html5'}
483
+ scaled_image = d.find { |b| b.context == :image }
484
+
485
+ expect(scaled_image.attributes['width']).to be_within(1).of(unscaled_image.attributes['width'] * 1.5)
486
+ expect(scaled_image.attributes['height']).to be_within(1).of(unscaled_image.attributes['height'] * 1.5)
487
+ end
325
488
  end
data/spec/test_helper.rb CHANGED
@@ -30,7 +30,7 @@ module Asciidoctor
30
30
  end
31
31
 
32
32
  RSpec.configure do |c|
33
- TEST_DIR = 'testing'
33
+ TEST_DIR = File.expand_path('testing')
34
34
 
35
35
  c.before(:suite) do
36
36
  FileUtils.rm_r TEST_DIR if Dir.exists? TEST_DIR
@@ -45,12 +45,8 @@ RSpec.configure do |c|
45
45
  test_dir = File.expand_path(metadata[:description].gsub(/[^\w]+/, '_'), group_dir)
46
46
  Dir.mkdir(test_dir)
47
47
 
48
- old_wd = Dir.pwd
49
- Dir.chdir test_dir
50
- begin
48
+ Dir.chdir(test_dir) do
51
49
  example.run
52
- ensure
53
- Dir.chdir old_wd
54
50
  end
55
51
  end
56
52
  end
metadata CHANGED
@@ -1,85 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asciidoctor-diagram
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.preview.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pepijn Van Eeckhoudt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-02 00:00:00.000000000 Z
11
+ date: 2015-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: asciidoctor
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.5.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.5.0
69
- - !ruby/object:Gem::Dependency
70
- name: rjb
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: 1.4.8
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: 1.4.8
83
69
  description: Asciidoctor diagramming extension
84
70
  email:
85
71
  - pepijn@vaneeckhoudt.net
@@ -95,6 +81,7 @@ files:
95
81
  - examples/README.adoc
96
82
  - examples/design.adoc
97
83
  - examples/features.adoc
84
+ - lib/asciidoctor-diagram-java-1.3.4.jar
98
85
  - lib/asciidoctor-diagram.rb
99
86
  - lib/asciidoctor-diagram/blockdiag.rb
100
87
  - lib/asciidoctor-diagram/blockdiag/extension.rb
@@ -105,18 +92,19 @@ files:
105
92
  - lib/asciidoctor-diagram/graphviz/extension.rb
106
93
  - lib/asciidoctor-diagram/plantuml.rb
107
94
  - lib/asciidoctor-diagram/plantuml/extension.rb
95
+ - lib/asciidoctor-diagram/salt.rb
108
96
  - lib/asciidoctor-diagram/shaape.rb
109
97
  - lib/asciidoctor-diagram/shaape/extension.rb
110
98
  - lib/asciidoctor-diagram/util/binaryio.rb
111
99
  - lib/asciidoctor-diagram/util/cli_generator.rb
112
100
  - lib/asciidoctor-diagram/util/java.rb
113
101
  - lib/asciidoctor-diagram/util/java_jruby.rb
114
- - lib/asciidoctor-diagram/util/java_rjb.rb
102
+ - lib/asciidoctor-diagram/util/java_socket.rb
115
103
  - lib/asciidoctor-diagram/util/png.rb
116
104
  - lib/asciidoctor-diagram/util/svg.rb
117
105
  - lib/asciidoctor-diagram/util/which.rb
118
106
  - lib/asciidoctor-diagram/version.rb
119
- - lib/ditaamini0_9.jar
107
+ - lib/ditaamini-0.10.jar
120
108
  - lib/plantuml.jar
121
109
  - spec/blockdiag_spec.rb
122
110
  - spec/ditaa_spec.rb
@@ -134,17 +122,17 @@ require_paths:
134
122
  - lib
135
123
  required_ruby_version: !ruby/object:Gem::Requirement
136
124
  requirements:
137
- - - '>='
125
+ - - ">="
138
126
  - !ruby/object:Gem::Version
139
127
  version: '0'
140
128
  required_rubygems_version: !ruby/object:Gem::Requirement
141
129
  requirements:
142
- - - '>'
130
+ - - ">="
143
131
  - !ruby/object:Gem::Version
144
- version: 1.3.1
132
+ version: '0'
145
133
  requirements: []
146
134
  rubyforge_project:
147
- rubygems_version: 2.0.14
135
+ rubygems_version: 2.4.7
148
136
  signing_key:
149
137
  specification_version: 4
150
138
  summary: An extension for asciidoctor that adds support for UML diagram generation
@@ -1,91 +0,0 @@
1
- require 'rjb'
2
-
3
- module Asciidoctor
4
- module Diagram
5
- # @private
6
- module Java
7
- INITAWT_JAR_PATH = File.expand_path File.join('..', 'initawt.jar'), File.dirname(__FILE__)
8
-
9
- module Package
10
- def method_missing(meth, *args, &block)
11
- raise "No arguments expected" unless args.empty?
12
- raise "No block expected" if block
13
-
14
- name = meth.to_s
15
- @proxies ||= {}
16
- @proxies[name] ||= create_java_proxy(name)
17
- end
18
-
19
- private
20
-
21
- def create_java_proxy(name)
22
- qualified_name = @name ? "#{@name}.#{name}" : name
23
- if name =~ /^[[:upper:]]/
24
- Package.create_class(qualified_name)
25
- else
26
- Package.create_package(qualified_name)
27
- end
28
- end
29
-
30
- def self.create_class(name)
31
- ::Rjb.import(name)
32
- end
33
-
34
- def self.create_package(name)
35
- package = Module.new
36
- package.extend Package
37
- package.instance_variable_set :@name, name
38
- package.instance_variable_set :@parent, name
39
- package
40
- end
41
- end
42
-
43
- def self.classpath
44
- @classpath ||= []
45
- end
46
-
47
- def self.load
48
- if @loaded
49
- return
50
- end
51
-
52
- Rjb::load(classpath.join(File::PATH_SEPARATOR))
53
-
54
- # On OS X using AWT from JNI is extremely deadlock prone. Enabling AWT headless mode resolves this issue. We're
55
- # never actually going to display an AWT GUI, so this should be fairly safe.
56
- Rjb::import('java.lang.System').setProperty 'java.awt.headless', 'true'
57
-
58
- @loaded = true
59
- end
60
-
61
- def self.array_to_java_array(array, type)
62
- # Rjb does not require an explicit conversion of a Ruby Array containing Ruby Strings to a Ruby Array containing
63
- # Java Strings. It handles this implicitly when calling Java methods.
64
- array
65
- end
66
-
67
- def self.string_from_java_bytes(bytes)
68
- # Rjb implictly converts Java byte arrays to Ruby Strings so nothing needs to be done here
69
- bytes
70
- end
71
-
72
- def self.method_missing(meth, *args, &block)
73
- raise "No arguments expected" unless args.empty?
74
- raise "No block expected" if block
75
-
76
- load
77
-
78
- @root_package ||= Package.send(:create_package, nil)
79
- @root_package.send(meth, *args)
80
- end
81
-
82
- def self.new_object(java_class, signature = nil, *args)
83
- if signature
84
- java_class.new_with_sig(signature, *args)
85
- else
86
- java_class.new(*args)
87
- end
88
- end
89
- end
90
- end
91
- end
data/lib/ditaamini0_9.jar DELETED
Binary file