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.
183 lines
6.0 KiB
183 lines
6.0 KiB
// Copyright Tsung Wu <tsung.bz@gmail.com>
|
|
// twitter: @ioNull
|
|
// github: http://github.com/ioNull/emoji.js
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
// copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
// persons to whom the Software is furnished to do so, subject to the
|
|
// following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included
|
|
// in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
;(function(root) {
|
|
var list;
|
|
if (typeof require != 'undefined') {
|
|
getEmojiListObj = require('./emoji-list-with-image');
|
|
punycode = require('./vendor/punycode/punycode.min.js');
|
|
list = getEmojiListObj.getEmojiList();
|
|
} else {
|
|
list = root.getEmojiList();
|
|
}
|
|
|
|
if (typeof console === 'undefined') {
|
|
console = {
|
|
log: function() {}
|
|
};
|
|
}
|
|
var emoji = {
|
|
parse: function(what) {
|
|
var unicodes;
|
|
if (what) {
|
|
unicodes = punycode.ucs2.decode(what);
|
|
} else {
|
|
return '';
|
|
}
|
|
//console.log(unicodes.length);
|
|
var unicodeString = '';
|
|
var kinds = list;
|
|
//debugger
|
|
for (var now = 0; now < unicodes.length;) {
|
|
var unicode = unicodes[now];
|
|
var isEmoji = false;
|
|
var isEmojiUnicode = false;
|
|
if (unicode >= 0xE000 && unicode < 0xE538) {
|
|
unicodeString = unicode.toString(16);
|
|
//console.log('it is emoji: ' + unicode + punycode.ucs2.encode([unicode]) + ' : ' + unicodeString);
|
|
//replace with img directly
|
|
isEmoji = true;
|
|
} else if (
|
|
//左上左下右上右下箭头
|
|
(unicode >= 0x2196 && unicode <= 0x2199) ||
|
|
//左右三角箭头
|
|
(unicode == 0x25C0 || unicode == 0x25B6) ||
|
|
//2三角左右
|
|
(unicode == 0x23EA || unicode == 0x23E9) || (unicode >= 0x2600 && unicode <= 0x3299) || (unicode >= 0x1f000 && unicode <= 0x1f700)) {
|
|
unicodeString = unicode.toString(16);
|
|
//console.log('it is unicode 6 emoji: ' + unicode + punycode.ucs2.encode([unicode]) + ' : ' + unicodeString);
|
|
//we need to find out what is mapped
|
|
isEmoji = true;
|
|
isEmojiUnicode = true;
|
|
} else {
|
|
//console.log('it is not emoji' + unicode);
|
|
//数字和#号
|
|
if (unicode == 0x20e3) {
|
|
if (now > 0) {
|
|
//check if previous is a number or #
|
|
var preCode = unicodes[now - 1];
|
|
if (preCode == 0x23 || preCode >= 0x30 && preCode <= 0x39) {
|
|
//console.log('it is a number unicode: ' + preCode);
|
|
isEmoji = true;
|
|
isEmojiUnicode = true; --now;
|
|
unicode = preCode;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isEmoji) {
|
|
for (var i = 0; i < kinds.length; ++i) {
|
|
var kind = kinds[i];
|
|
for (var j = 0; j < kind.length; ++j) {
|
|
var emo = kind[j];
|
|
var foundCount = 0;
|
|
var unicodeEmoji = emo[1];
|
|
if (isEmojiUnicode) {
|
|
var isArray = (typeof unicodeEmoji != 'string');
|
|
if (isArray && now + unicodeEmoji.length - 1 < unicodes.length) {
|
|
//console.log('is array :' + now + ' ' + unicodeEmoji.length);
|
|
for (var uindex = 0; uindex < unicodeEmoji.length; uindex++) {
|
|
var unString = unicodes[now + uindex].toString(16);
|
|
//console.log('unString is: ' + unString);
|
|
if (unString != unicodeEmoji[uindex]) {
|
|
foundCount = 0;
|
|
break;
|
|
} else {
|
|
foundCount++;
|
|
}
|
|
}
|
|
//console.log('emojis string is: ' + emo[0] + ' count: ' + foundCount);
|
|
} else if (!isArray && emo[1] == unicodeString) {
|
|
foundCount = 1;
|
|
}
|
|
} else if (!isEmojiUnicode && emo[0] == unicodeString) {
|
|
foundCount = 1;
|
|
}
|
|
|
|
if (foundCount > 0) {
|
|
//console.log('emojis string is: ' + emo[0] + ' count: ' + foundCount);
|
|
var data = 'data:image/png;base64,' + emo[2];
|
|
var html = '<img style="display: inline;vertical-align: middle;" src="' + data + '" unicode16="'+emo[1]+'"/>';
|
|
//console.log('img is: ' + html);
|
|
//remove old text, add html string
|
|
var puny = punycode.ucs2.decode(html);
|
|
//console.log('puny length: ' + puny.length);
|
|
unicodes.splice(now, foundCount);
|
|
for (var curr = 0; curr < puny.length; ++curr) {
|
|
unicodes.splice(now, 0, puny[curr]);
|
|
//move next
|
|
++now;
|
|
}
|
|
//index increase next loop
|
|
--now;
|
|
//console.log('unicodes length: ' + unicodes.length);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}++now;
|
|
}
|
|
//console.log('unicodes length: ' + unicodes.length);
|
|
var html = punycode.ucs2.encode(unicodes);
|
|
return html;
|
|
},
|
|
decodeChar: function (code_point) {//单个字符解码,如 0x1f604=>字符
|
|
var output = '';
|
|
if (code_point > 0xFFFF) {
|
|
code_point -= 0x10000;
|
|
output += String.fromCharCode(code_point >>> 10 & 0x3FF | 0xD800);
|
|
code_point = 0xDC00 | code_point & 0x3FF;
|
|
}
|
|
output += String.fromCharCode(code_point);
|
|
return output;
|
|
}
|
|
};
|
|
|
|
var ioNull = {
|
|
emoji: emoji
|
|
};
|
|
|
|
function extend(a, b) {
|
|
for (var prop in b) {
|
|
if (typeof b[prop] === 'undefined') {
|
|
delete a[prop];
|
|
// Avoid "Member not found" error in IE8 caused by setting window.constructor
|
|
} else if (prop !== 'constructor' || a !== root) {
|
|
a[prop] = b[prop];
|
|
}
|
|
}
|
|
return a;
|
|
};
|
|
if (typeof exports === 'undefined') {
|
|
if (typeof root.ioNull === 'undefined') {
|
|
root.ioNull = ioNull;
|
|
} else {
|
|
extend(root.ioNull, ioNull);
|
|
}
|
|
} else { // 支持exports方式
|
|
extend(exports, ioNull);
|
|
}
|
|
})(this);
|
|
|