@@ -10,19 +10,19 @@ 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
- alphanumeric1, char, multispace0, multispace1, one_of,
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, value, verify,
20
+ cut, into, map, map_opt, map_res, not, opt, peek, recognize, value,
21
+ verify,
21
22
} ;
22
23
use nom:: error:: context;
23
- 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} ;
24
25
use nom:: sequence:: { delimited, pair, preceded, terminated, tuple} ;
25
- use num_traits:: Zero ;
26
26
use std:: str:: from_utf8;
27
27
28
28
pub fn value_expression ( input : Span ) -> PResult < Value > {
@@ -326,86 +326,23 @@ pub fn bracket_list(input: Span) -> PResult<Value> {
326
326
) )
327
327
}
328
328
329
- fn sign_prefix ( input : Span ) -> PResult < Option < & [ u8 ] > > {
330
- opt ( alt ( ( tag ( "-" ) , tag ( "+" ) ) ) ) ( input)
331
- . map ( |( r, s) | ( r, s. map ( |s| s. fragment ( ) ) ) )
332
- }
333
-
334
329
pub fn numeric ( input : Span ) -> PResult < Numeric > {
335
330
map ( pair ( number, unit) , |( number, unit) | {
336
331
Numeric :: new ( number, unit)
337
332
} ) ( input)
338
333
}
339
334
340
- pub fn number ( input : Span ) -> PResult < Number > {
341
- map (
342
- tuple ( (
343
- sign_prefix ,
335
+ pub fn number ( input : Span ) -> PResult < f64 > {
336
+ map_opt (
337
+ recognize ( delimited (
338
+ opt ( one_of ( "+-" ) ) ,
344
339
alt ( (
345
- map ( pair ( decimal_integer, decimal_decimals) , |( n, d) | n + d) ,
346
- decimal_decimals,
347
- decimal_integer,
348
- ) ) ,
349
- opt ( preceded (
350
- alt ( ( tag ( "e" ) , tag ( "E" ) ) ) ,
351
- tuple ( ( sign_prefix, decimal_i32) ) ,
340
+ terminated ( digit1, opt ( terminated ( char ( '.' ) , digit1) ) ) ,
341
+ preceded ( char ( '.' ) , digit1) ,
352
342
) ) ,
343
+ opt ( delimited ( one_of ( "eE" ) , opt ( one_of ( "+-" ) ) , digit1) ) ,
353
344
) ) ,
354
- |( sign, num, exp) | {
355
- let value = if sign == Some ( b"-" ) {
356
- // Only f64-based Number can represent negative zero.
357
- if num. is_zero ( ) {
358
- ( -0.0 ) . into ( )
359
- } else {
360
- -num
361
- }
362
- } else {
363
- num
364
- } ;
365
- if let Some ( ( e_sign, e_val) ) = exp {
366
- let e_val = if e_sign == Some ( b"-" ) { -e_val } else { e_val } ;
367
- // Note: powi sounds right, but looses some precision.
368
- value * Number :: from ( 10f64 . powf ( e_val. into ( ) ) )
369
- } else {
370
- value
371
- }
372
- } ,
373
- ) ( input)
374
- }
375
-
376
- pub fn decimal_integer ( input : Span ) -> PResult < Number > {
377
- fold_many1 (
378
- // Note: We should use bytes directly, one_of returns a char.
379
- one_of ( "0123456789" ) ,
380
- || Number :: from ( 0 ) ,
381
- |r, d| ( r * 10 ) + Number :: from ( i64:: from ( d as u8 - b'0' ) ) ,
382
- ) ( input)
383
- }
384
- pub fn decimal_i32 ( input : Span ) -> PResult < i32 > {
385
- fold_many1 (
386
- // Note: We should use bytes directly, one_of returns a char.
387
- one_of ( "0123456789" ) ,
388
- || 0 ,
389
- |r, d| ( r * 10 ) + i32:: from ( d as u8 - b'0' ) ,
390
- ) ( input)
391
- }
392
-
393
- pub fn decimal_decimals ( input : Span ) -> PResult < Number > {
394
- map (
395
- preceded (
396
- tag ( "." ) ,
397
- fold_many1 (
398
- one_of ( "0123456789" ) ,
399
- || ( Number :: from ( 0 ) , Number :: from ( 1 ) ) ,
400
- |( r, n) , d| {
401
- (
402
- ( r * 10 ) + Number :: from ( i64:: from ( d as u8 - b'0' ) ) ,
403
- n * 10 ,
404
- )
405
- } ,
406
- ) ,
407
- ) ,
408
- |( r, d) | r / d,
345
+ |s : Span | from_utf8 ( s. fragment ( ) ) . ok ( ) ?. parse ( ) . ok ( ) ,
409
346
) ( input)
410
347
}
411
348
@@ -595,43 +532,38 @@ mod test {
595
532
use super :: * ;
596
533
use crate :: sass:: CallArgs ;
597
534
use crate :: sass:: Value :: { Color , List , Literal , Map , Paren } ;
598
- use crate :: value:: Rational ;
599
535
use crate :: ScopeRef ;
600
536
601
537
#[ test]
602
538
fn simple_number ( ) {
603
- check_expr ( "4;" , number ( 4 , 1 ) )
539
+ check_expr ( "4;" , Value :: scalar ( 4. ) )
604
540
}
605
541
606
542
#[ test]
607
543
fn simple_number_neg ( ) {
608
- check_expr ( "-4;" , number ( -4 , 1 ) )
544
+ check_expr ( "-4;" , Value :: scalar ( -4. ) )
609
545
}
610
546
611
547
#[ test]
612
548
fn simple_number_pos ( ) {
613
- check_expr ( "+4;" , Value :: scalar ( 4 ) )
549
+ check_expr ( "+4;" , Value :: scalar ( 4. ) )
614
550
}
615
551
616
552
#[ test]
617
553
fn simple_number_dec ( ) {
618
- check_expr ( "4.34;" , number ( 434 , 100 ) )
554
+ check_expr ( "4.34;" , Value :: scalar ( 4.34 ) )
619
555
}
620
556
#[ test]
621
557
fn simple_number_onlydec ( ) {
622
- check_expr ( ".34;" , number ( 34 , 100 ) )
558
+ check_expr ( ".34;" , Value :: scalar ( 0.34 ) )
623
559
}
624
560
#[ test]
625
561
fn simple_number_onlydec_neg ( ) {
626
- check_expr ( "-.34;" , number ( - 34 , 100 ) )
562
+ check_expr ( "-.34;" , Value :: scalar ( - 0.34 ) )
627
563
}
628
564
#[ test]
629
565
fn simple_number_onlydec_pos ( ) {
630
- check_expr ( "+.34;" , number ( 34 , 100 ) )
631
- }
632
-
633
- fn number ( nom : i64 , denom : i64 ) -> Value {
634
- Value :: scalar ( Rational :: new ( nom, denom) )
566
+ check_expr ( "+.34;" , Value :: scalar ( 0.34 ) )
635
567
}
636
568
637
569
#[ test]
0 commit comments