mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: allows replacement of digits and symbols emojis (#7978)
This commit is contained in:
parent
9e248de02a
commit
5d72561f4f
@ -21,11 +21,29 @@ export function extendedEmojiList() {
|
|||||||
|
|
||||||
const emojiHash = {};
|
const emojiHash = {};
|
||||||
|
|
||||||
const unicodeRegexp = new RegExp(
|
export function buildReplacementsList(emojiReplacements) {
|
||||||
Object.keys(replacements)
|
return Object.keys(emojiReplacements)
|
||||||
.sort()
|
.sort()
|
||||||
.reverse()
|
.reverse()
|
||||||
.join("|") + "|\\B:[^\\s:]+(?::t\\d)?:?\\B",
|
.map(emoji => {
|
||||||
|
return emoji
|
||||||
|
.split("")
|
||||||
|
.map(chr => {
|
||||||
|
return (
|
||||||
|
"\\u" +
|
||||||
|
chr
|
||||||
|
.charCodeAt(0)
|
||||||
|
.toString(16)
|
||||||
|
.padStart(4, "0")
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.join("");
|
||||||
|
})
|
||||||
|
.join("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
const unicodeRegexp = new RegExp(
|
||||||
|
buildReplacementsList(replacements) + "|\\B:[^\\s:]+(?::t\\d)?:?\\B",
|
||||||
"g"
|
"g"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -133,9 +133,10 @@ class Emoji
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.replacement_code(code)
|
def self.replacement_code(code)
|
||||||
hexes = code.split('-'.freeze).map!(&:hex)
|
code
|
||||||
# Don't replace digits, letters and some symbols
|
.split('-'.freeze)
|
||||||
hexes.pack("U*".freeze) if hexes[0] > 255
|
.map!(&:hex)
|
||||||
|
.pack("U*".freeze)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.unicode_replacements
|
def self.unicode_replacements
|
||||||
@ -146,6 +147,10 @@ class Emoji
|
|||||||
|
|
||||||
db['emojis'].each do |e|
|
db['emojis'].each do |e|
|
||||||
name = e['name']
|
name = e['name']
|
||||||
|
|
||||||
|
# special cased as we prefer to keep these as symbols
|
||||||
|
next if name == 'registered'.freeze
|
||||||
|
next if name == 'copyright'.freeze
|
||||||
next if name == 'tm'.freeze
|
next if name == 'tm'.freeze
|
||||||
|
|
||||||
code = replacement_code(e['code'])
|
code = replacement_code(e['code'])
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
__PrettyText = require("pretty-text/pretty-text").default;
|
__PrettyText = require("pretty-text/pretty-text").default;
|
||||||
__buildOptions = require("pretty-text/pretty-text").buildOptions;
|
__buildOptions = require("pretty-text/pretty-text").buildOptions;
|
||||||
__performEmojiUnescape = require("pretty-text/emoji").performEmojiUnescape;
|
__performEmojiUnescape = require("pretty-text/emoji").performEmojiUnescape;
|
||||||
|
__buildReplacementsList = require("pretty-text/emoji").buildReplacementsList;
|
||||||
__performEmojiEscape = require("pretty-text/emoji").performEmojiEscape;
|
__performEmojiEscape = require("pretty-text/emoji").performEmojiEscape;
|
||||||
|
|
||||||
__utils = require("discourse/lib/utilities");
|
__utils = require("discourse/lib/utilities");
|
||||||
@ -8,13 +9,7 @@ __utils = require("discourse/lib/utilities");
|
|||||||
__emojiUnicodeReplacer = null;
|
__emojiUnicodeReplacer = null;
|
||||||
|
|
||||||
__setUnicode = function(replacements) {
|
__setUnicode = function(replacements) {
|
||||||
let unicodeRegexp = new RegExp(
|
let unicodeRegexp = new RegExp(__buildReplacementsList(replacements), "g");
|
||||||
Object.keys(replacements)
|
|
||||||
.sort()
|
|
||||||
.reverse()
|
|
||||||
.join("|"),
|
|
||||||
"g"
|
|
||||||
);
|
|
||||||
|
|
||||||
__emojiUnicodeReplacer = function(text) {
|
__emojiUnicodeReplacer = function(text) {
|
||||||
unicodeRegexp.lastIndex = 0;
|
unicodeRegexp.lastIndex = 0;
|
||||||
|
@ -877,6 +877,13 @@ describe PrettyText do
|
|||||||
expect(PrettyText.cook("☺")).to match(/\:slight_smile\:/)
|
expect(PrettyText.cook("☺")).to match(/\:slight_smile\:/)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "replaces digits" do
|
||||||
|
expect(PrettyText.cook("🔢")).to match(/\:1234\:/)
|
||||||
|
expect(PrettyText.cook("1️⃣")).to match(/\:one\:/)
|
||||||
|
expect(PrettyText.cook("#️⃣")).to match(/\:hash\:/)
|
||||||
|
expect(PrettyText.cook("*️⃣")).to match(/\:asterisk\:/)
|
||||||
|
end
|
||||||
|
|
||||||
it "doesn't replace unicode emoji if emoji is disabled" do
|
it "doesn't replace unicode emoji if emoji is disabled" do
|
||||||
SiteSetting.enable_emoji = false
|
SiteSetting.enable_emoji = false
|
||||||
expect(PrettyText.cook("💣")).not_to match(/\:bomb\:/)
|
expect(PrettyText.cook("💣")).not_to match(/\:bomb\:/)
|
||||||
|
@ -12,11 +12,6 @@ describe Emoji do
|
|||||||
expect(Emoji.replacement_code('1f1e9-1f1ea').codepoints).to eq([127465, 127466])
|
expect(Emoji.replacement_code('1f1e9-1f1ea').codepoints).to eq([127465, 127466])
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns nil for weird cases" do
|
|
||||||
expect(Emoji.replacement_code('32')).to be_nil
|
|
||||||
expect(Emoji.replacement_code('robin')).to be_nil
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '.load_custom' do
|
describe '.load_custom' do
|
||||||
describe 'when a custom emoji has an invalid upload_id' do
|
describe 'when a custom emoji has an invalid upload_id' do
|
||||||
it 'should return the custom emoji without a URL' do
|
it 'should return the custom emoji without a URL' do
|
||||||
|
Loading…
Reference in New Issue
Block a user