asciidoctor-diagram 1.5.19 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.adoc +71 -0
  3. data/README.adoc +66 -20
  4. data/examples/features.adoc +2 -2
  5. data/lib/asciidoctor-diagram.rb +5 -0
  6. data/lib/asciidoctor-diagram/a2s/converter.rb +59 -0
  7. data/lib/asciidoctor-diagram/a2s/extension.rb +6 -52
  8. data/lib/asciidoctor-diagram/blockdiag/converter.rb +37 -0
  9. data/lib/asciidoctor-diagram/blockdiag/extension.rb +9 -116
  10. data/lib/asciidoctor-diagram/bpmn.rb +7 -0
  11. data/lib/asciidoctor-diagram/bpmn/converter.rb +62 -0
  12. data/lib/asciidoctor-diagram/bpmn/extension.rb +14 -0
  13. data/lib/asciidoctor-diagram/bytefield.rb +7 -0
  14. data/lib/asciidoctor-diagram/bytefield/converter.rb +26 -0
  15. data/lib/asciidoctor-diagram/bytefield/extension.rb +14 -0
  16. data/lib/asciidoctor-diagram/diagram_converter.rb +23 -0
  17. data/lib/asciidoctor-diagram/diagram_processor.rb +374 -0
  18. data/lib/asciidoctor-diagram/diagram_source.rb +322 -0
  19. data/lib/asciidoctor-diagram/ditaa/converter.rb +90 -0
  20. data/lib/asciidoctor-diagram/ditaa/extension.rb +6 -71
  21. data/lib/asciidoctor-diagram/dpic.rb +7 -0
  22. data/lib/asciidoctor-diagram/dpic/converter.rb +30 -0
  23. data/lib/asciidoctor-diagram/dpic/extension.rb +14 -0
  24. data/lib/asciidoctor-diagram/erd/converter.rb +31 -0
  25. data/lib/asciidoctor-diagram/erd/extension.rb +6 -35
  26. data/lib/asciidoctor-diagram/gnuplot/converter.rb +63 -0
  27. data/lib/asciidoctor-diagram/gnuplot/extension.rb +6 -62
  28. data/lib/asciidoctor-diagram/graphviz/converter.rb +32 -0
  29. data/lib/asciidoctor-diagram/graphviz/extension.rb +6 -35
  30. data/lib/asciidoctor-diagram/http/converter.rb +99 -0
  31. data/lib/asciidoctor-diagram/http/server.rb +132 -0
  32. data/lib/asciidoctor-diagram/lilypond/converter.rb +54 -0
  33. data/lib/asciidoctor-diagram/lilypond/extension.rb +6 -53
  34. data/lib/asciidoctor-diagram/meme/converter.rb +122 -0
  35. data/lib/asciidoctor-diagram/meme/extension.rb +5 -107
  36. data/lib/asciidoctor-diagram/mermaid/converter.rb +192 -0
  37. data/lib/asciidoctor-diagram/mermaid/extension.rb +6 -159
  38. data/lib/asciidoctor-diagram/msc/converter.rb +35 -0
  39. data/lib/asciidoctor-diagram/msc/extension.rb +6 -36
  40. data/lib/asciidoctor-diagram/nomnoml/converter.rb +25 -0
  41. data/lib/asciidoctor-diagram/nomnoml/extension.rb +6 -28
  42. data/lib/asciidoctor-diagram/pikchr.rb +7 -0
  43. data/lib/asciidoctor-diagram/pikchr/converter.rb +26 -0
  44. data/lib/asciidoctor-diagram/pikchr/extension.rb +14 -0
  45. data/lib/asciidoctor-diagram/plantuml/converter.rb +117 -0
  46. data/lib/asciidoctor-diagram/plantuml/extension.rb +10 -119
  47. data/lib/asciidoctor-diagram/shaape/converter.rb +25 -0
  48. data/lib/asciidoctor-diagram/shaape/extension.rb +6 -28
  49. data/lib/asciidoctor-diagram/smcat/converter.rb +44 -0
  50. data/lib/asciidoctor-diagram/smcat/extension.rb +6 -42
  51. data/lib/asciidoctor-diagram/svgbob/converter.rb +49 -0
  52. data/lib/asciidoctor-diagram/svgbob/extension.rb +6 -28
  53. data/lib/asciidoctor-diagram/symbolator.rb +7 -0
  54. data/lib/asciidoctor-diagram/symbolator/converter.rb +23 -0
  55. data/lib/asciidoctor-diagram/symbolator/extension.rb +14 -0
  56. data/lib/asciidoctor-diagram/syntrax/converter.rb +58 -0
  57. data/lib/asciidoctor-diagram/syntrax/extension.rb +6 -51
  58. data/lib/asciidoctor-diagram/tikz/converter.rb +75 -0
  59. data/lib/asciidoctor-diagram/tikz/extension.rb +6 -60
  60. data/lib/asciidoctor-diagram/umlet/converter.rb +33 -0
  61. data/lib/asciidoctor-diagram/umlet/extension.rb +6 -28
  62. data/lib/asciidoctor-diagram/util/cli.rb +14 -3
  63. data/lib/asciidoctor-diagram/util/cli_generator.rb +19 -1
  64. data/lib/asciidoctor-diagram/util/gif.rb +2 -2
  65. data/lib/asciidoctor-diagram/util/java.rb +114 -1
  66. data/lib/asciidoctor-diagram/util/java_socket.rb +8 -120
  67. data/lib/asciidoctor-diagram/util/pdf.rb +2 -2
  68. data/lib/asciidoctor-diagram/util/png.rb +2 -2
  69. data/lib/asciidoctor-diagram/util/svg.rb +46 -19
  70. data/lib/asciidoctor-diagram/util/which.rb +0 -29
  71. data/lib/asciidoctor-diagram/vega/converter.rb +47 -0
  72. data/lib/asciidoctor-diagram/vega/extension.rb +6 -44
  73. data/lib/asciidoctor-diagram/version.rb +1 -1
  74. data/lib/asciidoctor-diagram/wavedrom/converter.rb +50 -0
  75. data/lib/asciidoctor-diagram/wavedrom/extension.rb +6 -54
  76. data/lib/ditaa-1.3.15.jar +0 -0
  77. data/lib/plantuml-1.3.15.jar +0 -0
  78. data/lib/plantuml.jar +0 -0
  79. data/lib/server-1.3.15.jar +0 -0
  80. data/spec/a2s_spec.rb +2 -140
  81. data/spec/blockdiag_spec.rb +2 -200
  82. data/spec/bpmn_spec.rb +56 -0
  83. data/spec/bytefield_spec.rb +92 -0
  84. data/spec/ditaa_spec.rb +37 -143
  85. data/spec/dpic_spec.rb +19 -0
  86. data/spec/erd_spec.rb +2 -199
  87. data/spec/gnuplot_spec.rb +2 -255
  88. data/spec/graphviz_spec.rb +6 -145
  89. data/spec/lilypond_spec.rb +2 -140
  90. data/spec/mermaid_spec.rb +62 -209
  91. data/spec/msc_spec.rb +2 -199
  92. data/spec/nomnoml_spec.rb +4 -142
  93. data/spec/pikchr_spec.rb +51 -0
  94. data/spec/plantuml_spec.rb +24 -507
  95. data/spec/shaape_spec.rb +9 -221
  96. data/spec/shared_examples.rb +603 -0
  97. data/spec/smcat_spec.rb +2 -140
  98. data/spec/svgbob_spec.rb +2 -140
  99. data/spec/symbolator_spec.rb +23 -0
  100. data/spec/syntrax_spec.rb +5 -215
  101. data/spec/test_helper.rb +1 -21
  102. data/spec/tikz_spec.rb +65 -15
  103. data/spec/umlet_spec.rb +2 -58
  104. data/spec/vega_spec.rb +4 -117
  105. data/spec/wavedrom_spec.rb +2 -199
  106. metadata +58 -8
  107. data/lib/asciidoctor-diagram/extensions.rb +0 -568
  108. data/lib/ditaa-1.3.13.jar +0 -0
  109. data/lib/plantuml-1.3.13.jar +0 -0
  110. data/lib/server-1.3.13.jar +0 -0
@@ -0,0 +1,33 @@
1
+ require_relative '../diagram_converter'
2
+ require_relative '../util/cli_generator'
3
+ require_relative '../util/platform'
4
+ require_relative '../util/java'
5
+
6
+ module Asciidoctor
7
+ module Diagram
8
+ # @private
9
+ class UmletConverter
10
+ include DiagramConverter
11
+ include CliGenerator
12
+
13
+
14
+ def supported_formats
15
+ [:svg, :png, :pdf, :gif]
16
+ end
17
+
18
+ def convert(source, format, options)
19
+ java = ::Asciidoctor::Diagram::Java.java
20
+
21
+ umlet = source.find_command('umlet')
22
+ ext = File.extname(umlet)
23
+ if ext == '' || ext != '.jar'
24
+ umlet = File.expand_path(File.basename(umlet, '.*') + '.jar', File.dirname(umlet))
25
+ end
26
+
27
+ generate_file(java, 'uxf', format.to_s, source.to_s) do |tool_path, input_path, output_path|
28
+ [tool_path, '-jar', Platform.native_path(umlet), '-action=convert', "-format=#{format.to_s}", "-filename=#{Platform.native_path(input_path)}", "-output=#{Platform.native_path(output_path)}"]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,36 +1,14 @@
1
- require_relative '../extensions'
2
- require_relative '../util/cli_generator'
3
- require_relative '../util/platform'
4
- require_relative '../util/which'
1
+ require_relative '../diagram_processor'
2
+ require_relative 'converter'
5
3
 
6
4
  module Asciidoctor
7
5
  module Diagram
8
- # @private
9
- module Umlet
10
- include CliGenerator
11
- include Which
12
-
13
- def self.included(mod)
14
- [:svg, :png, :pdf, :gif].each do |f|
15
- mod.register_format(f, :image) do |parent, source|
16
- umlet(parent, source, f)
17
- end
18
- end
19
- end
20
-
21
- def umlet(parent, source, format)
22
- generate_file(which(parent, 'umlet'), 'uxf', format.to_s, source.to_s) do |tool_path, input_path, output_path|
23
- [tool_path, '-action=convert', "-format=#{format.to_s}", "-filename=#{Platform.native_path(input_path)}", "-output=#{Platform.native_path(output_path)}"]
24
- end
25
- end
26
- end
27
-
28
- class UmletBlockProcessor < Extensions::DiagramBlockProcessor
29
- include Umlet
6
+ class UmletBlockProcessor < DiagramBlockProcessor
7
+ use_converter UmletConverter
30
8
  end
31
9
 
32
- class UmletBlockMacroProcessor < Extensions::DiagramBlockMacroProcessor
33
- include Umlet
10
+ class UmletBlockMacroProcessor < DiagramBlockMacroProcessor
11
+ use_converter UmletConverter
34
12
  end
35
13
  end
36
14
  end
@@ -9,7 +9,7 @@ module Asciidoctor
9
9
  require_relative 'java'
10
10
 
11
11
  def self.run(*args)
12
- opts = args.pop if args.last.is_a? Hash
12
+ opts = args.pop.dup if args.last.is_a? Hash
13
13
  in_data = opts && opts[:stdin_data]
14
14
 
15
15
  pb = java.lang.ProcessBuilder.new(*args)
@@ -61,12 +61,23 @@ module Asciidoctor
61
61
  require 'open3'
62
62
 
63
63
  def self.run(*args)
64
- stdout, stderr, status = Open3.capture3(*args)
64
+ if Hash === args.last
65
+ opts = args.pop.dup
66
+ else
67
+ opts = {}
68
+ end
69
+
70
+ # When the first argument is an array, we force capture3 (or better the underlying Kernel#spawn)
71
+ # to use a non-shell execution variant.
72
+ cmd = File.basename(args[0])
73
+ args[0] = [args[0], cmd]
74
+
75
+ stdout, stderr, status = Open3.capture3(*args, opts)
65
76
 
66
77
  exit = status.exitstatus
67
78
 
68
79
  if exit != 0
69
- raise "#{File.basename(args[0])} failed: #{stdout.empty? ? stderr : stdout}"
80
+ raise "#{cmd} failed: #{stdout.empty? ? stderr : stdout}"
70
81
  end
71
82
 
72
83
  {
@@ -1,3 +1,4 @@
1
+ require 'asciidoctor/logging'
1
2
  require 'tempfile'
2
3
  require_relative 'cli'
3
4
 
@@ -5,6 +6,8 @@ module Asciidoctor
5
6
  module Diagram
6
7
  # @private
7
8
  module CliGenerator
9
+ include Asciidoctor::Logging
10
+
8
11
  def generate_stdin(tool, format, code)
9
12
  tool_name = File.basename(tool)
10
13
 
@@ -26,7 +29,7 @@ module Asciidoctor
26
29
  else
27
30
  opts = [tool]
28
31
  end
29
- generate(opts, :stdout, :stdin_data => code)
32
+ generate(opts, :stdout, :stdin_data => code, :binmode => true)
30
33
  end
31
34
 
32
35
  def generate_file(tool, input_ext, output_ext, code)
@@ -51,6 +54,20 @@ module Asciidoctor
51
54
  end
52
55
  end
53
56
 
57
+ def generate_file_stdout(tool, input_ext, code)
58
+ tool_name = File.basename(tool)
59
+
60
+ source_file = Tempfile.new([tool_name, ".#{input_ext}"])
61
+ begin
62
+ File.write(source_file.path, code)
63
+
64
+ opts = yield tool, source_file.path
65
+ generate(opts, :stdout)
66
+ ensure
67
+ source_file.unlink
68
+ end
69
+ end
70
+
54
71
  private
55
72
  def generate(opts, target_file, open3_opts = {})
56
73
  case opts
@@ -64,6 +81,7 @@ module Asciidoctor
64
81
  raise "Block passed to generate_file should return an Array or a Hash"
65
82
  end
66
83
 
84
+ logger.debug "Executing #{args} with options #{open3_opts}"
67
85
  result = ::Asciidoctor::Diagram::Cli.run(*args, open3_opts)
68
86
 
69
87
  data = target_file == :stdout ? result[:out] : read_result(target_file, out_file)
@@ -7,14 +7,14 @@ module Asciidoctor
7
7
  GIF87A_SIGNATURE = 'GIF87a'.force_encoding(Encoding::ASCII_8BIT)
8
8
  GIF89A_SIGNATURE = 'GIF89a'.force_encoding(Encoding::ASCII_8BIT)
9
9
 
10
- def self.get_image_size(data)
10
+ def self.post_process_image(data)
11
11
  bio = BinaryIO.new(data)
12
12
  gif_signature = bio.read_string(6)
13
13
  raise "Invalid GIF signature" unless gif_signature == GIF87A_SIGNATURE || gif_signature == GIF89A_SIGNATURE
14
14
 
15
15
  width = bio.read_uint16_le
16
16
  height = bio.read_uint16_le
17
- [width, height]
17
+ [data, width, height]
18
18
  end
19
19
  end
20
20
  end
@@ -6,7 +6,7 @@ module Asciidoctor
6
6
  module Java
7
7
  def self.classpath
8
8
  @classpath ||= [
9
- File.expand_path(File.join('../..', 'server-1.3.13.jar'), File.dirname(__FILE__))
9
+ File.expand_path(File.join('../..', 'server-1.3.15.jar'), File.dirname(__FILE__))
10
10
  ]
11
11
  end
12
12
 
@@ -88,6 +88,119 @@ module Asciidoctor
88
88
  raise "#{prefix_msg}: #{response[:reason]}"
89
89
  end
90
90
  end
91
+
92
+ def self.java
93
+ @java_exe ||= find_java
94
+ raise "Could not find Java executable" unless @java_exe
95
+ @java_exe
96
+ end
97
+
98
+ private
99
+ def self.find_java
100
+ case ::Asciidoctor::Diagram::Platform.os
101
+ when :windows
102
+ path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
103
+ when :macosx
104
+ path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(::Asciidoctor::Diagram::Cli.run('/usr/libexec/java_home')[:out].strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
105
+ else
106
+ path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
107
+ end
108
+ end
109
+
110
+ def self.path_to(java_home, java_binary)
111
+ exe_path = File.expand_path(java_binary, java_home)
112
+ if File.executable?(exe_path)
113
+ exe_path
114
+ else
115
+ nil
116
+ end
117
+ end
118
+
119
+ JDK_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit'
120
+ JRE_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment'
121
+
122
+ def self.registry_lookup
123
+ registry_current(JRE_KEY) || registry_current(JDK_KEY) || registry_any()
124
+ end
125
+
126
+ def self.registry_current(key)
127
+ current_version = registry_query(key, 'CurrentVersion')
128
+ if current_version
129
+ java_home = registry_query("#{key}\\#{current_version}", 'JavaHome')
130
+ java_exe(java_home)
131
+ else
132
+ nil
133
+ end
134
+ end
135
+
136
+ def self.registry_any()
137
+ java_homes = registry_query('HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft', 'JavaHome', :recursive => true).values
138
+ java_homes.map { |path| java_exe(path) }.find { |exe| !exe.nil? }
139
+ end
140
+
141
+ def self.java_exe(java_home)
142
+ java = File.expand_path('bin/java.exe', java_home)
143
+
144
+ if File.executable?(java)
145
+ java
146
+ else
147
+ nil
148
+ end
149
+ end
150
+
151
+ def self.registry_query(key, value = nil, opts = {})
152
+ args = ['reg', 'query']
153
+ args << key
154
+ args << '/v' << value unless value.nil?
155
+ args << '/s' if opts[:recursive]
156
+
157
+ begin
158
+ lines = ::Asciidoctor::Diagram::Cli.run(*args)[:out].lines.reject { |l| l.strip.empty? }.each
159
+ rescue
160
+ lines = [].each
161
+ end
162
+
163
+ result = {}
164
+
165
+ while true
166
+ begin
167
+ begin
168
+ k = lines.next
169
+ rescue StopIteration
170
+ break
171
+ end
172
+
173
+ unless k.start_with? key
174
+ next
175
+ end
176
+
177
+ v = nil
178
+ begin
179
+ v = lines.next.strip if lines.peek.start_with?(' ')
180
+ rescue StopIteration
181
+ break
182
+ end
183
+
184
+ if !k.valid_encoding? || (v && !v.valid_encoding?)
185
+ next
186
+ end
187
+
188
+ if v && (md = /([^\s]+)\s+(REG_[^\s]+)\s+(.+)/.match(v))
189
+ v_name = md[1]
190
+ v_value = md[3]
191
+ result["#{k}\\#{v_name}"] = v_value
192
+ else
193
+ result[k] = v
194
+ end
195
+ end
196
+ end
197
+
198
+ if value && !opts[:recursive]
199
+ result.values[0]
200
+ else
201
+ result
202
+ end
203
+ end
91
204
  end
92
205
  end
93
206
  end
@@ -9,28 +9,25 @@ module Asciidoctor
9
9
  # @private
10
10
  module Java
11
11
  class CommandServer
12
- attr_reader :port
13
-
14
12
  def initialize(java, classpath)
15
13
  args = []
16
14
  args << '-Djava.awt.headless=true'
17
15
  args << '-Djava.net.useSystemProxies=true'
18
16
  args << '-cp'
19
17
  args << classpath.flatten.map { |jar| ::Asciidoctor::Diagram::Platform.host_os_path(jar).strip }.join(::Asciidoctor::Diagram::Platform.host_os_path_separator)
20
- args << 'org.asciidoctor.diagram.CommandServer'
18
+ args << 'org.asciidoctor.diagram.StdInOutCommandServer'
21
19
 
22
- @server = IO.popen([java, *args])
23
- @port = @server.readline.strip.to_i
24
- @client = TCPSocket.new 'localhost', port
20
+ @server = IO.popen([java, *args], 'r+b')
25
21
  end
26
22
 
27
23
  def io
28
- @client
24
+ @server
29
25
  end
30
26
 
31
27
  def shutdown
32
28
  # KILL is a bit heavy handed, but TERM does not seem to shut down the JVM on Windows.
33
29
  Process.kill('KILL', @server.pid)
30
+ @server.close
34
31
  end
35
32
  end
36
33
 
@@ -44,11 +41,8 @@ module Asciidoctor
44
41
  end
45
42
 
46
43
  def self.instance
47
- @java_exe ||= find_java
48
- raise "Could not find Java executable" unless @java_exe
49
-
50
44
  unless defined?(@command_server) && @command_server
51
- server = CommandServer.new(@java_exe, classpath)
45
+ server = CommandServer.new(java, classpath)
52
46
  @command_server = server
53
47
  at_exit do
54
48
  server.shutdown
@@ -60,118 +54,12 @@ module Asciidoctor
60
54
 
61
55
  def self.send_request(req)
62
56
  svr = instance
63
- headers = req[:headers] ||= {}
64
- headers['Host'] = "localhost:#{svr.port}"
57
+ req[:headers] ||= {}
58
+ # headers = req[:headers] ||= {}
59
+ # headers['Host'] = "localhost:#{svr.port}"
65
60
  format_request(req, svr.io)
66
61
  parse_response(svr.io)
67
62
  end
68
-
69
- private
70
- def self.find_java
71
- case ::Asciidoctor::Diagram::Platform.os
72
- when :windows
73
- path_to(ENV['JAVA_HOME'], 'bin/java.exe') || registry_lookup || ::Asciidoctor::Diagram::Which.which('java')
74
- when :macosx
75
- path_to(ENV['JAVA_HOME'], 'bin/java') || path_to(::Asciidoctor::Diagram::Cli.run('/usr/libexec/java_home')[:out].strip, 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
76
- else
77
- path_to(ENV['JAVA_HOME'], 'bin/java') || ::Asciidoctor::Diagram::Which.which('java')
78
- end
79
- end
80
-
81
- def self.path_to(java_home, java_binary)
82
- exe_path = File.expand_path(java_binary, java_home)
83
- if File.executable?(exe_path)
84
- exe_path
85
- else
86
- nil
87
- end
88
- end
89
-
90
- JDK_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit'
91
- JRE_KEY = 'HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment'
92
-
93
- def self.registry_lookup
94
- registry_current(JRE_KEY) || registry_current(JDK_KEY) || registry_any()
95
- end
96
-
97
- def self.registry_current(key)
98
- current_version = registry_query(key, 'CurrentVersion')
99
- if current_version
100
- java_home = registry_query("#{key}\\#{current_version}", 'JavaHome')
101
- java_exe(java_home)
102
- else
103
- nil
104
- end
105
- end
106
-
107
- def self.registry_any()
108
- java_homes = registry_query('HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft', 'JavaHome', :recursive => true).values
109
- java_homes.map { |path| java_exe(path) }.find { |exe| !exe.nil? }
110
- end
111
-
112
- def self.java_exe(java_home)
113
- java = File.expand_path('bin/java.exe', java_home)
114
-
115
- if File.executable?(java)
116
- java
117
- else
118
- nil
119
- end
120
- end
121
-
122
- def self.registry_query(key, value = nil, opts = {})
123
- args = ['reg', 'query']
124
- args << key
125
- args << '/v' << value unless value.nil?
126
- args << '/s' if opts[:recursive]
127
-
128
- begin
129
- lines = ::Asciidoctor::Diagram::Cli.run(*args)[:out].lines.reject { |l| l.strip.empty? }.each
130
- rescue
131
- lines = [].each
132
- end
133
-
134
- result = {}
135
-
136
- while true
137
- begin
138
- begin
139
- k = lines.next
140
- rescue StopIteration
141
- break
142
- end
143
-
144
- unless k.start_with? key
145
- next
146
- end
147
-
148
- v = nil
149
- begin
150
- v = lines.next.strip if lines.peek.start_with?(' ')
151
- rescue StopIteration
152
- break
153
- end
154
-
155
- if !k.valid_encoding? || (v && !v.valid_encoding?)
156
- next
157
- end
158
-
159
- if v && (md = /([^\s]+)\s+(REG_[^\s]+)\s+(.+)/.match(v))
160
- v_name = md[1]
161
- v_value = md[3]
162
- result["#{k}\\#{v_name}"] = v_value
163
- else
164
- result[k] = v
165
- end
166
- end
167
- end
168
-
169
- if value && !opts[:recursive]
170
- result.values[0]
171
- else
172
- result
173
- end
174
- end
175
63
  end
176
64
  end
177
65
  end