mock平台

power-string.js 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /**
  2. * @author suxiaoxin
  3. */
  4. const aUniqueVerticalStringNotFoundInData = '___UNIQUE_VERTICAL___';
  5. const aUniqueCommaStringNotFoundInData = '___UNIQUE_COMMA___';
  6. const segmentSeparateChar = '|';
  7. const methodAndArgsSeparateChar = ':';
  8. const argsSeparateChar = ',';
  9. const md5 = require('md5');
  10. const sha = require('sha.js');
  11. const Base64 = require('js-base64').Base64;
  12. const stringHandles = {
  13. md5: function(str) {
  14. return md5(str);
  15. },
  16. sha: function(str, arg) {
  17. return sha(arg)
  18. .update(str)
  19. .digest('hex');
  20. },
  21. /**
  22. * type: sha1 sha224 sha256 sha384 sha512
  23. */
  24. sha1: function(str) {
  25. return sha('sha1')
  26. .update(str)
  27. .digest('hex');
  28. },
  29. sha224: function(str) {
  30. return sha('sha224')
  31. .update(str)
  32. .digest('hex');
  33. },
  34. sha256: function(str) {
  35. return sha('sha256')
  36. .update(str)
  37. .digest('hex');
  38. },
  39. sha384: function(str) {
  40. return sha('sha384')
  41. .update(str)
  42. .digest('hex');
  43. },
  44. sha512: function(str) {
  45. return sha('sha512')
  46. .update(str)
  47. .digest('hex');
  48. },
  49. base64: function(str) {
  50. return Base64.encode(str);
  51. },
  52. unbase64: function(str) {
  53. return Base64.decode(str);
  54. },
  55. substr: function(str, ...args) {
  56. return str.substr(...args);
  57. },
  58. concat: function(str, ...args) {
  59. args.forEach(item => {
  60. str += item;
  61. });
  62. return str;
  63. },
  64. lconcat: function(str, ...args) {
  65. args.forEach(item => {
  66. str = item + this._string;
  67. });
  68. return str;
  69. },
  70. lower: function(str) {
  71. return str.toLowerCase();
  72. },
  73. upper: function(str) {
  74. return str.toUpperCase();
  75. },
  76. length: function(str) {
  77. return str.length;
  78. },
  79. number: function(str) {
  80. return !isNaN(str) ? +str : str;
  81. }
  82. };
  83. let handleValue = function(str) {
  84. return str;
  85. };
  86. const _handleValue = function(str) {
  87. if (str[0] === str[str.length - 1] && (str[0] === '"' || str[0] === "'")) {
  88. str = str.substr(1, str.length - 2);
  89. }
  90. return handleValue(
  91. str
  92. .replace(new RegExp(aUniqueVerticalStringNotFoundInData, 'g'), segmentSeparateChar)
  93. .replace(new RegExp(aUniqueCommaStringNotFoundInData, 'g'), argsSeparateChar)
  94. );
  95. };
  96. class PowerString {
  97. constructor(str) {
  98. this._string = str;
  99. }
  100. toString() {
  101. return this._string;
  102. }
  103. }
  104. function addMethod(method, fn) {
  105. PowerString.prototype[method] = function(...args) {
  106. args.unshift(this._string + '');
  107. this._string = fn.apply(this, args);
  108. return this;
  109. };
  110. }
  111. function importMethods(handles) {
  112. for (let method in handles) {
  113. addMethod(method, handles[method]);
  114. }
  115. }
  116. importMethods(stringHandles);
  117. function handleOriginStr(str, handleValueFn) {
  118. if (!str) return str;
  119. if (typeof handleValueFn === 'function') {
  120. handleValue = handleValueFn;
  121. }
  122. str = str
  123. .replace('\\' + segmentSeparateChar, aUniqueVerticalStringNotFoundInData)
  124. .replace('\\' + argsSeparateChar, aUniqueCommaStringNotFoundInData)
  125. .split(segmentSeparateChar)
  126. .map(handleSegment)
  127. .reduce(execute, null)
  128. .toString();
  129. return str;
  130. }
  131. function execute(str, curItem, index) {
  132. if (index === 0) {
  133. return new PowerString(curItem);
  134. }
  135. return str[curItem.method].apply(str, curItem.args);
  136. }
  137. function handleSegment(str, index) {
  138. str = str.trim();
  139. if (index === 0) {
  140. return _handleValue(str);
  141. }
  142. let method,
  143. args = [];
  144. if (str.indexOf(methodAndArgsSeparateChar) > 0) {
  145. str = str.split(methodAndArgsSeparateChar);
  146. method = str[0].trim();
  147. args = str[1].split(argsSeparateChar).map(item => _handleValue(item.trim()));
  148. } else {
  149. method = str;
  150. }
  151. if (typeof stringHandles[method] !== 'function') {
  152. throw new Error(`This method name(${method}) is not exist.`);
  153. }
  154. return {
  155. method,
  156. args
  157. };
  158. }
  159. module.exports = {
  160. utils: stringHandles,
  161. PowerString,
  162. /**
  163. * 类似于 angularJs的 filter 功能
  164. * @params string
  165. * @params fn 处理参数值函数,默认是一个返回原有参数值函数
  166. *
  167. * @expamle
  168. * filter('string | substr: 1, 10 | md5 | concat: hello ')
  169. */
  170. filter: handleOriginStr
  171. };