pretty.cjs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. 'use strict';
  2. const skipTags = ["script", "style"];
  3. function prettifySVG(content, tab = " ", depth = 0) {
  4. let result = "";
  5. let level = 0;
  6. content = content.replace(/(\s)*\/>/g, " />");
  7. while (content.length > 0) {
  8. const openIndex = content.indexOf("<");
  9. let closeIndex = content.indexOf(">");
  10. if (openIndex === -1 && closeIndex === -1) {
  11. return result;
  12. }
  13. if (openIndex === -1 || closeIndex === -1 || closeIndex < openIndex) {
  14. return null;
  15. }
  16. const text = content.slice(0, openIndex);
  17. const trimmedText = text.trim();
  18. if (trimmedText.length) {
  19. if (text.trimStart() !== text && text.trimEnd() !== text) {
  20. result += trimmedText + "\n" + tab.repeat(level + depth);
  21. } else {
  22. result = result.trim() + text;
  23. }
  24. }
  25. content = content.slice(openIndex);
  26. closeIndex -= openIndex;
  27. const lastChar = content.slice(closeIndex - 1, closeIndex);
  28. const isClosing = content.slice(0, 2) === "</";
  29. let isSelfClosing = lastChar === "/" || lastChar === "?";
  30. if (isClosing && isSelfClosing) {
  31. return null;
  32. }
  33. const tagName = content.slice(isClosing ? 2 : 1).split(/[\s>]/).shift();
  34. const ignoreTagContent = !isSelfClosing && !isClosing && skipTags.includes(tagName);
  35. if (!ignoreTagContent) {
  36. const nextOpenIndex = content.indexOf("<", 1);
  37. if (nextOpenIndex !== -1 && nextOpenIndex < closeIndex) {
  38. return null;
  39. }
  40. }
  41. if (isClosing && tab.length) {
  42. if (result.slice(0 - tab.length) === tab) {
  43. result = result.slice(0, result.length - tab.length);
  44. }
  45. }
  46. result += content.slice(0, closeIndex + 1);
  47. content = content.slice(closeIndex + 1);
  48. if (ignoreTagContent) {
  49. const closingIndex = content.indexOf("</" + tagName);
  50. const closingEnd = content.indexOf(">", closingIndex);
  51. if (closingIndex < 0 || closingEnd < 0) {
  52. return null;
  53. }
  54. result += content.slice(0, closingEnd + 1);
  55. content = content.slice(closingEnd + 1);
  56. isSelfClosing = true;
  57. }
  58. if (isClosing) {
  59. level--;
  60. if (level < 0) {
  61. return null;
  62. }
  63. } else if (!isSelfClosing) {
  64. level++;
  65. }
  66. result += "\n" + tab.repeat(level + depth);
  67. }
  68. return level === 0 ? result : null;
  69. }
  70. exports.prettifySVG = prettifySVG;