emoji-mart-lazyload/scripts/build-data.js

149 lines
3.7 KiB
JavaScript
Raw Normal View History

2016-07-07 17:35:22 +00:00
var fs = require('fs'),
emojiData = require('emoji-datasource'),
2016-07-21 20:06:13 +00:00
emojiLib = require('emojilib'),
2016-07-07 17:35:22 +00:00
inflection = require('inflection'),
mkdirp = require('mkdirp'),
buildSearch = require('../src/utils/build-search')
2016-07-21 20:06:13 +00:00
var unifiedToNative = unified => String.fromCodePoint(
...unified.split('-').map(s => parseInt(s, 16))
);
// Turn this:
//
// "uruguay": {
// "keywords": ["uy", "flag", "nation", "country", "banner"],
// "char": "🇺🇾",
// "fitzpatrick_scale": false,
// "category": "flags"
// },
//
// into this:
//
// "🇺🇾": {
// "name": "uruguay",
// "keywords": ["uruguay", "uy", "flag", "nation", "country", "banner"],
// "char": "🇺🇾",
// "fitzpatrick_scale": false,
// "category": "flags"
// },
var emojiLibByChar = Object.keys(emojiLib.lib).reduce(
(acc, shortName) => {
var data = Object.assign({}, emojiLib.lib[shortName])
data.keywords.unshift(shortName)
data.name = shortName
acc[data.char] = data
return acc
},
{}
)
2016-07-07 17:35:22 +00:00
var categories = ['People', 'Nature', 'Foods', 'Activity', 'Places', 'Objects', 'Symbols', 'Flags'],
data = { categories: [], emojis: {}, skins: {}, short_names: {} },
2016-07-07 17:35:22 +00:00
categoriesIndex = {}
2016-05-31 14:36:52 +00:00
categories.forEach((category, i) => {
data.categories[i] = { name: category, emojis: [] }
categoriesIndex[category] = i
})
emojiData.sort((a, b) => {
2016-07-07 17:35:22 +00:00
var aTest = a.sort_order || a.short_name,
bTest = b.sort_order || b.short_name
2016-05-31 14:36:52 +00:00
return aTest - bTest
})
emojiData.forEach((datum) => {
var category = datum.category,
2016-07-21 20:06:13 +00:00
keywords = [],
categoryIndex,
char = unifiedToNative(datum.unified),
emojiLibMatch = emojiLibByChar[char]
2016-05-31 14:36:52 +00:00
if (!datum.category) {
2016-05-31 14:36:52 +00:00
throw new Error('“' + datum.short_name + '” doesnt have a category')
}
datum.name || (datum.name = datum.short_name.replace(/\-/g, ' '))
if (datum.category == 'Flags' && emojiLibMatch) {
// prefer name from emojiLib ("Uruguay")
// instead of emojiData ("REGIONAL INDICATOR SYMBOL LETTERS UY")
datum.name = emojiLibMatch.name
}
2016-05-31 14:36:52 +00:00
datum.name = inflection.titleize(datum.name || '')
if (datum.category == 'Flags') {
// uppercase two-letter country codes
datum.name = datum.name.replace(/\b[A-Z]([a-z])$/, letters => letters.toUpperCase())
}
2016-05-31 14:36:52 +00:00
if (!datum.name) {
throw new Error('“' + datum.short_name + '” doesnt have a name')
}
2016-07-07 21:22:40 +00:00
datum.emoticons = datum.texts || []
datum.text = datum.text || ''
2016-07-07 21:22:40 +00:00
delete datum.texts
if (emojiLibMatch) {
keywords = emojiLibMatch.keywords
2016-07-21 20:06:13 +00:00
}
datum.search = buildSearch({
short_names: datum.short_names,
name: datum.name,
keywords,
emoticons: datum.emoticons
})
2016-07-26 18:50:55 +00:00
datum.search = datum.search.join(',')
2016-07-21 20:06:13 +00:00
2016-06-09 01:30:41 +00:00
if (datum.category == 'Skin Tones') {
data.skins[datum.short_name] = datum
} else {
categoryIndex = categoriesIndex[category]
data.categories[categoryIndex].emojis.push(datum.short_name)
data.emojis[datum.short_name] = datum
}
2016-07-22 16:23:47 +00:00
datum.short_names.forEach((short_name, i) => {
if (i == 0) { return }
data.short_names[short_name] = datum.short_name
})
2016-07-22 16:23:47 +00:00
delete datum.docomo
delete datum.au
delete datum.softbank
delete datum.google
delete datum.image
delete datum.short_name
delete datum.category
delete datum.sort_order
2017-03-10 17:11:05 +00:00
for (let key in datum) {
let value = datum[key]
if (Array.isArray(value) && !value.length) {
delete datum[key]
}
}
2016-05-31 14:36:52 +00:00
})
2017-04-04 16:00:32 +00:00
var flags = data.categories[categoriesIndex['Flags']]
2016-07-07 17:34:03 +00:00
flags.emojis.sort()
2016-05-31 14:36:52 +00:00
mkdirp('data', (err) => {
if (err) throw err
2017-03-02 18:55:01 +00:00
const stringifiedData = JSON.stringify(data).replace(/\"([A-Za-z_]+)\":/g, '$1:')
fs.writeFile('data/index.js', `export default ${stringifiedData}`, (err) => {
2016-05-31 14:36:52 +00:00
if (err) throw err
})
})