mirror of
https://github.com/discourse/discourse.git
synced 2025-03-06 11:19:51 +00:00
FEATURE: line with only 1 to 3 emojis will now display as large emojis
This commit is contained in:
parent
91f8ada8e0
commit
948bd00340
@ -231,9 +231,68 @@ function applyEmoji(
|
|||||||
result.push(text);
|
result.push(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we check for a result <= 5 because we support maximum 3 large emojis
|
||||||
|
// EMOJI SPACE EMOJI SPACE EMOJI => 5 tokens
|
||||||
|
if (result && result.length > 0 && result.length <= 5) {
|
||||||
|
// we ensure line starts and ends with an emoji
|
||||||
|
// and has no more than 3 emojis
|
||||||
|
if (
|
||||||
|
result[0].type === "emoji" &&
|
||||||
|
result[result.length - 1].type === "emoji" &&
|
||||||
|
result.filter(r => r.type === "emoji").length <= 3
|
||||||
|
) {
|
||||||
|
let allEmojiLine = true;
|
||||||
|
let index = 0;
|
||||||
|
|
||||||
|
const checkNextToken = t => {
|
||||||
|
if (!t) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!["emoji", "text"].includes(t.type)) {
|
||||||
|
allEmojiLine = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// a text token should always have an emoji before
|
||||||
|
// and be a space
|
||||||
|
if (
|
||||||
|
t.type === "text" &&
|
||||||
|
((result[index - 1] && result[index - 1].type !== "emoji") ||
|
||||||
|
t.content !== " ")
|
||||||
|
) {
|
||||||
|
allEmojiLine = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// exit as soon as possible
|
||||||
|
if (allEmojiLine) {
|
||||||
|
index += 1;
|
||||||
|
checkNextToken(result[index]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
checkNextToken(result[index]);
|
||||||
|
|
||||||
|
if (allEmojiLine) {
|
||||||
|
result.forEach(r => {
|
||||||
|
if (r.type === "emoji") {
|
||||||
|
applyAllEmojiClass(r);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyAllEmojiClass(token) {
|
||||||
|
token.attrs.forEach(attr => {
|
||||||
|
if (attr[0] === "class") {
|
||||||
|
attr[1] = `${attr[1]} only-emoji`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export function setup(helper) {
|
export function setup(helper) {
|
||||||
helper.registerOptions((opts, siteSettings, state) => {
|
helper.registerOptions((opts, siteSettings, state) => {
|
||||||
opts.features.emoji = !state.disableEmojis && !!siteSettings.enable_emoji;
|
opts.features.emoji = !state.disableEmojis && !!siteSettings.enable_emoji;
|
||||||
@ -257,5 +316,10 @@ export function setup(helper) {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
helper.whiteList(["img[class=emoji]", "img[class=emoji emoji-custom]"]);
|
helper.whiteList([
|
||||||
|
"img[class=emoji]",
|
||||||
|
"img[class=emoji emoji-custom]",
|
||||||
|
"img[class=emoji emoji-custom only-emoji]",
|
||||||
|
"img[class=emoji only-emoji]"
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,12 @@ img.emoji {
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img.emoji.only-emoji {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
margin: 0.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
small img.emoji,
|
small img.emoji,
|
||||||
sub img.emoji,
|
sub img.emoji,
|
||||||
sup img.emoji {
|
sup img.emoji {
|
||||||
|
@ -1143,7 +1143,7 @@ describe CookedPostProcessor do
|
|||||||
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
||||||
<img src="http://foo.bar/image.png"><br>
|
<img src="http://foo.bar/image.png"><br>
|
||||||
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
||||||
<img src="//test.localhost/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji" alt=":smile:"></p>
|
<img src="//test.localhost/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1158,7 +1158,7 @@ describe CookedPostProcessor do
|
|||||||
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
||||||
<img src="http://foo.bar/image.png"><br>
|
<img src="http://foo.bar/image.png"><br>
|
||||||
<a class="attachment" href="//my.cdn.com/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
<a class="attachment" href="//my.cdn.com/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
||||||
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji" alt=":smile:"></p>
|
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1171,7 +1171,7 @@ describe CookedPostProcessor do
|
|||||||
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
||||||
<img src="http://foo.bar/image.png"><br>
|
<img src="http://foo.bar/image.png"><br>
|
||||||
<a class="attachment" href="https://my.cdn.com/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
<a class="attachment" href="https://my.cdn.com/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
||||||
<img src="https://my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji" alt=":smile:"></p>
|
<img src="https://my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1185,7 +1185,7 @@ describe CookedPostProcessor do
|
|||||||
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
||||||
<img src="http://foo.bar/image.png"><br>
|
<img src="http://foo.bar/image.png"><br>
|
||||||
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
||||||
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji" alt=":smile:"></p>
|
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1199,7 +1199,7 @@ describe CookedPostProcessor do
|
|||||||
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
<a href="http://www.google.com" rel="nofollow noopener">Google</a><br>
|
||||||
<img src="http://foo.bar/image.png"><br>
|
<img src="http://foo.bar/image.png"><br>
|
||||||
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
<a class="attachment" href="//test.localhost/#{upload_path}/original/1X/af2c2618032c679333bebf745e75f9088748d737.txt">text.txt</a> (20 Bytes)<br>
|
||||||
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji" alt=":smile:"></p>
|
<img src="//my.cdn.com/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -109,6 +109,48 @@ describe PrettyText do
|
|||||||
|
|
||||||
expect(cook(md)).to eq(html.strip)
|
expect(cook(md)).to eq(html.strip)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "adds an only-emoji class when a line has only one emoji" do
|
||||||
|
md = <<~MD
|
||||||
|
foo 😀
|
||||||
|
foo 😀 bar
|
||||||
|
:smile_cat:
|
||||||
|
:smile_cat: :smile_cat:
|
||||||
|
:smile_cat: :smile_cat: :smile_cat: :smile_cat:
|
||||||
|
baz? :smile_cat:
|
||||||
|
😀
|
||||||
|
😉 foo
|
||||||
|
😉 😉
|
||||||
|
😉 😉
|
||||||
|
😉 😉 😉
|
||||||
|
😉😉😉
|
||||||
|
😉 😉 😉
|
||||||
|
😉d😉 😉
|
||||||
|
😉 😉 😉d
|
||||||
|
😉😉😉😉
|
||||||
|
MD
|
||||||
|
|
||||||
|
html = <<~HTML
|
||||||
|
<p>foo <img src="/images/emoji/twitter/grinning.png?v=#{Emoji::EMOJI_VERSION}" title=":grinning:" class="emoji" alt=":grinning:"><br>
|
||||||
|
foo <img src="/images/emoji/twitter/grinning.png?v=#{Emoji::EMOJI_VERSION}" title=":grinning:" class="emoji" alt=":grinning:"> bar<br>
|
||||||
|
<img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji only-emoji" alt=":smile_cat:"><br>
|
||||||
|
<img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji only-emoji" alt=":smile_cat:"> <img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji only-emoji" alt=":smile_cat:"><br>
|
||||||
|
<img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji" alt=":smile_cat:"> <img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji" alt=":smile_cat:"> <img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji" alt=":smile_cat:"> <img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji" alt=":smile_cat:"><br>
|
||||||
|
baz? <img src="/images/emoji/twitter/smile_cat.png?v=#{Emoji::EMOJI_VERSION}" title=":smile_cat:" class="emoji" alt=":smile_cat:"><br>
|
||||||
|
<img src="/images/emoji/twitter/grinning.png?v=#{Emoji::EMOJI_VERSION}" title=":grinning:" class="emoji only-emoji" alt=":grinning:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"> foo<br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji only-emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:">d:wink: <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"><br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"> <img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:">d<br>
|
||||||
|
<img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"><img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"><img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"><img src="/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}" title=":wink:" class="emoji" alt=":wink:"></p>
|
||||||
|
HTML
|
||||||
|
|
||||||
|
expect(cook(md)).to eq(html.strip)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "do off topic quoting of posts from secure categories" do
|
it "do off topic quoting of posts from secure categories" do
|
||||||
@ -1064,7 +1106,7 @@ describe PrettyText do
|
|||||||
it "can handle emoji by name" do
|
it "can handle emoji by name" do
|
||||||
|
|
||||||
expected = <<HTML
|
expected = <<HTML
|
||||||
<p><img src="/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}\" title=":smile:" class="emoji" alt=":smile:"><img src="/images/emoji/twitter/sunny.png?v=#{Emoji::EMOJI_VERSION}" title=":sunny:" class="emoji" alt=":sunny:"></p>
|
<p><img src="/images/emoji/twitter/smile.png?v=#{Emoji::EMOJI_VERSION}\" title=":smile:" class="emoji only-emoji" alt=":smile:"><img src="/images/emoji/twitter/sunny.png?v=#{Emoji::EMOJI_VERSION}" title=":sunny:" class="emoji only-emoji" alt=":sunny:"></p>
|
||||||
HTML
|
HTML
|
||||||
expect(PrettyText.cook(":smile::sunny:")).to eq(expected.strip)
|
expect(PrettyText.cook(":smile::sunny:")).to eq(expected.strip)
|
||||||
end
|
end
|
||||||
@ -1076,7 +1118,7 @@ HTML
|
|||||||
end
|
end
|
||||||
|
|
||||||
it "can handle emoji by translation" do
|
it "can handle emoji by translation" do
|
||||||
expected = "<p><img src=\"/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}\" title=\":wink:\" class=\"emoji\" alt=\":wink:\"></p>"
|
expected = "<p><img src=\"/images/emoji/twitter/wink.png?v=#{Emoji::EMOJI_VERSION}\" title=\":wink:\" class=\"emoji only-emoji\" alt=\":wink:\"></p>"
|
||||||
expect(PrettyText.cook(";)")).to eq(expected)
|
expect(PrettyText.cook(";)")).to eq(expected)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1333,15 +1333,15 @@ QUnit.test("enable/disable features", assert => {
|
|||||||
QUnit.test("emoji", assert => {
|
QUnit.test("emoji", assert => {
|
||||||
assert.cooked(
|
assert.cooked(
|
||||||
":smile:",
|
":smile:",
|
||||||
`<p><img src="/images/emoji/emoji_one/smile.png?v=${v}" title=":smile:" class="emoji" alt=":smile:"></p>`
|
`<p><img src="/images/emoji/emoji_one/smile.png?v=${v}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>`
|
||||||
);
|
);
|
||||||
assert.cooked(
|
assert.cooked(
|
||||||
":(",
|
":(",
|
||||||
`<p><img src="/images/emoji/emoji_one/frowning.png?v=${v}" title=":frowning:" class="emoji" alt=":frowning:"></p>`
|
`<p><img src="/images/emoji/emoji_one/frowning.png?v=${v}" title=":frowning:" class="emoji only-emoji" alt=":frowning:"></p>`
|
||||||
);
|
);
|
||||||
assert.cooked(
|
assert.cooked(
|
||||||
"8-)",
|
"8-)",
|
||||||
`<p><img src="/images/emoji/emoji_one/sunglasses.png?v=${v}" title=":sunglasses:" class="emoji" alt=":sunglasses:"></p>`
|
`<p><img src="/images/emoji/emoji_one/sunglasses.png?v=${v}" title=":sunglasses:" class="emoji only-emoji" alt=":sunglasses:"></p>`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1363,7 +1363,7 @@ QUnit.test("emoji - emojiSet", assert => {
|
|||||||
assert.cookedOptions(
|
assert.cookedOptions(
|
||||||
":smile:",
|
":smile:",
|
||||||
{ siteSettings: { emoji_set: "twitter" } },
|
{ siteSettings: { emoji_set: "twitter" } },
|
||||||
`<p><img src="/images/emoji/twitter/smile.png?v=${v}" title=":smile:" class="emoji" alt=":smile:"></p>`
|
`<p><img src="/images/emoji/twitter/smile.png?v=${v}" title=":smile:" class="emoji only-emoji" alt=":smile:"></p>`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user