/** * @author suxiaoxin */ const aUniqueVerticalStringNotFoundInData = '___UNIQUE_VERTICAL___'; const aUniqueCommaStringNotFoundInData = '___UNIQUE_COMMA___'; const segmentSeparateChar = '|'; const methodAndArgsSeparateChar = ':'; const argsSeparateChar = ','; const md5 = require('md5'); const sha = require('sha.js'); const Base64 = require('js-base64').Base64; const stringHandles = { md5: function(str) { return md5(str); }, sha: function(str, arg) { return sha(arg) .update(str) .digest('hex'); }, /** * type: sha1 sha224 sha256 sha384 sha512 */ sha1: function(str) { return sha('sha1') .update(str) .digest('hex'); }, sha224: function(str) { return sha('sha224') .update(str) .digest('hex'); }, sha256: function(str) { return sha('sha256') .update(str) .digest('hex'); }, sha384: function(str) { return sha('sha384') .update(str) .digest('hex'); }, sha512: function(str) { return sha('sha512') .update(str) .digest('hex'); }, base64: function(str) { return Base64.encode(str); }, unbase64: function(str) { return Base64.decode(str); }, substr: function(str, ...args) { return str.substr(...args); }, concat: function(str, ...args) { args.forEach(item => { str += item; }); return str; }, lconcat: function(str, ...args) { args.forEach(item => { str = item + this._string; }); return str; }, lower: function(str) { return str.toLowerCase(); }, upper: function(str) { return str.toUpperCase(); }, length: function(str) { return str.length; }, number: function(str) { return !isNaN(str) ? +str : str; } }; let handleValue = function(str) { return str; }; const _handleValue = function(str) { if (str[0] === str[str.length - 1] && (str[0] === '"' || str[0] === "'")) { str = str.substr(1, str.length - 2); } return handleValue( str .replace(new RegExp(aUniqueVerticalStringNotFoundInData, 'g'), segmentSeparateChar) .replace(new RegExp(aUniqueCommaStringNotFoundInData, 'g'), argsSeparateChar) ); }; class PowerString { constructor(str) { this._string = str; } toString() { return this._string; } } function addMethod(method, fn) { PowerString.prototype[method] = function(...args) { args.unshift(this._string + ''); this._string = fn.apply(this, args); return this; }; } function importMethods(handles) { for (let method in handles) { addMethod(method, handles[method]); } } importMethods(stringHandles); function handleOriginStr(str, handleValueFn) { if (!str) return str; if (typeof handleValueFn === 'function') { handleValue = handleValueFn; } str = str .replace('\\' + segmentSeparateChar, aUniqueVerticalStringNotFoundInData) .replace('\\' + argsSeparateChar, aUniqueCommaStringNotFoundInData) .split(segmentSeparateChar) .map(handleSegment) .reduce(execute, null) .toString(); return str; } function execute(str, curItem, index) { if (index === 0) { return new PowerString(curItem); } return str[curItem.method].apply(str, curItem.args); } function handleSegment(str, index) { str = str.trim(); if (index === 0) { return _handleValue(str); } let method, args = []; if (str.indexOf(methodAndArgsSeparateChar) > 0) { str = str.split(methodAndArgsSeparateChar); method = str[0].trim(); args = str[1].split(argsSeparateChar).map(item => _handleValue(item.trim())); } else { method = str; } if (typeof stringHandles[method] !== 'function') { throw new Error(`This method name(${method}) is not exist.`); } return { method, args }; } module.exports = { utils: stringHandles, PowerString, /** * 类似于 angularJs的 filter 功能 * @params string * @params fn 处理参数值函数,默认是一个返回原有参数值函数 * * @expamle * filter('string | substr: 1, 10 | md5 | concat: hello ') */ filter: handleOriginStr };