path-utils.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. function encodePagePath(path) {
  2. const paths = path.split('/');
  3. paths.forEach((item, index) => {
  4. paths[index] = encodeURIComponent(item);
  5. });
  6. return paths.join('/');
  7. }
  8. function encodePagesPath(pages) {
  9. pages.forEach((page) => {
  10. if (!page.path) {
  11. return;
  12. }
  13. page.path = encodePagePath(page.path);
  14. });
  15. return pages;
  16. }
  17. function matchSlashes(path) {
  18. // https://regex101.com/r/Z21fEd/5
  19. return path.match(/^((\/+)?(.+?))(\/+)?$/);
  20. }
  21. function hasHeadingSlash(path) {
  22. const match = matchSlashes(path);
  23. return (match[2] != null);
  24. }
  25. function hasTrailingSlash(path) {
  26. const match = matchSlashes(path);
  27. return (match[4] != null);
  28. }
  29. function addHeadingSlash(path) {
  30. if (path === '/') {
  31. return path;
  32. }
  33. if (!hasHeadingSlash(path)) {
  34. return `/${path}`;
  35. }
  36. return path;
  37. }
  38. function addTrailingSlash(path) {
  39. if (path === '/') {
  40. return path;
  41. }
  42. if (!hasTrailingSlash(path)) {
  43. return `${path}/`;
  44. }
  45. return path;
  46. }
  47. function removeTrailingSlash(path) {
  48. if (path === '/') {
  49. return path;
  50. }
  51. const match = matchSlashes(path);
  52. return match[1];
  53. }
  54. function normalizePath(path) {
  55. const match = matchSlashes(path);
  56. if (match == null) {
  57. return '/';
  58. }
  59. return `/${match[3]}`;
  60. }
  61. module.exports = {
  62. encodePagePath,
  63. encodePagesPath,
  64. hasHeadingSlash,
  65. hasTrailingSlash,
  66. addHeadingSlash,
  67. addTrailingSlash,
  68. removeTrailingSlash,
  69. normalizePath,
  70. };