File: css_decls_box_shadow.go

package info (click to toggle)
golang-github-evanw-esbuild 0.25.10-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,184 kB
  • sloc: javascript: 28,602; makefile: 856; sh: 17
file content (106 lines) | stat: -rw-r--r-- 2,804 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package css_parser

import (
	"strings"

	"github.com/evanw/esbuild/internal/css_ast"
	"github.com/evanw/esbuild/internal/css_lexer"
)

func (p *parser) lowerAndMangleBoxShadow(tokens []css_ast.Token, wouldClipColor *bool) []css_ast.Token {
	insetCount := 0
	colorCount := 0
	numbersBegin := 0
	numbersCount := 0
	numbersDone := false
	foundUnexpectedToken := false

	for i, t := range tokens {
		if t.Kind == css_lexer.TNumber || t.Kind == css_lexer.TDimension {
			if numbersDone {
				// Track if we found a non-number in between two numbers
				foundUnexpectedToken = true
			}
			if p.options.minifySyntax && t.TurnLengthIntoNumberIfZero() {
				// "0px" => "0"
				tokens[i] = t
			}
			if numbersCount == 0 {
				// Track the index of the first number
				numbersBegin = i
			}
			numbersCount++
		} else {
			if numbersCount != 0 {
				// Track when we find a non-number after a number
				numbersDone = true
			}

			if looksLikeColor(t) {
				colorCount++
				tokens[i] = p.lowerAndMinifyColor(t, wouldClipColor)
			} else if t.Kind == css_lexer.TIdent && strings.EqualFold(t.Text, "inset") {
				insetCount++
			} else {
				// Track if we found a token other than a number, a color, or "inset"
				foundUnexpectedToken = true
			}
		}
	}

	// If everything looks like a valid rule, trim trailing zeros off the numbers.
	// There are three valid configurations of numbers:
	//
	//   offset-x | offset-y
	//   offset-x | offset-y | blur-radius
	//   offset-x | offset-y | blur-radius | spread-radius
	//
	// If omitted, blur-radius and spread-radius are implied to be zero.
	if p.options.minifySyntax && insetCount <= 1 && colorCount <= 1 && numbersCount > 2 && numbersCount <= 4 && !foundUnexpectedToken {
		numbersEnd := numbersBegin + numbersCount
		for numbersCount > 2 && tokens[numbersBegin+numbersCount-1].IsZero() {
			numbersCount--
		}
		tokens = append(tokens[:numbersBegin+numbersCount], tokens[numbersEnd:]...)
	}

	// Set the whitespace flags
	for i := range tokens {
		var whitespace css_ast.WhitespaceFlags
		if i > 0 || !p.options.minifyWhitespace {
			whitespace |= css_ast.WhitespaceBefore
		}
		if i+1 < len(tokens) {
			whitespace |= css_ast.WhitespaceAfter
		}
		tokens[i].Whitespace = whitespace
	}
	return tokens
}

func (p *parser) lowerAndMangleBoxShadows(tokens []css_ast.Token, wouldClipColor *bool) []css_ast.Token {
	n := len(tokens)
	end := 0
	i := 0

	for i < n {
		// Find the comma or the end of the token list
		comma := i
		for comma < n && tokens[comma].Kind != css_lexer.TComma {
			comma++
		}

		// Mangle this individual shadow
		end += copy(tokens[end:], p.lowerAndMangleBoxShadow(tokens[i:comma], wouldClipColor))

		// Skip over the comma
		if comma < n {
			tokens[end] = tokens[comma]
			end++
			comma++
		}
		i = comma
	}

	return tokens[:end]
}