Skip to content
Snippets Groups Projects
common.js 1.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • Igor Markin's avatar
    Igor Markin committed
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    
    Igor Markin's avatar
    Igor Markin committed
    exports.cloneAnchorFromPane = exports.pruneElement = exports.amendNodes = exports.ATTRIBUTES_TO_KEEP = exports.ELEMENT_TYPES_TO_REMOVE = void 0;
    
    Igor Markin's avatar
    Igor Markin committed
    // this is a Node module. require is a must to work across different envs
    const URL = require("url-parse");
    
    Igor Markin's avatar
    Igor Markin committed
    const DUMMY_QR_CODE_ID = "dummyQrCode";
    
    Igor Markin's avatar
    Igor Markin committed
    exports.ELEMENT_TYPES_TO_REMOVE = {
        br: true,
        hr: true,
        use: true,
        svg: true,
    };
    
    Igor Markin's avatar
    Igor Markin committed
    exports.ATTRIBUTES_TO_KEEP = {
        alt: true,
        src: true,
        cite: true,
        data: true,
        datetime: true,
        href: true,
        value: true,
    };
    
    Igor Markin's avatar
    Igor Markin committed
    const amendNodes = (document) => {
        /**
         * Unwind Outlook safelink wrappers
         */
        const anchors = document.getElementsByTagName("a");
        for (const anchor of anchors) {
    
    Igor Markin's avatar
    Igor Markin committed
            const url = new URL(anchor.getAttribute("href"), true);
    
    Igor Markin's avatar
    Igor Markin committed
            if (url.host.includes("safelinks.protection.outlook.com")) {
    
    Igor Markin's avatar
    Igor Markin committed
                anchor.setAttribute("href", url.query["url"]);
    
    Igor Markin's avatar
    Igor Markin committed
            }
        }
    };
    exports.amendNodes = amendNodes;
    
    Igor Markin's avatar
    Igor Markin committed
    /**
     * Removes dummy QR code from HTML
     * @param element
     */
    const isDummyQrCode = (element) => {
        if (element.id === DUMMY_QR_CODE_ID) {
            return true;
        }
    };
    /**
     * Decides whether node should be removed
     * @param element
     */
    const pruneElement = (element) => {
        if (isDummyQrCode(element)) {
            return true;
        }
        return !!exports.ELEMENT_TYPES_TO_REMOVE[element.nodeName.toLowerCase()];
    };
    exports.pruneElement = pruneElement;
    const cloneAnchorFromPane = (a, pane) => {
        try {
    
    Igor Markin's avatar
    Igor Markin committed
            const url = new URL(a.getAttribute("href"));
    
    Igor Markin's avatar
    Igor Markin committed
            // If this is external url
            if (url.host && url.protocol) {
                pane.parentNode.insertBefore(a.cloneNode(false), pane);
            }
        }
    
    Igor Markin's avatar
    Igor Markin committed
        catch (e) {
            return e;
    
    Igor Markin's avatar
    Igor Markin committed
        }
    };
    exports.cloneAnchorFromPane = cloneAnchorFromPane;