migrate_camel_front.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # -*- coding: utf-8 -*-
  2. """前端驼峰迁移:src 下 .vue/.js 的全小写 snake_case 标识符 -> 驼峰。
  3. .vue 只处理 <template> 与 <script>,跳过 <style>。
  4. 排除清单:证书文件名、路由枚举值、CSS 类名、import 路径、第三方 SDK 字段、
  5. 前端框架自身配置 key、localStorage key、短信场景枚举值 —— 这些不是接口字段。
  6. """
  7. import re
  8. from pathlib import Path
  9. ROOT = Path(r"F:\shop\yoshop2.0-store")
  10. SRC = ROOT / "src"
  11. EXCLUDE = {
  12. # 微信支付证书文件名(文案)
  13. "apiclient_cert", "apiclient_key",
  14. # 商品列表 listType 枚举值(路由 query,前后端约定值)
  15. "on_sale", "off_sale", "sold_out",
  16. # CSS 类名片段
  17. "text_right",
  18. # import 路径(文件名)
  19. "lazy_use",
  20. # 第三方(云存储/短信/支付)固定字段
  21. "access_key", "access_key_id", "access_key_secret",
  22. "secret_id", "secret_key", "pub_key",
  23. # 前端框架自身配置 / localStorage key(与后端接口无关)
  24. "multi_tab", "fixed_header", "fixed_sidebar", "sidebar_type",
  25. "nav_theme", "content_width", "auto_hide_header",
  26. "app_language", "app_theme", "is_mobile",
  27. "region_tree", "order_export_form",
  28. # 短信场景枚举值
  29. "order_pay",
  30. }
  31. SNAKE = re.compile(r'\b([a-z]+(_[a-z0-9]+)+)\b')
  32. def to_camel(s):
  33. return re.sub(r'_([a-z0-9])', lambda m: m.group(1).upper(), s)
  34. def convert_vue(text):
  35. """按 <template>/<script>/<style> 分段,只处理前两者。"""
  36. parts = re.split(r'(<style[^>]*>[\s\S]*?</style>)', text)
  37. out = []
  38. for p in parts:
  39. if p.startswith("<style"):
  40. out.append(p)
  41. else:
  42. out.append(SNAKE.sub(snake_repl, p))
  43. return "".join(out)
  44. def snake_repl(m):
  45. t = m.group(1)
  46. if t in EXCLUDE:
  47. return t
  48. return to_camel(t)
  49. changed = []
  50. total = 0
  51. for f in sorted(list(SRC.rglob("*.vue")) + list(SRC.rglob("*.js"))):
  52. text = f.read_text(encoding="utf-8", errors="replace")
  53. new = convert_vue(text) if f.suffix == ".vue" else SNAKE.sub(snake_repl, text)
  54. if new != text:
  55. n = sum(1 for a, b in zip(text.split("\n"), new.split("\n")) if a != b)
  56. total += len(SNAKE.findall(re.sub(r'|'.join(map(lambda e: re.escape(e), EXCLUDE)), '', new)))
  57. f.write_text(new, encoding="utf-8", newline="")
  58. changed.append((str(f.relative_to(ROOT)), n))
  59. print("改动 %d 个文件" % len(changed))
  60. for name, n in sorted(changed, key=lambda x: -x[1])[:20]:
  61. print(" %-64s ~%d 行" % (name, n))