helper.js 4.2 KB
/**
 * Created by LiuChuanYang on 2017/01/19.
 */


'use strict';

/**
 * and 逻辑运算
 * {{and arg1 arg2 ...}}
 * {{#and arg1 arg2 ...}}{{/and}}
 * @returns {*}
 */
exports.and = function() {

    let options = arguments[arguments.length - 1];
    let ret = false;
    let len = arguments.length - 1;
    let i = 1;

    if (len > 0) {
        ret = arguments[0];
        while (i < len) {
            ret = ret && arguments[i];
            i++;
        }
    }

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * or 逻辑运算 {{or arg1 arg2 ... }}
 * @returns {*}
 */
exports.or = function() {
    let options = arguments[arguments.length - 1];
    let ret = false;
    let len = arguments.length - 1;
    let i = 1;

    if (len > 0) {
        ret = arguments[0];
        while (i < len) {
            ret = ret || arguments[i];
            i++;
        }
    }

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * 大于逻辑  v1 > v2
 * @param v1
 * @param v2
 * @param options
 * @returns {*}
 */
exports.gt = function(v1, v2, options) {
    var ret = v1 > v2;

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            // 不满足条件执行{{else}}部分
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * 大于等于逻辑 v1 >= v2
 * @param v1
 * @param v2
 * @param options
 * @returns {*}
 */
exports.ge = function(v1, v2, options) {
    var ret = v1 >= v2;

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            // 不满足条件执行{{else}}部分
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * 小于逻辑 v1 < v2
 * @param v1
 * @param v2
 * @param options
 * @returns {*}
 */
exports.lt = function(v1, v2, options) {
    var ret = v1 < v2;

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            // 不满足条件执行{{else}}部分
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * 小于等于逻辑 v1 <= v2
 * @param v1
 * @param v2
 * @param options
 * @returns {*}
 */
exports.le = function(v1, v2, options) {
    var ret = v1 <= v2;

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            // 不满足条件执行{{else}}部分
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

/**
 * 相等逻辑 v1 === v2
 * @param v1
 * @param v2
 * @param options
 * @returns {*}
 */
exports.eq = function(v1, v2, options) {
    var ret = v1 === v2;

    if (options.fn) {
        if (ret) {
            return options.fn(this);
        } else {
            // 不满足条件执行{{else}}部分
            return options.inverse(this);
        }
    } else {
        return ret;
    }
};

exports.if_cond = function(left, operator, right, options) {
    switch (operator) {
        case '==':
            return (left == right) ? options.fn(this) : options.inverse(this); // eslint-disable-line
        case '!=':
            return (left != right) ? options.fn(this) : options.inverse(this); // eslint-disable-line
        case '===':
            return (left === right) ? options.fn(this) : options.inverse(this);
        case '<':
            return (left < right) ? options.fn(this) : options.inverse(this);
        case '<=':
            return (left <= right) ? options.fn(this) : options.inverse(this);
        case '>':
            return (left > right) ? options.fn(this) : options.inverse(this);
        case '>=':
            return (left >= right) ? options.fn(this) : options.inverse(this);
        case '&&':
            return (left && right) ? options.fn(this) : options.inverse(this);
        case '||':
            return (left || right) ? options.fn(this) : options.inverse(this);
        default:
            return options.inverse(this);
    }
};