move-list-search-actions-to-end.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * 将 queryForm 内带 list-search-actions 的块移到 </el-form> 前,使搜索按钮靠右对齐。
  3. * Usage: node scripts/move-list-search-actions-to-end.js [viewsDir]
  4. */
  5. const fs = require('fs')
  6. const path = require('path')
  7. const viewsDir = process.argv[2]
  8. ? path.resolve(process.argv[2])
  9. : path.join(__dirname, '../src/views')
  10. function walk(dir, files = []) {
  11. for (const name of fs.readdirSync(dir)) {
  12. const full = path.join(dir, name)
  13. if (fs.statSync(full).isDirectory()) walk(full, files)
  14. else if (name.endsWith('.vue')) files.push(full)
  15. }
  16. return files
  17. }
  18. function normalizeActionsBlock(block) {
  19. // el-col 改为 template,避免嵌套 el-row 时破坏 el-form-item 布局
  20. return block
  21. .replace(/<el-col\b([^>]*)>/g, '<template$1>')
  22. .replace(/<\/el-col>/g, '</template>')
  23. }
  24. function moveSearchActionsToEnd(content) {
  25. const queryIdx = content.indexOf('ref="queryForm"')
  26. if (queryIdx < 0 || !content.includes('list-search-actions')) return content
  27. const formOpenStart = content.lastIndexOf('<el-form', queryIdx)
  28. const formCloseStart = content.indexOf('</el-form>', queryIdx)
  29. if (formOpenStart < 0 || formCloseStart < 0) return content
  30. const before = content.slice(0, formOpenStart)
  31. const formTagEnd = content.indexOf('>', formOpenStart) + 1
  32. const formOpenTag = content.slice(formOpenStart, formTagEnd)
  33. let formBody = content.slice(formTagEnd, formCloseStart)
  34. const after = content.slice(formCloseStart)
  35. const actionsRe = /<el-form-item\b[^>]*\blist-search-actions\b[^>]*>[\s\S]*?<\/el-form-item>\s*/g
  36. const actions = []
  37. formBody = formBody.replace(actionsRe, (m) => {
  38. actions.push(normalizeActionsBlock(m.replace(/\s+$/, '')))
  39. return ''
  40. })
  41. if (actions.length === 0) return content
  42. formBody = formBody.replace(/\n{3,}/g, '\n\n').replace(/\s+$/, '')
  43. const actionsBlock = '\n' + actions.join('\n') + '\n'
  44. return before + formOpenTag + formBody + actionsBlock + after
  45. }
  46. let changed = 0
  47. for (const file of walk(viewsDir)) {
  48. const original = fs.readFileSync(file, 'utf8')
  49. const next = moveSearchActionsToEnd(original)
  50. if (next !== original) {
  51. fs.writeFileSync(file, next, 'utf8')
  52. changed++
  53. console.log(path.relative(viewsDir, file))
  54. }
  55. }
  56. console.log('\nMoved list-search-actions in ' + changed + ' files')