#!/usr/bin/env -S deno run --allow-read --ext ts // vi: ft=typescript import { DOMParser, Element, } from "https://deno.land/x/deno_dom@v0.1.41-alpha-artifacts/deno-dom-wasm.ts"; function sanitizeLink(link: string): string { try { let url = new URL(link); url.searchParams.delete("tracking_data"); url.searchParams.delete("utm_source"); url.searchParams.delete("utm_medium"); url.searchParams.delete("utm_campaign"); if ( url.host.includes("safelinks.protection.outlook.com") && url.searchParams.has("url") ) { url = new URL(url.searchParams.get("url")!); } return url.href; } catch (err) { console.error(err); return link; } } function sanitizeEl(el: Element) { const href = el.getAttribute("href"); if (href) { el.setAttribute("href", sanitizeLink(href)); } const src = el.getAttribute("src"); if (src) { el.setAttribute("src", sanitizeLink(src)); } } function sanitize(html: string): string { const document = new DOMParser().parseFromString(html, "text/html"); const aTags = document?.querySelectorAll("a"); aTags?.forEach((a) => sanitizeEl(a as Element)); const imgTags = document?.querySelectorAll("a"); imgTags?.forEach((img) => sanitizeEl(img as Element)); if (document?.documentElement?.outerHTML) { return document.documentElement.outerHTML; } else throw new Error("No document available"); } if (import.meta.main) { let file: string; const [path] = Deno.args; if (!path || path === "-") { file = await new Response(Deno.stdin.readable).text(); } else file = await Deno.readTextFile(path); console.log(sanitize(file)); }