blob: dbde0592cfe75fed268f7caf81acff393bb076f7 (
plain) (
tree)
|
|
#!/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));
}
|