UNPKG

react-style-editor

Version:

A React component that displays and edits CSS, similar to the browser's DevTools.

67 lines (62 loc) 1.62 kB
/* */ /** * */ const modify = (nodeList, nodeId, payload) => { const ancestors = findAncestors(nodeList, nodeId); let oldNode = ancestors.pop(); let node = Object.assign({}, oldNode, payload); const originalNode = oldNode; const freshNode = node; for (let i = ancestors.length - 1; i >= 0; i--) { const oldParent = ancestors[i]; const parent = (ancestors[i] = Object.assign({}, oldParent)); const kids = (parent.kids = parent.kids.slice()); const index = kids.indexOf(oldNode); kids[index] = node; oldNode = oldParent; node = parent; } return { freshRules: node.kids, originalNode, freshNode, parentNode: ancestors[ancestors.length - 1], }; }; const findAncestors = (nodeList, nodeId) => { const path = [{kids: nodeList}]; const indexes = []; let level = 0; let i = 0; let kids = nodeList; while (true) { const node = kids[i]; if (!node) { level--; path.pop(); if (level < 0) { break; } i = indexes[level] + 1; kids = path[level].kids; } else { if (node.id === nodeId) { path.push(node); return path; } if (node.kids) { path.push(node); indexes[level] = i; level++; i = 0; kids = node.kids; } else { i++; } } } return null; }; export default modify;