Last active
September 3, 2019 11:43
-
-
Save max-pub/a5c15b7831bbfaba7ad13acefc3d0781 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
XML = { | |
parse: (string, type = 'text/xml') => new DOMParser().parseFromString(string, type), // like JSON.parse | |
stringify: DOM => new XMLSerializer().serializeToString(DOM), // like JSON.stringify | |
transform: (xml, xsl) => { | |
let proc = new XSLTProcessor(); | |
proc.importStylesheet(typeof xsl == 'string' ? XML.parse(xsl) : xsl); | |
let output = proc.transformToFragment(typeof xml == 'string' ? XML.parse(xml) : xml, document); | |
return typeof xml == 'string' ? XML.stringify(output) : output; // if source was string then stringify response, else return object | |
}, | |
minify: node => XML.toString(node, false), | |
prettify: node => XML.toString(node, true), | |
toString: (node, pretty, level = 0, singleton = false) => { // einzelkind | |
if (typeof node == 'string') node = XML.parse(node); | |
let tabs = pretty ? Array(level + 1).fill('').join('\t') : ''; | |
let newLine = pretty ? '\n' : ''; | |
if (node.nodeType == 3) return (singleton ? '' : tabs) + node.textContent.trim() + (singleton ? '' : newLine) | |
if (!node.tagName) return XML.toString(node.firstChild, pretty); | |
let output = tabs + `<${node.tagName}`; // >\n | |
for (let i = 0; i < node.attributes.length; i++) | |
output += ` ${node.attributes[i].name}="${node.attributes[i].value}"`; | |
if (node.childNodes.length == 0) return output + ' />' + newLine; | |
else output += '>'; | |
let onlyOneTextChild = ((node.childNodes.length == 1) && (node.childNodes[0].nodeType == 3)); | |
if (!onlyOneTextChild) output += newLine; | |
for (let i = 0; i < node.childNodes.length; i++) | |
output += XML.toString(node.childNodes[i], pretty, level + 1, onlyOneTextChild); | |
return output + (onlyOneTextChild ? '' : tabs) + `</${node.tagName}>` + newLine; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment