Skip to content

Commit 8a587c6

Browse files
committed
reduce complexity of zest.js parseSelector
1 parent 96363a3 commit 8a587c6

File tree

3 files changed

+77
-73
lines changed

3 files changed

+77
-73
lines changed

src/Debug/js/zest.js

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ var zest = (function () {
4646
// parse/split selector into chunks
4747
// chunks contains any custom pseudo-selectors at the end of the chunk
4848
function parseSelector (selector) {
49-
5049
// Replace string-based pseudo-selectors in the selector
5150
Object.entries(pseudoSelectors).forEach(([name, mixed]) => {
5251
if (typeof mixed === 'string') {
@@ -60,45 +59,48 @@ var zest = (function () {
6059
// Rejoin parts such that parts end with custom pseudo-selectors
6160
const rejoinedParts = [];
6261
for (let i = 0; i < parts.length; i++) {
63-
if (i > 0 && /^[>+~]$/.test(parts[i])) {
64-
const combined = parts[i] + ' ' + parts[i + 1];
65-
containsCustomPseudoSelectors(rejoinedParts[rejoinedParts.length - 1]) === false
66-
? rejoinedParts[rejoinedParts.length - 1] += ' ' + combined
67-
: rejoinedParts.push(combined);
68-
i++; // Skip the next part as it has been joined
69-
} else {
62+
if (i < 1 || /^[>+~]$/.test(parts[i]) === false) {
7063
rejoinedParts.push(parts[i]);
64+
continue
7165
}
72-
}
73-
74-
return rejoinedParts.map(part => {
75-
const parts = part.split(REGEX_PSEUDO_SELECTORS);
76-
const customPseudoSelectors = Object.keys(pseudoSelectors);
77-
var baseSelector = parts.shift();
78-
var pseudosCustom = [];
79-
var pseudosStandard = [];
80-
for (const part of parts) {
81-
customPseudoSelectors.includes(part)
82-
? pseudosCustom.push(part)
83-
: pseudosStandard.push(part);
84-
}
85-
if (pseudosStandard.length > 0) {
86-
// Add standard pseudo-selectors to the baseSelector
87-
baseSelector += pseudosStandard.map(p => `:${p}`).join('');
88-
} else if (baseSelector && /[>+~]\s*$/.test(baseSelector)) {
89-
// baseSelector ends with a CSS combinator -> append "*"
90-
baseSelector += ' *';
91-
} else if (baseSelector && /^\s*[>+~]/.test(baseSelector)) {
92-
// baseSelector starts with a CSS combinator -> prepend ":scope"
93-
baseSelector = ':scope ' + baseSelector;
94-
} else if (baseSelector === '') {
95-
baseSelector = '*';
96-
}
97-
return {
98-
baseSelector: baseSelector.trim(),
99-
pseudoParts: pseudosCustom,
66+
const combined = parts[i] + ' ' + parts[i + 1];
67+
containsCustomPseudoSelectors(rejoinedParts[rejoinedParts.length - 1]) === false
68+
? rejoinedParts[rejoinedParts.length - 1] += ' ' + combined
69+
: rejoinedParts.push(combined);
70+
i++; // Skip the next part as it has been joined
71+
}
72+
73+
return rejoinedParts.map(partMap)
74+
}
75+
76+
// For a given part, separate base selector and custom pseudo-selectors
77+
function partMap (part) {
78+
const parts = part.split(REGEX_PSEUDO_SELECTORS);
79+
const customPseudoSelectors = Object.keys(pseudoSelectors);
80+
var baseSelector = parts.shift();
81+
var pseudosCustom = [];
82+
var pseudosStandard = [];
83+
for (const part of parts) {
84+
customPseudoSelectors.includes(part)
85+
? pseudosCustom.push(part)
86+
: pseudosStandard.push(part);
10087
}
101-
})
88+
if (pseudosStandard.length > 0) {
89+
// Add standard pseudo-selectors to the baseSelector
90+
baseSelector += pseudosStandard.map(p => `:${p}`).join('');
91+
} else if (baseSelector && /[>+~]\s*$/.test(baseSelector)) {
92+
// baseSelector ends with a CSS combinator -> append "*"
93+
baseSelector += ' *';
94+
} else if (baseSelector && /^\s*[>+~]/.test(baseSelector)) {
95+
// baseSelector starts with a CSS combinator -> prepend ":scope"
96+
baseSelector = ':scope ' + baseSelector;
97+
} else if (baseSelector === '') {
98+
baseSelector = '*';
99+
}
100+
return {
101+
baseSelector: baseSelector.trim(),
102+
pseudoParts: pseudosCustom,
103+
}
102104
}
103105

104106
// for the given element, perform a query or match

0 commit comments

Comments
 (0)