@atlaskit/adf-schema
Version:
Shared package that contains the ADF-schema (json) and ProseMirror node/mark specs
80 lines (77 loc) • 2.93 kB
JavaScript
// Default emoji id for Confluence glyphs that has no match to Fabric Emoji
const DEFAULT_EMOJI_ID = '2b50';
// Default ac:name for emoticons as a fallback is `blue-star`
const DEFAULT_EMOJI_ACNAME = 'blue-star';
// ac:hipchat-emoticon prefix when converting to Emoji ID
const HC_EMOTICON_PREFIX = 'atlassian-';
/**
* Confluence glyphs ac:name of <ac:emoticon /> map to new emojis
* {
* [ac:name] : ['emoji-id', 'emoji-shortName', 'emoji-fallback']
* ...
* }
* Glyphs that do not map to Fabric Emoji
* will be mapped to Emoji Id '2b50' (:star:) with preserving ac:name as shortName attribute;
*/
const acNameToEmojiMap = {
smile: ['1f642', ':slight_smile:', '\uD83D\uDE42'],
sad: ['1f641', ':slight_frown:', '\uD83D\uDE41'],
cheeky: ['1f61b', ':stuck_out_tongue:', '\uD83D\uDE1B'],
laugh: ['1f600', ':grinning:', '\uD83D\uDE00'],
wink: ['1f609', ':wink:', '\uD83D\uDE09'],
information: ['2139', ':information_source:', '\u2139'],
tick: ['2705', ':white_check_mark:', '\u2705'],
cross: ['274c', ':x:', '\u274C'],
warning: ['26a0', ':warning:', '\u26A0'],
plus: ['2795', ':heavy_plus_sign:', '\u2795'],
minus: ['2796', ':heavy_minus_sign:', '\u2796'],
question: ['2753', ':question:', '\u003F'],
'thumbs-up': ['1f44d', ':thumbsup:', '\uD83D\uDC4D'],
'thumbs-down': ['1f44e', ':thumbsdown:', '\uD83D\uDC4E'],
'light-on': ['1f4a1', ':bulb:', '\uD83D\uDCA1'],
'yellow-star': ['2b50', ':star:', '\uD83D\uDC9B'],
'light-off': ['1f6ab', ':no_entry_sign:', '\uD83D\uDEAB'],
'red-star': ['2764', ':heart:', '\u2764\uFE0F'],
'green-star': ['1f49a', ':green_heart:', '\uD83D\uDC9A'],
'blue-star': ['1f499', ':blue_heart:', '\uD83D\uDC99'],
heart: ['2764', ':heart:', '\u2764\uFE0F'],
'broken-heart': ['1f494', ':broken_heart:', '\uD83D\uDC94']
};
export function acNameToEmoji(acName) {
const emojiData = acNameToEmojiMap[acName];
return emojiData ? {
id: emojiData[0],
shortName: emojiData[1],
text: emojiData[2]
} : {
id: DEFAULT_EMOJI_ID,
shortName: `:${acName}:`,
text: ''
};
}
export function emojiIdToAcName(emojiId) {
const filterEmojis = acName => acNameToEmojiMap[acName] ? acNameToEmojiMap[acName][0] === emojiId : false;
return Object.keys(acNameToEmojiMap).filter(filterEmojis)[0];
}
export function acShortcutToEmoji(hipchatEmoticonShortName) {
return {
id: `${HC_EMOTICON_PREFIX}${hipchatEmoticonShortName}`,
shortName: `:${hipchatEmoticonShortName}:`,
text: ''
};
}
function getAcNameFromShortName(shortName) {
return shortName.slice(shortName[0] === ':' ? 1 : 0, shortName[shortName.length - 1] === ':' ? -1 : shortName.length);
}
export function getEmojiAcName({
id,
shortName
}) {
if (DEFAULT_EMOJI_ID === id) {
const possibleName = getAcNameFromShortName(shortName);
if (possibleName in acNameToEmojiMap) {
return possibleName;
}
}
return emojiIdToAcName(id) || DEFAULT_EMOJI_ACNAME;
}