| 1 | import { splitAtTopLevelOnly } from './splitAtTopLevelOnly'
|
|---|
| 2 |
|
|---|
| 3 | let KEYWORDS = new Set(['inset', 'inherit', 'initial', 'revert', 'unset'])
|
|---|
| 4 | let SPACE = /\ +(?![^(]*\))/g // Similar to the one above, but with spaces instead.
|
|---|
| 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 | // Reset index, since the regex is stateful.
|
|---|
| 17 | LENGTH.lastIndex = 0
|
|---|
| 18 |
|
|---|
| 19 | // Keyword
|
|---|
| 20 | if (!seen.has('KEYWORD') && KEYWORDS.has(part)) {
|
|---|
| 21 | result.keyword = part
|
|---|
| 22 | seen.add('KEYWORD')
|
|---|
| 23 | }
|
|---|
| 24 |
|
|---|
| 25 | // Length value
|
|---|
| 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 | // Color or unknown
|
|---|
| 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 | // Check if valid
|
|---|
| 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 | }
|
|---|