@@ -576,14 +576,14 @@ module.exports = function (Twig) {
576
576
} ,
577
577
{
578
578
type : Twig . expression . type . slice ,
579
- regex : / ^ \[ ( \d * : \d * ) \] / ,
579
+ regex : / ^ \[ ( - ? \w * : - ? \w * ) \] / ,
580
580
next : Twig . expression . set . operationsExtended ,
581
581
compile ( token , stack , output ) {
582
582
const sliceRange = token . match [ 1 ] . split ( ':' ) ;
583
583
584
584
// SliceStart can be undefined when we pass parameters to the slice filter later
585
- const sliceStart = ( sliceRange [ 0 ] ) ? parseInt ( sliceRange [ 0 ] , 10 ) : undefined ;
586
- const sliceEnd = ( sliceRange [ 1 ] ) ? parseInt ( sliceRange [ 1 ] , 10 ) : undefined ;
585
+ const sliceStart = sliceRange [ 0 ] ;
586
+ const sliceEnd = sliceRange [ 1 ] ;
587
587
588
588
token . value = 'slice' ;
589
589
token . params = [ sliceStart , sliceEnd ] ;
@@ -596,11 +596,39 @@ module.exports = function (Twig) {
596
596
597
597
output . push ( token ) ;
598
598
} ,
599
- parse ( token , stack ) {
599
+ parse ( token , stack , context ) {
600
600
const input = stack . pop ( ) ;
601
- const { params} = token ;
601
+ let { params} = token ;
602
602
const state = this ;
603
603
604
+ if ( parseInt ( params [ 0 ] , 10 ) . toString ( ) === params [ 0 ] ) {
605
+ params [ 0 ] = parseInt ( params [ 0 ] , 10 ) ;
606
+ } else {
607
+ const value = context [ params [ 0 ] ] ;
608
+ if ( state . template . options . strictVariables && value === undefined ) {
609
+ throw new Twig . Error ( 'Variable "' + params [ 0 ] + '" does not exist.' ) ;
610
+ }
611
+
612
+ params [ 0 ] = value ;
613
+ }
614
+
615
+ if ( params [ 1 ] ) {
616
+ if ( parseInt ( params [ 1 ] , 10 ) . toString ( ) === params [ 1 ] ) {
617
+ params [ 1 ] = parseInt ( params [ 1 ] , 10 ) ;
618
+ } else {
619
+ const value = context [ params [ 1 ] ] ;
620
+ if ( state . template . options . strictVariables && value === undefined ) {
621
+ throw new Twig . Error ( 'Variable "' + params [ 1 ] + '" does not exist.' ) ;
622
+ }
623
+
624
+ if ( value === undefined ) {
625
+ params = [ params [ 0 ] ] ;
626
+ } else {
627
+ params [ 1 ] = value ;
628
+ }
629
+ }
630
+ }
631
+
604
632
stack . push ( Twig . filter . call ( state , token . value , input , params ) ) ;
605
633
}
606
634
} ,
0 commit comments