File "svgs-inline-vanilla.js"

Full Path: /home/vantageo/public_html/cache/.wp-cli/wp-content/plugins/svg-support/js/svgs-inline-vanilla.js
File size: 6.3 KB
MIME-type: text/plain
Charset: utf-8

// Wait for the document to be ready
document.addEventListener("DOMContentLoaded", function(event) {

    let bodhisvgsReplacements = 0;

    // Function to replace the img tag with the SVG
    function bodhisvgsReplace(img) {

        // Ensure it's an image
        if (img.nodeName !== 'IMG') {
            return;
        }

        var imgID = img.id;
        var imgClass = img.className;
        var imgURL = img.src;

        // Ensure the URL ends with .svg before proceeding
        if (!imgURL.endsWith('svg')) {
            return;
        }

        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() {

            if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {

                var data = xmlHttp.responseText;

                // Parse the returned data to extract the SVG
                let parser = new DOMParser();
                const doc = parser.parseFromString(data, 'text/html');

                // Get the SVG tag from the parsed data
                var svg = doc.getElementsByTagName('svg')[0];

                var svgID = svg.id;

                // Add replaced image's ID to the new SVG if necessary
                if (typeof imgID === 'undefined' || imgID === '') {
                    if (typeof svgID === 'undefined' || svgID === '') {
                        imgID = 'svg-replaced-' + bodhisvgsReplacements;
                        svg.setAttribute('id', imgID);
                    } else {
                        imgID = svgID;
                    }
                } else {
                    svg.setAttribute('id', imgID);
                }

                // Add replaced image's classes to the new SVG
                if (typeof imgClass !== 'undefined' && imgClass !== '') {
                    svg.setAttribute('class', imgClass + ' replaced-svg svg-replaced-' + bodhisvgsReplacements);
                }

                // Remove any invalid XML tags as per http://validator.w3.org
                svg.removeAttribute('xmlns:a');

                // If sanitization is enabled, sanitize the SVG code
                if (frontSanitizationEnabled === 'on' && svg.outerHTML !== "") {
                    var sanitizedSVG = DOMPurify.sanitize(svg.outerHTML); // Sanitize SVG code via DOMPurify library
                    img.outerHTML = sanitizedSVG; // Replace img tag with sanitized SVG content
                } else {
                    // Replace image with new SVG directly
                    img.replaceWith(svg);
                }

                bodhisvgsReplacements++;

            } else if (xmlHttp.readyState === 4 && xmlHttp.status !== 200) {
                console.error('Failed to load SVG:', imgURL);
            }

        };

        // Open the XMLHttpRequest with GET method
        xmlHttp.open("GET", imgURL, false);
        xmlHttp.send(null);

    }

    // Function to iterate over nodes and replace images
    function bodhisvgsIterator(node) {

        if (node.childNodes.length > 0) {

            for (var i = 0; i < node.childNodes.length; i++) {

                if (node.childNodes[i].nodeName === 'IMG') {

                    // It's an image... replace it too
                    var img = node.childNodes[i];
                    bodhisvgsReplace(img);

                } else {

                    // Go to another level
                    bodhisvgsIterator(node.childNodes[i]);

                }
            }

        }

    }

    // Wrap in IIFE so that it can be called again later as bodhisvgsInlineSupport();
    (bodhisvgsInlineSupport = function() {

        console.log('Running bodhisvgsInlineSupport');

        // If force inline SVG option is active then add class
        if (ForceInlineSVGActive === 'true') {

            var allImages = document.getElementsByTagName('img'); // Find all images on page

            // Loop on images
            for (var i = 0; i < allImages.length; i++) {

                if (typeof allImages[i].src !== 'undefined') {

                    // Check if it has SVG
                    if (allImages[i].src.match(/\.(svg)/)) {

                        // Add our class - if not already added
                        if (!allImages[i].classList.contains(cssTarget.ForceInlineSVG)) {

                            // Add class now
                            allImages[i].classList.add(cssTarget.ForceInlineSVG);

                        }

                    }

                }

            }

        }

        // Polyfill to support all older browsers
        if (!String.prototype.endsWith) {
            String.prototype.endsWith = function(searchString, position) {
                var subjectString = this.toString();
                if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
                    position = subjectString.length;
                }
                position -= searchString.length;
                var lastIndex = subjectString.lastIndexOf(searchString, position);
                return lastIndex !== -1 && lastIndex === position;
            };
        } // end polyfill

        // Another snippet to support IE11
        String.prototype.endsWith = function(pattern) {
            var d = this.length - pattern.length;
            return d >= 0 && this.lastIndexOf(pattern) === d;
        };
        // End snippet to support IE11

		// Check to see if user set an alternate class
		var target;
		if (ForceInlineSVGActive === 'true') {
			target = (typeof cssTarget.Bodhi === 'string' ? cssTarget.ForceInlineSVG : 'style-svg');
		} else {
			target = (typeof cssTarget === 'string' ? cssTarget : 'style-svg');
		}

		// Ensure target is a string before attempting to use replace
		if (typeof target === 'string') {
			// Remove .img from class
			target = target.replace("img.", "");
		} else {
			console.error('Target is not a string:', target);
			return;
		}

        var allImages = document.getElementsByClassName(target); // find all images with force svg class

        for (var i = 0; i < allImages.length; i++) {

            if (typeof allImages[i].src === 'undefined') { // not an image

                bodhisvgsIterator(allImages[i]); // Iterate through child nodes

            } else {

                var img = allImages[i];
                bodhisvgsReplace(img);

            }

        }

    })(); // Execute immediately

});