export const removeTagsAndAttrs = (content, removeTags, removeSVGTagAttrs, removingTagAttrs) => { // removeTags: boolean const removingTags = ['title', 'desc', 'defs', 'style'] // removeSVGTagAttrs: boolean const hasNoWidthHeight = ['width', 'height'] // Removes width and height attributes from . // removingTagAttrs: array const hasNoAttributes = removingTagAttrs || [] // Removes attributes from inside the . let tempDivElement = document.createElement("div"); tempDivElement.innerHTML = content; // Removes specified tags and its children. Specify tags by modifying removingTags array. if (removeTags) { removingTags.map((tag) => { const htmlTag = tempDivElement.querySelector(tag) if (htmlTag) htmlTag.remove() }) } if (removeSVGTagAttrs) { hasNoWidthHeight.map((attr) => { tempDivElement.querySelector("svg").removeAttribute(attr) }) } if (removingTagAttrs) { hasNoAttributes.map((attr) => { const tagAttrsElements = Object.values(tempDivElement.querySelectorAll(`[${attr}]`)) tagAttrsElements.map((element) => { element.removeAttribute(attr) }) }) } const processedHtml = tempDivElement.innerHTML tempDivElement = null return processedHtml } export const cleanUpSvgContext = (content) => { const regexSequences = [ // Remove XML stuffs and comments [/<\?xml[\s\S]*?>/gi, ""], [//gi, ""], [//gi, ""], // SVG XML -> HTML5 [/\<([A-Za-z]+)([^\>]*)\/\>/g, "<$1$2>"], // convert self-closing XML SVG nodes to explicitly closed HTML5 SVG nodes [/\s+/g, " "], // replace whitespace sequences with a single space [/\> \<"], // remove whitespace between tags ] const cleanedContext = regexSequences.reduce((prev, regex) => { return "".replace.apply(prev, regex) }, content).trim() return cleanedContext }