@ -1,22 +0,0 @@ | |||||
// @preval | |||||
const data = require('emoji-mart/dist/data').default; | |||||
const pick = require('lodash/pick'); | |||||
const values = require('lodash/values'); | |||||
const condensedEmojis = Object.keys(data.emojis).map(key => { | |||||
if (!data.emojis[key].short_names[0] === key) { | |||||
throw new Error('The condenser expects the first short_code to be the ' + | |||||
'key. It may need to be rewritten if the emoji change such that this ' + | |||||
'is no longer the case.'); | |||||
} | |||||
return values(pick(data.emojis[key], ['short_names', 'unified', 'search'])); | |||||
}); | |||||
// JSON.parse/stringify is to emulate what @preval is doing and avoid any | |||||
// inconsistent behavior in dev mode | |||||
module.exports = JSON.parse(JSON.stringify({ | |||||
emojis: condensedEmojis, | |||||
skins: data.skins, | |||||
categories: data.categories, | |||||
short_names: data.short_names, | |||||
})); |
@ -1,16 +0,0 @@ | |||||
const data = require('./emoji_data_compressed'); | |||||
// decompress | |||||
const emojis = {}; | |||||
data.emojis.forEach(compressedEmoji => { | |||||
const [ short_names, unified, search ] = compressedEmoji; | |||||
emojis[short_names[0]] = { | |||||
short_names, | |||||
unified, | |||||
search, | |||||
}; | |||||
}); | |||||
data.emojis = emojis; | |||||
module.exports = data; |
@ -1,38 +0,0 @@ | |||||
// @preval | |||||
// http://www.unicode.org/Public/emoji/5.0/emoji-test.txt | |||||
const emojis = require('./emoji_map.json'); | |||||
const { emojiIndex } = require('emoji-mart'); | |||||
const excluded = ['®', '©', '™']; | |||||
const skins = ['🏻', '🏼', '🏽', '🏾', '🏿']; | |||||
const shortcodeMap = {}; | |||||
Object.keys(emojiIndex.emojis).forEach(key => { | |||||
shortcodeMap[emojiIndex.emojis[key].native] = emojiIndex.emojis[key].id; | |||||
}); | |||||
const stripModifiers = unicode => { | |||||
skins.forEach(tone => { | |||||
unicode = unicode.replace(tone, ''); | |||||
}); | |||||
return unicode; | |||||
}; | |||||
Object.keys(emojis).forEach(key => { | |||||
if (excluded.includes(key)) { | |||||
delete emojis[key]; | |||||
return; | |||||
} | |||||
const normalizedKey = stripModifiers(key); | |||||
let shortcode = shortcodeMap[normalizedKey]; | |||||
if (!shortcode) { | |||||
shortcode = shortcodeMap[normalizedKey + '\uFE0F']; | |||||
} | |||||
emojis[key] = [emojis[key], shortcode]; | |||||
}); | |||||
module.exports.unicodeMapping = emojis; |
@ -0,0 +1,90 @@ | |||||
// @preval | |||||
// http://www.unicode.org/Public/emoji/5.0/emoji-test.txt | |||||
// This file contains the compressed version of the emoji data from | |||||
// both emoji_map.json and from emoji-mart's emojiIndex and data objects. | |||||
// It's designed to be emitted in an array format to take up less space | |||||
// over the wire. | |||||
const { unicodeToFilename } = require('./unicode_to_filename'); | |||||
const { unicodeToUnifiedName } = require('./unicode_to_unified_name'); | |||||
const emojiMap = require('./emoji_map.json'); | |||||
const { emojiIndex } = require('emoji-mart'); | |||||
const emojiMartData = require('emoji-mart/dist/data').default; | |||||
const excluded = ['®', '©', '™']; | |||||
const skins = ['🏻', '🏼', '🏽', '🏾', '🏿']; | |||||
const shortcodeMap = {}; | |||||
const shortCodesToEmojiData = {}; | |||||
const emojisWithoutShortCodes = []; | |||||
Object.keys(emojiIndex.emojis).forEach(key => { | |||||
shortcodeMap[emojiIndex.emojis[key].native] = emojiIndex.emojis[key].id; | |||||
}); | |||||
const stripModifiers = unicode => { | |||||
skins.forEach(tone => { | |||||
unicode = unicode.replace(tone, ''); | |||||
}); | |||||
return unicode; | |||||
}; | |||||
Object.keys(emojiMap).forEach(key => { | |||||
if (excluded.includes(key)) { | |||||
delete emojiMap[key]; | |||||
return; | |||||
} | |||||
const normalizedKey = stripModifiers(key); | |||||
let shortcode = shortcodeMap[normalizedKey]; | |||||
if (!shortcode) { | |||||
shortcode = shortcodeMap[normalizedKey + '\uFE0F']; | |||||
} | |||||
const filename = emojiMap[key]; | |||||
const filenameData = [key]; | |||||
if (unicodeToFilename(key) !== filename) { | |||||
// filename can't be derived using unicodeToFilename | |||||
filenameData.push(filename); | |||||
} | |||||
if (typeof shortcode === 'undefined') { | |||||
emojisWithoutShortCodes.push(filenameData); | |||||
} else { | |||||
shortCodesToEmojiData[shortcode] = shortCodesToEmojiData[shortcode] || [[]]; | |||||
shortCodesToEmojiData[shortcode][0].push(filenameData); | |||||
} | |||||
}); | |||||
Object.keys(emojiIndex.emojis).forEach(key => { | |||||
const { native } = emojiIndex.emojis[key]; | |||||
const { short_names, search, unified } = emojiMartData.emojis[key]; | |||||
if (short_names[0] !== key) { | |||||
throw new Error('The compresser expects the first short_code to be the ' + | |||||
'key. It may need to be rewritten if the emoji change such that this ' + | |||||
'is no longer the case.'); | |||||
} | |||||
short_names.splice(0, 1); // first short name can be inferred from the key | |||||
const searchData = [native, short_names, search]; | |||||
if (unicodeToUnifiedName(native) !== unified) { | |||||
// unified name can't be derived from unicodeToUnifiedName | |||||
searchData.push(unified); | |||||
} | |||||
shortCodesToEmojiData[key].push(searchData); | |||||
}); | |||||
// JSON.parse/stringify is to emulate what @preval is doing and avoid any | |||||
// inconsistent behavior in dev mode | |||||
module.exports = JSON.parse(JSON.stringify([ | |||||
shortCodesToEmojiData, | |||||
emojiMartData.skins, | |||||
emojiMartData.categories, | |||||
emojiMartData.short_names, | |||||
emojisWithoutShortCodes, | |||||
])); |
@ -0,0 +1,41 @@ | |||||
// The output of this module is designed to mimic emoji-mart's | |||||
// "data" object, such that we can use it for a light version of emoji-mart's | |||||
// emojiIndex.search functionality. | |||||
const { unicodeToUnifiedName } = require('./unicode_to_unified_name'); | |||||
const [ shortCodesToEmojiData, skins, categories, short_names ] = require('./emoji_compressed'); | |||||
const emojis = {}; | |||||
// decompress | |||||
Object.keys(shortCodesToEmojiData).forEach((shortCode) => { | |||||
let [ | |||||
filenameData, // eslint-disable-line no-unused-vars | |||||
searchData, | |||||
] = shortCodesToEmojiData[shortCode]; | |||||
let [ | |||||
native, | |||||
short_names, | |||||
search, | |||||
unified, | |||||
] = searchData; | |||||
if (!unified) { | |||||
// unified name can be derived from unicodeToUnifiedName | |||||
unified = unicodeToUnifiedName(native); | |||||
} | |||||
short_names = [shortCode].concat(short_names); | |||||
emojis[shortCode] = { | |||||
native, | |||||
search, | |||||
short_names, | |||||
unified, | |||||
}; | |||||
}); | |||||
module.exports = { | |||||
emojis, | |||||
skins, | |||||
categories, | |||||
short_names, | |||||
}; |
@ -1,7 +1,7 @@ | |||||
// This code is largely borrowed from: | // This code is largely borrowed from: | ||||
// https://github.com/missive/emoji-mart/blob/bbd4fbe/src/utils/emoji-index.js | // https://github.com/missive/emoji-mart/blob/bbd4fbe/src/utils/emoji-index.js | ||||
import data from './emoji_data_light'; | |||||
import data from './emoji_mart_data_light'; | |||||
import { getData, getSanitizedData, intersect } from './emoji_utils'; | import { getData, getSanitizedData, intersect } from './emoji_utils'; | ||||
let index = {}; | let index = {}; |
@ -0,0 +1,35 @@ | |||||
// A mapping of unicode strings to an object containing the filename | |||||
// (i.e. the svg filename) and a shortCode intended to be shown | |||||
// as a "title" attribute in an HTML element (aka tooltip). | |||||
const [ | |||||
shortCodesToEmojiData, | |||||
skins, // eslint-disable-line no-unused-vars | |||||
categories, // eslint-disable-line no-unused-vars | |||||
short_names, // eslint-disable-line no-unused-vars | |||||
emojisWithoutShortCodes, | |||||
] = require('./emoji_compressed'); | |||||
const { unicodeToFilename } = require('./unicode_to_filename'); | |||||
// decompress | |||||
const unicodeMapping = {}; | |||||
function processEmojiMapData(emojiMapData, shortCode) { | |||||
let [ native, filename ] = emojiMapData; | |||||
if (!filename) { | |||||
// filename name can be derived from unicodeToFilename | |||||
filename = unicodeToFilename(native); | |||||
} | |||||
unicodeMapping[native] = { | |||||
shortCode: shortCode, | |||||
filename: filename, | |||||
}; | |||||
} | |||||
Object.keys(shortCodesToEmojiData).forEach((shortCode) => { | |||||
let [ filenameData ] = shortCodesToEmojiData[shortCode]; | |||||
filenameData.forEach(emojiMapData => processEmojiMapData(emojiMapData, shortCode)); | |||||
}); | |||||
emojisWithoutShortCodes.forEach(emojiMapData => processEmojiMapData(emojiMapData)); | |||||
module.exports = unicodeMapping; |
@ -1,7 +1,7 @@ | |||||
// This code is largely borrowed from: | // This code is largely borrowed from: | ||||
// https://github.com/missive/emoji-mart/blob/bbd4fbe/src/utils/index.js | // https://github.com/missive/emoji-mart/blob/bbd4fbe/src/utils/index.js | ||||
import data from './emoji_data_light'; | |||||
import data from './emoji_mart_data_light'; | |||||
const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/; | const COLONS_REGEX = /^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/; | ||||
@ -0,0 +1,26 @@ | |||||
// taken from: | |||||
// https://github.com/twitter/twemoji/blob/47732c7/twemoji-generator.js#L848-L866 | |||||
exports.unicodeToFilename = (str) => { | |||||
let result = ''; | |||||
let charCode = 0; | |||||
let p = 0; | |||||
let i = 0; | |||||
while (i < str.length) { | |||||
charCode = str.charCodeAt(i++); | |||||
if (p) { | |||||
if (result.length > 0) { | |||||
result += '-'; | |||||
} | |||||
result += (0x10000 + ((p - 0xD800) << 10) + (charCode - 0xDC00)).toString(16); | |||||
p = 0; | |||||
} else if (0xD800 <= charCode && charCode <= 0xDBFF) { | |||||
p = charCode; | |||||
} else { | |||||
if (result.length > 0) { | |||||
result += '-'; | |||||
} | |||||
result += charCode.toString(16); | |||||
} | |||||
} | |||||
return result; | |||||
}; |
@ -0,0 +1,17 @@ | |||||
function padLeft(str, num) { | |||||
while (str.length < num) { | |||||
str = '0' + str; | |||||
} | |||||
return str; | |||||
} | |||||
exports.unicodeToUnifiedName = (str) => { | |||||
let output = ''; | |||||
for (let i = 0; i < str.length; i += 2) { | |||||
if (i > 0) { | |||||
output += '-'; | |||||
} | |||||
output += padLeft(str.codePointAt(i).toString(16).toUpperCase(), 4); | |||||
} | |||||
return output; | |||||
}; |