code.twelvefourseven.net

Transforming external links in Eleventy

  1. _utils/links.js
  2. .eleventy.js
  3. style.css
import { parseHTML } from "linkedom";
export default function(content) {
	if (this.page.outputPath && this.page.outputPath.endsWith(".html")) {
		const { document } = parseHTML(content);
		const links = Array.from(document.querySelectorAll("a"));
		links.forEach((link) => {
			const href = link.getAttribute("href");
			const isExternal = href && href.startsWith("http");
			if (isExternal) {
				link.classList.add("external");
				link.setAttribute("target", "_blank");
				link.setAttribute("rel", "noopener noreferrer");
			}
		});
		return "<!DOCTYPE html>\n" + document.documentElement.outerHTML;
	}
	return content;
};
import transformExternalLinks from "./_utils/links.js";
export default async function (config) {
	// ...
	config.addTransform("externalLinks", transformExternalLinks);
}
.external::after {
	background-color: currentcolor;
	content: "\200b"/"(external)";
	display: inline-block;
	height: 1em;
	margin-left: .2em;
	-webkit-mask-image: url(/external.svg);
	mask-image: url(/external.svg);
	-webkit-mask-size: cover;
	mask-size: cover;
	vertical-align: text-top;
	width: 1em;
}