| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 'use strict';
- const isTag = (node) => {
- return node.type === 'element';
- };
- const existsOne = (test, elems) => {
- return elems.some((elem) => {
- if (isTag(elem)) {
- return test(elem) || existsOne(test, getChildren(elem));
- } else {
- return false;
- }
- });
- };
- const getAttributeValue = (elem, name) => {
- return elem.attributes[name];
- };
- const getChildren = (node) => {
- return node.children || [];
- };
- const getName = (elemAst) => {
- return elemAst.name;
- };
- const getParent = (node) => {
- return node.parentNode || null;
- };
- const getSiblings = (elem) => {
- var parent = getParent(elem);
- return parent ? getChildren(parent) : [];
- };
- const getText = (node) => {
- if (node.children[0].type === 'text' && node.children[0].type === 'cdata') {
- return node.children[0].value;
- }
- return '';
- };
- const hasAttrib = (elem, name) => {
- return elem.attributes[name] !== undefined;
- };
- const removeSubsets = (nodes) => {
- let idx = nodes.length;
- let node;
- let ancestor;
- let replace;
- // Check if each node (or one of its ancestors) is already contained in the
- // array.
- while (--idx > -1) {
- node = ancestor = nodes[idx];
- // Temporarily remove the node under consideration
- nodes[idx] = null;
- replace = true;
- while (ancestor) {
- if (nodes.includes(ancestor)) {
- replace = false;
- nodes.splice(idx, 1);
- break;
- }
- ancestor = getParent(ancestor);
- }
- // If the node has been found to be unique, re-insert it.
- if (replace) {
- nodes[idx] = node;
- }
- }
- return nodes;
- };
- const findAll = (test, elems) => {
- const result = [];
- for (const elem of elems) {
- if (isTag(elem)) {
- if (test(elem)) {
- result.push(elem);
- }
- result.push(...findAll(test, getChildren(elem)));
- }
- }
- return result;
- };
- const findOne = (test, elems) => {
- for (const elem of elems) {
- if (isTag(elem)) {
- if (test(elem)) {
- return elem;
- }
- const result = findOne(test, getChildren(elem));
- if (result) {
- return result;
- }
- }
- }
- return null;
- };
- const svgoCssSelectAdapter = {
- isTag,
- existsOne,
- getAttributeValue,
- getChildren,
- getName,
- getParent,
- getSiblings,
- getText,
- hasAttrib,
- removeSubsets,
- findAll,
- findOne,
- };
- module.exports = svgoCssSelectAdapter;
|