🐛 Fixed apostrophes not displaying correctly in Outlook for member emails

refs https://github.com/TryGhost/Ghost/issues/11536

- Outlook supports `'` as a special char for apostrophes but not `&#apos;` which is what cheerio/juiced render
- adds a basic string placement to the email serializer to switch to the older style of special char
This commit is contained in:
Kevin Ansfield 2020-08-12 19:46:25 +01:00
parent 87965818db
commit 163092f377
2 changed files with 35 additions and 0 deletions

View File

@ -131,6 +131,9 @@ const serialize = async (postModel, options = {isBrowserPreview: false}) => {
_cheerio('a').attr('target','_blank'); _cheerio('a').attr('target','_blank');
juicedHtml = _cheerio.html(); juicedHtml = _cheerio.html();
// Fix any unsupported chars in Outlook
juicedHtml = juicedHtml.replace(/'/g, ''');
const emailTmpl = { const emailTmpl = {
subject: post.email_subject || post.title, subject: post.email_subject || post.title,
html: juicedHtml, html: juicedHtml,

View File

@ -108,6 +108,38 @@ describe('Email Preview API', function () {
}); });
}); });
}); });
it('has custom content transformations for email compatibility', function () {
const post = testUtils.DataGenerator.forKnex.createPost({
id: ObjectId.generate(),
title: 'Post with email-only card',
slug: 'email-only-card',
mobiledoc: '{"version":"0.3.1","atoms":[],"cards":[],"markups":[],"sections":[[1,"p",[[0,[],0,"This is the actual post content... With an apostrophy: \'"]]],[1,"p",[]]]}',
html: '<p>This is the actual post content...</p>',
plaintext: 'This is the actual post content...',
status: 'draft',
uuid: 'd52c42ae-2755-455c-80ec-70b2ec55c904'
});
return models.Post.add(post, {context: {internal: true}}).then(() => {
return request
.get(localUtils.API.getApiQuery(`email_preview/posts/${post.id}/`))
.set('Origin', config.get('url'))
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200)
.then((res) => {
should.not.exist(res.headers['x-cache-invalidate']);
const jsonResponse = res.body;
should.exist(jsonResponse);
should.exist(jsonResponse.email_previews);
jsonResponse.email_previews[0].html.should.match(/&#39;/);
jsonResponse.email_previews[0].html.should.not.match(/&apos;/);
});
});
});
}); });
describe('As Owner', function () { describe('As Owner', function () {