Fully end to end encrypted anonymous chat program. Server only stores public key lookup for users and the encrypted messages. No credentials are transfered to the server, but kept in local browser storage. This allows 100% safe chatting. https://safechat.ch
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

134 lines
7.3 KiB

/*
* 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 )", ": |", ": \\", "= \\", ": *", ": &gt;", ": &lt;"//, "* )"
];
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)", ":|", ":\\", "=\\", ":*", ":&gt;", ":&lt;"//, "*)"
];
var specialEmoticons = { // emoticons to be treated with a special class, hash specifies the additional class to add, along with standard css-emoticon class
"&gt;:)": { cssClass: "red-emoticon small-emoticon spaced-emoticon" },
"&gt;;)": { cssClass: "red-emoticon small-emoticon spaced-emoticon"},
"&gt;:(": { cssClass: "red-emoticon small-emoticon spaced-emoticon" },
"&gt;: )": { cssClass: "red-emoticon small-emoticon" },
"&gt;; )": { cssClass: "red-emoticon small-emoticon"},
"&gt;: (": { cssClass: "red-emoticon small-emoticon" },
";(": { cssClass: "red-emoticon spaced-emoticon" },
"&lt;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);