@@ -10,18 +10,18 @@ use super::{
10
10
input_to_string, list_or_single, position, sass_string, PResult , Span ,
11
11
} ;
12
12
use crate :: sass:: { BinOp , SassString , Value } ;
13
- use crate :: value:: { ListSeparator , Number , Numeric , Operator , Rgba } ;
13
+ use crate :: value:: { ListSeparator , Numeric , Operator , Rgba } ;
14
14
use nom:: branch:: alt;
15
15
use nom:: bytes:: complete:: { tag, tag_no_case} ;
16
16
use nom:: character:: complete:: {
17
17
alphanumeric1, char, digit1, multispace0, multispace1, one_of,
18
18
} ;
19
19
use nom:: combinator:: {
20
- cut, into, map, map_res, not, opt, peek, recognize, success , value,
20
+ cut, into, map, map_opt , map_res, not, opt, peek, recognize, value,
21
21
verify,
22
22
} ;
23
23
use nom:: error:: context;
24
- use nom:: multi:: { fold_many0, fold_many1 , many0, many_m_n, separated_list1} ;
24
+ use nom:: multi:: { fold_many0, many0, many_m_n, separated_list1} ;
25
25
use nom:: sequence:: { delimited, pair, preceded, terminated, tuple} ;
26
26
use std:: str:: from_utf8;
27
27
@@ -332,68 +332,20 @@ pub fn numeric(input: Span) -> PResult<Numeric> {
332
332
} ) ( input)
333
333
}
334
334
335
- pub fn number ( input : Span ) -> PResult < Number > {
336
- map (
337
- tuple ( (
338
- sign_neg ,
335
+ pub fn number ( input : Span ) -> PResult < f64 > {
336
+ map_opt (
337
+ recognize ( delimited (
338
+ opt ( one_of ( "+-" ) ) ,
339
339
alt ( (
340
- map ( pair ( decimal_integer, decimal_decimals) , |( n, d) | n + d) ,
341
- decimal_decimals,
342
- decimal_integer,
343
- ) ) ,
344
- opt ( preceded (
345
- alt ( ( tag ( "e" ) , tag ( "E" ) ) ) ,
346
- tuple ( ( sign_neg, decimal_i32) ) ,
340
+ terminated ( digit1, opt ( terminated ( char ( '.' ) , digit1) ) ) ,
341
+ preceded ( char ( '.' ) , digit1) ,
347
342
) ) ,
343
+ opt ( delimited ( one_of ( "eE" ) , opt ( one_of ( "+-" ) ) , digit1) ) ,
348
344
) ) ,
349
- |( is_neg, num, exp) | {
350
- let value = if is_neg { -num } else { num } ;
351
- Number :: from ( if let Some ( ( e_neg, e_val) ) = exp {
352
- let e_val = if e_neg { -e_val } else { e_val } ;
353
- // Note: powi sounds right, but looses some precision.
354
- value * 10f64 . powf ( e_val. into ( ) )
355
- } else {
356
- value
357
- } )
358
- } ,
359
- ) ( input)
360
- }
361
-
362
- /// Parse true on `-` and false on `+` or no sign.
363
- fn sign_neg ( input : Span ) -> PResult < bool > {
364
- alt ( (
365
- value ( true , char ( '-' ) ) ,
366
- value ( false , char ( '+' ) ) ,
367
- success ( false ) ,
368
- ) ) ( input)
369
- }
370
-
371
- pub fn decimal_integer ( input : Span ) -> PResult < f64 > {
372
- map ( digit1, |s : Span | {
373
- s. fragment ( )
374
- . iter ( )
375
- . fold ( 0.0 , |r, d| ( r * 10. ) + f64:: from ( d - b'0' ) )
376
- } ) ( input)
377
- }
378
- pub fn decimal_i32 ( input : Span ) -> PResult < i32 > {
379
- fold_many1 (
380
- // Note: We should use bytes directly, one_of returns a char.
381
- one_of ( "0123456789" ) ,
382
- || 0 ,
383
- |r, d| ( r * 10 ) + i32:: from ( d as u8 - b'0' ) ,
345
+ |s : Span | from_utf8 ( s. fragment ( ) ) . ok ( ) ?. parse ( ) . ok ( ) ,
384
346
) ( input)
385
347
}
386
348
387
- pub fn decimal_decimals ( input : Span ) -> PResult < f64 > {
388
- map ( preceded ( char ( '.' ) , digit1) , |s : Span | {
389
- let digits = s. fragment ( ) ;
390
- digits
391
- . iter ( )
392
- . fold ( 0.0 , |r, d| ( r * 10. ) + f64:: from ( d - b'0' ) )
393
- * ( 10f64 ) . powf ( -( digits. len ( ) as f64 ) )
394
- } ) ( input)
395
- }
396
-
397
349
pub fn variable_nomod ( input : Span ) -> PResult < Value > {
398
350
let ( rest, name) = preceded ( char ( '$' ) , identifier) ( input) ?;
399
351
let pos = input. up_to ( & rest) . to_owned ( ) ;
@@ -584,12 +536,12 @@ mod test {
584
536
585
537
#[ test]
586
538
fn simple_number ( ) {
587
- check_expr ( "4;" , number ( 4. ) )
539
+ check_expr ( "4;" , Value :: scalar ( 4. ) )
588
540
}
589
541
590
542
#[ test]
591
543
fn simple_number_neg ( ) {
592
- check_expr ( "-4;" , number ( -4. ) )
544
+ check_expr ( "-4;" , Value :: scalar ( -4. ) )
593
545
}
594
546
595
547
#[ test]
@@ -599,23 +551,19 @@ mod test {
599
551
600
552
#[ test]
601
553
fn simple_number_dec ( ) {
602
- check_expr ( "4.34;" , number ( 4.34 ) )
554
+ check_expr ( "4.34;" , Value :: scalar ( 4.34 ) )
603
555
}
604
556
#[ test]
605
557
fn simple_number_onlydec ( ) {
606
- check_expr ( ".34;" , number ( 0.34 ) )
558
+ check_expr ( ".34;" , Value :: scalar ( 0.34 ) )
607
559
}
608
560
#[ test]
609
561
fn simple_number_onlydec_neg ( ) {
610
- check_expr ( "-.34;" , number ( -0.34 ) )
562
+ check_expr ( "-.34;" , Value :: scalar ( -0.34 ) )
611
563
}
612
564
#[ test]
613
565
fn simple_number_onlydec_pos ( ) {
614
- check_expr ( "+.34;" , number ( 0.34 ) )
615
- }
616
-
617
- fn number ( value : f64 ) -> Value {
618
- Value :: scalar ( value)
566
+ check_expr ( "+.34;" , Value :: scalar ( 0.34 ) )
619
567
}
620
568
621
569
#[ test]
0 commit comments