UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

71 lines (68 loc) 2.44 kB
import { svgNS } from './constants.mjs'; import { getMultipleNodes } from './getMultipleNodes.mjs'; import { applyViewboxTransform } from './applyViewboxTransform.mjs'; function parseUseDirectives(doc) { const nodelist = getMultipleNodes(doc, ['use', 'svg:use']); let i = 0; while (nodelist.length && i < nodelist.length) { const el = nodelist[i], xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href'); if (xlinkAttribute === null) { return; } const xlink = xlinkAttribute.slice(1); const x = el.getAttribute('x') || 0; const y = el.getAttribute('y') || 0; const el2Orig = doc.getElementById(xlink); if (el2Orig === null) { // if we can't find the target of the xlink, consider this use tag bad, similar to no xlink return; } let el2 = el2Orig.cloneNode(true); let currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')'; const oldLength = nodelist.length; const namespace = svgNS; applyViewboxTransform(el2); if (/^svg$/i.test(el2.nodeName)) { const el3 = el2.ownerDocument.createElementNS(namespace, 'g'); for (let j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) { const attr = attrs.item(j); attr && el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue); } // el2.firstChild != null while (el2.firstChild) { el3.appendChild(el2.firstChild); } el2 = el3; } for (let j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) { const attr = attrs.item(j); if (!attr) { continue; } const { nodeName, nodeValue } = attr; if (nodeName === 'x' || nodeName === 'y' || nodeName === 'xlink:href' || nodeName === 'href') { continue; } if (nodeName === 'transform') { currentTrans = nodeValue + ' ' + currentTrans; } else { el2.setAttribute(nodeName, nodeValue); } } el2.setAttribute('transform', currentTrans); el2.setAttribute('instantiated_by_use', '1'); el2.removeAttribute('id'); const parentNode = el.parentNode; parentNode.replaceChild(el2, el); // some browsers do not shorten nodelist after replaceChild (IE8) if (nodelist.length === oldLength) { i++; } } } export { parseUseDirectives }; //# sourceMappingURL=parseUseDirectives.mjs.map