@@ -11,8 +11,10 @@ var isArray = require('../type/isArray');
1111var isString = require ( '../type/isString' ) ;
1212var extend = require ( '../object/extend' ) ;
1313
14- var EXPRESSION_REGEXP = / { { \s ? ( \/ ? [ a - z A - Z 0 - 9 _ . @ [ \] ] + ) \s ? } } / g;
15- var BRACKET_REGEXP = / ^ ( [ a - z A - Z 0 - 9 _ @ ] + ) \[ ( [ a - z A - Z 0 - 9 _ @ ] + ) \] $ / ;
14+ var EXPRESSION_REGEXP = / { { \s ? ( \/ ? [ a - z A - Z 0 - 9 _ . @ [ \] " ' \- ] + ) \s ? } } / g;
15+ var BRACKET_REGEXP = / ^ ( [ a - z A - Z 0 - 9 _ @ ] + ) \[ ( [ a - z A - Z 0 - 9 _ @ " ' ] + ) \] $ / ;
16+ var DOT_REGEXP = / ^ ( [ a - z A - Z _ ] + ) \. ( [ a - z A - Z _ ] + ) $ / ;
17+ var STRING_REGEXP = / ^ [ " ' ] ( \w + ) [ " ' ] $ / ;
1618var NUMBER_REGEXP = / ^ - ? \d + \. ? \d * $ / ;
1719
1820var EXPRESSION_INTERVAL = 2 ;
@@ -30,17 +32,23 @@ var BLOCK_HELPERS = {
3032 * @returns {* }
3133 * @private
3234 */
35+ // eslint-disable-next-line complexity
3336function getValueFromContext ( exp , context ) {
34- var bracketExps ;
37+ var splitedExps ;
3538 var value = context [ exp ] ;
3639
3740 if ( exp === 'true' ) {
3841 value = true ;
3942 } else if ( exp === 'false' ) {
4043 value = false ;
44+ } else if ( STRING_REGEXP . test ( exp ) ) {
45+ value = STRING_REGEXP . exec ( exp ) [ 1 ] ;
4146 } else if ( BRACKET_REGEXP . test ( exp ) ) {
42- bracketExps = exp . split ( BRACKET_REGEXP ) ;
43- value = getValueFromContext ( bracketExps [ 1 ] , context ) [ getValueFromContext ( bracketExps [ 2 ] , context ) ] ;
47+ splitedExps = exp . split ( BRACKET_REGEXP ) ;
48+ value = getValueFromContext ( splitedExps [ 1 ] , context ) [ getValueFromContext ( splitedExps [ 2 ] , context ) ] ;
49+ } else if ( DOT_REGEXP . test ( exp ) ) {
50+ splitedExps = exp . split ( DOT_REGEXP ) ;
51+ value = getValueFromContext ( splitedExps [ 1 ] , context ) [ splitedExps [ 2 ] ] ;
4452 } else if ( NUMBER_REGEXP . test ( exp ) ) {
4553 value = parseFloat ( exp ) ;
4654 }
@@ -296,6 +304,10 @@ function compile(sources, context) {
296304 * <br>
297305 * If expression exists in the context, it will be replaced.
298306 * ex) '{{title}}' with context {title: 'Hello!'} is converted to 'Hello!'.
307+ * An array or object can be accessed using bracket and dot notation.
308+ * ex) '{{odds[2]}}' with context {odds: [1, 3, 5]} is converted to '5'.
309+ * ex) '{{evens[first]}}' with context {evens: [2, 4], first: 0} is converted to '2'.
310+ * ex) '{{project["name"]}}' and '{{project.name}}' with context {project: {name: 'CodeSnippet'}} is converted to 'CodeSnippet'.
299311 * <br>
300312 * If replaced expression is a function, next expressions will be arguments of the function.
301313 * ex) '{{add 1 2}}' with context {add: function(a, b) {return a + b;}} is converted to '3'.
0 commit comments