refactor: code

This commit is contained in:
alexander.akait 2024-10-09 09:21:00 +03:00
parent 7fd36f908e
commit 94fa19ad68
4 changed files with 417 additions and 213 deletions

View File

@ -428,6 +428,49 @@ class CssParser extends Parser {
const eatNameInVar = eatUntil(",)};/");
walkCssTokens(source, {
isSelector: () => isNextRulePrelude,
leftCurlyBracket: (input, start, end) => {
switch (scope) {
case CSS_MODE_TOP_LEVEL: {
allowImportAtRule = false;
scope = CSS_MODE_IN_BLOCK;
blockNestingLevel = 1;
if (isModules) {
isNextRulePrelude = isNextNestedSyntax(input, end);
}
break;
}
case CSS_MODE_IN_BLOCK: {
blockNestingLevel++;
isNextRulePrelude = isNextNestedSyntax(input, end);
break;
}
}
return end;
},
rightCurlyBracket: (input, start, end) => {
switch (scope) {
case CSS_MODE_IN_BLOCK: {
if (isLocalMode()) {
processDeclarationValueDone(input);
inAnimationProperty = false;
}
if (--blockNestingLevel === 0) {
scope = CSS_MODE_TOP_LEVEL;
isNextRulePrelude = true;
if (isModules) {
modeData = undefined;
}
} else {
isNextRulePrelude = isNextNestedSyntax(input, end);
}
break;
}
}
return end;
},
url: (input, start, end, contentStart, contentEnd) => {
const value = normalizeUrl(
input.slice(contentStart, contentEnd),
@ -775,49 +818,6 @@ class CssParser extends Parser {
}
return end;
},
leftCurlyBracket: (input, start, end) => {
switch (scope) {
case CSS_MODE_TOP_LEVEL: {
allowImportAtRule = false;
scope = CSS_MODE_IN_BLOCK;
blockNestingLevel = 1;
if (isModules) {
isNextRulePrelude = isNextNestedSyntax(input, end);
}
break;
}
case CSS_MODE_IN_BLOCK: {
blockNestingLevel++;
isNextRulePrelude = isNextNestedSyntax(input, end);
break;
}
}
return end;
},
rightCurlyBracket: (input, start, end) => {
switch (scope) {
case CSS_MODE_IN_BLOCK: {
if (isLocalMode()) {
processDeclarationValueDone(input);
inAnimationProperty = false;
}
if (--blockNestingLevel === 0) {
scope = CSS_MODE_TOP_LEVEL;
isNextRulePrelude = true;
if (isModules) {
modeData = undefined;
}
} else {
isNextRulePrelude = isNextNestedSyntax(input, end);
}
break;
}
}
return end;
},
identifier: (input, start, end) => {
switch (scope) {
case CSS_MODE_IN_BLOCK: {
@ -854,9 +854,10 @@ class CssParser extends Parser {
return end;
},
id: (input, start, end) => {
if (isLocalMode()) {
hash: (input, start, end, isID) => {
if (isLocalMode() && isNextRulePrelude && isID) {
const name = input.slice(start + 1, end);
console.log(name);
const dep = new CssLocalIdentifierDependency(name, [start + 1, end]);
const { line: sl, column: sc } = locConverter.get(start);
const { line: el, column: ec } = locConverter.get(end);

View File

@ -9,20 +9,20 @@
* @typedef {object} CssTokenCallbacks
* @property {function(string, number): boolean=} isSelector
* @property {function(string, number, number, number, number): number=} url
* @property {function(string, number, number): number=} string
* @property {function(string, number, number): number=} leftParenthesis
* @property {function(string, number, number): number=} rightParenthesis
* @property {function(string, number, number): number=} pseudoFunction
* @property {function(string, number, number): number=} function
* @property {function(string, number, number): number=} pseudoClass
* @property {function(string, number, number): number=} atKeyword
* @property {function(string, number, number): number=} class
* @property {function(string, number, number): number=} identifier
* @property {function(string, number, number): number=} id
* @property {function(string, number, number): number=} leftCurlyBracket
* @property {function(string, number, number): number=} rightCurlyBracket
* @property {function(string, number, number): number=} semicolon
* @property {function(string, number, number): number=} comma
* @property {(function(string, number, number): number)=} string
* @property {(function(string, number, number): number)=} leftParenthesis
* @property {(function(string, number, number): number)=} rightParenthesis
* @property {(function(string, number, number): number)=} pseudoFunction
* @property {(function(string, number, number): number)=} function
* @property {(function(string, number, number): number)=} pseudoClass
* @property {(function(string, number, number): number)=} atKeyword
* @property {(function(string, number, number): number)=} class
* @property {(function(string, number, number): number)=} identifier
* @property {(function(string, number, number, boolean): number)=} hash
* @property {(function(string, number, number): number)=} leftCurlyBracket
* @property {(function(string, number, number): number)=} rightCurlyBracket
* @property {(function(string, number, number): number)=} semicolon
* @property {(function(string, number, number): number)=} comma
*/
/** @typedef {function(string, number, CssTokenCallbacks): number} CharHandler */
@ -484,13 +484,8 @@ const consumeNumberSign = (input, pos, callbacks) => {
pos = _consumeAnIdentSequence(input, pos, callbacks);
if (
isId &&
callbacks.isSelector &&
callbacks.isSelector(input, pos) &&
callbacks.id !== undefined
) {
return callbacks.id(input, start, pos);
if (callbacks.hash !== undefined) {
return callbacks.hash(input, start, pos, isId);
}
return pos;

File diff suppressed because it is too large Load Diff

View File

@ -56,8 +56,8 @@ describe("walkCssTokens", () => {
results.push(["identifier", input.slice(s, e)]);
return e;
},
id: (input, s, e) => {
results.push(["id", input.slice(s, e)]);
hash: (input, s, e, isID) => {
results.push(["hash", input.slice(s, e), isID]);
return e;
},
string: (input, s, e) => {