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 1291         1                 245 245   245   40   205   92   113   3   110   18   92   7 7   7 14   85   3 1 2 1 1 1         82       163             40 40   40 6     40                     18   18   9 9 2     9 9 1     9 9   9   9   8 24   4         9 22       18             12 12        
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.Parser.parse(str);
      return this._render(asts);
    }
  });
};