helpers.js 3.95 KB
/**
 * Handlebars helpers
 * bikai kai.bi@yoho.cn
 * 2016-05-10
 */
'use strict';
const querystring = require('querystring');
const _ = require('lodash');
const moment = require('moment');
const config = require('../config/common');

/**
 * 七牛图片路径处理
 * @param  {[string]} url
 * @param  {[string]} width
 * @param  {[string]} height
 * @param  {[string]} mode
 * @return {[string]}
 */
exports.image = (url, width, height, mode) => {
    mode = _.isNumber(mode) ? mode : 2;
    url = url || '';
    return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
};

/**
 * 条件判断
 * @param  {[string]} v1
 * @param  {[string]} v2
 * @param  {[object]} options 上下文环境,一般不手动传
 * @return {[boolen]}
 */
exports.isEqual = (v1, v2, _options) => {
    if (_.isEqual(v1, v2)) {
         return _options.fn(this); // eslint-disable-line
    }

     return _options.inverse(this); // eslint-disable-line
};

/**
 * 站内地址格式化
 * @param  {[string]} uri 路径
 * @param  {[object]} qs 查询字符串
 * @param  {[string]} module 模块
 * @return {[string]}
 */
exports.urlFormat = (uri, qs, module) => {
    const subDomain = '.yohobuy.com';
    const subName = {
        default: config.siteUrl,
        guang: `//guang${subDomain}`,
        list: `//list${subDomain}`,
        search: `//search${subDomain}`,
        huodong: `//huodong${subDomain}`,
        activity: '//activity.yohobuy.com',
        index: config.siteUrl
    };
    let url;

    module = module || 'default';
    if (subName[module]) {
        url = subName[module];
    } else {
        url = `//${module}${subDomain}`; // 规则没匹配到就把模块当作子域名
    }

    url += uri;
    if (qs) {
        url += `?${querystring.stringify(qs)}`;
    }

    return url;
};


/**
 * 大写转小写处理
 * @param  {[string]} str 转换字符
 */
exports.lowerCase = (str) => {
    str = str || '';
    return str.toLowerCase();
};

/**
 * 小写转大写处理
 * @param  {[string]} str 转换字符
 */
exports.upperCase = (str) => {
    str = str || '';
    return str.toUpperCase();
};

/**
 * 四舍五入
 * @param  {[type]} num 数字
 * @param  {[type]} precision 精度
 * @return {[type]}
 */
exports.round = (num, precision) => {
    precision = _.isNumber(precision) ? precision : 2;
    num = _.isInteger(num) ? (+num).toFixed(precision) : _.round(num, precision);
    return num;
};

/**
 * 时间格式化
 * @param format 格式化token @see{http://momentjs.cn/docs/#/displaying/format/}
 * @param date 日期或者数字
 * @return string
 *
 */
exports.dateFormat = (format, date) => {
    if (typeof format !== 'string' || typeof date === 'undefined') {
        return '';
    } else {
        if (date instanceof Date) {
            return moment(date).format(format);
        } else {
            const d = moment.unix(date);

            return moment(d).utc().format(format);
        }
    }
};

/**
 * 时间差格式化
 * @param {[string]} format 格式化字符串
 * @param {[number]} diff 相差值
 * @param {[string]} type diff时间类型 默认ms
 *
 *          Key                Shorthand
 *           years              y
 *           quarters           Q
 *           months             M
 *           weeks              w
 *           days               d
 *           hours              h
 *           minutes            m
 *           seconds            s
 *           milliseconds       ms
 *
 * @example
 *  let diff = 60 * 60 * 24 * (1.3) + 2;
 *
 *  let s = helpers.dateDiffFormat('{d}天{h}小时', diff, 's');
 *  >>> 1天7小时
 */
exports.dateDiffFormat = (format, diff, type) => {
    if (typeof format !== 'string' || typeof diff === 'undefined') {
        return '';
    } else {
        type = type || 'ms';
        const m = moment.duration(diff, type);

        format.match(/(\{.*?\})/g).forEach((s) => {
            format = format.replace(s, m.get(s.substring(1, s.length - 1)));
        });

        return format;
    }
};