parse-path-string.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  2. var SPACES = '\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029';
  3. var PATH_COMMAND = new RegExp('([a-z])[' + SPACES + ',]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[' + SPACES + ']*,?[' + SPACES + ']*)+)', 'ig');
  4. var PATH_VALUES = new RegExp('(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[' + SPACES + ']*,?[' + SPACES + ']*', 'ig');
  5. // Parses given path string into an array of arrays of path segments
  6. module.exports = function parsePathString(pathString) {
  7. if (!pathString) {
  8. return null;
  9. }
  10. if ((typeof pathString === 'undefined' ? 'undefined' : _typeof(pathString)) === _typeof([])) {
  11. return pathString;
  12. }
  13. var paramCounts = {
  14. a: 7,
  15. c: 6,
  16. o: 2,
  17. h: 1,
  18. l: 2,
  19. m: 2,
  20. r: 4,
  21. q: 4,
  22. s: 4,
  23. t: 2,
  24. v: 1,
  25. u: 3,
  26. z: 0
  27. };
  28. var data = [];
  29. String(pathString).replace(PATH_COMMAND, function (a, b, c) {
  30. var params = [];
  31. var name = b.toLowerCase();
  32. c.replace(PATH_VALUES, function (a, b) {
  33. b && params.push(+b);
  34. });
  35. if (name === 'm' && params.length > 2) {
  36. data.push([b].concat(params.splice(0, 2)));
  37. name = 'l';
  38. b = b === 'm' ? 'l' : 'L';
  39. }
  40. if (name === 'o' && params.length === 1) {
  41. data.push([b, params[0]]);
  42. }
  43. if (name === 'r') {
  44. data.push([b].concat(params));
  45. } else {
  46. while (params.length >= paramCounts[name]) {
  47. data.push([b].concat(params.splice(0, paramCounts[name])));
  48. if (!paramCounts[name]) {
  49. break;
  50. }
  51. }
  52. }
  53. });
  54. return data;
  55. };