diff --git a/karma.conf.js b/karma.conf.js
index 68836138c..c7c4242d0 100644
--- a/karma.conf.js
+++ b/karma.conf.js
@@ -12,6 +12,7 @@ module.exports = function(config) {
{ pattern: "dist/emojis.js", served: true },
"dist/converse.js",
"dist/converse.css",
+ { pattern: "dist/images/**/*.*", included: false },
{ pattern: "dist/webfonts/**/*.*", included: false },
{ pattern: "dist/\@fortawesome/fontawesome-free/sprites/solid.svg",
watched: false,
@@ -60,7 +61,8 @@ module.exports = function(config) {
],
proxies: {
- "/dist/\@fortawesome/fontawesome-free/sprites/solid.svg": "/base/dist/\@fortawesome/fontawesome-free/sprites/solid.svg"
+ "/dist/\@fortawesome/fontawesome-free/sprites/solid.svg": "/base/dist/\@fortawesome/fontawesome-free/sprites/solid.svg",
+ "/dist/images/custom_emojis/": "/base/dist/images/custom_emojis/"
},
client: {
diff --git a/spec/emojis.js b/spec/emojis.js
index d48cea6e0..3e2c1fafb 100644
--- a/spec/emojis.js
+++ b/spec/emojis.js
@@ -100,7 +100,6 @@ describe("Emojis", function () {
done();
}));
-
it("allows you to search for particular emojis",
mock.initConverse(
['rosterGroupsFetched', 'chatBoxesFetched'], {},
@@ -239,5 +238,51 @@ describe("Emojis", function () {
expect(u.hasClass('chat-msg__text--larger', message)).toBe(true);
done()
}));
+
+
+ it("can show custom emojis",
+ mock.initConverse(
+ ['rosterGroupsFetched', 'chatBoxesFetched'],
+ { emoji_categories: {
+ "smileys": ":grinning:",
+ "people": ":thumbsup:",
+ "activity": ":soccer:",
+ "travel": ":motorcycle:",
+ "objects": ":bomb:",
+ "nature": ":rainbow:",
+ "food": ":hotdog:",
+ "symbols": ":musical_note:",
+ "flags": ":flag_ac:",
+ "custom": ':xmpp:'
+ } },
+ async function (done, _converse) {
+
+ await mock.waitForRoster(_converse, 'current', 1);
+ const contact_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@montague.lit';
+ await mock.openChatBoxFor(_converse, contact_jid);
+ const view = _converse.api.chatviews.get(contact_jid);
+
+ const toolbar = await u.waitUntil(() => view.el.querySelector('ul.chat-toolbar'));
+ expect(toolbar.querySelectorAll('li.toggle-smiley__container').length).toBe(1);
+ toolbar.querySelector('a.toggle-smiley').click();
+ await u.waitUntil(() => u.isVisible(view.el.querySelector('.emoji-picker__lists')), 1000);
+ const picker = await u.waitUntil(() => view.el.querySelector('.emoji-picker__container'), 1000);
+ const custom_category = picker.querySelector('.pick-category[data-category="custom"]');
+ expect(custom_category.innerHTML.replace(//g, '').trim()).toBe(
+ '
');
+
+ const textarea = view.el.querySelector('textarea.chat-textarea');
+ textarea.value = 'Running tests for :converse:';
+ view.onKeyDown({
+ target: textarea,
+ preventDefault: function preventDefault () {},
+ keyCode: 13 // Enter
+ });
+ await new Promise(resolve => view.model.messages.once('rendered', resolve));
+ const body = view.el.querySelector('converse-chat-message-body');
+ expect(body.innerHTML.replace(//g, '').trim()).toBe(
+ 'Running tests for
');
+ done();
+ }));
});
});
diff --git a/src/headless/converse-chat.js b/src/headless/converse-chat.js
index ca20992ba..6e6756413 100644
--- a/src/headless/converse-chat.js
+++ b/src/headless/converse-chat.js
@@ -951,21 +951,23 @@ converse.plugins.add('converse-chat', {
getOutgoingMessageAttributes (text, spoiler_hint) {
const is_spoiler = this.get('composing_spoiler');
const origin_id = u.getUniqueId();
+ const body = text ? u.httpToGeoUri(u.shortnameToUnicode(text), _converse) : undefined;
return {
- 'id': origin_id,
- 'jid': this.get('jid'),
- 'nickname': this.get('nickname'),
- 'msgid': origin_id,
- 'origin_id': origin_id,
- 'fullname': _converse.xmppstatus.get('fullname'),
'from': _converse.bare_jid,
+ 'fullname': _converse.xmppstatus.get('fullname'),
+ 'id': origin_id,
'is_only_emojis': text ? u.isOnlyEmojis(text) : false,
+ 'jid': this.get('jid'),
+ 'message': body,
+ 'msgid': origin_id,
+ 'nickname': this.get('nickname'),
'sender': 'me',
- 'time': (new Date()).toISOString(),
- 'message': text ? u.httpToGeoUri(u.shortnameToUnicode(text), _converse) : undefined,
- 'is_spoiler': is_spoiler,
'spoiler_hint': is_spoiler ? spoiler_hint : undefined,
- 'type': this.get('message_type')
+ 'time': (new Date()).toISOString(),
+ 'type': this.get('message_type'),
+ body,
+ is_spoiler,
+ origin_id
}
},
diff --git a/src/headless/converse-emoji.js b/src/headless/converse-emoji.js
index 703ddc5c6..398fb4bee 100644
--- a/src/headless/converse-emoji.js
+++ b/src/headless/converse-emoji.js
@@ -3,10 +3,11 @@
* @copyright 2020, the Converse.js contributors
* @license Mozilla Public License (MPLv2)
*/
-import { Model } from '@converse/skeletor/src/model.js';
-import { find, uniq } from "lodash-es";
import * as twemoji from "twemoji";
+import { Model } from '@converse/skeletor/src/model.js';
import { _converse, api, converse } from "./converse-core";
+import { find, isString, uniq } from "lodash-es";
+import { html } from 'lit-html';
const u = converse.env.utils;
@@ -27,6 +28,7 @@ const ASCII_LIST = {
};
+let shortnames_regex;
const ASCII_REGEX = '(\\*\\\\0\\/\\*|\\*\\\\O\\/\\*|\\-___\\-|\\:\'\\-\\)|\'\\:\\-\\)|\'\\:\\-D|\\>\\:\\-\\)|>\\:\\-\\)|\'\\:\\-\\(|\\>\\:\\-\\(|>\\:\\-\\(|\\:\'\\-\\(|O\\:\\-\\)|0\\:\\-3|0\\:\\-\\)|0;\\^\\)|O;\\-\\)|0;\\-\\)|O\\:\\-3|\\-__\\-|\\:\\-Þ|\\:\\-Þ|\\<\\/3|<\\/3|\\:\'\\)|\\:\\-D|\'\\:\\)|\'\\=\\)|\'\\:D|\'\\=D|\\>\\:\\)|>\\:\\)|\\>;\\)|>;\\)|\\>\\=\\)|>\\=\\)|;\\-\\)|\\*\\-\\)|;\\-\\]|;\\^\\)|\'\\:\\(|\'\\=\\(|\\:\\-\\*|\\:\\^\\*|\\>\\:P|>\\:P|X\\-P|\\>\\:\\[|>\\:\\[|\\:\\-\\(|\\:\\-\\[|\\>\\:\\(|>\\:\\(|\\:\'\\(|;\\-\\(|\\>\\.\\<|>\\.<|#\\-\\)|%\\-\\)|X\\-\\)|\\\\0\\/|\\\\O\\/|0\\:3|0\\:\\)|O\\:\\)|O\\=\\)|O\\:3|B\\-\\)|8\\-\\)|B\\-D|8\\-D|\\-_\\-|\\>\\:\\\\|>\\:\\\\|\\>\\:\\/|>\\:\\/|\\:\\-\\/|\\:\\-\\.|\\:\\-P|\\:Þ|\\:Þ|\\:\\-b|\\:\\-O|O_O|\\>\\:O|>\\:O|\\:\\-X|\\:\\-#|\\:\\-\\)|\\(y\\)|\\<3|<3|\\:D|\\=D|;\\)|\\*\\)|;\\]|;D|\\:\\*|\\=\\*|\\:\\(|\\:\\[|\\=\\(|\\:@|;\\(|D\\:|\\:\\$|\\=\\$|#\\)|%\\)|X\\)|B\\)|8\\)|\\:\\/|\\:\\\\|\\=\\/|\\=\\\\|\\:L|\\=L|\\:P|\\=P|\\:b|\\:O|\\:X|\\:#|\\=X|\\=#|\\:\\)|\\=\\]|\\=\\)|\\:\\])';
const ASCII_REPLACE_REGEX = new RegExp("