// Returns a promise which resolves with a Document representing a parsed SVG // from the given text file. The top-level group tag is given an id equal to // the original file name (without an extension). function svgDocument(file) { var reader = new FileReader; return new Promise((resolve, reject) => { reader.onload = function(e) { var text = e.target.result; var parser = new DOMParser(); var xmlDocument = parser.parseFromString(text, "text/xml"); var name = file.name.substring(0, file.name.indexOf(".svg")); var svg = xmlDocument.querySelector('svg'); if (svg != null) { var g = svg.querySelector('g'); if (g != null) { // Set top-level group id to be the filename. g.setAttribute('id', name); } else { // Enclose SVG elements in a parent group tag. let newGroup = document.createElement('g'); newGroup.setAttribute('id', name); for (let i = 0; i < svg.children.length; i++) { let child = svg.children[i]; newGroup.appendChild(child); } svg.appendChild(newGroup); } } resolve(xmlDocument); }; reader.readAsText(file); reader.onerror = reject; }); } // Returns [Document, Metadata] function sanitizeSvg(svgDocument) { let tags = ["path", "g", "polyline", "polygon"], notes = { fill: false, // True if a fill rule other than `fill: #000000;` is used. stroke: false // True if a stroke attribute is used. }; tags.forEach((tag) => { svgDocument.querySelectorAll(tag).forEach((element) => { let fill = element.getAttribute("fill"); if (fill && fill !== "#000000") { notes.fill = true; } let stroke = element.getAttribute("stroke"); if (stroke) { notes.stroke = true; } element.removeAttribute("fill"); element.removeAttribute("stroke"); }); }); // TODO: Return useful metadata regarding the svgDocument. return [svgDocument, notes]; } // Returns a string representing a sprite sheet for the given XML documents. function svgSpritesheet(documents) { let serializer = new XMLSerializer(), s = "", data = []; documents.forEach((d) => { let sanitizedSvg, datum, formattedSvg, symbolizedSvg; [sanitizedSvg, datum] = sanitizeSvg(d); formattedSvg = serializer.serializeToString(sanitizedSvg); symbolizedSvg = formattedSvg .replace("", ""); s += symbolizedSvg; data.push(datum); }); return ['' + s + '', data]; }