# File lib/asciidoctor/attribute_list.rb, line 107
  def parse_attribute index = 0, pos_attrs = []
    single_quoted_value = false
    skip_blank
    # example: "quote"
    if (first = @scanner.peek(1)) == '"'
      name = parse_attribute_value @scanner.get_byte
      value = nil
    # example: 'quote'
    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

      # example: quote
      if !c || c == @delimiter
        value = nil
      # example: Sherlock Holmes || =foo=
      elsif c != '=' || !name
        name = %(#{name}#{' ' * skipped}#{c}#{scan_to_delimiter})
        value = nil
      else
        skip_blank
        if @scanner.peek(1)
          # example: foo="bar" || foo="ba\"zaar"
          if (c = @scanner.get_byte) == '"'
            value = parse_attribute_value c
          # example: foo='bar' || foo='ba\'zaar' || foo='ba"zaar'
          elsif c == '\''
            value = parse_attribute_value c
            single_quoted_value = true
          # example: foo=,
          elsif c == @delimiter
            value = nil
          # example: foo=bar (all spaces ignored)
          else
            value = %(#{c}#{scan_to_delimiter})
            return true if value == 'None'
          end
        end
      end
    end

    if value
      # example: options="opt1,opt2,opt3"
      # opts is an alias for options
      case name
      when 'options', 'opts'
        name = 'options'
        value.tr(' ', '').split(',').each {|opt| @attributes[%(#{opt}-option)] = '' }
        @attributes[name] = value
      when 'title'
        @attributes[name] = value
      else
        @attributes[name] = single_quoted_value && !value.empty? && @block ? (@block.apply_normal_subs value) : value
      end
    else
      resolved_name = single_quoted_value && !name.empty? && @block ? (@block.apply_normal_subs name) : name
      if (pos_name = pos_attrs[index])
        @attributes[pos_name] = resolved_name
      end
      # QUESTION should we always assign the positional key?
      @attributes[index + 1] = resolved_name
      # QUESTION should we assign the resolved name as an attribute?
      #@attributes[resolved_name] = nil
    end

    true
  end