patch-say-inline-drawer.cjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const fs = require("fs");
  2. const path = require("path");
  3. const file = path.join(__dirname, "../src/components/say.vue");
  4. let s = fs.readFileSync(file, "utf8");
  5. const startToken = ' <el-drawer v-model="drawerVisible"';
  6. const start = s.indexOf(startToken);
  7. const tmplEnd = s.indexOf("</template>");
  8. if (start === -1 || tmplEnd === -1) throw new Error("markers not found");
  9. const drawersSection = s.slice(start, tmplEnd).trimEnd();
  10. function drawerToInline(elBlock, showExpr) {
  11. const lines = elBlock.split("\n");
  12. const openRe = /^(\s*)<el-drawer\b[^>]*>/;
  13. const closeRe = /<\/el-drawer>\s*$/;
  14. const mOpen = elBlock.match(openRe);
  15. if (!mOpen) throw new Error("no el-drawer open");
  16. let inner = elBlock.replace(openRe, "").replace(closeRe, "").trimEnd();
  17. inner = inner.replace(
  18. /<template #header>\s*/,
  19. '<div class="el-drawer__header">\n'
  20. );
  21. inner = inner.replace(/<\/template>/, "</div>");
  22. const pad = " ";
  23. const innerIndented = inner
  24. .split("\n")
  25. .map((ln) => (ln.trim() ? pad + ln.replace(/^\s{2}/, "") : ln))
  26. .join("\n");
  27. return [
  28. ` <div v-show="${showExpr}" class="say-inline-drawer-root">`,
  29. innerIndented,
  30. ` </div>`,
  31. ].join("\n");
  32. }
  33. const splitRe =
  34. /\n <el-drawer v-model="drawerVisible"[\s\S]*?<\/el-drawer>\n\n <el-drawer v-model="knowledgeVisible"[\s\S]*?<\/el-drawer>\n\n <el-drawer v-model="bgDetailVisible"[\s\S]*?<\/el-drawer>\n\n <el-drawer v-model="keywordVisible"[\s\S]*?<\/el-drawer>/;
  35. const m = drawersSection.match(splitRe);
  36. if (!m) throw new Error("could not split four drawers");
  37. const full = m[0];
  38. const parts = full.split(/\n\n <el-drawer /).map((chunk, idx) => {
  39. if (idx === 0) return chunk;
  40. return " <el-drawer " + chunk;
  41. });
  42. if (parts.length !== 4) throw new Error("expected 4 drawers got " + parts.length);
  43. const inlinePanels = [
  44. drawerToInline(parts[0], "drawerVisible"),
  45. drawerToInline(parts[1], "knowledgeVisible"),
  46. drawerToInline(parts[2], "bgDetailVisible"),
  47. drawerToInline(parts[3], "keywordVisible"),
  48. ].join("\n\n");
  49. const overlayDrawers = parts
  50. .map((p) =>
  51. p.replace(/^(\s*)<el-drawer\b/, '$1<el-drawer v-if="!useInlineDrawers"')
  52. )
  53. .join("\n\n");
  54. const replacement = [
  55. ` <Teleport v-if="useInlineDrawers" :to="inlineDrawerTeleportTo">`,
  56. inlinePanels,
  57. ` </Teleport>`,
  58. ``,
  59. ` <template v-if="!useInlineDrawers">`,
  60. overlayDrawers.replace(/^/gm, " "),
  61. ` </template>`,
  62. ``,
  63. ].join("\n");
  64. const out = s.slice(0, start) + replacement + s.slice(tmplEnd);
  65. fs.writeFileSync(file, out);
  66. console.log("patched", file);