diff --git a/core/server/data/meta/excerpt.js b/core/server/data/meta/excerpt.js index 7effd7b22f..f6e31584bb 100644 --- a/core/server/data/meta/excerpt.js +++ b/core/server/data/meta/excerpt.js @@ -1,6 +1,7 @@ var downsize = require('downsize'); function getExcerpt(html, truncateOptions) { + truncateOptions = truncateOptions || {}; // Strip inline and bottom footnotes var excerpt = html.replace(/.*?<\/a>/gi, ''); excerpt = excerpt.replace(/
    .*?<\/ol><\/div>/, ''); diff --git a/core/server/data/meta/index.js b/core/server/data/meta/index.js index 8464c1046d..30327e680a 100644 --- a/core/server/data/meta/index.js +++ b/core/server/data/meta/index.js @@ -14,7 +14,8 @@ var config = require('../../config'), getModifiedDate = require('./modified_date'), getOgType = require('./og_type'), getStructuredData = require('./structured_data'), - getPostSchema = require('./schema'); + getPostSchema = require('./schema'), + getExcerpt = require('./excerpt'); function getMetaData(data, root) { var blog = config.theme, metaData; @@ -37,6 +38,10 @@ function getMetaData(data, root) { blog: blog }; + if (data.post && data.post.html) { + metaData.excerpt = getExcerpt(data.post.html, {words: 50}); + } + metaData.structuredData = getStructuredData(metaData); metaData.schema = getPostSchema(metaData, data); diff --git a/core/server/data/meta/schema.js b/core/server/data/meta/schema.js index ba59479537..4f59b90dd7 100644 --- a/core/server/data/meta/schema.js +++ b/core/server/data/meta/schema.js @@ -16,7 +16,11 @@ function trimSchema(schema) { } function getPostSchema(metaData, data) { - var schema = { + var description = metaData.metaDescription ? escapeExpression(metaData.metaDescription) : + (metaData.excerpt ? escapeExpression(metaData.excerpt) : null), + schema; + + schema = { '@context': 'http://schema.org', '@type': 'Article', publisher: metaData.blog.title, @@ -37,9 +41,7 @@ function getPostSchema(metaData, data) { image: metaData.coverImage, keywords: metaData.keywords && metaData.keywords.length > 0 ? metaData.keywords.join(', ') : null, - description: metaData.metaDescription ? - escapeExpression(metaData.metaDescription) : - null + description: description }; schema.author = trimSchema(schema.author); return trimSchema(schema); diff --git a/core/server/data/meta/structured_data.js b/core/server/data/meta/structured_data.js index 6fd7b8cf4b..dfc6edbd94 100644 --- a/core/server/data/meta/structured_data.js +++ b/core/server/data/meta/structured_data.js @@ -10,7 +10,7 @@ function getStructuredData(metaData) { 'og:site_name': metaData.blog.title, 'og:type': metaData.ogType, 'og:title': metaData.metaTitle, - 'og:description': metaData.metaDescription, + 'og:description': metaData.metaDescription || metaData.excerpt, 'og:url': metaData.canonicalUrl, 'og:image': metaData.coverImage, 'article:published_time': metaData.publishedDate, @@ -18,7 +18,7 @@ function getStructuredData(metaData) { 'article:tag': metaData.keywords, 'twitter:card': card, 'twitter:title': metaData.metaTitle, - 'twitter:description': metaData.metaDescription, + 'twitter:description': metaData.metaDescription || metaData.excerpt, 'twitter:url': metaData.canonicalUrl, 'twitter:image:src': metaData.coverImage }; diff --git a/core/server/helpers/ghost_head.js b/core/server/helpers/ghost_head.js index 3f09ebf901..bd098be0cb 100644 --- a/core/server/helpers/ghost_head.js +++ b/core/server/helpers/ghost_head.js @@ -11,7 +11,6 @@ var getMetaData = require('../data/meta'), escapeExpression = hbs.handlebars.Utils.escapeExpression, SafeString = hbs.handlebars.SafeString, _ = require('lodash'), - api = require('../api'), filters = require('../filters'), assetHelper = require('./asset'), config = require('../config'), diff --git a/core/test/unit/server_helpers/ghost_head_spec.js b/core/test/unit/server_helpers/ghost_head_spec.js index 49521614dd..e2efccba2f 100644 --- a/core/test/unit/server_helpers/ghost_head_spec.js +++ b/core/test/unit/server_helpers/ghost_head_spec.js @@ -595,6 +595,27 @@ describe('{{ghost_head}} helper', function () { }).catch(done); }); + it('returns twitter and facebook descriptions if no meta description available', function (done) { + var post = { + title: 'Welcome to Ghost', + html: '

    This is a short post

    ', + author: { + name: 'Author name' + } + }; + + helpers.ghost_head.call( + {relativeUrl: '/post/', safeVersion: '0.3', context: ['post'], post: post}, + {data: {root: {context: ['post']}}} + ).then(function (rendered) { + should.exist(rendered); + rendered.string.should.match(//); + rendered.string.should.match(//); + + done(); + }).catch(done); + }); + it('returns canonical URL', function (done) { helpers.ghost_head.call( {safeVersion: '0.3', relativeUrl: '/about/', context: ['page']},