complete redesign: use nodejs on server instead of php - documentation to be updated
This commit is contained in:
134
nodejs/public/javascripts/jquery.cssemoticons.js
Normal file
134
nodejs/public/javascripts/jquery.cssemoticons.js
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* jQuery CSSEmoticons plugin 0.2.9
|
||||
*
|
||||
* Copyright (c) 2010 Steve Schwartz (JangoSteve)
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Date: Sun Oct 22 1:00:00 2010 -0500
|
||||
*/
|
||||
(function($) {
|
||||
$.fn.emoticonize = function(options) {
|
||||
|
||||
var opts = $.extend({}, $.fn.emoticonize.defaults, options);
|
||||
|
||||
var escapeCharacters = [ ")", "(", "*", "[", "]", "{", "}", "|", "^", "<", ">", "\\", "?", "+", "=", "." ];
|
||||
|
||||
var threeCharacterEmoticons = [
|
||||
// really weird bug if you have :{ and then have :{) in the same container anywhere *after* :{ then :{ doesn't get matched, e.g. :] :{ :) :{) :) :-) will match everything except :{
|
||||
// But if you take out the :{) or even just move :{ to the right of :{) then everything works fine. This has something to do with the preMatch string below I think, because
|
||||
// it'll work again if you set preMatch equal to '()'
|
||||
// So for now, we'll just remove :{) from the emoticons, because who actually uses this mustache man anyway?
|
||||
// ":{)",
|
||||
":-)", ":o)", ":c)", ":^)", ":-D", ":-(", ":-9", ";-)", ":-P", ":-p", ":-Þ", ":-b", ":-O", ":-/", ":-X", ":-#", ":'(", "B-)", "8-)", ";*(", ":-*", ":-\\",
|
||||
"?-)", // <== This is my own invention, it's a smiling pirate (with an eye-patch)!
|
||||
// and the twoCharacterEmoticons from below, but with a space inserted
|
||||
": )", ": ]", "= ]", "= )", "8 )", ": }", ": D", "8 D", "X D", "x D", "= D", ": (", ": [", ": {", "= (", "; )", "; ]", "; D", ": P", ": p", "= P", "= p", ": b", ": Þ", ": O", "8 O", ": /", "= /", ": S", ": #", ": X", "B )", ": |", ": \\", "= \\", ": *", ": >", ": <"//, "* )"
|
||||
];
|
||||
|
||||
var twoCharacterEmoticons = [ // separate these out so that we can add a letter-spacing between the characters for better proportions
|
||||
":)", ":]", "=]", "=)", "8)", ":}", ":D", ":(", ":[", ":{", "=(", ";)", ";]", ";D", ":P", ":p", "=P", "=p", ":b", ":Þ", ":O", ":/", "=/", ":S", ":#", ":X", "B)", ":|", ":\\", "=\\", ":*", ":>", ":<"//, "*)"
|
||||
];
|
||||
|
||||
var specialEmoticons = { // emoticons to be treated with a special class, hash specifies the additional class to add, along with standard css-emoticon class
|
||||
">:)": { cssClass: "red-emoticon small-emoticon spaced-emoticon" },
|
||||
">;)": { cssClass: "red-emoticon small-emoticon spaced-emoticon"},
|
||||
">:(": { cssClass: "red-emoticon small-emoticon spaced-emoticon" },
|
||||
">: )": { cssClass: "red-emoticon small-emoticon" },
|
||||
">; )": { cssClass: "red-emoticon small-emoticon"},
|
||||
">: (": { cssClass: "red-emoticon small-emoticon" },
|
||||
";(": { cssClass: "red-emoticon spaced-emoticon" },
|
||||
"<3": { cssClass: "pink-emoticon counter-rotated" },
|
||||
"O_O": { cssClass: "no-rotate" },
|
||||
"o_o": { cssClass: "no-rotate" },
|
||||
"0_o": { cssClass: "no-rotate" },
|
||||
"O_o": { cssClass: "no-rotate" },
|
||||
"T_T": { cssClass: "no-rotate" },
|
||||
"^_^": { cssClass: "no-rotate" },
|
||||
"O:)": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"O: )": { cssClass: "small-emoticon" },
|
||||
"8D": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"XD": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"xD": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"=D": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"8O": { cssClass: "small-emoticon spaced-emoticon" },
|
||||
"[+=..]": { cssClass: "no-rotate nintendo-controller" }
|
||||
//"OwO": { cssClass: "no-rotate" }, // these emoticons overflow and look weird even if they're made even smaller, could probably fix this with some more css trickery
|
||||
//"O-O": { cssClass: "no-rotate" },
|
||||
//"O=)": { cssClass: "small-emoticon" }
|
||||
}
|
||||
|
||||
var specialRegex = new RegExp( '(\\' + escapeCharacters.join('|\\') + ')', 'g' );
|
||||
// One of these characters must be present before the matched emoticon, or the matched emoticon must be the first character in the container HTML
|
||||
// This is to ensure that the characters in the middle of HTML properties or URLs are not matched as emoticons
|
||||
// Below matches ^ (first character in container HTML), \s (whitespace like space or tab), or \0 (NULL character)
|
||||
// (<\\S+.*>) matches <\\S+.*> (matches an HTML tag like <span> or <div>), but haven't quite gotten it working yet, need to push this fix now
|
||||
var preMatch = '(^|[\\s\\0])';
|
||||
|
||||
for ( var i=threeCharacterEmoticons.length-1; i>=0; --i ){
|
||||
threeCharacterEmoticons[i] = threeCharacterEmoticons[i].replace(specialRegex,'\\$1');
|
||||
threeCharacterEmoticons[i] = new RegExp( preMatch+'(' + threeCharacterEmoticons[i] + ')', 'g' );
|
||||
}
|
||||
|
||||
for ( var i=twoCharacterEmoticons.length-1; i>=0; --i ){
|
||||
twoCharacterEmoticons[i] = twoCharacterEmoticons[i].replace(specialRegex,'\\$1');
|
||||
twoCharacterEmoticons[i] = new RegExp( preMatch+'(' + twoCharacterEmoticons[i] + ')', 'g' );
|
||||
}
|
||||
|
||||
for ( var emoticon in specialEmoticons ){
|
||||
specialEmoticons[emoticon].regexp = emoticon.replace(specialRegex,'\\$1');
|
||||
specialEmoticons[emoticon].regexp = new RegExp( preMatch+'(' + specialEmoticons[emoticon].regexp + ')', 'g' );
|
||||
}
|
||||
|
||||
var exclude = 'span.css-emoticon';
|
||||
if(opts.exclude){ exclude += ','+opts.exclude; }
|
||||
var excludeArray = exclude.split(',')
|
||||
|
||||
return this.not(exclude).each(function() {
|
||||
var container = $(this);
|
||||
var cssClass = 'css-emoticon'
|
||||
if(opts.animate){ cssClass += ' un-transformed-emoticon animated-emoticon'; }
|
||||
|
||||
for( var emoticon in specialEmoticons ){
|
||||
specialCssClass = cssClass + " " + specialEmoticons[emoticon].cssClass;
|
||||
container.html(container.html().replace(specialEmoticons[emoticon].regexp,"$1<span class='" + specialCssClass + "'>$2</span>"));
|
||||
}
|
||||
$(threeCharacterEmoticons).each(function(){
|
||||
container.html(container.html().replace(this,"$1<span class='" + cssClass + "'>$2</span>"));
|
||||
});
|
||||
$(twoCharacterEmoticons).each(function(){
|
||||
container.html(container.html().replace(this,"$1<span class='" + cssClass + " spaced-emoticon'>$2</span>"));
|
||||
});
|
||||
// fix emoticons that got matched more then once (where one emoticon is a subset of another emoticon), and thus got nested spans
|
||||
$.each(excludeArray,function(index,item){
|
||||
container.find($.trim(item)+" span.css-emoticon").each(function(){
|
||||
$(this).replaceWith($(this).text());
|
||||
});
|
||||
});
|
||||
if(opts.animate){
|
||||
setTimeout(function(){$('.un-transformed-emoticon').removeClass('un-transformed-emoticon');}, opts.delay);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$.fn.unemoticonize = function(options) {
|
||||
var opts = $.extend({}, $.fn.emoticonize.defaults, options);
|
||||
return this.each(function() {
|
||||
var container = $(this);
|
||||
container.find('span.css-emoticon').each(function(){
|
||||
// add delay equal to animate speed if animate is not false
|
||||
var span = $(this);
|
||||
if(opts.animate){
|
||||
span.addClass('un-transformed-emoticon');
|
||||
setTimeout(function(){span.replaceWith(span.text());}, opts.delay);
|
||||
}else{
|
||||
span.replaceWith(span.text());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$.fn.emoticonize.defaults = {animate: true, delay: 500, exclude: 'pre,code,.no-emoticons'}
|
||||
})(jQuery);
|
Reference in New Issue
Block a user