- Complete React app with 7 developer tools - JSON Tool with visual structured editor - Serialize Tool with visual structured editor - URL, Base64, CSV/JSON, Beautifier, Diff tools - Responsive navigation with dropdown menu - Dark/light mode toggle - Mobile-responsive design with sticky header - All tools working with copy/paste functionality
45 lines
969 B
JavaScript
45 lines
969 B
JavaScript
'use strict';
|
|
|
|
/**
|
|
* @param {import('postcss').AnyNode} nodeA
|
|
* @param {import('postcss').AnyNode} nodeB
|
|
* @return {boolean}
|
|
*/
|
|
function checkMatch(nodeA, nodeB) {
|
|
if (nodeA.type === 'atrule' && nodeB.type === 'atrule') {
|
|
return (
|
|
nodeA.params === nodeB.params &&
|
|
nodeA.name.toLowerCase() === nodeB.name.toLowerCase()
|
|
);
|
|
}
|
|
return nodeA.type === nodeB.type;
|
|
}
|
|
|
|
/** @typedef {import('postcss').AnyNode & {parent?: Child}} Child */
|
|
/**
|
|
* @param {Child} nodeA
|
|
* @param {Child} nodeB
|
|
* @return {boolean}
|
|
*/
|
|
function sameParent(nodeA, nodeB) {
|
|
if (!nodeA.parent) {
|
|
// A is orphaned, return if B is orphaned as well
|
|
return !nodeB.parent;
|
|
}
|
|
|
|
if (!nodeB.parent) {
|
|
// B is orphaned and A is not
|
|
return false;
|
|
}
|
|
|
|
// Check if parents match
|
|
if (!checkMatch(nodeA.parent, nodeB.parent)) {
|
|
return false;
|
|
}
|
|
|
|
// Check parents' parents
|
|
return sameParent(nodeA.parent, nodeB.parent);
|
|
}
|
|
|
|
module.exports = sameParent;
|