From 09b1e11940bebab92bbb48c8a1e1714fc9e95ea6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 13 Nov 2024 16:47:00 -0500 Subject: [PATCH] feat: #12683, parse incoming emoji tags and replace in content prior to storage in database --- public/scss/generics.scss | 4 ++++ src/posts/create.js | 21 ++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/public/scss/generics.scss b/public/scss/generics.scss index c44f0e2caa..4fca5d8594 100644 --- a/public/scss/generics.scss +++ b/public/scss/generics.scss @@ -151,4 +151,8 @@ blockquote { .pull-right { float: right!important; +} + +img.emoji { + height: $font-size-lg; } \ No newline at end of file diff --git a/src/posts/create.js b/src/posts/create.js index b42b2cedc3..388dcde606 100644 --- a/src/posts/create.js +++ b/src/posts/create.js @@ -11,6 +11,8 @@ const privileges = require('../privileges'); const activitypub = require('../activitypub'); const utils = require('../utils'); +const isEmojiShortcode = /^:[\w]+:$/; + module.exports = function (Posts) { Posts.create = async function (data) { // This is an internal method, consider using Topics.reply instead @@ -28,13 +30,7 @@ module.exports = function (Posts) { } const pid = data.pid || await db.incrObjectField('global', 'nextPid'); - let postData = { - pid: pid, - uid: uid, - tid: tid, - content: content, - timestamp: timestamp, - }; + let postData = { pid, uid, tid, content, timestamp }; if (data.toPid) { postData.toPid = data.toPid; @@ -49,6 +45,17 @@ module.exports = function (Posts) { postData.url = _activitypub.url; } + // Rewrite emoji references to inline image assets + if (_activitypub && _activitypub.tag && Array.isArray(_activitypub.tag)) { + _activitypub.tag + .filter(tag => tag.type === 'Emoji' && + isEmojiShortcode.test(tag.name) && + tag.icon && tag.icon.mediaType && tag.icon.mediaType.startsWith('image/')) + .forEach((tag) => { + postData.content = postData.content.replace(new RegExp(tag.name, 'g'), ``); + }); + } + ({ post: postData } = await plugins.hooks.fire('filter:post.create', { post: postData, data: data })); await db.setObject(`post:${postData.pid}`, postData);