Smiley Parser

Hi,

Does anyone know of smiley parser - that can parse for standard smileys
{ :), :frowning: etc } and replace with images?

I also wanted URL parser that can automagically give hyperlinks to URLs.

Any inputs?

PS:

http://www.rubyonrails.ch/doku.php/wiki:syntax#smileys

This seemed interesting, but didnt really knw how to use it.

Regards,
Sandeep G

On 28 Mar 2008, at 19:03, Sandeep G. wrote:

Hi,

Does anyone know of smiley parser - that can parse for standard
smileys
{ :), :frowning: etc } and replace with images?

I also wanted URL parser that can automagically give hyperlinks to
URLs.

auto_link ?

I don’t know of one, but this shouldn’t be hard, just a bunch of gsubs
really.

Fred

Any inputs?

PS:

http://www.rubyonrails.ch/doku.php/wiki:syntax#smileys

Sandeep,

I recently had to do this for an app… spent lots of time searching.
Here, this will save you some time:

reg = /(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+).[a-z]{2,5}(:
[0-9]{1,5})?(/[^\s]
)/ix
line.gsub(reg,%q[\0])

Do some console tests with that just to be sure it matches what you
want, but it’s the best regexp I’ve found for URL matching… i.e. the
most complete. Note, you can grab various parts using \1, \2, etc. \0
just grabs the whole match.

As for the smilies, I have no idea… that would be a much more
complex matching algorithm. It sounds like an ideal candidate for a
plugin… i.e. “acts_as_smiley”. :slight_smile:

-Dan

On Mar 28, 1:34 pm, Frederick C. [email protected]

I am not aware of a smiley parser, but it really is just a matter of
downloading the smiley images and putting them into a directory, then
creating some sort of mapping between a text pattern and a smiley image
and then looping through and doing gsubs.

images/
smilies/
happy.png
sad.png

SMILEY_HASH = { “:)” => ‘happy’, “:(” => “sad” }

def smileyize(message)
returning message do
SMILEY_HASH.each_pair do |key, value|
message.gsub!(key, image_path("#{value}.png"))
end
end
end

Air coded, but you get the idea.

Of course, as Fred mentioned, auto_link as a helper will do all that
anyway:
http://api.rubyonrails.com/classes/ActionView/Helpers/TextHelper.html#M001058

Hehe.

-Dan

On Mar 28, 1:34 pm, Frederick C. [email protected]

Hi,

Thank you all for inputs.

Is there a more efficient way of doing GSUB, instead of doing gsub on
entire text for each smiley? As the list of Smileys grows big, gsub in
loop will be a overhead.

Regards,
Sandeep G

Nathan E. wrote:

I am not aware of a smiley parser, but it really is just a matter of
downloading the smiley images and putting them into a directory, then
creating some sort of mapping between a text pattern and a smiley image
and then looping through and doing gsubs.

images/
smilies/
happy.png
sad.png

SMILEY_HASH = { “:)” => ‘happy’, “:(” => “sad” }

def smileyize(message)
returning message do
SMILEY_HASH.each_pair do |key, value|
message.gsub!(key, image_path("#{value}.png"))
end
end
end

Air coded, but you get the idea.

On 29 Mar 2008, at 15:53, Sandeep G. wrote:

Hi,

Thank you all for inputs.

Is there a more efficient way of doing GSUB, instead of doing gsub on
entire text for each smiley? As the list of Smileys grows big, gsub in
loop will be a overhead.

well first of all, i’d worry about that when that became a problem
rather than assuming it might.
Secondly you could probably use something like

smileys = {‘smiley1’ => ‘xxx’, ‘smiley2’ => ‘yyy’, ‘smiley1’ => ‘zzz’
text.gsub /(smiley1)|(smiley2)|(smiley3)/ do |match|
smileys[match]
end

Frederick C. wrote:

smileys = {‘smiley1’ => ‘xxx’, ‘smiley2’ => ‘yyy’, ‘smiley1’ => ‘zzz’
text.gsub /(smiley1)|(smiley2)|(smiley3)/ do |match|
smileys[match]
end

That duplicates smileys 1 2 and 3. Can we DRY it?

And could .gsub be .scan instead?


Phlip

On 29 Mar 2008, at 17:24, Phlip wrote:

Frederick C. wrote:

smileys = {‘smiley1’ => ‘xxx’, ‘smiley2’ => ‘yyy’, ‘smiley1’ => ‘zzz’
text.gsub /(smiley1)|(smiley2)|(smiley3)/ do |match|
smileys[match]
end

That duplicates smileys 1 2 and 3. Can we DRY it?

sure, was just trying to be explicit. You could build the regexp from
the smileys array. There’s probably a limit on how long a regexp can
be though.

And could .gsub be .scan instead?
doesn’t gsub make more sense if the goal is to replace stuff in the
source text with something else?

Fred

Hi Fred,

def smileyize(text)

    smileys = {

“8-)” => ‘icon_cool.gif’ ,
“8-O” => ‘icon_eek.gif’,
“8-o” => ‘icon_eek.gif’,
‘:-(’ => ‘icon_sad.gif’,
‘:-)’ => ‘icon_smile.gif’,
}
text.gsub /(“8-o”)/ do |match|
image_path(smileys[match])
end
return text
end

I tried something like this, but didnt work. It sends back the same
text.Can you help me on this?

I even tried to simplify things and test with this:
<%= “XX”.gsub /(“XX”)/ do |match| “YY” end%>
This displays XX itself :frowning:

Frederick C. wrote:

On 29 Mar 2008, at 17:24, Phlip wrote:

Frederick C. wrote:

smileys = {‘smiley1’ => ‘xxx’, ‘smiley2’ => ‘yyy’, ‘smiley1’ => ‘zzz’
text.gsub /(smiley1)|(smiley2)|(smiley3)/ do |match|
smileys[match]
end

That duplicates smileys 1 2 and 3. Can we DRY it?

sure, was just trying to be explicit. You could build the regexp from
the smileys array. There’s probably a limit on how long a regexp can
be though.

And could .gsub be .scan instead?
doesn’t gsub make more sense if the goal is to replace stuff in the
source text with something else?

Fred

Sandeep.

Try it without the quotes:

“XX”.gsub /(XX)/ do |match| “YY” end
=> “YY”

or even just: “XX”.gsub /XX/, “YY”

:sunglasses: … er… icon_cool.gif

-Danimal

On Mar 29, 12:32 pm, Sandeep G. <rails-mailing-l…@andreas-

Thank you all! That was nice of you!

Posting my final func:

def smileyize(text)
smileys = { “8-O” => ‘icon_eek.gif’, “8-o” => ‘icon_eek.gif’,":-("
=> ‘icon_sad.gif’, “:-)” => ‘icon_smile.gif’, “:-/” =>
‘icon_doubt.gif’ , “:-\” => ‘icon_doubt2.gif’, “:-?”
=>‘icon_confused.gif’,":-D" => ‘icon_biggrin.gif’, “:-P”
=>‘icon_razz.gif’,":-o" => ‘icon_surprised.gif’,":-O"
=>‘icon_surprised.gif’,":-x"=>‘icon_silenced.gif’,":-X" =>
‘icon_silenced.gif’,":-|" => ‘icon_neutral.gif’,";-)"
=>‘icon_wink.gif’,"^_^" => ‘icon_fun.gif’,":?:" =>
‘icon_question.gif’,":!:" => ‘icon_exclaim.gif’,“LOL” =>‘icon_lol.gif’ }

text = (text).gsub
/(8-O)|(:-))|(:-()|(:-/)|(:-\)|(:-?)|(:-D)|(:-P)|(:-o)|(:-O)|(:-X)|(:-x)|(:-|)|(;-))|(^_^)|(:?:)|(:!:)|(LOL)/
do |match| image_tag(image_path(“smileys”+"/"+smileys[match])) end

return text
end

Regards,
Sandeep G

It occurs to me that YAML could be a real boon here. I.e. define your
mappings via YAML (or XML but who does that anymore? grin). Probably
define it as something simple like:

mappings:
icon_eek.gif: 8-O
icon_sad.gif: :frowning:

etc.

then read it into a very similar hash table to what you have, maybe
reversing the keys if need be.

I think it would be cool to have an “acts_as_smiley” plugin. Maybe
something where you could do:

class Post < ActiveRecord::Base
acts_as_smiley :body, :icons => “myicons” # (this would be a subdir
of “images” in public)
end

Then, “underneath the covers”, it redefines the body accessor so that
it returns the smiley-parsed value of :body.

I could even imagine some other hooks like defining additional
accessors, like :body_nosmiley or :body_smiley that skips or runs the
parser.

Just a thought. Anyway, glad you got it working!

-Danimal 8-O

On Mar 29, 3:03 pm, Sandeep G. <rails-mailing-l…@andreas-
s.net> wrote:

=>‘icon_surprised.gif’,“:-x”=>‘icon_silenced.gif’,“:-X” =>

Regards,
Sandeep G

Posted viahttp://www.ruby-forum.com/.

That regexp is scary. If you think of adding more smileys:

regexp = Regexp.new(“(”+ smileys.keys.map{|k|
Regexp.escape(k)}.join(“|”) +“)”)

with the added benefit that you need to add more smileys in just one
place.