diff options
author | MIYAGI Hikaru <hcmiya@users.noreply.github.com> | 2017-09-21 01:47:16 +0000 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2017-09-21 03:47:16 +0200 |
commit | a9abe8909371f4a3069760e6bd8d7444b85dab71 (patch) | |
tree | 73408a76c6b846197a0e10fe91138a20655bd9cd /app/javascript | |
parent | 798b0fc5af3e9e4acec6624e041ff035d95c8b78 (diff) |
Fix shortname problem in emojify() (regression from #5016) (#5032)
When colon appears end of line, skiped all character containing unicode emojis. Fixed. https://github.com/tootsuite/mastodon/pull/5016#issuecomment-331012008
Diffstat (limited to 'app/javascript')
-rw-r--r-- | app/javascript/mastodon/emoji.js | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/app/javascript/mastodon/emoji.js b/app/javascript/mastodon/emoji.js index e586a3442..7a0dab9d1 100644 --- a/app/javascript/mastodon/emoji.js +++ b/app/javascript/mastodon/emoji.js @@ -7,29 +7,34 @@ const emojify = (str, customEmojis = {}) => { let rtn = ''; for (;;) { let match, i = 0, tag; - while (i < str.length && (tag = '<&:'.indexOf(str[i])) === -1 && !(match = trie.search(str.slice(i)))) { + while (i < str.length && (tag = '<&'.indexOf(str[i])) === -1 && str[i] !== ':' && !(match = trie.search(str.slice(i)))) { i += str.codePointAt(i) < 65536 ? 1 : 2; } if (i === str.length) break; else if (tag >= 0) { - let tagend = str.indexOf('>;:'[tag], i + 1) + 1; + const tagend = str.indexOf('>;'[tag], i + 1) + 1; if (!tagend) break; - if (str[i] === ':') { - const shortname = str.slice(i, tagend); + rtn += str.slice(0, tagend); + str = str.slice(tagend); + } else if (str[i] === ':') { + try { + // if replacing :shortname: succeed, exit this block with "continue" + const closeColon = str.indexOf(':', i + 1) + 1; + if (!closeColon) throw null; // no pair of ':' const lt = str.indexOf('<', i + 1); - if ((lt === -1 || lt >= tagend) && shortname in customEmojis) { + if (!(lt === -1 || lt >= closeColon)) throw null; // tag appeared before closing ':' + const shortname = str.slice(i, closeColon); + if (shortname in customEmojis) { rtn += str.slice(0, i) + `<img draggable="false" class="emojione" alt="${shortname}" title="${shortname}" src="${customEmojis[shortname]}" />`; - str = str.slice(tagend); - } else { - rtn += str.slice(0, i + 1); - str = str.slice(i + 1); + str = str.slice(closeColon); + continue; } - } else { - rtn += str.slice(0, tagend); - str = str.slice(tagend); - } + } catch (e) {} + // replacing :shortname: failed + rtn += str.slice(0, i + 1); + str = str.slice(i + 1); } else { const [filename, shortCode] = unicodeMapping[match]; rtn += str.slice(0, i) + `<img draggable="false" class="emojione" alt="${match}" title=":${shortCode}:" src="/emoji/${filename}.svg" />`; |