14
14
< link rel ="import " href ="../utils/path.html ">
15
15
<!-- for notify, reflect -->
16
16
< link rel ="import " href ="../utils/case-map.html ">
17
- < link rel ="import " href ="../utils/binding-parser.html ">
18
17
< link rel ="import " href ="property-accessors.html ">
19
18
<!-- for annotated effects -->
20
19
< link rel ="import " href ="template-stamp.html ">
802
801
803
802
const emptyArray = [ ] ;
804
803
804
+ // Regular expressions used for binding
805
+ const IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')' ;
806
+ const NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')' ;
807
+ const SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')' ;
808
+ const DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')' ;
809
+ const STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')' ;
810
+ const ARGUMENT = '(?:(' + IDENT + '|' + NUMBER + '|' + STRING + ')\\s*' + ')' ;
811
+ const ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')' ;
812
+ const ARGUMENT_LIST = '(?:' + '\\(\\s*' +
813
+ '(?:' + ARGUMENTS + '?' + ')' +
814
+ '\\)\\s*' + ')' ;
815
+ const BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')' ; // Group 3
816
+ const OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*' ;
817
+ const CLOSE_BRACKET = '(?:]]|}})' ;
818
+ const NEGATE = '(?:(!)\\s*)?' ; // Group 2
819
+ const EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET ;
820
+ const bindingRegex = new RegExp ( EXPRESSION , "g" ) ;
821
+
805
822
/**
806
823
* Create a string from binding parts of all the literal parts
807
824
*
2506
2523
* @protected
2507
2524
*/
2508
2525
static _parseBindings ( text , templateInfo ) {
2509
- const parserParts = Polymer . BindingParser . parse ( text , templateInfo ) ;
2510
- if ( parserParts . length ) {
2511
- return parserParts ;
2526
+ let parts = [ ] ;
2527
+ let lastIndex = 0 ;
2528
+ let m ;
2529
+ // Example: "literal1{{prop}}literal2[[!compute(foo,bar)]]final"
2530
+ // Regex matches:
2531
+ // Iteration 1: Iteration 2:
2532
+ // m[1]: '{{' '[['
2533
+ // m[2]: '' '!'
2534
+ // m[3]: 'prop' 'compute(foo,bar)'
2535
+ while ( ( m = bindingRegex . exec ( text ) ) !== null ) {
2536
+ // Add literal part
2537
+ if ( m . index > lastIndex ) {
2538
+ parts . push ( { literal : text . slice ( lastIndex , m . index ) } ) ;
2539
+ }
2540
+ // Add binding part
2541
+ let mode = m [ 1 ] [ 0 ] ;
2542
+ let negate = Boolean ( m [ 2 ] ) ;
2543
+ let source = m [ 3 ] . trim ( ) ;
2544
+ let customEvent = false , notifyEvent = '' , colon = - 1 ;
2545
+ if ( mode == '{' && ( colon = source . indexOf ( '::' ) ) > 0 ) {
2546
+ notifyEvent = source . substring ( colon + 2 ) ;
2547
+ source = source . substring ( 0 , colon ) ;
2548
+ customEvent = true ;
2549
+ }
2550
+ let signature = parseMethod ( source ) ;
2551
+ let dependencies = [ ] ;
2552
+ if ( signature ) {
2553
+ // Inline computed function
2554
+ let { args, methodName} = signature ;
2555
+ for ( let i = 0 ; i < args . length ; i ++ ) {
2556
+ let arg = args [ i ] ;
2557
+ if ( ! arg . literal ) {
2558
+ dependencies . push ( arg ) ;
2559
+ }
2560
+ }
2561
+ let dynamicFns = templateInfo . dynamicFns ;
2562
+ if ( dynamicFns && dynamicFns [ methodName ] || signature . static ) {
2563
+ dependencies . push ( methodName ) ;
2564
+ signature . dynamicFn = true ;
2565
+ }
2566
+ } else {
2567
+ // Property or path
2568
+ dependencies . push ( source ) ;
2569
+ }
2570
+ parts . push ( {
2571
+ source, mode, negate, customEvent, signature, dependencies,
2572
+ event : notifyEvent
2573
+ } ) ;
2574
+ lastIndex = bindingRegex . lastIndex ;
2575
+ }
2576
+ // Add a final literal part
2577
+ if ( lastIndex && lastIndex < text . length ) {
2578
+ let literal = text . substring ( lastIndex ) ;
2579
+ if ( literal ) {
2580
+ parts . push ( {
2581
+ literal : literal
2582
+ } ) ;
2583
+ }
2584
+ }
2585
+ if ( parts . length ) {
2586
+ return parts ;
2512
2587
} else {
2513
2588
return null ;
2514
2589
}
2615
2690
} ;
2616
2691
2617
2692
} ) ( ) ;
2618
- </ script >
2693
+ </ script >
0 commit comments