0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-06 22:40:14 -05:00

Add media:content support to RSS

refs #2263, #4888

- Adds media:content element to Ghost Rt pSS feeds containing the post cover image if one is available
- Removes the prepending of the image to the `<description>` field
- Keeps the prepending of the image in `<content:encoded>`
This commit is contained in:
Hannah Wolfe 2015-04-05 21:40:13 +01:00
parent 6db9826b23
commit 14134fb4b0
3 changed files with 38 additions and 17 deletions

View file

@ -505,7 +505,8 @@ frontendControllers = {
site_url: siteUrl,
ttl: '60',
custom_namespaces: {
content: 'http://purl.org/rss/1.0/modules/content/'
content: 'http://purl.org/rss/1.0/modules/content/',
media: 'http://search.yahoo.com/mrss/'
}
});
@ -525,14 +526,11 @@ frontendControllers = {
url: config.urlFor('post', {post: post, permalinks: permalinks}, true),
date: post.published_at,
categories: _.pluck(post.tags, 'name'),
author: post.author ? post.author.name : null
author: post.author ? post.author.name : null,
custom_elements: []
},
htmlContent = cheerio.load(post.html, {decodeEntities: false});
if (post.image) {
htmlContent('p').first().before('<img src="' + post.image + '" />');
htmlContent('img').attr('alt', post.title);
}
htmlContent = cheerio.load(post.html, {decodeEntities: false}),
image;
// convert relative resource urls to absolute
['href', 'src'].forEach(function (attributeName) {
@ -572,13 +570,31 @@ frontendControllers = {
});
});
item.custom_elements = [{
item.description = post.meta_description || downsize(htmlContent.html(), {words: 50});
if (post.image) {
image = config.urlFor('image', {image: post.image}, true);
// Add a media content tag
item.custom_elements.push({
'media:content': {
_attr: {
url: image,
medium: 'image'
}
}
});
// Also add the image to the content, because not all readers support media:content
htmlContent('p').first().before('<img src="' + image + '" />');
htmlContent('img').attr('alt', post.title);
}
item.custom_elements.push({
'content:encoded': {
_cdata: htmlContent.html()
}
}];
item.description = post.meta_description || downsize(htmlContent.html(), {words: 50});
});
feed.item(item);
});

View file

@ -443,7 +443,14 @@ describe('Frontend Routing', function () {
}).catch(done);
});
it('should use meta_description where available', function (done) {
it('should use meta_description and image where available', function (done) {
var post1End = 'you think :)</p>]]></content:encoded>',
post3Title = '<title><![CDATA[Short and Sweet]]>',
post3DescStart = '<description><![CDATA[test stuff',
post3ContentStart = '<content:encoded><![CDATA[<h2 id=\"testing\">testing</h2>\n\n' +
'<img src=\"http:\/\/placekitten.com\/500\/200\"',
post3Image = '<media:content url=\"http:\/\/placekitten.com\/500\/200\" medium=\"image\"\/>';
request.get('/rss/')
.expect('Content-Type', 'text/xml; charset=utf-8')
.expect('Cache-Control', testUtils.cacheRules['public'])
@ -454,10 +461,6 @@ describe('Frontend Routing', function () {
}
var content = res.text,
post1End = 'you think :)</p>]]></content:encoded>',
post3Title = '<title><![CDATA[Short and Sweet\]\]>',
post3DescStart = '<description><![CDATA[test stuff',
post3ContentStart = '<content:encoded><![CDATA[<h2 id=\"testing\">testing</h2>',
endIndex = content.indexOf(post1End);
content.indexOf('<rss').should.be.above(0);
@ -465,6 +468,7 @@ describe('Frontend Routing', function () {
content.indexOf(post3Title).should.be.above(endIndex);
content.indexOf(post3DescStart).should.be.above(endIndex);
content.indexOf(post3ContentStart).should.be.above(endIndex);
content.indexOf(post3Image).should.be.above(endIndex);
content.indexOf('</rss>').should.be.above(0);
done();

View file

@ -23,6 +23,7 @@ DataGenerator.Content = {
slug: "short-and-sweet",
markdown: "## testing\n\nmctesters\n\n- test\n- line\n- items",
html: "<h2 id=\"testing\">testing</h2>\n\n<p>mctesters</p>\n\n<ul>\n<li>test</li>\n<li>line</li>\n<li>items</li>\n</ul>",
image: "http://placekitten.com/500/200",
meta_description: "test stuff",
published_at: new Date("2015-01-03")
},