pretty.mjs 2.3 KB

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