@@ -509,275 +509,75 @@ ValidationTypes = {
509
509
510
510
complex : {
511
511
512
- "<bg-position>" : function ( expression ) {
513
- var result = false ,
514
- numeric = "<percentage> | <length>" ,
515
- xDir = "left | right" ,
516
- yDir = "top | bottom" ,
517
- count = 0 ;
518
-
519
- while ( expression . peek ( count ) && expression . peek ( count ) . text !== "," ) {
520
- count ++ ;
521
- }
522
-
523
- /*
524
- <position> = [
525
- [ left | center | right | top | bottom | <percentage> | <length> ]
526
- |
527
- [ left | center | right | <percentage> | <length> ]
528
- [ top | center | bottom | <percentage> | <length> ]
529
- |
530
- [ center | [ left | right ] [ <percentage> | <length> ]? ] &&
531
- [ center | [ top | bottom ] [ <percentage> | <length> ]? ]
532
- ]
533
- */
534
-
535
- if ( count < 3 ) {
536
- if ( ValidationTypes . isAny ( expression , xDir + " | center | " + numeric ) ) {
537
- result = true ;
538
- ValidationTypes . isAny ( expression , yDir + " | center | " + numeric ) ;
539
- } else if ( ValidationTypes . isAny ( expression , yDir ) ) {
540
- result = true ;
541
- ValidationTypes . isAny ( expression , xDir + " | center" ) ;
542
- }
543
- } else {
544
- if ( ValidationTypes . isAny ( expression , xDir ) ) {
545
- if ( ValidationTypes . isAny ( expression , yDir ) ) {
546
- result = true ;
547
- ValidationTypes . isAny ( expression , numeric ) ;
548
- } else if ( ValidationTypes . isAny ( expression , numeric ) ) {
549
- if ( ValidationTypes . isAny ( expression , yDir ) ) {
550
- result = true ;
551
- ValidationTypes . isAny ( expression , numeric ) ;
552
- } else if ( ValidationTypes . isAny ( expression , "center" ) ) {
553
- result = true ;
554
- }
555
- }
556
- } else if ( ValidationTypes . isAny ( expression , yDir ) ) {
557
- if ( ValidationTypes . isAny ( expression , xDir ) ) {
558
- result = true ;
559
- ValidationTypes . isAny ( expression , numeric ) ;
560
- } else if ( ValidationTypes . isAny ( expression , numeric ) ) {
561
- if ( ValidationTypes . isAny ( expression , xDir ) ) {
562
- result = true ;
563
- ValidationTypes . isAny ( expression , numeric ) ;
564
- } else if ( ValidationTypes . isAny ( expression , "center" ) ) {
565
- result = true ;
566
- }
567
- }
568
- } else if ( ValidationTypes . isAny ( expression , "center" ) ) {
569
- if ( ValidationTypes . isAny ( expression , xDir + " | " + yDir ) ) {
570
- result = true ;
571
- ValidationTypes . isAny ( expression , numeric ) ;
572
- }
573
- }
574
- }
575
-
576
- return result ;
577
- } ,
578
-
579
- "<bg-size>" : function ( expression ) {
580
- //<bg-size> = [ <length> | <percentage> | auto ]{1,2} | cover | contain
581
- var result = false ,
582
- numeric = "<percentage> | <length> | auto" ;
583
-
584
- if ( ValidationTypes . isAny ( expression , "cover | contain" ) ) {
585
- result = true ;
586
- } else if ( ValidationTypes . isAny ( expression , numeric ) ) {
587
- result = true ;
588
- ValidationTypes . isAny ( expression , numeric ) ;
589
- }
590
-
591
- return result ;
592
- } ,
593
-
594
- "<clip-source>" : function ( expression ) {
595
- return ValidationTypes . isAny ( expression , "<uri>" ) ;
596
- } ,
597
-
598
- "<clip-path>" : function ( expression ) {
599
- // <basic-shape> || <geometry-box>
600
- var result = false ;
601
-
602
- if ( ValidationTypes . isType ( expression , "<basic-shape>" ) ) {
603
- result = true ;
604
- if ( expression . hasNext ( ) ) {
605
- result = ValidationTypes . isType ( expression , "<geometry-box>" ) ;
606
- }
607
- } else if ( ValidationTypes . isType ( expression , "<geometry-box>" ) ) {
608
- result = true ;
609
- if ( expression . hasNext ( ) ) {
610
- result = ValidationTypes . isType ( expression , "<basic-shape>" ) ;
611
- }
612
- }
613
-
614
- return result && ! expression . hasNext ( ) ;
615
-
616
- } ,
617
-
618
- "<filter-function-list>" : function ( expression ) {
619
- var result , part , i ;
620
- for ( i = 0 , result = true ; result && expression . hasNext ( ) ; i ++ ) {
621
- result = ValidationTypes . isAny ( expression , "<filter-function> | <uri>" ) ;
622
- }
623
-
624
- if ( i > 1 && ! result ) {
625
- // More precise error message if we fail after the first
626
- // parsed <filter-function>.
627
- part = expression . peek ( ) ;
628
- throw new ValidationError ( "Expected (<filter-function> | <uri>) but found '" + part . text + "'." , part . line , part . col ) ;
629
- }
630
-
631
- return result ;
632
-
633
- } ,
634
-
635
- "<repeat-style>" : function ( expression ) {
636
- //repeat-x | repeat-y | [repeat | space | round | no-repeat]{1,2}
637
- var result = false ,
638
- values = "repeat | space | round | no-repeat" ,
639
- part ;
640
-
641
- if ( expression . hasNext ( ) ) {
642
- part = expression . next ( ) ;
643
-
644
- if ( ValidationTypes . isLiteral ( part , "repeat-x | repeat-y" ) ) {
645
- result = true ;
646
- } else if ( ValidationTypes . isLiteral ( part , values ) ) {
647
- result = true ;
648
-
649
- if ( expression . hasNext ( ) && ValidationTypes . isLiteral ( expression . peek ( ) , values ) ) {
650
- expression . next ( ) ;
651
- }
652
- }
653
- }
654
-
655
- return result ;
656
-
657
- } ,
658
-
659
- "<shadow>" : function ( expression ) {
660
- //inset? && [ <length>{2,4} && <color>? ]
661
- var result = false ,
662
- count = 0 ,
663
- inset = false ,
664
- color = false ;
665
-
666
- if ( expression . hasNext ( ) ) {
667
-
668
- if ( ValidationTypes . isAny ( expression , "inset" ) ) {
669
- inset = true ;
670
- }
671
-
672
- if ( ValidationTypes . isAny ( expression , "<color>" ) ) {
673
- color = true ;
674
- }
675
-
676
- while ( ValidationTypes . isAny ( expression , "<length>" ) && count < 4 ) {
677
- count ++ ;
678
- }
679
-
680
-
681
- if ( expression . hasNext ( ) ) {
682
- if ( ! color ) {
683
- ValidationTypes . isAny ( expression , "<color>" ) ;
684
- }
685
-
686
- if ( ! inset ) {
687
- ValidationTypes . isAny ( expression , "inset" ) ;
688
- }
689
-
690
- }
691
-
692
- result = ( count >= 2 && count <= 4 ) ;
693
-
694
- }
695
-
696
- return result ;
697
- } ,
698
-
699
- "<x-one-radius>" : function ( expression ) {
700
- //[ <length> | <percentage> ] [ <length> | <percentage> ]?
701
- var result = false ,
702
- simple = "<length> | <percentage> | inherit" ;
703
-
704
- if ( ValidationTypes . isAny ( expression , simple ) ) {
705
- result = true ;
706
- ValidationTypes . isAny ( expression , simple ) ;
707
- }
708
-
709
- return result ;
710
- } ,
711
-
712
- "<flex>" : function ( expression ) {
713
- // http://www.w3.org/TR/2014/WD-css-flexbox-1-20140325/#flex-property
714
- // none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]
715
- // Valid syntaxes, according to https://developer.mozilla.org/en-US/docs/Web/CSS/flex#Syntax
716
- // * none
717
- // * <flex-grow>
718
- // * <flex-basis>
719
- // * <flex-grow> <flex-basis>
720
- // * <flex-grow> <flex-shrink>
721
- // * <flex-grow> <flex-shrink> <flex-basis>
722
- // * inherit
723
- var part ,
724
- result = false ;
725
- if ( ValidationTypes . isAny ( expression , "none | inherit" ) ) {
726
- result = true ;
727
- } else {
728
- if ( ValidationTypes . isType ( expression , "<flex-grow>" ) ) {
729
- if ( expression . peek ( ) ) {
730
- if ( ValidationTypes . isType ( expression , "<flex-shrink>" ) ) {
731
- if ( expression . peek ( ) ) {
732
- result = ValidationTypes . isType ( expression , "<flex-basis>" ) ;
733
- } else {
734
- result = true ;
735
- }
736
- } else if ( ValidationTypes . isType ( expression , "<flex-basis>" ) ) {
737
- result = expression . peek ( ) === null ;
738
- }
739
- } else {
740
- result = true ;
741
- }
742
- } else if ( ValidationTypes . isType ( expression , "<flex-basis>" ) ) {
743
- result = true ;
744
- }
745
- }
746
-
747
- if ( ! result ) {
748
- // Generate a more verbose error than "Expected <flex>..."
749
- part = expression . peek ( ) ;
750
- throw new ValidationError ( "Expected (none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]) but found '" + expression . value . text + "'." , part . line , part . col ) ;
751
- }
752
-
753
- return result ;
754
- } ,
755
-
756
- "<text-decoration>" : function ( expression ) {
757
- // none | [ underline || overline || line-through || blink ] | inherit
758
- var part ,
759
- result ,
760
- someOf = "[ underline || overline || line-through || blink ]" ,
761
- identifiers = { } ,
762
- found ;
763
-
764
- do {
765
- part = expression . next ( ) ;
766
- found = 0 ;
767
- if ( someOf . indexOf ( part ) > - 1 ) {
768
- if ( ! identifiers [ part ] ) {
769
- identifiers [ part ] = 0 ;
770
- }
771
- identifiers [ part ] ++ ;
772
- found = identifiers [ part ] ;
773
- }
774
- } while ( found === 1 && expression . hasNext ( ) ) ;
775
-
776
- result = found === 1 && ! expression . hasNext ( ) ;
777
- if ( found === 0 && JSON . stringify ( identifiers ) === '{}' ) {
778
- expression . previous ( ) ;
779
- }
780
- return result ;
781
- }
512
+ "<bg-position>" : Matcher . cast ( "<position>" ) . hash ( ) ,
513
+
514
+ "<bg-size>" :
515
+ //<bg-size> = [ <length> | <percentage> | auto ]{1,2} | cover | contain
516
+ Matcher . alt ( "cover" , "contain" , Matcher . cast ( "<percentage> | <length> | auto" ) . braces ( 1 , 2 ) ) ,
517
+
518
+ "<clip-source>" : Matcher . cast ( "<uri>" ) ,
519
+
520
+ "<clip-path>" :
521
+ // <basic-shape> || <geometry-box>
522
+ Matcher . cast ( "<basic-shape>" ) . oror ( "<geometry-box>" ) ,
523
+
524
+ "<filter-function-list>" :
525
+ // [ <filter-function> | <uri> ]+
526
+ Matcher . cast ( "<filter-function> | <uri>" ) . plus ( ) ,
527
+
528
+ "<position>" :
529
+ // <position> = [
530
+ // [ left | center | right | top | bottom | <percentage> | <length> ]
531
+ // |
532
+ // [ left | center | right | <percentage> | <length> ]
533
+ // [ top | center | bottom | <percentage> | <length> ]
534
+ // |
535
+ // [ center | [ left | right ] [ <percentage> | <length> ]? ] &&
536
+ // [ center | [ top | bottom ] [ <percentage> | <length> ]? ]
537
+ //]
538
+ Matcher . alt (
539
+ // Because `alt` combinator is ordered, we need to test these
540
+ // in order from longest possible match to shortest.
541
+ Matcher . andand (
542
+ Matcher . cast ( "center" ) . or (
543
+ Matcher . seq ( "left | right" ,
544
+ Matcher . cast ( "<percentage> | <length>" ) . question ( ) ) ) ,
545
+ Matcher . cast ( "center" ) . or (
546
+ Matcher . seq ( "top | bottom" ,
547
+ Matcher . cast ( "<percentage> | <length>" ) . question ( ) ) ) ) ,
548
+ Matcher . seq ( "left | center | right | <percentage> | <length>" ,
549
+ "top | center | bottom | <percentage> | <length>" ) ,
550
+ "left | center | right | top | bottom | <percentage> | <length>"
551
+ ) ,
552
+
553
+ "<repeat-style>" :
554
+ //repeat-x | repeat-y | [repeat | space | round | no-repeat]{1,2}
555
+ Matcher . alt ( "repeat-x | repeat-y" , Matcher . cast ( "repeat | space | round | no-repeat" ) . braces ( 1 , 2 ) ) ,
556
+
557
+ "<shadow>" :
558
+ //inset? && [ <length>{2,4} && <color>? ]
559
+ Matcher . many ( [ true /* length is required */ ] ,
560
+ Matcher . cast ( "<length>" ) . braces ( 2 , 4 ) , "inset" , "<color>" ) ,
561
+
562
+ "<x-one-radius>" :
563
+ //[ <length> | <percentage> ] [ <length> | <percentage> ]?
564
+ Matcher . cast ( "<length> | <percentage>" ) . braces ( 1 , 2 ) ,
565
+
566
+ "<flex>" :
567
+ // http://www.w3.org/TR/2014/WD-css-flexbox-1-20140325/#flex-property
568
+ // none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]
569
+ // Valid syntaxes, according to https://developer.mozilla.org/en-US/docs/Web/CSS/flex#Syntax
570
+ // * none
571
+ // * <flex-grow>
572
+ // * <flex-basis>
573
+ // * <flex-grow> <flex-basis>
574
+ // * <flex-grow> <flex-shrink>
575
+ // * <flex-grow> <flex-shrink> <flex-basis>
576
+ // * inherit
577
+ Matcher . alt ( "none" , "inherit" , Matcher . cast ( "<flex-grow>" ) . then ( Matcher . cast ( "<flex-shrink>" ) . question ( ) ) . oror ( "<flex-basis>" ) ) ,
578
+
579
+ "<text-decoration>" :
580
+ // none | [ underline || overline || line-through || blink ] | inherit
581
+ Matcher . oror ( "underline" , "overline" , "line-through" , "blink" )
782
582
}
783
583
} ;
0 commit comments