format.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import {arrayToString} from './array-to-string.js';
  2. import {valueToString} from './value-to-string.js';
  3. /**
  4. * Format - extended version of https://github.com/tmpfs/format-util
  5. *
  6. * native:
  7. * s - string
  8. * d - digits
  9. * j - json
  10. *
  11. * extras:
  12. * v - value (valueToString.js)
  13. * l - list (arrayToString.js)
  14. *
  15. * @param {*} pattern
  16. * @param {...*} args
  17. * @returns {string}
  18. */
  19. export function format(pattern, ...args) {
  20. if (pattern instanceof Date) {
  21. pattern = pattern.toISOString();
  22. } else if (typeof pattern !== 'string') {
  23. pattern = String(pattern);
  24. }
  25. const re = /(%?)(%([sdjvl]))/g;
  26. const argsQueue = [...args];
  27. if (argsQueue.length) {
  28. pattern = pattern.replace(re, function (match, escaped, ptn, flag) {
  29. let arg = argsQueue.shift();
  30. switch (flag) {
  31. case 's':
  32. arg = String(arg);
  33. break;
  34. case 'd':
  35. arg = Number(arg);
  36. break;
  37. case 'j':
  38. arg = JSON.stringify(arg);
  39. break;
  40. case 'v':
  41. arg = valueToString(arg);
  42. break;
  43. case 'l':
  44. arg = arrayToString(arg);
  45. break;
  46. }
  47. if (!escaped) return arg;
  48. argsQueue.unshift(arg);
  49. return match;
  50. });
  51. }
  52. // has arguments after interpolation
  53. if (argsQueue.length) pattern += ' ' + argsQueue.join(' ');
  54. // update escaped %% values
  55. pattern = pattern.replace(/%{2}/g, '%');
  56. return '' + pattern;
  57. }