diff --git a/lib/plugins/helper/open_graph.js b/lib/plugins/helper/open_graph.js index 5ac3812e95..e58cdc0d9f 100644 --- a/lib/plugins/helper/open_graph.js +++ b/lib/plugins/helper/open_graph.js @@ -2,7 +2,7 @@ const urlFn = require('url'); const moment = require('moment'); -const { encodeURL, htmlTag, stripHTML, escapeHTML } = require('hexo-util'); +const { htmlTag, prettyUrls, stripHTML, escapeHTML } = require('hexo-util'); const localeMap = { 'en': 'en_US', 'de': 'de_DE', @@ -44,7 +44,7 @@ function openGraphHelper(options = {}) { let keywords = page.keywords || (page.tags && page.tags.length ? page.tags : undefined) || config.keywords; const title = options.title || page.title || config.title; const type = options.type || (this.is_post() ? 'article' : 'website'); - let url = options.url || this.url; + const url = prettyUrls(options.url || this.url || config.url, config.pretty_urls); const siteName = options.site_name || config.title; const twitterCard = options.twitter_card || 'summary'; const date = options.date !== false ? options.date || page.date : false; @@ -82,12 +82,6 @@ function openGraphHelper(options = {}) { result += og('og:type', type); result += og('og:title', title); - if (url) { - if (config.pretty_urls.trailing_index === false) { - url = url.replace(/index\.html$/, ''); - } - url = encodeURL(url); - } result += og('og:url', url); result += og('og:site_name', siteName); @@ -113,7 +107,7 @@ function openGraphHelper(options = {}) { if (!urlFn.parse(path).host) { // resolve `path`'s absolute path relative to current page's url // `path` can be both absolute (starts with `/`) or relative. - return urlFn.resolve(url || config.url, path); + return urlFn.resolve(url, path); } return path; diff --git a/test/scripts/helpers/open_graph.js b/test/scripts/helpers/open_graph.js index 6e5b3779b0..c384c1453c 100644 --- a/test/scripts/helpers/open_graph.js +++ b/test/scripts/helpers/open_graph.js @@ -2,7 +2,7 @@ const moment = require('moment'); const cheerio = require('cheerio'); -const { encodeURL } = require('hexo-util'); +const { escapeHTML } = require('hexo-util'); describe('open_graph', () => { const Hexo = require('../../../lib/hexo'); @@ -34,7 +34,7 @@ describe('open_graph', () => { }).should.eql([ meta({property: 'og:type', content: 'website'}), meta({property: 'og:title', content: hexo.config.title}), - meta({property: 'og:url'}), + meta({property: 'og:url', content: escapeHTML(hexo.config.url)}), meta({property: 'og:site_name', content: hexo.config.title}), meta({property: 'og:locale', content: 'en_US'}), meta({property: 'article:published_time', content: post.date.toISOString()}), @@ -117,7 +117,7 @@ describe('open_graph', () => { result.should.contain(meta({property: 'og:url', content: 'https://hexo.io/bar'})); }); - it('url - should not ends with index.html', () => { + it('url - pretty_urls.trailing_index', () => { hexo.config.pretty_urls.trailing_index = false; const result = openGraph.call({ page: {}, @@ -128,11 +128,47 @@ describe('open_graph', () => { const $ = cheerio.load(result); - $('meta[property="og:url"]').attr('content').endsWith('index.html').should.be.false; + $('meta[property="og:url"]').attr('content').endsWith('index.html').should.eql(false); hexo.config.pretty_urls.trailing_index = true; }); + it('url - pretty_urls.trailing_html', () => { + hexo.config.pretty_urls.trailing_html = false; + const result = openGraph.call({ + page: {}, + config: hexo.config, + is_post: isPost, + url: 'http://yoursite.com/page/about.html' + }); + + const $ = cheerio.load(result); + + $('meta[property="og:url"]').attr('content').endsWith('.html').should.eql(false); + + hexo.config.pretty_urls.trailing_html = true; + }); + + it('url - null pretty_urls', () => { + hexo.config.pretty_urls = null; + const url = 'http://yoursite.com/page/about.html'; + const result = openGraph.call({ + page: {}, + config: hexo.config, + is_post: isPost, + url + }); + + const $ = cheerio.load(result); + + $('meta[property="og:url"]').attr('content').should.eql(url); + + hexo.config.pretty_urls = { + trailing_index: true, + trailing_html: true + }; + }); + it('url - IDN', () => { const ctx = { page: {}, @@ -143,7 +179,7 @@ describe('open_graph', () => { const result = openGraph.call(ctx); - result.should.contain(meta({property: 'og:url', content: encodeURL(ctx.url)})); + result.should.contain(meta({property: 'og:url', content: escapeHTML(ctx.url)})); }); it('images - content', () => {