module Asciidoctor::Extensions::SyntaxProcessorDsl

def resolve_attributes *args

def resolve_attributes *args
  # NOTE assume true as default value; rewrap single-argument string or symbol
  if (args = args.fetch 0, true).respond_to? :to_sym
    args = [args]
  end unless args.size > 1
  case args
  when true
    option :positional_attrs, []
    option :default_attrs, {}
  when ::Array
    names, defaults = [], {}
    args.each do |arg|
      if (arg = arg.to_s).include? '='
        name, _, value = arg.partition '='
        if name.include? ':'
          idx, _, name = name.partition ':'
          idx = idx == '@' ? names.size : idx.to_i
          names[idx] = name
        end
        defaults[name] = value
      elsif arg.include? ':'
        idx, _, name = arg.partition ':'
        idx = idx == '@' ? names.size : idx.to_i
        names[idx] = name
      else
        names << arg
      end
    end
    option :positional_attrs, names.compact
    option :default_attrs, defaults
  when ::Hash
    names, defaults = [], {}
    args.each do |key, val|
      if (name = key.to_s).include? ':'
        idx, _, name = name.partition ':'
        idx = idx == '@' ? names.size : idx.to_i
        names[idx] = name
      end
      defaults[name] = val if val
    end
    option :positional_attrs, names.compact
    option :default_attrs, defaults
  else
    raise ::ArgumentError, %(unsupported attributes specification for macro: #{args.inspect})
  end
end