format.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import {arrayToList} from './array-to-list.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 (arrayToList.js)
  14. *
  15. * @param {string} pattern
  16. * @return {string}
  17. */
  18. export function format(pattern) {
  19. if (pattern instanceof Date) {
  20. pattern = pattern.toISOString();
  21. } else if (typeof pattern !== 'string') {
  22. pattern = String(pattern);
  23. }
  24. const re = /(%?)(%([sdjvl]))/g;
  25. const args = Array.prototype.slice.call(arguments, 1);
  26. if (args.length) {
  27. pattern = pattern.replace(re, function (match, escaped, ptn, flag) {
  28. let arg = args.shift();
  29. switch (flag) {
  30. case 's':
  31. arg = String(arg);
  32. break;
  33. case 'd':
  34. arg = Number(arg);
  35. break;
  36. case 'j':
  37. arg = JSON.stringify(arg);
  38. break;
  39. case 'v':
  40. arg = valueToString(arg);
  41. break;
  42. case 'l':
  43. arg = arrayToList(arg);
  44. break;
  45. }
  46. if (!escaped) return arg;
  47. args.unshift(arg);
  48. return match;
  49. });
  50. }
  51. // arguments remain after formatting
  52. if (args.length) pattern += ' ' + args.join(' ');
  53. // update escaped %% values
  54. pattern = pattern.replace(/%{2}/g, '%');
  55. return '' + pattern;
  56. }