def parse_attribute index = 0, pos_attrs = []
single_quoted_value = false
skip_blank
if (first = @scanner.peek(1)) == '"'
name = parse_attribute_value @scanner.get_byte
value = nil
elsif first == '\''
name = parse_attribute_value @scanner.get_byte
value = nil
single_quoted_value = true
else
name = scan_name
skipped = 0
c = nil
if @scanner.eos?
return false unless name
else
skipped = skip_blank || 0
c = @scanner.get_byte
end
if !c || c == @delimiter
value = nil
elsif c != '=' || !name
name = %(#{name}#{' ' * skipped}#{c}#{scan_to_delimiter})
value = nil
else
skip_blank
if @scanner.peek(1)
if (c = @scanner.get_byte) == '"'
value = parse_attribute_value c
elsif c == '\''
value = parse_attribute_value c
single_quoted_value = true
elsif c == @delimiter
value = nil
else
value = %(#{c}#{scan_to_delimiter})
return true if value == 'None'
end
end
end
end
if value
case name
when 'options', 'opts'
if value.include? ','
value = value.delete ' ' if value.include? ' '
(value.split ',').each {|opt| @attributes[%(#{opt}-option)] = '' unless opt.empty? }
else
@attributes[%(#{value = value.strip}-option)] = ''
end
@attributes['options'] = value
else
if single_quoted_value && @block
case name
when 'title', 'reftext'
@attributes[name] = value
else
@attributes[name] = @block.apply_subs value
end
else
@attributes[name] = value
end
end
else
resolved_name = single_quoted_value && @block ? (@block.apply_subs name) : name
if (pos_name = pos_attrs[index])
@attributes[pos_name] = resolved_name
end
@attributes[index + 1] = resolved_name
end
true
end