implement unicode emoji replacements
This commit is contained in:
parent
97b6d8664b
commit
cfbda863e8
|
@ -171,13 +171,17 @@ function getEmojiTokenByTranslation(content, pos, state) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyEmoji(content, state) {
|
function applyEmoji(content, state, emojiUnicodeReplacer) {
|
||||||
let i;
|
let i;
|
||||||
let result = null;
|
let result = null;
|
||||||
let contentToken = null;
|
let contentToken = null;
|
||||||
|
|
||||||
let start = 0;
|
let start = 0;
|
||||||
|
|
||||||
|
if (emojiUnicodeReplacer) {
|
||||||
|
content = emojiUnicodeReplacer(content);
|
||||||
|
}
|
||||||
|
|
||||||
let endToken = content.length;
|
let endToken = content.length;
|
||||||
|
|
||||||
for (i=0; i<content.length-1; i++) {
|
for (i=0; i<content.length-1; i++) {
|
||||||
|
@ -236,6 +240,8 @@ export function setup(helper) {
|
||||||
});
|
});
|
||||||
|
|
||||||
helper.registerPlugin((md)=>{
|
helper.registerPlugin((md)=>{
|
||||||
md.core.ruler.push('emoji', state => textReplace(state, applyEmoji));
|
md.core.ruler.push('emoji', state => textReplace(
|
||||||
|
state, (c,s)=>applyEmoji(c,s,md.options.discourse.emojiUnicodeReplacer))
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,8 @@ export function buildOptions(state) {
|
||||||
userId,
|
userId,
|
||||||
getCurrentUser,
|
getCurrentUser,
|
||||||
currentUser,
|
currentUser,
|
||||||
lookupAvatarByPostNumber
|
lookupAvatarByPostNumber,
|
||||||
|
emojiUnicodeReplacer
|
||||||
} = state;
|
} = state;
|
||||||
|
|
||||||
if (!siteSettings.enable_experimental_markdown_it) {
|
if (!siteSettings.enable_experimental_markdown_it) {
|
||||||
|
@ -53,6 +54,7 @@ export function buildOptions(state) {
|
||||||
currentUser,
|
currentUser,
|
||||||
lookupAvatarByPostNumber,
|
lookupAvatarByPostNumber,
|
||||||
mentionLookup: state.mentionLookup,
|
mentionLookup: state.mentionLookup,
|
||||||
|
emojiUnicodeReplacer,
|
||||||
allowedHrefSchemes: siteSettings.allowed_href_schemes ? siteSettings.allowed_href_schemes.split('|') : null,
|
allowedHrefSchemes: siteSettings.allowed_href_schemes ? siteSettings.allowed_href_schemes.split('|') : null,
|
||||||
markdownIt: siteSettings.enable_experimental_markdown_it
|
markdownIt: siteSettings.enable_experimental_markdown_it
|
||||||
};
|
};
|
||||||
|
|
|
@ -149,6 +149,7 @@ module PrettyText
|
||||||
end
|
end
|
||||||
|
|
||||||
if SiteSetting.enable_experimental_markdown_it
|
if SiteSetting.enable_experimental_markdown_it
|
||||||
|
# defer load markdown it
|
||||||
unless context.eval("window.markdownit")
|
unless context.eval("window.markdownit")
|
||||||
ctx_load_manifest(context, "markdown-it-bundle.js")
|
ctx_load_manifest(context, "markdown-it-bundle.js")
|
||||||
end
|
end
|
||||||
|
@ -168,6 +169,7 @@ module PrettyText
|
||||||
__optInput.categoryHashtagLookup = __categoryLookup;
|
__optInput.categoryHashtagLookup = __categoryLookup;
|
||||||
__optInput.mentionLookup = __mentionLookup;
|
__optInput.mentionLookup = __mentionLookup;
|
||||||
__optInput.customEmoji = #{custom_emoji.to_json};
|
__optInput.customEmoji = #{custom_emoji.to_json};
|
||||||
|
__optInput.emojiUnicodeReplacer = __emojiUnicodeReplacer;
|
||||||
JS
|
JS
|
||||||
|
|
||||||
if opts[:topicId]
|
if opts[:topicId]
|
||||||
|
|
|
@ -3,7 +3,28 @@ __buildOptions = require('pretty-text/pretty-text').buildOptions;
|
||||||
__performEmojiUnescape = require('pretty-text/emoji').performEmojiUnescape;
|
__performEmojiUnescape = require('pretty-text/emoji').performEmojiUnescape;
|
||||||
|
|
||||||
__utils = require('discourse/lib/utilities');
|
__utils = require('discourse/lib/utilities');
|
||||||
__setUnicode = require('pretty-text/engines/discourse-markdown/emoji').setUnicodeReplacements;
|
|
||||||
|
__emojiUnicodeReplacer = null;
|
||||||
|
|
||||||
|
__setUnicode = function(replacements) {
|
||||||
|
require('pretty-text/engines/discourse-markdown/emoji').setUnicodeReplacements(replacements);
|
||||||
|
|
||||||
|
let unicodeRegexp = new RegExp(Object.keys(replacements).sort().reverse().join("|"), "g");
|
||||||
|
|
||||||
|
__emojiUnicodeReplacer = function(text) {
|
||||||
|
unicodeRegexp.lastIndex = 0;
|
||||||
|
let m;
|
||||||
|
while ((m = unicodeRegexp.exec(text)) !== null) {
|
||||||
|
let replacement = ":" + replacements[m[0]] + ":";
|
||||||
|
const before = text.charAt(m.index-1);
|
||||||
|
if (!/\B/.test(before)) {
|
||||||
|
replacement = "\u200b" + replacement;
|
||||||
|
}
|
||||||
|
text = text.replace(m[0], replacement);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
__paths = {};
|
__paths = {};
|
||||||
|
|
||||||
|
|
|
@ -503,13 +503,13 @@ HTML
|
||||||
SiteSetting.enable_experimental_markdown_it = true
|
SiteSetting.enable_experimental_markdown_it = true
|
||||||
end
|
end
|
||||||
|
|
||||||
# it "replaces skin toned emoji" do
|
it "replaces skin toned emoji" do
|
||||||
# expect(PrettyText.cook("hello 👱🏿♀️")).to eq("<p>hello <img src=\"/images/emoji/emoji_one/blonde_woman/6.png?v=5\" title=\":blonde_woman:t6:\" class=\"emoji\" alt=\":blonde_woman:t6:\"></p>")
|
expect(PrettyText.cook("hello 👱🏿♀️")).to eq("<p>hello <img src=\"/images/emoji/twitter/blonde_woman/6.png?v=5\" title=\":blonde_woman:t6:\" class=\"emoji\" alt=\":blonde_woman:t6:\"></p>")
|
||||||
# expect(PrettyText.cook("hello 👩🎤")).to eq("<p>hello <img src=\"/images/emoji/emoji_one/woman_singer.png?v=5\" title=\":woman_singer:\" class=\"emoji\" alt=\":woman_singer:\"></p>")
|
expect(PrettyText.cook("hello 👩🎤")).to eq("<p>hello <img src=\"/images/emoji/twitter/woman_singer.png?v=5\" title=\":woman_singer:\" class=\"emoji\" alt=\":woman_singer:\"></p>")
|
||||||
# expect(PrettyText.cook("hello 👩🏾🎓")).to eq("<p>hello <img src=\"/images/emoji/emoji_one/woman_student/5.png?v=5\" title=\":woman_student:t5:\" class=\"emoji\" alt=\":woman_student:t5:\"></p>")
|
expect(PrettyText.cook("hello 👩🏾🎓")).to eq("<p>hello <img src=\"/images/emoji/twitter/woman_student/5.png?v=5\" title=\":woman_student:t5:\" class=\"emoji\" alt=\":woman_student:t5:\"></p>")
|
||||||
# expect(PrettyText.cook("hello 🤷♀️")).to eq("<p>hello <img src=\"/images/emoji/emoji_one/woman_shrugging.png?v=5\" title=\":woman_shrugging:\" class=\"emoji\" alt=\":woman_shrugging:\"></p>")
|
expect(PrettyText.cook("hello 🤷♀️")).to eq("<p>hello <img src=\"/images/emoji/twitter/woman_shrugging.png?v=5\" title=\":woman_shrugging:\" class=\"emoji\" alt=\":woman_shrugging:\"></p>")
|
||||||
# end
|
end
|
||||||
#
|
|
||||||
|
|
||||||
it "supports href schemes" do
|
it "supports href schemes" do
|
||||||
SiteSetting.allowed_href_schemes = "macappstore|steam"
|
SiteSetting.allowed_href_schemes = "macappstore|steam"
|
||||||
|
|
Loading…
Reference in New Issue