mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-06 15:00:26 +08:00
feat: add power-string
This commit is contained in:
parent
017bec5d44
commit
2dea67c17f
178
common/power-string.js
Normal file
178
common/power-string.js
Normal file
@ -0,0 +1,178 @@
|
||||
/**
|
||||
* @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);
|
||||
},
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
||||
let handleValue = function(str){
|
||||
return str;
|
||||
}
|
||||
|
||||
const _handleValue = function(str){
|
||||
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];
|
||||
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 = {
|
||||
PowerString,
|
||||
/**
|
||||
* 类似于 angularJs的 filter 功能
|
||||
* @params string
|
||||
* @params fn 处理参数值函数,默认是一个返回原有参数值函数
|
||||
*
|
||||
* @expamle
|
||||
* filter('string | substr: 1, 10 | md5 | concat: hello ')
|
||||
*/
|
||||
filter: handleOriginStr
|
||||
};
|
||||
|
@ -21,6 +21,7 @@
|
||||
"axios": "^0.16.2",
|
||||
"deref": "^0.7.0",
|
||||
"fs-extra": "^3.0.1",
|
||||
"js-base64": "^2.3.2",
|
||||
"json-schema-ref-parser": "^4.0.0",
|
||||
"json5": "^0.5.1",
|
||||
"jsonwebtoken": "^7.4.1",
|
||||
@ -36,6 +37,7 @@
|
||||
"markdown-it": "^8.4.0",
|
||||
"markdown-it-anchor": "^4.0.0",
|
||||
"markdown-it-table-of-contents": "^0.3.2",
|
||||
"md5": "^2.2.1",
|
||||
"mockjs": "^1.0.1-beta3",
|
||||
"moment": "^2.18.1",
|
||||
"mongoose": "4.7.0",
|
||||
@ -43,6 +45,7 @@
|
||||
"nodemailer": "^4.0.1",
|
||||
"randexp": "^0.4.6",
|
||||
"request": "^2.81.0",
|
||||
"sha.js": "^2.4.9",
|
||||
"sha1": "^1.1.1",
|
||||
"tslib": "^1.8.0",
|
||||
"underscore": "^1.8.3",
|
||||
|
Loading…
x
Reference in New Issue
Block a user