|
4295 | 4295 | // https://developer.mozilla.org/en-US/docs/Web/CSS/WebKit_Extensions |
4296 | 4296 | // https://developer.mozilla.org/en-US/docs/Web/CSS/Mozilla_Extensions |
4297 | 4297 | const pseudoAliasMap = { |
| 4298 | + '-moz-center': 'center', |
| 4299 | + '-webkit-center': 'center', |
4298 | 4300 | '-ms-grid-columns': 'grid-template-columns', |
4299 | 4301 | '-ms-grid-rows': 'grid-template-rows', |
4300 | 4302 | '-ms-grid-row': 'grid-row-start', |
|
4307 | 4309 | '::-ms-input-placeholder': '::placeholder', |
4308 | 4310 | ':-moz-any()': ':is', |
4309 | 4311 | '-moz-user-modify': 'user-modify', |
| 4312 | + '-webkit-match-parent': 'match-parent', |
4310 | 4313 | '-moz-background-clip': 'background-clip', |
4311 | 4314 | '-moz-background-origin': 'background-origin', |
4312 | 4315 | '-ms-input-placeholder': 'placeholder', |
|
4463 | 4466 | '-webkit-min-logical-height', |
4464 | 4467 | '-webkit-min-logical-width', |
4465 | 4468 | '-webkit-nbsp-mode', |
| 4469 | + '-webkit-match-parent', |
4466 | 4470 | '-webkit-perspective-origin-x', |
4467 | 4471 | '-webkit-perspective-origin-y', |
4468 | 4472 | '-webkit-rtl-ordering', |
|
9015 | 9019 | syntax: "auto | fixed" |
9016 | 9020 | }, |
9017 | 9021 | "text-align": { |
9018 | | - syntax: "start | end | left | right | center | justify | match-parent" |
| 9022 | + syntax: "start | end | left | right | center | justify | match-parent | <-non-standard-text-align>" |
9019 | 9023 | }, |
9020 | 9024 | "text-align-last": { |
9021 | 9025 | syntax: "auto | start | end | left | right | center | justify" |
|
9246 | 9250 | syntax: "auto | grayscale" |
9247 | 9251 | }, |
9248 | 9252 | "-moz-user-select": { |
9249 | | - syntax: "none | text | all | -moz-none" |
| 9253 | + syntax: "none | text | all | -moz-none | auto | element | elements | text | toggle" |
9250 | 9254 | }, |
9251 | 9255 | "-ms-flex-align": { |
9252 | 9256 | syntax: "start | end | center | baseline | stretch" |
|
11012 | 11016 | }, |
11013 | 11017 | "inset-area": { |
11014 | 11018 | syntax: "[ [ left | center | right | span-left | span-right | x-start | x-end | span-x-start | span-x-end | x-self-start | x-self-end | span-x-self-start | span-x-self-end | span-all ] || [ top | center | bottom | span-top | span-bottom | y-start | y-end | span-y-start | span-y-end | y-self-start | y-self-end | span-y-self-start | span-y-self-end | span-all ] | [ block-start | center | block-end | span-block-start | span-block-end | span-all ] || [ inline-start | center | inline-end | span-inline-start | span-inline-end | span-all ] | [ self-block-start | self-block-end | span-self-block-start | span-self-block-end | span-all ] || [ self-inline-start | self-inline-end | span-self-inline-start | span-self-inline-end | span-all ] | [ start | center | end | span-start | span-end | span-all ]{1,2} | [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2} ]" |
| 11019 | + }, |
| 11020 | + "-non-standard-text-align": { |
| 11021 | + syntax: "| -moz-center | -webkit-center | -webkit-match-parent" |
11015 | 11022 | } |
11016 | 11023 | }; |
11017 | 11024 | var selectors = { |
|
11835 | 11842 | let items = []; |
11836 | 11843 | let match = 0; |
11837 | 11844 | while ((item = iterator.next()) && !item.done) { |
11838 | | - // console.error(JSON.stringify({match, val: item.value,func}, null, 1)); |
11839 | 11845 | switch (item.value.typ) { |
11840 | 11846 | case ValidationTokenEnum.OpenParenthesis: |
11841 | 11847 | if (match > 0) { |
|
12526 | 12532 | const type = getTokenType(match[3]); |
12527 | 12533 | return Object.defineProperty({ |
12528 | 12534 | typ: ValidationTokenEnum.PropertyType, |
12529 | | - val: type.val, |
| 12535 | + val: match[1], |
12530 | 12536 | unit: exports.EnumToken[type.typ], |
12531 | | - range: [+type.val, match[4] == '\u221e' ? Infinity : +match[4]] |
| 12537 | + range: [+type.val, match[4] == '\u221e' ? null : +match[4]] |
12532 | 12538 | }, 'pos', { ...objectProperties, value: pos }); |
12533 | 12539 | } |
12534 | 12540 | return Object.defineProperty({ |
|
12599 | 12605 | case ValidationTokenEnum.Bracket: |
12600 | 12606 | return '[' + token.chi.reduce((acc, curr) => acc + renderSyntax(curr), '') + ']' + renderAttributes(token); |
12601 | 12607 | case ValidationTokenEnum.PropertyType: |
12602 | | - return '<' + token.val + '>' + renderAttributes(token); |
| 12608 | + return '<' + token.val + (Array.isArray(token.range) ? `[${token?.range?.[0]}, ${token?.range?.[1] ?? '\u221e'}]` : '') + '>' + renderAttributes(token); |
12603 | 12609 | case ValidationTokenEnum.DeclarationType: |
12604 | 12610 | return "<'" + token.val + "'>" + renderAttributes(token); |
12605 | 12611 | case ValidationTokenEnum.Number: |
|
13423 | 13429 | break; |
13424 | 13430 | } |
13425 | 13431 | ast = getParsedSyntax("declarations" /* ValidationSyntaxGroupEnum.Declarations */, node.nam); |
| 13432 | + // console.error({ast: ast.reduce((acc, curr) => acc + renderSyntax(curr), '')}); |
13426 | 13433 | if (ast != null) { |
13427 | 13434 | let token = null; |
13428 | 13435 | const values = node.val.slice(); |
|
13442 | 13449 | } |
13443 | 13450 | } |
13444 | 13451 | result = doEvaluateSyntax(ast, createContext(values), { ...options, visited: new WeakMap() }); |
| 13452 | + // console.error(JSON.stringify({ast, values, result}, null, 1)); |
13445 | 13453 | if (result.valid == SyntaxValidationResult.Valid && !result.context.done()) { |
13446 | 13454 | let token = null; |
13447 | 13455 | while ((token = result.context.next()) != null) { |
|
13500 | 13508 | let i = 0; |
13501 | 13509 | let result; |
13502 | 13510 | let token = null; |
13503 | | - // console.error(`>> doEvaluateSyntax: ${syntaxes.reduce((acc, curr) => acc + renderSyntax(curr), '')}`, context.peek()); |
13504 | | - // console.error(new Error('doEvaluateSyntax')); |
13505 | 13511 | for (; i < syntaxes.length; i++) { |
13506 | 13512 | syntax = syntaxes[i]; |
13507 | 13513 | if (context.done()) { |
|
13511 | 13517 | break; |
13512 | 13518 | } |
13513 | 13519 | token = context.peek(); |
13514 | | - // console.error(`>> doEvaluateSyntax: ${ renderSyntax(syntax)}`, context.peek()); |
13515 | 13520 | if (syntax.typ == ValidationTokenEnum.Whitespace) { |
13516 | 13521 | if (context.peek()?.typ == exports.EnumToken.WhitespaceTokenType) { |
13517 | 13522 | context.next(); |
|
13545 | 13550 | clearVisited(token, syntax, 'doEvaluateSyntax', options); |
13546 | 13551 | } |
13547 | 13552 | } |
13548 | | - // console.error(`>> doEvaluateSyntax: ${ renderSyntax(syntax)}\nvalid:${result.valid == SyntaxValidationResult.Valid ? 'valid' : 'invalid'}\n`, context.peek()); |
13549 | 13553 | if (result.valid == SyntaxValidationResult.Drop) { |
13550 | 13554 | if (syntax.isOptional) { |
13551 | 13555 | continue; |
|
13554 | 13558 | } |
13555 | 13559 | context.update(result.context); |
13556 | 13560 | } |
13557 | | - return { |
| 13561 | + // @ts-ignore |
| 13562 | + return result ?? { |
13558 | 13563 | valid: SyntaxValidationResult.Valid, |
13559 | 13564 | node: null, |
13560 | 13565 | syntax: syntaxes[i - 1], |
@@ -13619,13 +13624,11 @@ |
13619 | 13624 | context |
13620 | 13625 | }; |
13621 | 13626 | } |
13622 | | - // console.error(`>> matchList: ${tokens.reduce((acc, curr, index) => acc + (index > 0 ? ' ' : '') + renderToken(curr), '')}`); |
13623 | 13627 | result = doEvaluateSyntax([syntax], createContext(tokens), { |
13624 | 13628 | ...options, |
13625 | 13629 | isList: false, |
13626 | 13630 | occurence: false |
13627 | 13631 | }); |
13628 | | - // console.error(`>> matchList: ${tokens.reduce((acc, curr, index) => acc + (index > 0 ? ' ' : '') + renderToken(curr), '')}\n>> result: ${result.valid == SyntaxValidationResult.Valid ? 'valid' : 'invalid'}\n${JSON.stringify(result, null, 1)}`); |
13629 | 13632 | if (result.valid == SyntaxValidationResult.Valid) { |
13630 | 13633 | context = con.clone(); |
13631 | 13634 | count++; |
|
13684 | 13687 | let success = false; |
13685 | 13688 | let result; |
13686 | 13689 | let token = context.peek(); |
13687 | | - // console.error(`>> match: ${renderSyntax(syntax)}`); |
13688 | 13690 | switch (syntax.typ) { |
13689 | 13691 | case ValidationTokenEnum.PipeToken: |
13690 | 13692 | return someOf(syntax.chi, context, options); |
|
13699 | 13701 | } |
13700 | 13702 | return { |
13701 | 13703 | valid: SyntaxValidationResult.Drop, |
13702 | | - node: context.next(), |
| 13704 | + node: context.current(), |
13703 | 13705 | syntax, |
13704 | 13706 | error: `expected '${ValidationTokenEnum[syntax.typ].toLowerCase()}', got '${context.done() ? null : renderToken(context.peek())}'`, |
13705 | 13707 | context |
|
13734 | 13736 | } |
13735 | 13737 | switch (syntax.typ) { |
13736 | 13738 | case ValidationTokenEnum.Keyword: |
13737 | | - success = (token.typ == exports.EnumToken.IdenTokenType || token.typ == exports.EnumToken.DashedIdenTokenType) && |
| 13739 | + success = (token.typ == exports.EnumToken.IdenTokenType || token.typ == exports.EnumToken.DashedIdenTokenType || isIdentColor(token)) && |
13738 | 13740 | (token.val == syntax.val || |
13739 | 13741 | syntax.val.localeCompare(token.val, undefined, { sensitivity: 'base' }) == 0 || |
13740 | 13742 | // config.declarations.all |
|
13970 | 13972 | case 'number': |
13971 | 13973 | case 'number-token': |
13972 | 13974 | success = token.typ == exports.EnumToken.NumberTokenType; |
13973 | | - if ('range' in syntax) { |
13974 | | - success = success && +token.val >= +syntax.range[0] && +token.val <= +syntax.range[1]; |
| 13975 | + if (success && 'range' in syntax) { |
| 13976 | + success = +token.val >= +syntax.range[0] && (syntax.range[1] == null || +token.val <= +syntax.range[1]); |
13975 | 13977 | } |
13976 | 13978 | break; |
13977 | 13979 | case 'angle': |
|
14062 | 14064 | context.next(); |
14063 | 14065 | } |
14064 | 14066 | result = doEvaluateSyntax(syntaxes[i], context.clone(), options); |
14065 | | - // console.error(JSON.stringify({result, syntax: syntaxes[i], context, slice: context.slice()}, null, 1)); |
14066 | 14067 | if (result.valid == SyntaxValidationResult.Valid) { |
14067 | 14068 | success = true; |
14068 | 14069 | if (result.context.done()) { |
|
14075 | 14076 | // pick the best match |
14076 | 14077 | matched.sort((a, b) => a.context.done() ? -1 : b.context.done() ? 1 : b.context.index - a.context.index); |
14077 | 14078 | } |
14078 | | - // console.error(JSON.stringify({matched, context, slice: context.slice(), syntaxes}, null, 1)); |
14079 | 14079 | return matched[0] ?? { |
14080 | 14080 | valid: SyntaxValidationResult.Drop, |
14081 | 14081 | node: context.current(), |
|
14148 | 14148 | const con = createContext(tokens); |
14149 | 14149 | let cp; |
14150 | 14150 | let j; |
14151 | | - // console.error(`>> allOf:syntax: ${syntax.reduce((acc, curr, index) => acc + (index > 0 ? ' && ' : '') + curr.reduce((acc, curr) => acc + renderSyntax(curr), ''), '')}`); |
14152 | | - // console.error(`>> allOf:tokens: ${con.slice<Token>().reduce((acc, curr, index) => acc + (index > 0 ? ' ' : '') + renderToken(curr), '')}`); |
14153 | | - // console.error(`>> allOf:tokens:slice: ${context.slice<Token>().reduce((acc, curr, index) => acc + (index > 0 ? ' ' : '') + renderToken(curr), '')}`); |
14154 | 14151 | for (i = 0; i < syntax.length; i++) { |
14155 | | - // console.error(`>> allOf:${i}:${syntax[i].reduce((acc, curr) => acc + renderSyntax(curr), '')}:current()`, con.current()); |
14156 | 14152 | if (syntax[i].length == 1 && syntax[i][0].isOptional) { |
14157 | | - // syntax[i][0 = structuredClone(syntax[i][0]); |
14158 | 14153 | syntax[i][0].isOptional = false; |
14159 | 14154 | j = 0; |
14160 | 14155 | cp = con.clone(); |
|
14163 | 14158 | syntax[i][0].isOptional = true; |
14164 | 14159 | syntax.splice(i, 1); |
14165 | 14160 | i = -1; |
14166 | | - // console.error(`>> allOf:done:peek: `, con.peek()); |
14167 | 14161 | continue; |
14168 | 14162 | } |
14169 | 14163 | while (!cp.done()) { |
|
14184 | 14178 | } |
14185 | 14179 | syntax[i][0].isOptional = true; |
14186 | 14180 | // @ts-ignore |
14187 | | - // console.error(`>> allOf:result valid: `, result?.valid == SyntaxValidationResult.Valid, con.current<Token>()); |
14188 | | - // @ts-ignore |
14189 | 14181 | if (result?.valid == SyntaxValidationResult.Valid) { |
14190 | 14182 | syntax.splice(i, 1); |
14191 | | - // console.error(`>> allOf:syntaxes: ${syntax.reduce((acc, curr, index) => acc + (index > 0 ? ' && ' : '') + curr.reduce((acc, curr) => acc + renderSyntax(curr), ''), '')}`); |
14192 | | - // console.error(`>> allOf:context:`, JSON.stringify(con, null, 1)); |
14193 | 14183 | i = -1; |
14194 | 14184 | } |
14195 | 14185 | continue; |
|
0 commit comments