import { emojiSearch } from "pretty-text/emoji"; import { IMAGE_VERSION as v } from "pretty-text/emoji/version"; import { emojiUnescape } from "discourse/lib/text"; import { discourseModule } from "helpers/qunit-helpers"; discourseModule("lib:emoji"); QUnit.test("emojiUnescape", function (assert) { const testUnescape = (input, expected, description, settings = {}) => { const originalSettings = {}; for (const [key, value] of Object.entries(settings)) { originalSettings[key] = this.siteSettings[key]; this.siteSettings[key] = value; } assert.equal(emojiUnescape(input), expected, description); for (const [key, value] of Object.entries(originalSettings)) { this.siteSettings[key] = value; } }; testUnescape( "Not emoji :O) :frog) :smile)", "Not emoji :O) :frog) :smile)", "title without emoji" ); testUnescape( "Not emoji :frog :smile", "Not emoji :frog :smile", "end colon is not optional" ); testUnescape( "emoticons :)", `emoticons <img src='/images/emoji/emoji_one/slight_smile.png?v=${v}' title='slight_smile' alt='slight_smile' class='emoji'>`, "emoticons are still supported" ); testUnescape( "With emoji :O: :frog: :smile:", `With emoji <img src='/images/emoji/emoji_one/o.png?v=${v}' title='O' alt='O' class='emoji'> <img src='/images/emoji/emoji_one/frog.png?v=${v}' title='frog' alt='frog' class='emoji'> <img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'>`, "title with emoji" ); testUnescape( "a:smile:a", "a:smile:a", "word characters not allowed next to emoji" ); testUnescape( "(:frog:) :)", `(<img src='/images/emoji/emoji_one/frog.png?v=${v}' title='frog' alt='frog' class='emoji'>) <img src='/images/emoji/emoji_one/slight_smile.png?v=${v}' title='slight_smile' alt='slight_smile' class='emoji'>`, "non-word characters allowed next to emoji" ); testUnescape( ":smile: hi", `<img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'> hi`, "start of line" ); testUnescape( "hi :smile:", `hi <img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'>`, "end of line" ); testUnescape( "hi :blonde_woman:t4:", `hi <img src='/images/emoji/emoji_one/blonde_woman/4.png?v=${v}' title='blonde_woman:t4' alt='blonde_woman:t4' class='emoji'>`, "support for skin tones" ); testUnescape( "hi :blonde_woman:t4: :blonde_man:t6:", `hi <img src='/images/emoji/emoji_one/blonde_woman/4.png?v=${v}' title='blonde_woman:t4' alt='blonde_woman:t4' class='emoji'> <img src='/images/emoji/emoji_one/blonde_man/6.png?v=${v}' title='blonde_man:t6' alt='blonde_man:t6' class='emoji'>`, "support for multiple skin tones" ); testUnescape( "hi :blonde_man:t6", "hi :blonde_man:t6", "end colon not optional for skin tones" ); testUnescape( "emoticons :)", "emoticons :)", "no emoticons when emojis are disabled", { enable_emoji: false } ); testUnescape( "emoji :smile:", "emoji :smile:", "no emojis when emojis are disabled", { enable_emoji: false } ); testUnescape( "emoticons :)", "emoticons :)", "no emoticons when emoji shortcuts are disabled", { enable_emoji_shortcuts: false } ); testUnescape( "Hello 😊 World", `Hello <img src='/images/emoji/emoji_one/blush.png?v=${v}' title='blush' alt='blush' class='emoji'> World`, "emoji from Unicode emoji" ); testUnescape( "Hello😊World", "Hello😊World", "keeps Unicode emoji when inline translation disabled", { enable_inline_emoji_translation: false, } ); testUnescape( "Hello😊World", `Hello<img src='/images/emoji/emoji_one/blush.png?v=${v}' title='blush' alt='blush' class='emoji'>World`, "emoji from Unicode emoji when inline translation enabled", { enable_inline_emoji_translation: true, } ); testUnescape( "hi:smile:", "hi:smile:", "no emojis when inline translation disabled", { enable_inline_emoji_translation: false, } ); testUnescape( "hi:smile:", `hi<img src='/images/emoji/emoji_one/smile.png?v=${v}' title='smile' alt='smile' class='emoji'>`, "emoji when inline translation enabled", { enable_inline_emoji_translation: true } ); }); QUnit.test("Emoji search", (assert) => { // able to find an alias assert.equal(emojiSearch("+1").length, 1); // able to find middle of line search assert.equal(emojiSearch("check", { maxResults: 3 }).length, 3); });