Ghost/ghost/link-replacer/lib/LinkReplacer.js
Simon Backx 4c5ba4ed7d
Added database storage for link redirects and click events (#15423)
closes https://github.com/TryGhost/Team/issues/1916 
closes https://github.com/TryGhost/Team/issues/1917

- Added database storage for link redirects and click events via repositories (hides away database layer) defined in the wrapper services
    - Added LinkClickRepository to store click events to database
    - Added LinkRedirectRepository to store link redirects to database
    - Added PostLinkRepository to link LinkRedirects with posts
- Renamed link-replacement package to link-replacer, and made it dependency less (it only replaces links now, doesn't do anything else)
- The link-tracking service has a new `addTrackingToUrl` which returns a new URL that includes tracking. The new `addRedirectToUrl` method does the same but without tracking for now.
- MEGA service now uses the link-replacer to replace links in the emails using a combination of different services (member attribution + link-tracking service)
2022-09-19 17:12:54 +02:00

34 lines
904 B
JavaScript

class LinkReplacer {
/**
* Replaces the links in the provided HTML
* @param {string} html
* @param {(url: URL): Promise<URL|string>} replaceLink
* @returns {Promise<string>}
*/
async replace(html, replaceLink) {
const cheerio = require('cheerio');
const $ = cheerio.load(html);
for (const el of $('a').toArray()) {
const href = $(el).attr('href');
if (href) {
let url;
try {
url = new URL(href);
} catch (e) {
// Ignore invalid URLs
}
if (url) {
url = await replaceLink(url);
const str = url.toString();
$(el).attr('href', str);
}
}
}
return $.html();
}
}
module.exports = new LinkReplacer();