From 15e4dd1e9ff422d37eb2fa108b26ecbcd30bccc8 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Mon, 18 Aug 2014 21:11:41 -0400 Subject: [PATCH] Pre & Next Links for Ghost_Head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #685 - Now that we have a ‘pagination’ meta object, we can implement SEO-friendly `next` and `prev` ref links in ``. - This implementation works uniformly for anything that supports pagination in the current schema (posts, tags, authors) - Regex should make the implementation future-proof for additional pagination --- core/server/helpers/index.js | 18 +++++++++++++- core/test/unit/server_helpers_index_spec.js | 26 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/core/server/helpers/index.js b/core/server/helpers/index.js index f0f4453137..101ab3774e 100644 --- a/core/server/helpers/index.js +++ b/core/server/helpers/index.js @@ -490,7 +490,9 @@ coreHelpers.ghost_head = function (options) { blog = config.theme(), head = [], majorMinor = /^(\d+\.)?(\d+)/, - trimmedVersion = this.version; + trimmedVersion = this.version, + trimmedUrlpattern = /.+(?=\/page\/\d*\/)/, + trimmedUrl, next, prev; trimmedVersion = trimmedVersion ? trimmedVersion.match(majorMinor)[0] : '?'; @@ -502,6 +504,20 @@ coreHelpers.ghost_head = function (options) { return coreHelpers.url.call(self, {hash: {absolute: true}}).then(function (url) { head.push(''); + if (self.pagination) { + trimmedUrl = self.relativeUrl.match(trimmedUrlpattern); + if (self.pagination.prev) { + prev = (self.pagination.prev > 1 ? prev = '/page/' + self.pagination.prev + '/' : prev = '/'); + prev = (trimmedUrl) ? '/' + trimmedUrl + prev : prev; + head.push(''); + } + if (self.pagination.next) { + next = '/page/' + self.pagination.next + '/'; + next = (trimmedUrl) ? '/' + trimmedUrl + next : next; + head.push(''); + } + } + return filters.doFilter('ghost_head', head); }).then(function (head) { var headString = _.reduce(head, function (memo, item) { return memo + '\n' + item; }, ''); diff --git a/core/test/unit/server_helpers_index_spec.js b/core/test/unit/server_helpers_index_spec.js index f17481e272..b2d42a66a5 100644 --- a/core/test/unit/server_helpers_index_spec.js +++ b/core/test/unit/server_helpers_index_spec.js @@ -551,6 +551,32 @@ describe('Core Helpers', function () { done(); }).catch(done); }); + + it('returns next & prev URL correctly for middle page', function (done) { + configUpdate({url: 'http://testurl.com'}); + helpers.ghost_head.call({version: '0.3.0', relativeUrl: '/page/3/', pagination: {next: '4', prev: '2'}}).then(function (rendered) { + should.exist(rendered); + rendered.string.should.equal('\n' + + '\n' + + '\n' + + '\n' + + ''); + done(); + }).catch(done); + }); + + it('returns next & prev URL correctly for second page', function (done) { + configUpdate({url: 'http://testurl.com'}); + helpers.ghost_head.call({version: '0.3.0', relativeUrl: '/page/2/', pagination: {next: '3', prev: '1'}}).then(function (rendered) { + should.exist(rendered); + rendered.string.should.equal('\n' + + '\n' + + '\n' + + '\n' + + ''); + done(); + }).catch(done); + }); }); describe('ghost_foot Helper', function () {