A slightly different approach (count the tabs once!), starting from 
James's code:

input = <<END_INPUT
foo
\t bar
\t \t baz
\t \t \t hello
\t \t world
END_INPUT

bullets = %w[* - o x]

h = Hash.new {|h, k|
   bullet = bullets[(k.count("\t")-1) % bullets.size]
   h[k] = k.gsub(/(\t )(?=\t )/, "  ").sub(/\t/, bullet)
}

input.gsub!(/^(\t ?)+/) do |indent|
   h[indent]
end

puts input

__END__

foo
* bar
   - baz
     o hello
   - world

-- 
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407