# File lib/asciidoctor/substitutors.rb, line 1178
  def parse_attributes(attrline, posattrs = ['role'], opts = {})
    return unless attrline
    return {} if attrline.empty?
    attrline = @document.sub_attributes(attrline) if opts[:sub_input] && (attrline.include? ATTR_REF_HEAD)
    attrline = unescape_bracketed_text(attrline) if opts[:unescape_input]
    # substitutions are only performed on attribute values if block is not nil
    block = opts.fetch(:sub_result, true) ? self : nil
    if (into = opts[:into])
      AttributeList.new(attrline, block).parse_into(into, posattrs)
    else
      AttributeList.new(attrline, block).parse(posattrs)
    end
  end