emoji-mart-lazyload/src/utils/index.js

137 lines
2.9 KiB
JavaScript
Raw Normal View History

2016-07-19 16:27:24 +00:00
import data from '../../data'
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/
2016-07-19 16:27:24 +00:00
const SKINS = [
'1F3FA', '1F3FB', '1F3FC',
'1F3FD', '1F3FE', '1F3FF',
]
function unifiedToNative(unified) {
var unicodes = unified.split('-'),
codePoints = unicodes.map((u) => `0x${u}`)
return String.fromCodePoint(...codePoints)
}
function sanitize(emoji) {
var { name, short_names, skin_tone, skin_variations, emoticons, unified } = emoji,
2016-07-19 16:27:24 +00:00
id = short_names[0],
colons = `:${id}:`
if (skin_tone) {
colons += `:skin-tone-${skin_tone}:`
}
return {
id,
name,
colons,
emoticons,
skin: skin_tone || (skin_variations ? 1 : null),
2016-07-19 16:27:24 +00:00
native: unifiedToNative(unified),
}
}
function getSanitizedData() {
return sanitize(getData(...arguments))
}
function getData(emoji, skin, set) {
var emojiData = {}
2016-07-19 16:27:24 +00:00
if (typeof emoji == 'string') {
let matches = emoji.match(COLONS_REGEX)
if (matches) {
emoji = matches[1]
if (matches[2]) {
skin = parseInt(matches[2])
}
}
if (data.short_names.hasOwnProperty(emoji)) {
emoji = data.short_names[emoji]
}
if (data.emojis.hasOwnProperty(emoji)) {
emojiData = data.emojis[emoji]
2016-10-13 00:26:10 +00:00
}
2016-07-19 16:27:24 +00:00
} else if (emoji.id) {
if (data.short_names.hasOwnProperty(emoji.id)) {
emoji.id = data.short_names[emoji.id]
}
if (data.emojis.hasOwnProperty(emoji.id)) {
emojiData = data.emojis[emoji.id]
2016-10-13 00:26:10 +00:00
skin || (skin = emoji.skin)
}
2016-07-19 16:27:24 +00:00
}
2017-03-10 17:11:05 +00:00
emojiData.emoticons || (emojiData.emoticons = [])
emojiData.variations || (emojiData.variations = [])
if (emojiData.skin_variations && skin > 1 && set) {
2016-07-19 16:27:24 +00:00
emojiData = JSON.parse(JSON.stringify(emojiData))
var skinKey = SKINS[skin - 1],
variationKey = `${emojiData.unified}-${skinKey}`,
variationData = emojiData.skin_variations[variationKey]
2016-07-19 16:27:24 +00:00
if (!variationData.variations && emojiData.variations) {
delete emojiData.variations
}
if (variationData[`has_img_${set}`]) {
2016-07-19 16:27:24 +00:00
emojiData.skin_tone = skin
for (let k in variationData) {
let v = variationData[k]
emojiData[k] = v
}
}
}
if (emojiData.variations && emojiData.variations.length) {
emojiData = JSON.parse(JSON.stringify(emojiData))
emojiData.unified = emojiData.variations.shift()
}
2016-07-19 16:27:24 +00:00
return emojiData
}
2016-07-22 20:04:30 +00:00
function intersect(a, b) {
var aSet = new Set(a),
bSet = new Set(b),
intersection = null
intersection = new Set(
[...aSet].filter(x => bSet.has(x))
)
return Array.from(intersection)
}
2016-10-27 03:22:59 +00:00
function deepMerge(a, b) {
var o = {}
for (let key in a) {
let originalValue = a[key],
value = originalValue
if (b.hasOwnProperty(key)) {
value = b[key]
}
if (typeof value === 'object') {
value = deepMerge(originalValue, value)
}
o[key] = value
}
return o
}
2016-11-01 15:51:55 +00:00
export { getData, getSanitizedData, intersect, deepMerge, unifiedToNative }