Kang-min Liu - Asynapse.Emoticon-0.01
NAME
Asynapse.Emoticon - Enable emoticon in-place.
SYNOPSIS
var emoticon = new Asynapse.Emoticon.GoogleTalk
emoticon.filter( document.getElementById("smiley") )
DESCRIPTION
This library scan through your specified text or elements, and replace all emotion text it found with emoticon images. 3 styles available: GoogleTalk, MSN, Yahoo. First create an emoticon object:
emoticon = new Asynapse.Emoticon.GoogleTalk
Then invoke it's filter() method with your text in string:
emoticon.filter( string )
Or with a DOM element:
var elem = document.getElementById("foo")
emoticon.filter( elem )
If you have prototype, jQuery or cssQuery around, this could looks cool:
emoticon.filter( $('foo') )
If you need to filter through many elements, so far please do this on your own:
for ( i =0 ; i < elements.lenght ; i++ ) {
emoticon.filter( elements[i] )
}
The filter doesn't go deep down the DOM to replace all emotion text, but just the first-level child nodes. This may be changed in the future.
SEE ALSO
Text::Emoticon
Perl module on CPAN.
AUTHOR
Kang-min Liu, <gugod@gugod.org>
COPYRIGHT
Copyright (c) 2007 Kang-min Liu. All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as the Perl programming language (your choice of GPL or the Perl Artistic license).
if ( typeof Asynapse == 'undefined' ) { Asynapse = {} } Asynapse.Emoticon = function(){} Asynapse.Emoticon.VERSION = "0.01" Asynapse.Emoticon.prototype = { filter: function(target) { if ( typeof target == 'string' ) { return this.filter_text(target) } if ( typeof target == 'object' && target.nodeType == 1 ) { return this.filter_element(target) } }, filter_text: function(text) { var self = this; return text.replace(this.pattern(), function(icon) { return self.do_filter(icon) }); }, filter_element: function(elem) { var self = this; for ( var i = 0; i < elem.childNodes.length; i++ ) { if ( elem.childNodes[i].nodeType == 3 ) { var range = elem.ownerDocument.createRange() range.selectNode( elem.childNodes[i] ) var docfrag = range.createContextualFragment( this.filter_text(elem.childNodes[i].nodeValue) ) elem.replaceChild(docfrag, elem.childNodes[i]); } } }, do_filter: function(icon) { var xhtml = this.config.xhtml ? " /" : "" var img_class = this.config.class ? (' class="' + this.config.class + '"') : "" return "<img src=\"" + this.config.imgbase + "/" + this.map[icon] + '" ' + img_class + xhtml + '>' }, pattern: function () { if ( !this._pattern ) { var icons = []; for(i in this.map) { icons.push( this.quotemeta(i) ) } this._pattern = new RegExp( "(" + icons.join("|") +")" ,"g") } return this._pattern }, quotemeta: function ( str ) { var safe = str; var bs=String.fromCharCode(92); var unsafe= bs + "|-.+*?[^]$(){}=!<>¦:"; for ( i=0; i<unsafe.length; ++i ){ safe = safe.replace(new RegExp("\\"+unsafe.charAt(i),"g"), bs + unsafe.charAt(i)); } return safe; } } Asynapse.Emoticon.GoogleTalk = new Asynapse.Emoticon(); Asynapse.Emoticon.GoogleTalk.config = { 'imgbase' : "http://mail.google.com/mail/help/images/screenshots/chat", 'xhtml' : 1, 'strict' : 0, 'class' : null } Asynapse.Emoticon.GoogleTalk.map = { "<3" : "heart.gif", ":(|)" : "monkey.gif", "\\m/" : "rockout.gif", ":-o" : "shocked.gif", ":D" : "grin.gif", ":(" : "frown.gif", "X-(" : "angry.gif", "B-)" : "cool.gif", ":'(" : "cry.gif", "=D" : "equal_grin.gif", ";)" : "wink.gif", ":-|" : "straightface.gif", "=)" : "equal_smile.gif", ":-D" : "nose_grin.gif", ";^)" : "wink_big_nose.gif", ";-)" : "wink_nose.gif", ":-)" : "nose_smile.gif", ":-/" : "slant.gif", ":P" : "tongue.gif" } Asynapse.Emoticon.MSN = new Asynapse.Emoticon(); Asynapse.Emoticon.MSN.config = { 'imgbase' : "http://messenger.msn.com/Resource/emoticons", 'xhtml' : 1, 'strict' : 0, 'class' : null } Asynapse.Emoticon.MSN.map = { ':-)' : "regular_smile.gif", ':)' : "regular_smile.gif", ':-D' : "teeth_smile.gif", ':d' : "teeth_smile.gif", ':-O' : "omg_smile.gif", ':o' : "omg_smile.gif", ':-P' : "tongue_smile.gif", ':p' : "tongue_smile.gif", ';-)' : "wink_smile.gif", ';)' : "wink_smile.gif", ':-(' : "sad_smile.gif", ':(' : "sad_smile.gif", ':-S' : "confused_smile.gif", ':s' : "confused_smile.gif", ':-|' : "what_smile.gif", ':|' : "what_smile.gif", ':\'(' : "cry_smile.gif", ':-$' : "red_smile.gif", ':$' : "red_smile.gif", '(H)' : "shades_smile.gif", '(h)' : "shades_smile.gif", ':-@' : "angry_smile.gif", ':@' : "angry_smile.gif", '(A)' : "angel_smile.gif", '(a)' : "angel_smile.gif", '(6)' : "devil_smile.gif", ':-#' : "47_47.gif", '8o|' : "48_48.gif", '8-|' : "49_49.gif", '^o)' : "50_50.gif", ':-*' : "51_51.gif", '+o(' : "52_52.gif", ':^)' : "71_71.gif", '*-)' : "72_72.gif", '<:o)' : "74_74.gif", '8-)' : "75_75.gif", '|-)' : "77_77.gif", '(C)' : "coffee.gif", '(c)' : "coffee.gif", '(Y)' : "thumbs_up.gif", '(y)' : "thumbs_up.gif", '(N)' : "thumbs_down.gif", '(n)' : "thumbs_down.gif", '(B)' : "beer_mug.gif", '(b)' : "beer_mug.gif", '(D)' : "martini.gif", '(d)' : "martini.gif", '(X)' : "girl.gif", '(x)' : "girl.gif", '(Z)' : "guy.gif", '(z)' : "guy.gif", '({)' : "guy_hug.gif", '(})' : "girl_hug.gif", ':-[' : "bat.gif", ':[' : "bat.gif", '(^)' : "cake.gif", '(L)' : "heart.gif", '(l)' : "heart.gif", '(U)' : "broken_heart.gif", '(u)' : "broken_heart.gif", '(K)' : "kiss.gif", '(k)' : "kiss.gif", '(G)' : "present.gif", '(g)' : "present.gif", '(F)' : "rose.gif", '(f)' : "rose.gif", '(W)' : "wilted_rose.gif", '(w)' : "wilted_rose.gif", '(P)' : "camera.gif", '(p)' : "camera.gif", '(~)' : "film.gif", '(@)' : "cat.gif", '(&)' : "dog.gif", '(T)' : "phone.gif", '(t)' : "phone.gif", '(I)' : "lightbulb.gif", '(i)' : "lightbulb.gif", '(8)' : "note.gif", '(S)' : "moon.gif", '(*)' : "star.gif", '(E)' : "envelope.gif", '(e)' : "envelope.gif", '(O)' : "clock.gif", '(o)' : "clock.gif", '(M)' : "messenger.gif", '(m)' : "messenger.gif", '(sn)' : "53_53.gif", '(bah)' : "70_70.gif", '(pl)' : "55_55.gif", '(||)' : "56_56.gif", '(pi)' : "57_57.gif", '(so)' : "58_58.gif", '(au)' : "59_59.gif", '(ap)' : "60_60.gif", '(um)' : "61_61.gif", '(ip)' : "62_62.gif", '(co)' : "63_63.gif", '(mp)' : "64_64.gif", '(st)' : "66_66.gif", '(li)' : "73_73.gif", '(mo)' : "69_69.gif" } Asynapse.Emoticon.Yahoo = new Asynapse.Emoticon(); Asynapse.Emoticon.Yahoo.config = { 'imgbase' : "http://us.i1.yimg.com/us.yimg.com/i/mesg/emoticons6", 'xhtml' : 1, 'strict' : 0, 'class' : null } Asynapse.Emoticon.Yahoo.map = { ':)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/1.gif', ':(' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/2.gif', ';)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/3.gif', ':D' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/4.gif', ';;)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/5.gif', '>:D<' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/6.gif', '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/_/index.html' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/7.gif', ':x' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/8.gif', ':">' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/9.gif', ':P' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/10.gif', ':-*' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/11.gif', '=((' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/12.gif', ':-O' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/13.gif', 'X(' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/14.gif', ':>' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/15.gif', 'B-)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/16.gif', ':-S' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/17.gif', '#:-S' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/18.gif', '>:)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/19.gif', ':((' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/20.gif', ':))' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/21.gif', ':|' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/22.gif', '/:)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/23.gif', '=))' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/24.gif', 'O:)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/25.gif', ':-B' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/26.gif', '=;' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/27.gif', 'I-|' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/28.gif', '8-|' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/29.gif', 'L-)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/30.gif', ':-&' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/31.gif', ':-$' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/32.gif', '[-(' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/33.gif', ':O)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/34.gif', '8-}' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/35.gif', '<:-P' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/36.gif', '(:|' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/37.gif', '=P~' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/38.gif', ':-?' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/39.gif', '#-o' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/40.gif', '=D>' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/41.gif', ':-SS' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/42.gif', '@-)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/43.gif', ':^o' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/44.gif', ':-w' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/45.gif', ':-<' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/46.gif', '>:P' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/47.gif', '<):)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/48.gif', ':@)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/49.gif', '3:-O' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/50.gif', ':(|)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/51.gif', '~:>' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/52.gif', '@};-' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/53.gif', '%%-' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/54.gif', '**==' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/55.gif', '(~~)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/56.gif', '~O)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/57.gif', '*-:)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/58.gif', '8-X' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/59.gif', '=:)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/60.gif', '>-)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/61.gif', ':-L' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/62.gif', '[-O<' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/63.gif', '$-)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/64.gif', ':-"' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/65.gif', 'b-(' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/66.gif', ':)>-' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/67.gif', '[-X' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/68.gif', '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/D/index.html' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/69.gif', '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/gt/index.html' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/70.gif', ';))' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/71.gif', ':-@' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/76.gif', '^:)^' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/77.gif', ':-j' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/78.gif', '(*)' : '/doc/g/gu/gugod/Asynapse/Emoticon/001/lib/Asynapse/79.gif' } /** */