mirror of https://github.com/vector-im/riot-web
deduplicate emojibase loading
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>pull/21833/head
parent
5c57b9ab9b
commit
66d2a67142
|
@ -27,36 +27,22 @@ import _uniq from 'lodash/uniq';
|
||||||
import _sortBy from 'lodash/sortBy';
|
import _sortBy from 'lodash/sortBy';
|
||||||
import SettingsStore from "../settings/SettingsStore";
|
import SettingsStore from "../settings/SettingsStore";
|
||||||
import { shortcodeToUnicode } from '../HtmlUtils';
|
import { shortcodeToUnicode } from '../HtmlUtils';
|
||||||
|
import { EMOJI, IEmoji } from '../emoji';
|
||||||
|
|
||||||
import EMOTICON_REGEX from 'emojibase-regex/emoticon';
|
import EMOTICON_REGEX from 'emojibase-regex/emoticon';
|
||||||
import * as EMOJIBASE from 'emojibase-data/en/compact.json';
|
|
||||||
|
|
||||||
const LIMIT = 20;
|
const LIMIT = 20;
|
||||||
|
|
||||||
// Match for ascii-style ";-)" emoticons or ":wink:" shortcodes provided by emojibase
|
// Match for ascii-style ";-)" emoticons or ":wink:" shortcodes provided by emojibase
|
||||||
const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|:[+-\\w]*:?)$', 'g');
|
const EMOJI_REGEX = new RegExp('(' + EMOTICON_REGEX.source + '|:[+-\\w]*:?)$', 'g');
|
||||||
|
|
||||||
interface IEmoji {
|
|
||||||
annotation: string;
|
|
||||||
group: number;
|
|
||||||
hexcode: string;
|
|
||||||
order: number;
|
|
||||||
shortcodes: string[];
|
|
||||||
tags: string[];
|
|
||||||
unicode: string;
|
|
||||||
emoticon: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IEmojiShort {
|
interface IEmojiShort {
|
||||||
emoji: IEmoji;
|
emoji: IEmoji;
|
||||||
shortname: string;
|
shortname: string;
|
||||||
_orderBy: number;
|
_orderBy: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: it's very unclear why we bother with this generated emojidata file.
|
const EMOJI_SHORTNAMES: IEmojiShort[] = EMOJI.sort((a, b) => {
|
||||||
// all it means is that we end up bloating the bundle with precomputed stuff
|
|
||||||
// which would be trivial to calculate and cache on demand.
|
|
||||||
const EMOJI_SHORTNAMES: IEmojiShort[] = (EMOJIBASE as IEmoji[]).sort((a, b) => {
|
|
||||||
if (a.group === b.group) {
|
if (a.group === b.group) {
|
||||||
return a.order - b.order;
|
return a.order - b.order;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,28 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// @ts-ignore - import * as EMOJIBASE actually breaks this
|
||||||
import EMOJIBASE from 'emojibase-data/en/compact.json';
|
import EMOJIBASE from 'emojibase-data/en/compact.json';
|
||||||
|
|
||||||
|
export interface IEmoji {
|
||||||
|
annotation: string;
|
||||||
|
group: number;
|
||||||
|
hexcode: string;
|
||||||
|
order: number;
|
||||||
|
shortcodes: string[];
|
||||||
|
tags: string[];
|
||||||
|
unicode: string;
|
||||||
|
emoticon?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IEmojiWithFilterString extends IEmoji {
|
||||||
|
filterString?: string;
|
||||||
|
}
|
||||||
|
|
||||||
// The unicode is stored without the variant selector
|
// The unicode is stored without the variant selector
|
||||||
const UNICODE_TO_EMOJI = new Map(); // not exported as gets for it are handled by getEmojiFromUnicode
|
const UNICODE_TO_EMOJI = new Map<string, IEmojiWithFilterString>(); // not exported as gets for it are handled by getEmojiFromUnicode
|
||||||
export const EMOTICON_TO_EMOJI = new Map();
|
export const EMOTICON_TO_EMOJI = new Map<string, IEmojiWithFilterString>();
|
||||||
export const SHORTCODE_TO_EMOJI = new Map();
|
export const SHORTCODE_TO_EMOJI = new Map<string, IEmojiWithFilterString>();
|
||||||
|
|
||||||
export const getEmojiFromUnicode = unicode => UNICODE_TO_EMOJI.get(stripVariation(unicode));
|
export const getEmojiFromUnicode = unicode => UNICODE_TO_EMOJI.get(stripVariation(unicode));
|
||||||
|
|
||||||
|
@ -48,7 +64,7 @@ export const DATA_BY_CATEGORY = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Store various mappings from unicode/emoticon/shortcode to the Emoji objects
|
// Store various mappings from unicode/emoticon/shortcode to the Emoji objects
|
||||||
EMOJIBASE.forEach(emoji => {
|
EMOJIBASE.forEach((emoji: IEmojiWithFilterString) => {
|
||||||
const categoryId = EMOJIBASE_GROUP_ID_TO_CATEGORY[emoji.group];
|
const categoryId = EMOJIBASE_GROUP_ID_TO_CATEGORY[emoji.group];
|
||||||
if (DATA_BY_CATEGORY.hasOwnProperty(categoryId)) {
|
if (DATA_BY_CATEGORY.hasOwnProperty(categoryId)) {
|
||||||
DATA_BY_CATEGORY[categoryId].push(emoji);
|
DATA_BY_CATEGORY[categoryId].push(emoji);
|
||||||
|
@ -89,3 +105,5 @@ EMOJIBASE.forEach(emoji => {
|
||||||
function stripVariation(str) {
|
function stripVariation(str) {
|
||||||
return str.replace(/[\uFE00-\uFE0F]$/, "");
|
return str.replace(/[\uFE00-\uFE0F]$/, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const EMOJI: IEmoji[] = EMOJIBASE;
|
Loading…
Reference in New Issue