2017-12-11 21:14:05 +03:00
|
|
|
var cheerio = require('cheerio'),
|
|
|
|
url = require('url'),
|
|
|
|
urlService = require('../services/url');
|
2016-08-25 09:09:40 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
|
2017-10-18 19:54:17 +03:00
|
|
|
// CASE: don't convert internal links
|
|
|
|
if (attributeValue[0] === '#') {
|
|
|
|
return;
|
|
|
|
}
|
2016-08-25 09:09:40 +03:00
|
|
|
// 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;
|
2017-12-11 21:14:05 +03:00
|
|
|
attributeValue = urlService.utils.urlJoin(baseUrl, attributeValue);
|
2016-08-25 09:09:40 +03:00
|
|
|
el.attr(attributeName, attributeValue);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
return htmlContent;
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = makeAbsoluteUrls;
|