helper.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import path from 'path'
  2. import {
  3. arrayToRegExp,
  4. getTypeSymbol,
  5. hyphenate,
  6. isCommonType,
  7. isUnionType,
  8. main,
  9. } from 'components-helper'
  10. import {
  11. epOutput,
  12. epPackage,
  13. getPackageManifest,
  14. projRoot,
  15. } from '@kankan/build-utils'
  16. import type { TaskFunction } from 'gulp'
  17. import type {
  18. ReAttribute,
  19. ReComponentName,
  20. ReDocUrl,
  21. ReWebTypesSource,
  22. ReWebTypesType,
  23. } from 'components-helper'
  24. const typeMap = {
  25. vue: ['Component', 'VNode', 'CSSProperties', 'StyleValue'],
  26. }
  27. const reComponentName: ReComponentName = (title) =>
  28. `el-${hyphenate(title).replace(/[ ]+/g, '-')}`
  29. const reDocUrl: ReDocUrl = (fileName, header) => {
  30. const docs = 'https://element-plus.org/en-US/component/'
  31. const _header = header ? header.replaceAll(/\s+/g, '-').toLowerCase() : ''
  32. return `${docs}${fileName}.html${_header ? '#' : ''}${_header}`
  33. }
  34. const reWebTypesSource: ReWebTypesSource = (title) => {
  35. const symbol = `El${title
  36. .replaceAll(/-/g, ' ')
  37. .replaceAll(/^\w|\s+\w/g, (item) => {
  38. return item.trim().toUpperCase()
  39. })}`
  40. return { symbol }
  41. }
  42. const reAttribute: ReAttribute = (value, key) => {
  43. const str = value
  44. .replace(/^\*\*(.*)\*\*$/, '$1')
  45. .replace(/^`(.*)`$/, '$1')
  46. .replace(/^~~(.*)~~$/, '')
  47. .replaceAll(/<del>.*<\/del>/g, '')
  48. if (key === 'Name' && /^(-|—)$/.test(str)) {
  49. return 'default'
  50. } else if (str === '' || /^(-|—)$/.test(str)) {
  51. return undefined
  52. } else if (key === 'Name' && /v-model:(.+)/.test(str)) {
  53. const _str = str.match(/v-model:(.+)/)
  54. return _str ? _str[1] : undefined
  55. } else if (key === 'Name' && /v-model/.test(str)) {
  56. return 'model-value'
  57. } else if (key === 'Name') {
  58. return str
  59. .replaceAll(/\s*[\\*]\s*/g, '')
  60. .replaceAll(/\s*<.*>\s*/g, '')
  61. .replaceAll(/\s*\(.*\)\s*/g, '')
  62. .replaceAll(/\B([A-Z])/g, '-$1')
  63. .toLowerCase()
  64. } else if (key === 'Type') {
  65. return str
  66. .replaceAll(/\bfunction(\(.*\))?(:\s*\w+)?\b/gi, 'Function')
  67. .replaceAll(/\bdate\b/g, 'Date')
  68. .replaceAll(/\([^)]*\)(?!\s*=>)/g, '')
  69. .replaceAll(/(<[^>]*>|\{[^}]*}|\([^)]*\))/g, (item) => {
  70. return item.replaceAll(/(\/|\|)/g, '=_0!')
  71. })
  72. .replaceAll(/(\b\w+)\s*\|/g, '$1 /')
  73. .replaceAll(/\|\s*(\b\w+)/g, '/ $1')
  74. .replaceAll(/=_0!/g, '|')
  75. } else if (key === 'Accepted Values') {
  76. return /\[.+\]\(.+\)/.test(str) || /^\*$/.test(str)
  77. ? undefined
  78. : str.replaceAll(/`/g, '').replaceAll(/\([^)]*\)(?!\s*=>)/g, '')
  79. } else if (key === 'Subtags') {
  80. return str
  81. ? `el-${str
  82. .replaceAll(/\s*\/\s*/g, '/el-')
  83. .replaceAll(/\B([A-Z])/g, '-$1')
  84. .replaceAll(/\s+/g, '-')
  85. .toLowerCase()}`
  86. : undefined
  87. } else {
  88. return str
  89. }
  90. }
  91. const reWebTypesType: ReWebTypesType = (type) => {
  92. const isPublicType = isCommonType(type)
  93. const symbol = getTypeSymbol(type)
  94. const isUnion = isUnionType(symbol)
  95. const module = findModule(symbol)
  96. return isPublicType || !symbol || isUnion
  97. ? type
  98. : { name: type, source: { symbol, module } }
  99. }
  100. const findModule = (type: string): string | undefined => {
  101. let result: string | undefined = undefined
  102. for (const key in typeMap) {
  103. const regExp = arrayToRegExp(typeMap[key as keyof typeof typeMap])
  104. const inModule = regExp.test(getTypeSymbol(type))
  105. if (inModule) {
  106. result = key
  107. break
  108. }
  109. }
  110. return result
  111. }
  112. export const buildHelper: TaskFunction = (done) => {
  113. const { name, version } = getPackageManifest(epPackage)
  114. const tagVer = process.env.TAG_VERSION
  115. const _version = tagVer
  116. ? tagVer.startsWith('v')
  117. ? tagVer.slice(1)
  118. : tagVer
  119. : version!
  120. main({
  121. name: name!,
  122. version: _version,
  123. entry: `${path.resolve(
  124. projRoot,
  125. 'docs/en-US/component'
  126. )}/!(datetime-picker|message-box|message).md`,
  127. outDir: epOutput,
  128. reComponentName,
  129. reDocUrl,
  130. reWebTypesSource,
  131. reAttribute,
  132. reWebTypesType,
  133. props: 'Attributes',
  134. propsOptions: 'Accepted Values',
  135. tableRegExp:
  136. /#+\s+(.*\s*Attributes|.*\s*Events|.*\s*Slots|.*\s*Directives)\s*\n+(\|?.+\|.+)\n\|?\s*:?-+:?\s*\|.+((\n\|?.+\|.+)+)/g,
  137. })
  138. done()
  139. }