1 | import { splitAtTopLevelOnly } from './splitAtTopLevelOnly'
|
2 |
|
3 | let KEYWORDS = new Set(['inset', 'inherit', 'initial', 'revert', 'unset'])
|
4 | let SPACE = /\ +(?![^(]*\))/g
|
5 | let LENGTH = /^-?(\d+|\.\d+)(.*?)$/g
|
6 |
|
7 | export function parseBoxShadowValue(input) {
|
8 | let shadows = splitAtTopLevelOnly(input, ',')
|
9 | return shadows.map((shadow) => {
|
10 | let value = shadow.trim()
|
11 | let result = { raw: value }
|
12 | let parts = value.split(SPACE)
|
13 | let seen = new Set()
|
14 |
|
15 | for (let part of parts) {
|
16 |
|
17 | LENGTH.lastIndex = 0
|
18 |
|
19 |
|
20 | if (!seen.has('KEYWORD') && KEYWORDS.has(part)) {
|
21 | result.keyword = part
|
22 | seen.add('KEYWORD')
|
23 | }
|
24 |
|
25 |
|
26 | else if (LENGTH.test(part)) {
|
27 | if (!seen.has('X')) {
|
28 | result.x = part
|
29 | seen.add('X')
|
30 | } else if (!seen.has('Y')) {
|
31 | result.y = part
|
32 | seen.add('Y')
|
33 | } else if (!seen.has('BLUR')) {
|
34 | result.blur = part
|
35 | seen.add('BLUR')
|
36 | } else if (!seen.has('SPREAD')) {
|
37 | result.spread = part
|
38 | seen.add('SPREAD')
|
39 | }
|
40 | }
|
41 |
|
42 |
|
43 | else {
|
44 | if (!result.color) {
|
45 | result.color = part
|
46 | } else {
|
47 | if (!result.unknown) result.unknown = []
|
48 | result.unknown.push(part)
|
49 | }
|
50 | }
|
51 | }
|
52 |
|
53 |
|
54 | result.valid = result.x !== undefined && result.y !== undefined
|
55 |
|
56 | return result
|
57 | })
|
58 | }
|
59 |
|
60 | export function formatBoxShadowValue(shadows) {
|
61 | return shadows
|
62 | .map((shadow) => {
|
63 | if (!shadow.valid) {
|
64 | return shadow.raw
|
65 | }
|
66 |
|
67 | return [shadow.keyword, shadow.x, shadow.y, shadow.blur, shadow.spread, shadow.color]
|
68 | .filter(Boolean)
|
69 | .join(' ')
|
70 | })
|
71 | .join(', ')
|
72 | }
|