import anchorme from "anchorme"; import uEmojiParser from "universal-emoji-parser"; import twemoji from "twemoji"; import Config from "../../config"; const EmojiList = [ "笑脸", "生病", "破涕为笑", "吐舌", "脸红", "恐惧", "失望", "无语", "嘿哈", "捂脸", "奸笑", "机智", "皱眉", "耶", "鬼魂", "合十", "强壮", "庆祝", "礼物", "红包", "鸡", "开心", "大笑", "热情", "眨眼", "色", "接吻", "亲吻", "露齿笑", "满意", "戏弄", "得意", "汗", "低落", "呸", "焦虑", "担心", "震惊", "悔恨", "眼泪", "哭", "晕", "心烦", "生气", "睡觉", "恶魔", "外星人", "心", "心碎", "丘比特", "闪烁", "星星", "叹号", "问号", "睡着", "水滴", "音乐", "火", "便便", "弱", "拳头", "胜利", "上", "下", "右", "左", "第一", "吻", "热恋", "男孩", "女孩", "女士", "男士", "天使", "骷髅", "红唇", "太阳", "下雨", "多云", "雪人", "月亮", "闪电", "海浪", "猫", "小狗", "老鼠", "仓鼠", "兔子", "狗", "青蛙", "老虎", "考拉", "熊", "猪", "牛", "野猪", "猴子", "马", "蛇", "鸽子", "鸡", "企鹅", "毛虫", "章鱼", "鱼", "鲸鱼", "海豚", "玫瑰", "花", "棕榈树", "仙人掌", "礼盒", "南瓜灯", "圣诞老人", "圣诞树", "礼物", "铃", "气球", "CD", "相机", "录像机", "电脑", "电视", "电话", "解锁", "锁", "钥匙", "成交", "灯泡", "邮箱", "浴缸", "钱", "炸弹", "手枪", "药丸", "橄榄球", "篮球", "足球", "棒球", "高尔夫", "奖杯", "入侵者", "唱歌", "吉他", "比基尼", "皇冠", "雨伞", "手提包", "口红", "戒指", "钻石", "咖啡", "啤酒", "干杯", "鸡尾酒", "汉堡", "薯条", "意面", "寿司", "面条", "煎蛋", "冰激凌", "蛋糕", "苹果", "飞机", "火箭", "自行车", "高铁", "警告", "旗", "男人", "女人", "O", "X", "版权", "注册商标", "商标", ]; const QQFaceMap = { 微笑: "0", 撇嘴: "1", 色: "2", 发呆: "3", 得意: "4", 流泪: "5", 害羞: "6", 闭嘴: "7", 睡: "8", 大哭: "9", 尴尬: "10", 发怒: "11", 调皮: "12", 呲牙: "13", 惊讶: "14", 难过: "15", 酷: "16", 冷汗: "17", 抓狂: "18", 吐: "19", 偷笑: "20", 可爱: "21", 愉快: "21", 白眼: "22", 傲慢: "23", 饥饿: "24", 困: "25", 惊恐: "26", 流汗: "27", 憨笑: "28", 悠闲: "29", 大兵: "29", 奋斗: "30", 咒骂: "31", 疑问: "32", 嘘: "33", 晕: "34", 疯了: "35", 折磨: "35", 衰: "36", 骷髅: "37", 敲打: "38", 再见: "39", 擦汗: "40", 抠鼻: "41", 鼓掌: "42", 糗大了: "43", 坏笑: "44", 左哼哼: "45", 右哼哼: "46", 哈欠: "47", 鄙视: "48", 委屈: "49", 快哭了: "50", 阴险: "51", 亲亲: "52", 吓: "53", 可怜: "54", 菜刀: "55", 西瓜: "56", 啤酒: "57", 篮球: "58", 乒乓: "59", 咖啡: "60", 饭: "61", 猪头: "62", 玫瑰: "63", 凋谢: "64", 嘴唇: "65", 示爱: "65", 爱心: "66", 心碎: "67", 蛋糕: "68", 闪电: "69", 炸弹: "70", 刀: "71", 足球: "72", 瓢虫: "73", 便便: "74", 月亮: "75", 太阳: "76", 礼物: "77", 拥抱: "78", 强: "79", 弱: "80", 握手: "81", 胜利: "82", 抱拳: "83", 勾引: "84", 拳头: "85", 差劲: "86", 爱你: "87", NO: "88", OK: "89", 爱情: "90", 飞吻: "91", 跳跳: "92", 发抖: "93", 怄火: "94", 转圈: "95", 磕头: "96", 回头: "97", 跳绳: "98", 投降: "99", 激动: "100", 乱舞: "101", 献吻: "102", 左太极: "103", 右太极: "104", 嘿哈: "105", 捂脸: "106", 奸笑: "107", 机智: "108", 皱眉: "109", 耶: "110", 鸡: "111", 红包: "112", Smile: "0", Grimace: "1", Drool: "2", Scowl: "3", Chill: "4", CoolGuy: "4", Sob: "5", Shy: "6", Shutup: "7", Silent: "7", Sleep: "8", Cry: "9", Awkward: "10", Pout: "11", Angry: "11", Wink: "12", Tongue: "12", Grin: "13", Surprised: "14", Surprise: "14", Frown: "15", Cool: "16", Ruthless: "16", Tension: "17", Blush: "17", Scream: "18", Crazy: "18", Puke: "19", Chuckle: "20", Joyful: "21", Slight: "22", Smug: "23", Hungry: "24", Drowsy: "25", Panic: "26", Sweat: "27", Laugh: "28", Loafer: "29", Commando: "29", Strive: "30", Determined: "30", Scold: "31", Doubt: "32", Shocked: "32", Shhh: "33", Dizzy: "34", Tormented: "35", BadLuck: "36", Toasted: "36", Skull: "37", Hammer: "38", Wave: "39", Relief: "40", Speechless: "40", DigNose: "41", NosePick: "41", Clap: "42", Shame: "43", Trick: "44", "Bah! L": "45", "Bah! R": "46", Yawn: "47", Lookdown: "48", "Pooh-pooh": "48", Wronged: "49", Shrunken: "49", Puling: "50", TearingUp: "50", Sly: "51", Kiss: "52", "Uh-oh": "53", Wrath: "53", Whimper: "54", Cleaver: "55", Melon: "56", Watermelon: "56", Beer: "57", Basketball: "58", PingPong: "59", Coffee: "60", Rice: "61", Pig: "62", Rose: "63", Wilt: "64", Lip: "65", Lips: "65", Heart: "66", BrokenHeart: "67", Cake: "68", Lightning: "69", Bomb: "70", Dagger: "71", Soccer: "72", Ladybug: "73", Poop: "74", Moon: "75", Sun: "76", Gift: "77", Hug: "78", Strong: "79", ThumbsUp: "79", Weak: "80", ThumbsDown: "80", Shake: "81", Victory: "82", Peace: "82", Admire: "83", Fight: "83", Salute: "83", Beckon: "84", Fist: "85", Pinky: "86", Love: "2", RockOn: "87", No: "88", "Nuh-uh": "88", InLove: "90", Blowkiss: "91", Waddle: "92", Tremble: "93", "Aaagh!": "94", Twirl: "95", Kotow: "96", Lookback: "97", Dramatic: "97", Jump: "98", JumpRope: "98", "Give-in": "99", Surrender: "99", Hooray: "100", HeyHey: "101", Meditate: "101", Smooch: "102", "TaiJi L": "103", "TaiChi L": "103", "TaiJi R": "104", "TaiChi R": "104", Hey: "105", Facepalm: "106", Smirk: "107", Smart: "108", Concerned: "109", "Yeah!": "110", Chicken: "111", Packet: "112", 發呆: "3", 流淚: "5", 閉嘴: "7", 尷尬: "10", 發怒: "11", 調皮: "12", 驚訝: "14", 難過: "15", 饑餓: "24", 累: "25", 驚恐: "26", 悠閑: "29", 奮鬥: "30", 咒罵: "31", 疑問: "32", 噓: "33", 暈: "34", 瘋了: "35", 骷髏頭: "37", 再見: "39", 摳鼻: "41", 羞辱: "43", 壞笑: "44", 鄙視: "48", 陰險: "51", 親親: "52", 嚇: "53", 可憐: "54", 籃球: "58", 飯: "61", 豬頭: "62", 枯萎: "64", 愛心: "66", 閃電: "69", 炸彈: "70", 甲蟲: "73", 太陽: "76", 禮物: "77", 擁抱: "78", 強: "79", 勝利: "82", 拳頭: "85", 差勁: "86", 愛你: "88", 愛情: "90", 飛吻: "91", 發抖: "93", 噴火: "94", 轉圈: "95", 磕頭: "96", 回頭: "97", 跳繩: "98", 激動: "100", 亂舞: "101", 獻吻: "102", 左太極: "103", 右太極: "104", 吼嘿: "105", 掩面: "106", 機智: "108", 皺眉: "109", 歐耶: "110", 雞: "111", 紅包: "112", }; const emoji = []; Object.keys(QQFaceMap) .slice(0, 105) .map((e) => { var id = QQFaceMap[e]; emoji.push({ key: e, value: QQFaceMap[e], className: `qqemoji qqemoji${id}`, }); }); function getEmojiClassName(name) { name = name.substring(1, name.length - 1); var keys = Object.keys(QQFaceMap); var key = keys.find((e) => e === name); if (key) { let id = QQFaceMap[key]; let emojiCN = keys.find((e) => QQFaceMap[e] === id); if (+id < 200) { return `qqemoji qqemoji${id}`; } if (EmojiList.includes(emojiCN)) { return `emoji emoji${id}`; } } return false; } function parser(text) { var decodeText = anchorme({ input: text, options: { attributes: { target: "_blank", }, }, }); // (text.match(/\[[\w\s\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29\ud840-\ud868\udc00-\udfff\ud869[\udc00-\uded6\udf00-\udfff\ud86a-\ud86c\udc00-\udfff\ud86d[\udc00-\udf34\udf40-\udfff\ud86e\udc00-\udc1d]+\]/g) || []).map(e => { // var className = getEmojiClassName(e); // // if (!className) { // // Invalid emoji // return; // } // text = decodeText = text.split(`${e}`).join(``); // }); let emoji = twemoji.parse(decodeText); emoji = emoji.replace(/src="https:\/\/twemoji\.maxcdn\.com\/v\/[0-9.]+\//g, 'src="' + Config.emojiBaseUrl()); return emoji; } function normalize(text = "") { var matchs = text.match(/<\/span>/g) || []; var decodeText = text; try { matchs.map((e) => { // Decode utf16 to emoji var emojiCode = e.match(/emoji([0-9a-fA-F]+)/)[1].substr(0, 5); var emoji = String.fromCodePoint(parseInt(emojiCode, 16)); text = decodeText = text.split(e).join(emoji); }); } catch (ex) { console.error("Failed decode %s: %o", text, ex); } return decodeText; } export { emoji, parser, normalize };