images.js 3.8 KB
/**
 * 图片处理
 * @author: 梁校松
 * @date: 2016/4/25
 */

'use strict';

const _ = require('lodash');

const defaultImage = '/2015/08/25/02/01dd632a6e07bfef457ce4beda21dd6413.png';
const qiniuDomain = 'yhfair.qiniudn.com';
const domainList = {
    '01': ['img10.static.yhbimg.com', 'img11.static.yhbimg.com'],
    '02': ['img12.static.yhbimg.com', 'img13.static.yhbimg.com'],
    'yhb-head': 'head.static.yhbimg.com'
};

const regexp = /(?:\{)([a-zA-z][^\s\}]+)(?:\})/g;

/**
 * 替换数据
 */
const myReplace = (tem, data) => {
    return tem.replace(regexp, (fullMatch, capture) => {
        if (data[capture]) {
            return data[capture];
        } else {
            return fullMatch;
        }
    });
};

/**
 * 获取url
 * @param { string } domain 主机
 * @param { string } key 路径
 * @return { string } url
 */
const makeBaseUrl = (domain, key) =>{
    encodeURIComponent(key).replace('%2F', '/');
    return `http://${domain}/${key}`;
};

/**
 * 设置url路径中变量的值
 * @param { string } url
 * @return { string } 处理后的url
 */
const makeTemplateRequest = url => {
    let ops = ['{mode}', 'w/{width}', 'h/{height}'];

    if (ops.length === 0) {
        return url;
    }

    return url + '?imageView/' + ops.join('/');
};

/**
 * 获取图片url模板
 * @param { string } fileName 文件名
 * @param { string } mode 模式
 * @param { string } domain 主机名
 * @return { string } 处理后的url
 */
const getImgTemplateUrl = (fileName, mode, domain) =>{
    let baseUrl;

    // 默认值
    if (!mode) {
        mode = 1;
    }
    if (!domain) {
        domain = null;
    }

    if (domain === null) {
        domain = qiniuDomain;
    }

    baseUrl = makeBaseUrl(domain, fileName);

    return makeTemplateRequest(baseUrl);
};

/**
 * 获取图片url中的主机名
 * @param { Object } bucket 对象
 * @param { string } fileName 文件名
 * @return { string } 主机名
 */
const getDomain = (bucket, fileName) => {
    let domain = '';

    if (bucket in domainList) {
        domain = domainList.bucket;
    } else {
        let node = fileName.substr(15, 2);

        if (node in domainList) {
            let urlList = domainList[node];
            let nodeNum = _.random(urlList.length - 1);

            domain = urlList[nodeNum];
        }
    }

    return domain;
};

/**
 * 获取图片url模板
 * @param { string } fileName 文件名
 * @param { Object } bucket 对象
 * @param { string } mode 模式
 * @return { string } url模板
 */
const url = (fileName, bucket, mode) =>{
    // 默认值
    if (!mode) {
        mode = 1;
    }
    if (!bucket) {
        bucket = 'yhfair';
    }

    let domain = getDomain(bucket, fileName);

    return getImgTemplateUrl(bucket + fileName, mode, domain);
};

/**
 * url的结构设置
 * @param { string } fileName 文件名
 * @param { object } bucket 对象
 * @param { string } mode 模式
 * @return { string } url
 */
const template = (fileName, bucket, mode) => {
    // 默认值
    if (!mode) {
        mode = 1;
    }
    if (!bucket) {
        bucket = 'yhfair';
    }

    return url(fileName, bucket, mode);
};


/**
 * 获取图片url
 * @param { string } fileName 文件名
 * @param { number } width 图片宽度
 * @param { number } height 图片高度
 * @param { string } mode 模式
 * @param { object } bucket 对象
 * @return { string } url
 */
const getImageUrl = (fileName, width, height, mode, bucket) => {
    // 默认值
    if (!mode) {
        mode = 2;
    }
    if (!bucket) {
        bucket = 'goodsimg';
    }

    if (typeof(fileName) !== 'string') {
        return template(defaultImage, bucket, mode);
    }
    if (fileName.indexOf('http://') !== 0) {
        fileName = template(fileName, bucket, mode);
    }
    return myReplace(fileName, {width: width, height: height, mode: mode});
};

module.exports = {
    getImageUrl
};