text-clamp
Version:
处理文字超出最大行数显示...
127 lines (120 loc) • 3.02 kB
JavaScript
const fs = require('fs');
const path = require('path');
const rollup = require('rollup');
const uglify = require('uglify-js');
const zlib = require('zlib');
const mkdir=require('./utils/mkdir');
const generateConfig=require('./utils/generateConfig');
const resolve = require('./utils/resolve');
mkdir('dist');
build(generateConfig([{
input: resolve('src/clamp.js'),
name: 'clamp',
output: {
file: resolve('dist/clamp.js')
}
},{
input: resolve('src/clamp.js'),
name: 'clamp',
output: {
file: resolve('dist/clamp.min.js')
}
}]));
/**
* 生成文件
*
* @param {any} configTell Generator对象
*/
function build(configTell) {
let _config = configTell.next();
let config = _config.value;
if (!_config.done) {
buildEntry(config).then(() => {
build(configTell);
}).catch(logError);
}
}
/**
* build文件
*
* @param {Object} config build配置
* @returns {Promise}
*/
function buildEntry(config) {
let dest = config.output.file;
const isProd = /min\.js$/.test(dest);
return rollup.rollup(config).then((bundle) => {
const _generate = bundle.generate(config);
_generate.then(data => {
let code = data.code;
if (isProd) {
var minified = (config.banner ? config.banner + '\n' : '') + uglify.minify(code, {
output: {
ascii_only: true
},
compress: {
pure_funcs: ['makeMap']
}
}).code;
return write(dest, minified, true);
} else {
return write(dest, code);
}
});
}).catch(logError);
}
/**
* 写入文件
*
* @param {any} dest 存放目录
* @param {any} code 文件内容
* @param {any} zip 是否gzip压缩
* @returns {Promise}
*/
function write(dest, code, zip) {
return new Promise((resolve, reject) => {
var report = (extra) => {
console.log(green(path.relative(process.cwd(), dest)) + ' ' + getSize(code) + (extra || ''));
resolve();
};
fs.writeFile(dest, code, (err) => {
if (err) {
return reject(err);
}
if (zip) {
zlib.gzip(code, (err, zipped) => {
if (err) return reject(err);
report(' (gzipped: ' + getSize(zipped) + ')');
});
} else {
report();
}
});
});
}
/**
* 获取文件大小
*
* @param {any} code 文件内容
* @returns {String}
*/
function getSize(code) {
return (code.length / 1024).toFixed(2) + 'kb';
}
/**
* 字符绿色显示
*
* @param {String} str 字符串
* @returns {String}
*/
function green(str) {
return '\x1b[1m\x1b[32m' + str + '\x1b[39m\x1b[22m';
}
/**
* 打印错误日志
*
* @param {any} e 错误对象
*/
function logError(e) {
console.log(e);
}