* fix release script * fix svgcanvas edge cases * Update path-actions.js * add modern js * update deps * Update CHANGES.md
60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
import { preventClickDefault } from './utilities.js'
|
|
import dataStorage from './dataStorage.js'
|
|
|
|
/**
|
|
* Create a clone of an element, updating its ID and its children's IDs when needed.
|
|
* @function module:utilities.copyElem
|
|
* @param {Element} el - DOM element to clone
|
|
* @param {module:utilities.GetNextID} getNextId - The getter of the next unique ID.
|
|
* @returns {Element} The cloned element
|
|
*/
|
|
export const copyElem = (el, getNextId) => {
|
|
const ownerDocument = el?.ownerDocument || document
|
|
// manually create a copy of the element
|
|
const newEl = ownerDocument.createElementNS(el.namespaceURI, el.nodeName)
|
|
Array.from(el.attributes).forEach((attr) => {
|
|
if (attr.namespaceURI) {
|
|
newEl.setAttributeNS(attr.namespaceURI, attr.name, attr.value)
|
|
} else {
|
|
newEl.setAttribute(attr.name, attr.value)
|
|
}
|
|
})
|
|
// set the copied element's new id
|
|
newEl.removeAttribute('id')
|
|
newEl.id = getNextId()
|
|
|
|
// now create copies of all children
|
|
el.childNodes.forEach((child) => {
|
|
switch (child.nodeType) {
|
|
case 1: // element node
|
|
newEl.append(copyElem(child, getNextId))
|
|
break
|
|
case 3: // text node
|
|
case 4: // cdata section node
|
|
newEl.append(ownerDocument.createTextNode(child.nodeValue ?? ''))
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
})
|
|
|
|
if (dataStorage.has(el, 'gsvg')) {
|
|
const firstChild = newEl.firstElementChild || newEl.firstChild
|
|
if (firstChild) {
|
|
dataStorage.put(newEl, 'gsvg', firstChild)
|
|
}
|
|
}
|
|
if (dataStorage.has(el, 'symbol')) {
|
|
dataStorage.put(newEl, 'symbol', dataStorage.get(el, 'symbol'))
|
|
}
|
|
if (dataStorage.has(el, 'ref')) {
|
|
dataStorage.put(newEl, 'ref', dataStorage.get(el, 'ref'))
|
|
}
|
|
|
|
if (newEl.tagName === 'image') {
|
|
preventClickDefault(newEl)
|
|
}
|
|
|
|
return newEl
|
|
}
|