160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
# File 'lib/optbind.rb', line 160
def self.parser_opts_from_string(string = '', &handler)
string, shorts, longs = string.dup, [], []
while string.sub!(/\A(?:(?<short>-\w)\s+)/, '') do
shorts << $~[:short]
end
style, pattern, values, argument = [], nil
while string.sub!(/\A(?:(?<long>--[\[\]\-\w]+[\]\w]+)?(?:(?<argument>(?:\[?=?|=\[)[<(]\S+[)>]\.{,3}\]?)|\s+))/, '')
longs << $~[:long] if $~[:long]
next unless $~[:argument]
argument = $~[:argument]
style = [argument =~ /\A=?[<(]/ ? :REQUIRED : :OPTIONAL, argument =~ /\.{3}\]?\z/ ? :MULTIPLE : nil]
values = $~[:values].split('|') if argument =~ /(?:\[?=?|=\[)\((?<values>\S*)\)\]?/
if values.nil? && argument =~ /(?:\[?=?|=\[)<(?<name>\S+):(?<pattern>\S+)>\]?/
argument, pattern = "=<#{$~[:name]}>#{'...' if style.include? :MULTIPLE}", $~[:pattern]
argument = "=[#{argument[1..-1]}]" if style.include? :OPTIONAL
pattern = pattern.gsub(/\//, '::').gsub(/(?:\A|[-_]+)\w/) { |p| p[-1].upcase } if pattern =~ /\A[-_a-z]/
pattern = OptionBinder.const_get(pattern) rescue Regexp.new(pattern)
else
argument.sub!(/\A(?:=\[|\[?=?)/, style.include?(:OPTIONAL) ? '=[' : '=')
end
end
description = !string.empty? ? string.strip : nil
return (style + [pattern, values] + shorts + longs + [argument, description]).compact, handler
end
|