Hashes and Regexes and Special Characters

I am rolling my own smiley/emoticon generator. A lot of this has do
do with my less than stellar knowledge of ruby, so if this is better
asked on a ruby list, let me know and I'll move along...

I have text based emoticon replacement working fine. I use a hash to
define the text/image pairs like this...

emotes = {
  :wow => "wow.gif",
  :lol => "lol.gif"

I then have a simple regex that goes through the text and plucks out
[:key] and replaces it with an image tag.

The problem is I would also like to do conversion of :slight_smile: :open_mouth: :frowning: and
such. I'm running into trouble setting up my hash like that.

I can't seem to use special characters like : or ( in a key. So I
actually made two hashes, one with description/emote_text pairs and
one with description/image pairs like so...

special_keys = {
  :smile => ":)"
  :frown => ":frowning:
special_emotes = {
  :smile => "regular_smile.gif"
  :frown => "frown.gif"

Then I thought I would regex something like

special_keys.each_value do |key|

Now, forgetting for the moment the right side of that regex, which I
don't know if it will even work or not, the regex is failing because
the ')' in #{key} is closing the regex early. So I thought I would
get smart and escape the special characters in special_keys like so:

special_keys = {
  :smile => ":\)"

Which, to my suprise ends up as {:smile=>":)"}


About this time I figured I was trying too hard and that there's
probably something shiny in ruby that will solve this little problem.
Anyone out there an expert hash wrangler?


I reckon the reason that happens is because in a string, ) is a perfectly valid character but \) is an unknown character escape and so the \ gets dropped.
You really don't want to be doing this by hand though, RegExp.quote will do that for you.
Lastly you can have a symbol with anything you want in it, but you need to say :'here is a weird symbol'



Thank you SO much for your help. I managed to turn the mess of code I
was writing into something very simple and rubyish.

I now have the following in my helper...