1
1
import type { State } from './state'
2
2
import * as jit from './jit'
3
+ import { segment } from './segment'
3
4
4
5
export function getVariantsFromClassName (
5
6
state : State ,
@@ -13,60 +14,39 @@ export function getVariantsFromClassName(
13
14
}
14
15
return [ variant . name ]
15
16
} )
16
- let variants = new Set < string > ( )
17
- let offset = 0
18
- let parts = splitAtTopLevelOnly ( className , state . separator )
17
+
18
+ let parts = segment ( className , state . separator )
19
19
if ( parts . length < 2 ) {
20
- return { variants : Array . from ( variants ) , offset }
20
+ return { variants : [ ] , offset : 0 }
21
21
}
22
+
22
23
parts = parts . filter ( Boolean )
23
24
24
- for ( let part of parts ) {
25
- if (
26
- allVariants . includes ( part ) ||
27
- ( state . jit &&
28
- ( ( part . includes ( '[' ) && part . endsWith ( ']' ) ) || part . includes ( '/' ) ) &&
29
- jit . generateRules ( state , [ `${ part } ${ state . separator } [color:red]` ] ) . rules . length > 0 )
30
- ) {
31
- variants . add ( part )
32
- offset += part . length + state . separator . length
33
- continue
25
+ function isValidVariant ( part : string ) {
26
+ if ( allVariants . includes ( part ) ) {
27
+ return true
34
28
}
35
29
36
- break
37
- }
38
-
39
- return { variants : Array . from ( variants ) , offset }
40
- }
41
-
42
- // https://github.com/tailwindlabs/tailwindcss/blob/a8a2e2a7191fbd4bee044523aecbade5823a8664/src/util/splitAtTopLevelOnly.js
43
- function splitAtTopLevelOnly ( input : string , separator : string ) : string [ ] {
44
- let stack : string [ ] = [ ]
45
- let parts : string [ ] = [ ]
46
- let lastPos = 0
30
+ let className = `${ part } ${ state . separator } [color:red]`
47
31
48
- for ( let idx = 0 ; idx < input . length ; idx ++ ) {
49
- let char = input [ idx ]
50
-
51
- if ( stack . length === 0 && char === separator [ 0 ] ) {
52
- if ( separator . length === 1 || input . slice ( idx , idx + separator . length ) === separator ) {
53
- parts . push ( input . slice ( lastPos , idx ) )
54
- lastPos = idx + separator . length
32
+ if ( state . jit ) {
33
+ if ( ( part . includes ( '[' ) && part . endsWith ( ']' ) ) || part . includes ( '/' ) ) {
34
+ return jit . generateRules ( state , [ className ] ) . rules . length > 0
55
35
}
56
36
}
57
37
58
- if ( char === '(' || char === '[' || char === '{' ) {
59
- stack . push ( char )
60
- } else if (
61
- ( char === ')' && stack [ stack . length - 1 ] === '(' ) ||
62
- ( char === ']' && stack [ stack . length - 1 ] === '[' ) ||
63
- ( char === '}' && stack [ stack . length - 1 ] === '{' )
64
- ) {
65
- stack . pop ( )
66
- }
38
+ return false
67
39
}
68
40
69
- parts . push ( input . slice ( lastPos ) )
41
+ let offset = 0
42
+ let variants = new Set < string > ( )
70
43
71
- return parts
44
+ for ( let part of parts ) {
45
+ if ( ! isValidVariant ( part ) ) break
46
+
47
+ variants . add ( part )
48
+ offset += part . length + state . separator ! . length
49
+ }
50
+
51
+ return { variants : Array . from ( variants ) , offset }
72
52
}
0 commit comments