Code coverage report for src/compile/literal.js

Statements: 100% (53 / 53)      Branches: 97.14% (34 / 35)      Functions: 100% (7 / 7)      Lines: 100% (51 / 51)      Ignored: none     

All files » src/compile/ » literal.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131  1         1                 261 261   261   47   214   92   122   3   119   18   101   8 8   8 16   93   3 1 2 1 1 1         90       171             47 47   47   6     47                     18   18   9 9 2     9 9 1     9 9   9   9   8 24   4         9 22       18             13 13        
'use strict';
module.exports = function(Velocity, utils) {
  /**
   * literal解释模块
   * @require {method} getReferences
   */
  utils.mixin(Velocity.prototype, {
    /**
     * 字面量求值,主要包括string, integer, array, map四种数据结构
     * @param literal {object} 定义于velocity.yy文件,type描述数据类型,value属性
     * 是literal值描述
     * @return {object|string|number|array}返回对应的js变量
     */
    getLiteral: function(literal) {
 
      var type = literal.type;
      var ret = '';
 
      if (type === 'string') {
 
        ret = this.getString(literal);
 
      } else if (type === 'integer') {
 
        ret = parseInt(literal.value, 10);
 
      } else if (type === 'decimal') {
 
        ret = parseFloat(literal.value, 10);
 
      } else if (type === 'array') {
 
        ret = this.getArray(literal);
 
      } else if (type === 'map') {
 
        ret = {};
        var map = literal.value;
 
        utils.forEach(map, function(exp, key) {
          ret[key] = this.getLiteral(exp);
        }, this);
      } else if (type === 'bool') {
 
        if (literal.value === "null") {
          ret = null;
        } else if (literal.value === 'false') {
          ret = false;
        } else Eif (literal.value === 'true') {
          ret = true;
        }
 
      } else {
 
        return this.getReferences(literal);
 
      }
 
      return ret;
    },
 
    /**
     * 对字符串求值,对已双引号字符串,需要做变量替换
     */
    getString: function(literal) {
      var val = literal.value;
      var ret = val;
 
      if (literal.isEval && (val.indexOf('#') !== -1 ||
            val.indexOf("$") !== -1)) {
        ret = this.evalStr(val);
      }
 
      return ret;
    },
 
    /**
     * 对array字面量求值,比如[1, 2]=> [1,2],[1..5] => [1,2,3,4,5]
     * @param literal {object} array字面量的描述对象,分为普通数组和range数组两种
     * ,和js基本一致
     * @return {array} 求值得到的数组
     */
    getArray: function(literal) {
 
      var ret = [];
 
      if (literal.isRange) {
 
        var begin = literal.value[0];
        if (begin.type === 'references') {
          begin = this.getReferences(begin);
        }
 
        var end = literal.value[1];
        if (end.type === 'references') {
          end = this.getReferences(end);
        }
 
        end   = parseInt(end, 10);
        begin = parseInt(begin, 10);
 
        var i;
 
        if (!isNaN(begin) && !isNaN(end)) {
 
          if (begin < end) {
            for (i = begin; i <= end; i++) ret.push(i);
          } else {
            for (i = begin; i >= end; i--) ret.push(i);
          }
        }
 
      } else {
        utils.forEach(literal.value, function(exp) {
          ret.push(this.getLiteral(exp));
        }, this);
      }
 
      return ret;
    },
 
    /**
     * 对双引号字符串进行eval求值,替换其中的变量,只支持最基本的变量类型替换
     */
    evalStr: function(str) {
      var asts = Velocity.parse(str);
      return this._render(asts);
    }
  });
};