@@ -21,24 +21,31 @@ const Input: Component<{
21
21
const [ show , setShow ] = createSignal ( true ) ;
22
22
let arrowEl ! : HTMLDivElement ;
23
23
24
- let whiteSpaceOnly = true ;
25
-
26
24
const countWhiteSpace = ( ) => {
27
- let count = 0 ;
28
25
const value = props . value ;
26
+ const group : { char : string ; count : number } [ ] = [ ] ;
27
+ if ( value [ 0 ] != null ) {
28
+ group . push ( { char : value [ 0 ] , count : 0 } ) ;
29
+ }
29
30
value . split ( "" ) . forEach ( ( item ) => {
30
- if ( item === " " || item === "\t" ) {
31
- count ++ ;
31
+ const groupItem = group . at ( - 1 ) ! ;
32
+ if ( groupItem . char === item ) {
33
+ groupItem . count = groupItem . count + 1 ;
34
+ } else {
35
+ group . push ( { char : item , count : 1 } ) ;
32
36
}
33
37
} ) ;
34
- if ( count !== value . length ) {
35
- whiteSpaceOnly = false ;
36
- return ;
37
- }
38
- whiteSpaceOnly = true ;
38
+
39
39
setShow ( true ) ;
40
40
41
- return `${ value . match ( / \t / g) ? "\\t" : '" "' } (x${ count } )` ;
41
+ return group
42
+ . map ( ( { count, char } ) => {
43
+ if ( char === "\t" ) char = "\\t" ;
44
+ if ( char . match ( / \s / ) ) char = "\\s" ;
45
+
46
+ return `${ char } ${ count > 1 ? `(x${ count } )` : "" } ` ;
47
+ } )
48
+ . reduce ( ( a , c ) => a + " " + c , "" ) ;
42
49
} ;
43
50
44
51
const onClickReplaceTab = ( ) => {
@@ -129,6 +136,9 @@ const Input: Component<{
129
136
value = value . replace ( props . filter , "" ) ;
130
137
e . currentTarget . value = value ;
131
138
}
139
+
140
+ value = value . replace ( / \\ s / g, " " ) ;
141
+
132
142
const result = value . replace ( / \\ t / g, "\t" ) ;
133
143
if ( result !== value ) {
134
144
value = result . replace ( / [ ^ \t ] / g, "" ) ;
@@ -139,9 +149,9 @@ const Input: Component<{
139
149
} }
140
150
ref = { setReference }
141
151
/>
142
- < Show when = { props . maskType && whiteSpaceOnly && show ( ) } >
143
- < div class = "absolute inset-0px rounded-8px px-2 py-3px opacity-50 pointer-events-none" >
144
- { countWhiteSpace ( ) }
152
+ < Show when = { props . maskType && show ( ) } >
153
+ < div class = "absolute inset-0px rounded-8px px-2 py-3px bg-#fff dark:bg-#3B3B3B pointer-events-none" >
154
+ < span class = "opacity-50" > { countWhiteSpace ( ) } </ span >
145
155
</ div >
146
156
</ Show >
147
157
</ div >
0 commit comments