mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-10 23:36:14 -05:00
Moved make-absolute-urls to url service
refs #9178 - this util uses the url services (!) - moving this file into lib would not make sense right now - that would mean a module requires first ../lib/url, which then requires ../services/url - the url service definitely need a clean up 😃
This commit is contained in:
parent
64626dedd1
commit
991ccb1d35
6 changed files with 113 additions and 120 deletions
|
@ -15,7 +15,6 @@ var Promise = require('bluebird'),
|
||||||
logging = proxy.logging,
|
logging = proxy.logging,
|
||||||
i18n = proxy.i18n,
|
i18n = proxy.i18n,
|
||||||
errors = proxy.errors,
|
errors = proxy.errors,
|
||||||
makeAbsoluteUrl = require('../../../../utils/make-absolute-urls'),
|
|
||||||
urlService = require('../../../../services/url'),
|
urlService = require('../../../../services/url'),
|
||||||
amperizeCache = {},
|
amperizeCache = {},
|
||||||
allowedAMPTags = [],
|
allowedAMPTags = [],
|
||||||
|
@ -126,7 +125,7 @@ function getAmperizeHTML(html, post) {
|
||||||
amperize = amperize || new Amperize();
|
amperize = amperize || new Amperize();
|
||||||
|
|
||||||
// make relative URLs abolute
|
// make relative URLs abolute
|
||||||
html = makeAbsoluteUrl(html, urlService.utils.urlFor('home', true), post.url).html();
|
html = urlService.utils.makeAbsoluteUrls(html, urlService.utils.urlFor('home', true), post.url).html();
|
||||||
|
|
||||||
if (!amperizeCache[post.id] || moment(new Date(amperizeCache[post.id].updated_at)).diff(new Date(post.updated_at)) < 0) {
|
if (!amperizeCache[post.id] || moment(new Date(amperizeCache[post.id].updated_at)).diff(new Date(post.updated_at)) < 0) {
|
||||||
return new Promise(function (resolve) {
|
return new Promise(function (resolve) {
|
||||||
|
|
|
@ -2,8 +2,6 @@ var downsize = require('downsize'),
|
||||||
RSS = require('rss'),
|
RSS = require('rss'),
|
||||||
urlService = require('../../services/url'),
|
urlService = require('../../services/url'),
|
||||||
filters = require('../../filters'),
|
filters = require('../../filters'),
|
||||||
processUrls = require('../../utils/make-absolute-urls'),
|
|
||||||
|
|
||||||
generateFeed,
|
generateFeed,
|
||||||
generateItem,
|
generateItem,
|
||||||
generateTags;
|
generateTags;
|
||||||
|
@ -23,7 +21,7 @@ generateTags = function generateTags(data) {
|
||||||
|
|
||||||
generateItem = function generateItem(post, siteUrl, secure) {
|
generateItem = function generateItem(post, siteUrl, secure) {
|
||||||
var itemUrl = urlService.utils.urlFor('post', {post: post, secure: secure}, true),
|
var itemUrl = urlService.utils.urlFor('post', {post: post, secure: secure}, true),
|
||||||
htmlContent = processUrls(post.html, siteUrl, itemUrl),
|
htmlContent = urlService.utils.makeAbsoluteUrls(post.html, siteUrl, itemUrl),
|
||||||
item = {
|
item = {
|
||||||
title: post.title,
|
title: post.title,
|
||||||
// @TODO: DRY this up with data/meta/index & other excerpt code
|
// @TODO: DRY this up with data/meta/index & other excerpt code
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
// Contains all path information to be used throughout the codebase.
|
// Contains all path information to be used throughout the codebase.
|
||||||
// Assumes that config.url is set, and is valid
|
// Assumes that config.url is set, and is valid
|
||||||
|
const moment = require('moment-timezone'),
|
||||||
var moment = require('moment-timezone'),
|
|
||||||
_ = require('lodash'),
|
_ = require('lodash'),
|
||||||
url = require('url'),
|
url = require('url'),
|
||||||
|
cheerio = require('cheerio'),
|
||||||
config = require('../../config'),
|
config = require('../../config'),
|
||||||
settingsCache = require('../settings/cache'),
|
settingsCache = require('../settings/cache'),
|
||||||
// @TODO: unify this with the path in server/app.js
|
// @TODO: unify this with the path in server/app.js
|
||||||
|
@ -365,6 +367,64 @@ function redirectToAdmin(status, res, adminPath) {
|
||||||
return res.redirect(redirectUrl);
|
return res.redirect(redirectUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make absolute URLs
|
||||||
|
* @param {string} html
|
||||||
|
* @param {string} siteUrl (blog URL)
|
||||||
|
* @param {string} itemUrl (URL of current context)
|
||||||
|
* @returns {object} htmlContent
|
||||||
|
* @description Takes html, blog url and item url and converts relative url into
|
||||||
|
* absolute urls. Returns an object. The html string can be accessed by calling `html()` on
|
||||||
|
* the variable that takes the result of this function
|
||||||
|
*/
|
||||||
|
function makeAbsoluteUrls(html, siteUrl, itemUrl) {
|
||||||
|
var htmlContent = cheerio.load(html, {decodeEntities: false});
|
||||||
|
|
||||||
|
// convert relative resource urls to absolute
|
||||||
|
['href', 'src'].forEach(function forEach(attributeName) {
|
||||||
|
htmlContent('[' + attributeName + ']').each(function each(ix, el) {
|
||||||
|
var baseUrl,
|
||||||
|
attributeValue,
|
||||||
|
parsed;
|
||||||
|
|
||||||
|
el = htmlContent(el);
|
||||||
|
|
||||||
|
attributeValue = el.attr(attributeName);
|
||||||
|
|
||||||
|
// if URL is absolute move on to the next element
|
||||||
|
try {
|
||||||
|
parsed = url.parse(attributeValue);
|
||||||
|
|
||||||
|
if (parsed.protocol) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not convert protocol relative URLs
|
||||||
|
if (attributeValue.lastIndexOf('//', 0) === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CASE: don't convert internal links
|
||||||
|
if (attributeValue[0] === '#') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// compose an absolute URL
|
||||||
|
|
||||||
|
// if the relative URL begins with a '/' use the blog URL (including sub-directory)
|
||||||
|
// as the base URL, otherwise use the post's URL.
|
||||||
|
baseUrl = attributeValue[0] === '/' ? siteUrl : itemUrl;
|
||||||
|
attributeValue = urlJoin(baseUrl, attributeValue);
|
||||||
|
el.attr(attributeName, attributeValue);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return htmlContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.makeAbsoluteUrls = makeAbsoluteUrls;
|
||||||
module.exports.getProtectedSlugs = getProtectedSlugs;
|
module.exports.getProtectedSlugs = getProtectedSlugs;
|
||||||
module.exports.getSubdir = getSubdir;
|
module.exports.getSubdir = getSubdir;
|
||||||
module.exports.urlJoin = urlJoin;
|
module.exports.urlJoin = urlJoin;
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
var cheerio = require('cheerio'),
|
|
||||||
url = require('url'),
|
|
||||||
urlService = require('../services/url');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Make absolute URLs
|
|
||||||
* @param {string} html
|
|
||||||
* @param {string} siteUrl (blog URL)
|
|
||||||
* @param {string} itemUrl (URL of current context)
|
|
||||||
* @returns {object} htmlContent
|
|
||||||
* @description Takes html, blog url and item url and converts relative url into
|
|
||||||
* absolute urls. Returns an object. The html string can be accessed by calling `html()` on
|
|
||||||
* the variable that takes the result of this function
|
|
||||||
*/
|
|
||||||
function makeAbsoluteUrls(html, siteUrl, itemUrl) {
|
|
||||||
var htmlContent = cheerio.load(html, {decodeEntities: false});
|
|
||||||
// convert relative resource urls to absolute
|
|
||||||
['href', 'src'].forEach(function forEach(attributeName) {
|
|
||||||
htmlContent('[' + attributeName + ']').each(function each(ix, el) {
|
|
||||||
var baseUrl,
|
|
||||||
attributeValue,
|
|
||||||
parsed;
|
|
||||||
|
|
||||||
el = htmlContent(el);
|
|
||||||
|
|
||||||
attributeValue = el.attr(attributeName);
|
|
||||||
|
|
||||||
// if URL is absolute move on to the next element
|
|
||||||
try {
|
|
||||||
parsed = url.parse(attributeValue);
|
|
||||||
|
|
||||||
if (parsed.protocol) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not convert protocol relative URLs
|
|
||||||
if (attributeValue.lastIndexOf('//', 0) === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CASE: don't convert internal links
|
|
||||||
if (attributeValue[0] === '#') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// compose an absolute URL
|
|
||||||
|
|
||||||
// if the relative URL begins with a '/' use the blog URL (including sub-directory)
|
|
||||||
// as the base URL, otherwise use the post's URL.
|
|
||||||
baseUrl = attributeValue[0] === '/' ? siteUrl : itemUrl;
|
|
||||||
attributeValue = urlService.utils.urlJoin(baseUrl, attributeValue);
|
|
||||||
el.attr(attributeName, attributeValue);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return htmlContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = makeAbsoluteUrls;
|
|
|
@ -3,11 +3,11 @@ var should = require('should'),
|
||||||
sinon = require('sinon'),
|
sinon = require('sinon'),
|
||||||
_ = require('lodash'),
|
_ = require('lodash'),
|
||||||
moment = require('moment-timezone'),
|
moment = require('moment-timezone'),
|
||||||
urlService = require('../../../server/services/url'),
|
urlService = require('../../../../server/services/url'),
|
||||||
constants = require('../../../server/lib/constants'),
|
constants = require('../../../../server/lib/constants'),
|
||||||
settingsCache = require('../../../server/services/settings/cache'),
|
settingsCache = require('../../../../server/services/settings/cache'),
|
||||||
configUtils = require('../../utils/configUtils'),
|
configUtils = require('../../../utils/configUtils'),
|
||||||
testUtils = require('../../utils'),
|
testUtils = require('../../../utils'),
|
||||||
config = configUtils.config,
|
config = configUtils.config,
|
||||||
|
|
||||||
sandbox = sinon.sandbox.create();
|
sandbox = sinon.sandbox.create();
|
||||||
|
@ -721,4 +721,48 @@ describe('Url', function () {
|
||||||
urlService.utils.redirectToAdmin(302, res, '#/my/awesome/path');
|
urlService.utils.redirectToAdmin(302, res, '#/my/awesome/path');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('make absolute urls ', function () {
|
||||||
|
var siteUrl = 'http://my-ghost-blog.com',
|
||||||
|
itemUrl = 'my-awesome-post';
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
configUtils.set({url: 'http://my-ghost-blog.com'});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
configUtils.restore();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('[success] does not convert absolute URLs', function () {
|
||||||
|
var html = '<a href="http://my-ghost-blog.com/content/images" title="Absolute URL">',
|
||||||
|
result = urlService.utils.makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
||||||
|
|
||||||
|
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/content\/images" title="Absolute URL">/);
|
||||||
|
});
|
||||||
|
it('[failure] does not convert protocol relative `//` URLs', function () {
|
||||||
|
var html = '<a href="//my-ghost-blog.com/content/images" title="Absolute URL">',
|
||||||
|
result = urlService.utils.makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
||||||
|
|
||||||
|
result.should.match(/<a href="\/\/my-ghost-blog.com\/content\/images" title="Absolute URL">/);
|
||||||
|
});
|
||||||
|
it('[failure] does not convert internal links starting with "#"', function () {
|
||||||
|
var html = '<a href="#jumptosection" title="Table of Content">',
|
||||||
|
result = urlService.utils.makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
||||||
|
|
||||||
|
result.should.match(/<a href="#jumptosection" title="Table of Content">/);
|
||||||
|
});
|
||||||
|
it('[success] converts a relative URL', function () {
|
||||||
|
var html = '<a href="/about#nowhere" title="Relative URL">',
|
||||||
|
result = urlService.utils.makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
||||||
|
|
||||||
|
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/about#nowhere" title="Relative URL">/);
|
||||||
|
});
|
||||||
|
it('[success] converts a relative URL including subdirectories', function () {
|
||||||
|
var html = '<a href="/about#nowhere" title="Relative URL">',
|
||||||
|
result = urlService.utils.makeAbsoluteUrls(html, 'http://my-ghost-blog.com/blog', itemUrl).html();
|
||||||
|
|
||||||
|
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/blog\/about#nowhere" title="Relative URL">/);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
|
@ -1,47 +0,0 @@
|
||||||
var should = require('should'), // jshint ignore:line
|
|
||||||
makeAbsoluteUrls = require('../../../server/utils/make-absolute-urls'),
|
|
||||||
configUtils = require('../../utils/configUtils');
|
|
||||||
|
|
||||||
describe('Make absolute URLs ', function () {
|
|
||||||
var siteUrl = 'http://my-ghost-blog.com',
|
|
||||||
itemUrl = 'my-awesome-post';
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
configUtils.set({url: 'http://my-ghost-blog.com'});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(function () {
|
|
||||||
configUtils.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('[success] does not convert absolute URLs', function () {
|
|
||||||
var html = '<a href="http://my-ghost-blog.com/content/images" title="Absolute URL">',
|
|
||||||
result = makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
|
||||||
|
|
||||||
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/content\/images" title="Absolute URL">/);
|
|
||||||
});
|
|
||||||
it('[failure] does not convert protocol relative `//` URLs', function () {
|
|
||||||
var html = '<a href="//my-ghost-blog.com/content/images" title="Absolute URL">',
|
|
||||||
result = makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
|
||||||
|
|
||||||
result.should.match(/<a href="\/\/my-ghost-blog.com\/content\/images" title="Absolute URL">/);
|
|
||||||
});
|
|
||||||
it('[failure] does not convert internal links starting with "#"', function () {
|
|
||||||
var html = '<a href="#jumptosection" title="Table of Content">',
|
|
||||||
result = makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
|
||||||
|
|
||||||
result.should.match(/<a href="#jumptosection" title="Table of Content">/);
|
|
||||||
});
|
|
||||||
it('[success] converts a relative URL', function () {
|
|
||||||
var html = '<a href="/about#nowhere" title="Relative URL">',
|
|
||||||
result = makeAbsoluteUrls(html, siteUrl, itemUrl).html();
|
|
||||||
|
|
||||||
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/about#nowhere" title="Relative URL">/);
|
|
||||||
});
|
|
||||||
it('[success] converts a relative URL including subdirectories', function () {
|
|
||||||
var html = '<a href="/about#nowhere" title="Relative URL">',
|
|
||||||
result = makeAbsoluteUrls(html, 'http://my-ghost-blog.com/blog', itemUrl).html();
|
|
||||||
|
|
||||||
result.should.match(/<a href="http:\/\/my-ghost-blog.com\/blog\/about#nowhere" title="Relative URL">/);
|
|
||||||
});
|
|
||||||
});
|
|
Loading…
Add table
Reference in a new issue