mirror of
https://github.com/flarum/core.git
synced 2025-08-07 17:07:19 +02:00
Fix issue with Twemoji frontend rendering (#40)
This commit is contained in:
@@ -14,12 +14,39 @@ const options = {
|
|||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses an HTML string into a `<body>` node containing the HTML content.
|
||||||
|
*
|
||||||
|
* Vanilla JS implementation of jQuery's `$.parseHTML()`,
|
||||||
|
* sourced from http://youmightnotneedjquery.com/
|
||||||
|
*/
|
||||||
|
function parseHTML(str) {
|
||||||
|
const tmp = document.implementation.createHTMLDocument();
|
||||||
|
tmp.body.innerHTML = str;
|
||||||
|
|
||||||
|
return tmp.body;
|
||||||
|
}
|
||||||
|
|
||||||
export default function renderEmoji() {
|
export default function renderEmoji() {
|
||||||
override(Post.prototype, 'contentHtml', function (original) {
|
override(Post.prototype, 'contentHtml', function (original) {
|
||||||
const contentHtml = original();
|
const contentHtml = original();
|
||||||
|
|
||||||
if (this.oldContentHtml !== contentHtml) {
|
if (this.oldContentHtml !== contentHtml) {
|
||||||
this.emojifiedContentHtml = twemoji.parse(contentHtml, options);
|
// We need to parse the HTML string into a DOM node, then give it to Twemoji.
|
||||||
|
//
|
||||||
|
// This prevents some issues with the default find-replace that would be performed
|
||||||
|
// on a string passed to `Twemoji.parse()`.
|
||||||
|
//
|
||||||
|
// The parse function can only handle a single DOM node provided, so we need to
|
||||||
|
// wrap it in a node. In our `parseHTML` implementation, we wrap it in a `<body>`
|
||||||
|
// element. This gets stripped below.
|
||||||
|
//
|
||||||
|
// See https://github.com/flarum/core/issues/2958
|
||||||
|
const emojifiedDom = twemoji.parse(parseHTML(contentHtml), options);
|
||||||
|
|
||||||
|
// Steal the HTML string inside the emojified DOM `<body>` tag.
|
||||||
|
this.emojifiedContentHtml = emojifiedDom.innerHTML;
|
||||||
|
|
||||||
this.oldContentHtml = contentHtml;
|
this.oldContentHtml = contentHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user