Source File
css_parser_selector.go
Belonging Package
github.com/evanw/esbuild/internal/css_parser
package css_parser
import (
)
.eat(css_lexer.TWhitespace)
, := .parseComplexSelector()
if ! {
return
}
= append(, )
for {
.eat(css_lexer.TWhitespace)
if !.eat(css_lexer.TComma) {
break
}
.eat(css_lexer.TWhitespace)
, := .parseComplexSelector()
if ! {
return
}
= append(, )
}
= true
return
}
, := .parseCompoundSelector()
if ! {
return
}
.Selectors = append(.Selectors, )
for {
.eat(css_lexer.TWhitespace)
if .peek(css_lexer.TEndOfFile) || .peek(css_lexer.TComma) || .peek(css_lexer.TOpenBrace) {
break
}
:= .parseCombinator()
if != "" {
.eat(css_lexer.TWhitespace)
}
if .eat(css_lexer.TDelimAmpersand) {
.HasNestPrefix = true
}
:
for {
switch .current().Kind {
case css_lexer.THash:
if !.current().IsID {
break
}
:= .decoded()
.SubclassSelectors = append(.SubclassSelectors, &css_ast.SSHash{Name: })
.advance()
case css_lexer.TDelimDot:
.advance()
:= .decoded()
.SubclassSelectors = append(.SubclassSelectors, &css_ast.SSClass{Name: })
.expect(css_lexer.TIdent)
case css_lexer.TOpenBracket:
.advance()
, := .parseAttributeSelector()
if ! {
return
}
.SubclassSelectors = append(.SubclassSelectors, &)
case css_lexer.TColon:
break
}
:= .parsePseudoElementSelector()
.SubclassSelectors = append(.SubclassSelectors, &)
default:
break
}
}
if .eat(css_lexer.TColon) {
:= .parsePseudoElementSelector()
.PseudoClassSelectors = append(.PseudoClassSelectors, )
for .peek(css_lexer.TColon) {
:= .parsePseudoElementSelector()
.PseudoClassSelectors = append(.PseudoClassSelectors, )
}
}
if !.HasNestPrefix && .TypeSelector == nil && len(.SubclassSelectors) == 0 && len(.PseudoClassSelectors) == 0 {
.unexpected()
return
}
= true
return
}
if .peek(css_lexer.TDelimAsterisk) {
:= .nameToken()
.advance()
.NamespacedName.NamespacePrefix = &
.NamespacedName.Name = .nameToken()
if !.expect(css_lexer.TIdent) {
return
}
if .next().Kind != css_lexer.TDelimEquals && .eat(css_lexer.TDelimBar) {
:= .NamespacedName.Name
.NamespacedName.NamespacePrefix = &
.NamespacedName.Name = .nameToken()
if !.expect(css_lexer.TIdent) {
return
}
}
}
.eat(css_lexer.TWhitespace)
if .eat(css_lexer.TDelimEquals) {
.MatcherOp = "="
} else {
switch .current().Kind {
case css_lexer.TDelimTilde:
.MatcherOp = "~="
case css_lexer.TDelimBar:
.MatcherOp = "|="
case css_lexer.TDelimCaret:
.MatcherOp = "^="
case css_lexer.TDelimDollar:
.MatcherOp = "$="
case css_lexer.TDelimAsterisk:
.MatcherOp = "*="
}
if .MatcherOp != "" {
.advance()
.expect(css_lexer.TDelimEquals)
}
}
if .MatcherOp != "" {
.eat(css_lexer.TWhitespace)
if !.peek(css_lexer.TString) && !.peek(css_lexer.TIdent) {
.unexpected()
}
.MatcherValue = .decoded()
.advance()
.eat(css_lexer.TWhitespace)
if .peek(css_lexer.TIdent) {
if := .decoded(); len() == 1 {
if := [0]; == 'i' || == 'I' {
.MatcherModifier =
.advance()
}
}
}
}
.expect(css_lexer.TCloseBracket)
= true
return
}
func ( *parser) () css_ast.SSPseudoClass {
.advance()
if .peek(css_lexer.TFunction) {
:= .decoded()
.advance()
:= .convertTokens(.parseAnyValue())
.expect(css_lexer.TCloseParen)
return css_ast.SSPseudoClass{Name: , Args: }
}
:= .decoded()
:= css_ast.SSPseudoClass{}
if .expect(css_lexer.TIdent) {
.Name =
}
return
}
.stack = .stack[:0] // Reuse allocated memory
:= .index
:
for {
switch .current().Kind {
case css_lexer.TCloseParen, css_lexer.TCloseBracket, css_lexer.TCloseBrace:
:= len(.stack) - 1
if < 0 || !.peek(.stack[]) {
break
}
.stack = .stack[:]
case css_lexer.TSemicolon, css_lexer.TDelimExclamation:
if len(.stack) == 0 {
break
}
case css_lexer.TOpenParen, css_lexer.TFunction:
.stack = append(.stack, css_lexer.TCloseParen)
case css_lexer.TOpenBracket:
.stack = append(.stack, css_lexer.TCloseBracket)
case css_lexer.TOpenBrace:
.stack = append(.stack, css_lexer.TCloseBrace)
}
.advance()
}
:= .tokens[:.index]
if len() == 0 {
.unexpected()
}
return
}
func ( *parser) () string {
switch .current().Kind {
case css_lexer.TDelimGreaterThan:
.advance()
return ">"
case css_lexer.TDelimPlus:
.advance()
return "+"
case css_lexer.TDelimTilde:
.advance()
return "~"
default:
return ""
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |