0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Improve RSS feed

refs #2263

- Switch content type back to text/xml
- Use content:encode for full content
- Use meta description or first 50 words of content for description
This commit is contained in:
Hannah Wolfe 2015-03-22 20:51:07 +00:00
parent 6cd696b332
commit 79d213436e
4 changed files with 60 additions and 12 deletions

View file

@ -15,6 +15,7 @@ var moment = require('moment'),
template = require('../helpers/template'), template = require('../helpers/template'),
errors = require('../errors'), errors = require('../errors'),
cheerio = require('cheerio'), cheerio = require('cheerio'),
downsize = require('downsize'),
routeMatch = require('path-match')(), routeMatch = require('path-match')(),
frontendControllers, frontendControllers,
@ -500,7 +501,10 @@ frontendControllers = {
generator: 'Ghost ' + trimmedVersion, generator: 'Ghost ' + trimmedVersion,
feed_url: feedUrl, feed_url: feedUrl,
site_url: siteUrl, site_url: siteUrl,
ttl: '60' ttl: '60',
custom_namespaces: {
content: 'http://purl.org/rss/1.0/modules/content/'
}
}); });
// If page is greater than number of pages we have, redirect to last page // If page is greater than number of pages we have, redirect to last page
@ -566,11 +570,18 @@ frontendControllers = {
}); });
}); });
item.description = htmlContent.html(); item.custom_elements = [{
'content:encoded': {
_cdata: htmlContent.html()
}
}];
item.description = post.meta_description || downsize(htmlContent.html(), {words: 50});
feed.item(item); feed.item(item);
}); });
}).then(function () { }).then(function () {
res.set('Content-Type', 'application/rss+xml; charset=UTF-8'); res.set('Content-Type', 'text/xml; charset=UTF-8');
res.send(feed.xml()); res.send(feed.xml());
}); });
}); });

View file

@ -376,7 +376,7 @@ describe('Frontend Routing', function () {
it('should respond with xml', function (done) { it('should respond with xml', function (done) {
request.get('/rss/') request.get('/rss/')
.expect('Content-Type', 'application/rss+xml; charset=utf-8') .expect('Content-Type', 'text/xml; charset=utf-8')
.expect('Cache-Control', testUtils.cacheRules['public']) .expect('Cache-Control', testUtils.cacheRules['public'])
.expect(200) .expect(200)
.end(function (err, res) { .end(function (err, res) {
@ -394,8 +394,9 @@ describe('Frontend Routing', function () {
siteDescription = '<description><![CDATA[Just a blogging platform.]]></description>', siteDescription = '<description><![CDATA[Just a blogging platform.]]></description>',
siteUrl = '<link>http://127.0.0.1:2369/</link>', siteUrl = '<link>http://127.0.0.1:2369/</link>',
postTitle = '<![CDATA[Welcome to Ghost]]>', postTitle = '<![CDATA[Welcome to Ghost]]>',
postStart = '<description><![CDATA[<p>You\'re live!', descStart = '<description><![CDATA[<p>You\'re live!',
postEnd = 'you think :)</p>]]></description>', postStart = '<content:encoded><![CDATA[<p>You\'re live!',
postEnd = 'you think :)</p>]]></content:encoded>',
postLink = '<link>http://127.0.0.1:2369/welcome-to-ghost/</link>', postLink = '<link>http://127.0.0.1:2369/welcome-to-ghost/</link>',
postCreator = '<dc:creator><![CDATA[Joe Bloggs]]>', postCreator = '<dc:creator><![CDATA[Joe Bloggs]]>',
author = '<author>'; author = '<author>';
@ -405,6 +406,7 @@ describe('Frontend Routing', function () {
content.indexOf(siteDescription).should.be.above(0); content.indexOf(siteDescription).should.be.above(0);
content.indexOf(siteUrl).should.be.above(0); content.indexOf(siteUrl).should.be.above(0);
content.indexOf(postTitle).should.be.above(0); content.indexOf(postTitle).should.be.above(0);
content.indexOf(descStart).should.be.above(0);
content.indexOf(postStart).should.be.above(0); content.indexOf(postStart).should.be.above(0);
content.indexOf(postEnd).should.be.above(0); content.indexOf(postEnd).should.be.above(0);
content.indexOf(postLink).should.be.above(0); content.indexOf(postLink).should.be.above(0);
@ -434,11 +436,45 @@ describe('Frontend Routing', function () {
.end(doEnd(done)); .end(doEnd(done));
}); });
describe('RSS pages', function () { describe('More RSS', function () {
before(function (done) { before(function (done) {
testUtils.fixtures.insertPosts().then(function () { testUtils.fixtures.insertPosts().then(function () {
return testUtils.fixtures.insertMorePosts(11); done();
}).then(function () { }).catch(done);
});
it('should use meta_description where available', function (done) {
request.get('/rss/')
.expect('Content-Type', 'text/xml; charset=utf-8')
.expect('Cache-Control', testUtils.cacheRules['public'])
.expect(200)
.end(function (err, res) {
if (err) {
return done(err);
}
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);
content.indexOf(post1End).should.be.above(0);
content.indexOf(post3Title).should.be.above(endIndex);
content.indexOf(post3DescStart).should.be.above(endIndex);
content.indexOf(post3ContentStart).should.be.above(endIndex);
content.indexOf('</rss>').should.be.above(0);
done();
});
});
});
describe('RSS pages', function () {
before(function (done) {
testUtils.fixtures.insertMorePosts(11).then(function () {
done(); done();
}).catch(done); }).catch(done);
}); });
@ -899,7 +935,7 @@ describe('Frontend Routing', function () {
it('should serve RSS with date permalink', function (done) { it('should serve RSS with date permalink', function (done) {
request.get('/rss/') request.get('/rss/')
.expect('Content-Type', 'application/rss+xml; charset=utf-8') .expect('Content-Type', 'text/xml; charset=utf-8')
.expect('Cache-Control', testUtils.cacheRules['public']) .expect('Cache-Control', testUtils.cacheRules['public'])
.expect(200) .expect(200)
.end(function (err, res) { .end(function (err, res) {

View file

@ -23,6 +23,7 @@ DataGenerator.Content = {
slug: "short-and-sweet", slug: "short-and-sweet",
markdown: "## testing\n\nmctesters\n\n- test\n- line\n- items", 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>", 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>",
meta_description: "test stuff",
published_at: new Date("2015-01-03") published_at: new Date("2015-01-03")
}, },
{ {

View file

@ -60,13 +60,13 @@
"passport-oauth2-client-password": "0.1.2", "passport-oauth2-client-password": "0.1.2",
"path-match": "1.2.2", "path-match": "1.2.2",
"request": "2.51.0", "request": "2.51.0",
"rss": "1.0.0", "rss": "1.1.1",
"semver": "4.1.0", "semver": "4.1.0",
"showdown-ghost": "0.3.6", "showdown-ghost": "0.3.6",
"sqlite3": "3.0.5", "sqlite3": "3.0.5",
"unidecode": "0.1.3", "unidecode": "0.1.3",
"validator": "3.28.0", "validator": "3.28.0",
"xml": "0.0.12" "xml": "1.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"mysql": "2.1.1", "mysql": "2.1.1",