diff --git a/lib/parser/index.js b/lib/parser/index.js index dec9a579..88690e0d 100644 --- a/lib/parser/index.js +++ b/lib/parser/index.js @@ -25,7 +25,6 @@ var getFunction = require('./type/Function'); var getHash = require('./type/Hash'); var getId = require('./type/Id'); var getIdentifier = require('./type/Identifier'); -var getLegacyPseudoElement = require('./type/_LegacyPseudoElement'); var getMediaFeature = require('./type/MediaFeature'); var getMediaQuery = require('./type/MediaQuery'); var getMediaQueryList = require('./type/MediaQueryList'); @@ -35,7 +34,6 @@ var getOperator = require('./type/Operator'); var getParentheses = require('./type/Parentheses'); var getPercentage = require('./type/Percentage'); var getProgid = require('./type/Progid'); -var getPseudo = require('./type/_Pseudo'); var getPseudoClass = require('./type/PseudoClass'); var getPseudoElement = require('./type/PseudoElement'); var getRatio = require('./type/Ratio'); @@ -143,7 +141,6 @@ Parser.prototype = { Hash: getHash, Id: getId, Identifier: getIdentifier, - LegacyPseudoElement: getLegacyPseudoElement, MediaFeature: getMediaFeature, MediaQuery: getMediaQuery, MediaQueryList: getMediaQueryList, @@ -153,7 +150,6 @@ Parser.prototype = { Parentheses: getParentheses, Percentage: getPercentage, Progid: getProgid, - Pseudo: getPseudo, PseudoClass: getPseudoClass, PseudoElement: getPseudoElement, Ratio: getRatio, diff --git a/lib/parser/type/PseudoElement.js b/lib/parser/type/PseudoElement.js index 696a381f..04dde88b 100644 --- a/lib/parser/type/PseudoElement.js +++ b/lib/parser/type/PseudoElement.js @@ -30,7 +30,6 @@ module.exports = function PseudoElement() { type: 'PseudoElement', loc: this.getLocation(start, this.scanner.tokenStart), name: name, - children: children, - legacy: false + children: children }; }; diff --git a/lib/parser/type/Selector.js b/lib/parser/type/Selector.js index 6385c838..923f01b1 100644 --- a/lib/parser/type/Selector.js +++ b/lib/parser/type/Selector.js @@ -83,7 +83,12 @@ module.exports = function Selector(relative, disallowCombinators) { break; case COLON: - child = this.Pseudo(); + if (this.scanner.lookupType(1) === COLON) { + child = this.PseudoElement(); + } else { + child = this.PseudoClass(); + } + break; case IDENTIFIER: @@ -107,6 +112,7 @@ module.exports = function Selector(relative, disallowCombinators) { this.scanner.skip(idx); this.scanner.error('Identifier or asterisk is expected'); } + break; case NUMBER: diff --git a/lib/parser/type/_LegacyPseudoElement.js b/lib/parser/type/_LegacyPseudoElement.js deleted file mode 100644 index d651db37..00000000 --- a/lib/parser/type/_LegacyPseudoElement.js +++ /dev/null @@ -1,22 +0,0 @@ -var COLON = require('../../scanner').TYPE.Colon; - -// : ident -// https://drafts.csswg.org/selectors-4/#grammar -// Some older pseudo-elements (::before, ::after, ::first-line, and ::first-letter) -// can, for legacy reasons, be written using the grammar, -// with only a single ":" character at their start. -module.exports = function LegacyPseudoElement() { - var start = this.scanner.tokenStart; - var name; - - this.scanner.eat(COLON); - name = this.readIdent(false); - - return { - type: 'PseudoElement', - loc: this.getLocation(start, this.scanner.tokenStart), - name: name, - children: null, - legacy: true - }; -}; diff --git a/lib/parser/type/_Pseudo.js b/lib/parser/type/_Pseudo.js deleted file mode 100644 index fb92f4db..00000000 --- a/lib/parser/type/_Pseudo.js +++ /dev/null @@ -1,24 +0,0 @@ -var TYPE = require('../../scanner').TYPE; - -var IDENTIFIER = TYPE.Identifier; -var COLON = TYPE.Colon; - -// | -module.exports = function Pseudo() { - switch (this.scanner.lookupType(1)) { - case COLON: - return this.PseudoElement(); - - case IDENTIFIER: - // '::' starts a pseudo-element, ':' a pseudo-class - // Exceptions: :first-line, :first-letter, :before and :after - if (this.scanner.lookupValue(1, 'before') || - this.scanner.lookupValue(1, 'after') || - this.scanner.lookupValue(1, 'first-letter') || - this.scanner.lookupValue(1, 'first-line')) { - return this.LegacyPseudoElement(); - } - } - - return this.PseudoClass(); -}; diff --git a/lib/utils/translate.js b/lib/utils/translate.js index 3d70a5c1..5f9395f3 100644 --- a/lib/utils/translate.js +++ b/lib/utils/translate.js @@ -216,11 +216,9 @@ function translate(node) { : ':' + node.name; case 'PseudoElement': - return node.legacy - ? ':' + node.name // :before, :after, :first-letter and :first-line - : node.children !== null - ? '::' + node.name + '(' + each(node.children) + ')' - : '::' + node.name; + return node.children !== null + ? '::' + node.name + '(' + each(node.children) + ')' + : '::' + node.name; case 'Class': return '.' + node.name; diff --git a/lib/utils/translateWithSourceMap.js b/lib/utils/translateWithSourceMap.js index 18984ad6..2a3c7f08 100644 --- a/lib/utils/translateWithSourceMap.js +++ b/lib/utils/translateWithSourceMap.js @@ -268,11 +268,9 @@ function translate(node) { : ':' + node.name; case 'PseudoElement': - return node.legacy - ? ':' + node.name // :before, :after, :first-letter and :first-line - : node.children !== null - ? '::' + node.name + '(' + each(node.children) + ')' - : '::' + node.name; + return node.children !== null + ? '::' + node.name + '(' + each(node.children) + ')' + : '::' + node.name; case 'Class': return '.' + node.name; diff --git a/test/fixture/parse/selector/PseudoClass.json b/test/fixture/parse/selector/PseudoClass.json index 1c9c7f4a..e82346e0 100644 --- a/test/fixture/parse/selector/PseudoClass.json +++ b/test/fixture/parse/selector/PseudoClass.json @@ -40,5 +40,45 @@ } ] } + }, + "pseudo element :before": { + "source": ":before", + "ast": { + "type": "PseudoClass", + "name": "before", + "children": null + } + }, + "pseudo element :before case insesitive": { + "source": ":bEfOrE", + "ast": { + "type": "PseudoClass", + "name": "bEfOrE", + "children": null + } + }, + "pseudo element :after": { + "source": ":after", + "ast": { + "type": "PseudoClass", + "name": "after", + "children": null + } + }, + "pseudo element :first-letter": { + "source": ":first-letter", + "ast": { + "type": "PseudoClass", + "name": "first-letter", + "children": null + } + }, + "pseudo element :first-line": { + "source": ":first-line", + "ast": { + "type": "PseudoClass", + "name": "first-line", + "children": null + } } } diff --git a/test/fixture/parse/selector/PseudoElement.json b/test/fixture/parse/selector/PseudoElement.json index 845c4ecd..36bc72a6 100644 --- a/test/fixture/parse/selector/PseudoElement.json +++ b/test/fixture/parse/selector/PseudoElement.json @@ -4,8 +4,7 @@ "ast": { "type": "PseudoElement", "name": "test", - "children": null, - "legacy": false + "children": null } }, "pseudo element #1": { @@ -13,8 +12,7 @@ "ast": { "type": "PseudoElement", "name": "test-test", - "children": null, - "legacy": false + "children": null } }, "pseudo element ::before": { @@ -22,53 +20,7 @@ "ast": { "type": "PseudoElement", "name": "before", - "children": null, - "legacy": false - } - }, - "pseudo element :before": { - "source": ":before", - "ast": { - "type": "PseudoElement", - "name": "before", - "children": null, - "legacy": true - } - }, - "pseudo element :before case insesitive": { - "source": ":bEfOrE", - "ast": { - "type": "PseudoElement", - "name": "bEfOrE", - "children": null, - "legacy": true - } - }, - "pseudo element :after": { - "source": ":after", - "ast": { - "type": "PseudoElement", - "name": "after", - "children": null, - "legacy": true - } - }, - "pseudo element :first-letter": { - "source": ":first-letter", - "ast": { - "type": "PseudoElement", - "name": "first-letter", - "children": null, - "legacy": true - } - }, - "pseudo element :first-line": { - "source": ":first-line", - "ast": { - "type": "PseudoElement", - "name": "first-line", - "children": null, - "legacy": true + "children": null } } } diff --git a/test/fixture/parse/selector/functional-pseudo/slotted.json b/test/fixture/parse/selector/functional-pseudo/slotted.json index 01ba2bfd..4aceda5b 100644 --- a/test/fixture/parse/selector/functional-pseudo/slotted.json +++ b/test/fixture/parse/selector/functional-pseudo/slotted.json @@ -14,8 +14,7 @@ } ] } - ], - "legacy": false + ] } }, "spaces around selector": { @@ -38,8 +37,7 @@ } ] } - ], - "legacy": false + ] } }, "should be case insensitive": { @@ -57,8 +55,7 @@ } ] } - ], - "legacy": false + ] } }, "error #1": { diff --git a/test/fixture/stringify.ast b/test/fixture/stringify.ast index 76438e32..dbda2ac0 100644 --- a/test/fixture/stringify.ast +++ b/test/fixture/stringify.ast @@ -829,8 +829,7 @@ } }, "name": "pseudo", - "children": null, - "legacy": false + "children": null }, { "type": "Combinator", @@ -1239,8 +1238,7 @@ } ] } - ], - "legacy": false + ] }, { "type": "Combinator", @@ -2710,7 +2708,7 @@ "name": "*|span" }, { - "type": "PseudoElement", + "type": "PseudoClass", "loc": { "source": "stringify.css", "start": { @@ -2725,8 +2723,7 @@ } }, "name": "before", - "children": null, - "legacy": true + "children": null } ] }