|
|
@ -1,12 +1,51 @@ |
|
|
|
/* eslint-disable no-console */ |
|
|
|
const fs = require('fs-extra'); |
|
|
|
const glob = require('glob'); |
|
|
|
const chalk = require('chalk'); |
|
|
|
const path = require('path'); |
|
|
|
const yaml = require('dumi/node_modules/js-yaml'); |
|
|
|
|
|
|
|
// 检查 ~demo 文件夹是否存在,存在则说明是来自 next 的合并
|
|
|
|
const tmpFolder = `~demo`; |
|
|
|
|
|
|
|
// ==============================================================================
|
|
|
|
// Log 先记录,flush 后才打印,以免打印过多无用信息
|
|
|
|
let consoleLines = []; |
|
|
|
let consoleOffset = 0; |
|
|
|
|
|
|
|
function logCache(...args) { |
|
|
|
consoleLines.push(args); |
|
|
|
} |
|
|
|
|
|
|
|
function logClear() { |
|
|
|
consoleLines = []; |
|
|
|
} |
|
|
|
|
|
|
|
function logFlush() { |
|
|
|
consoleLines.forEach(args => { |
|
|
|
const txt = args |
|
|
|
.map(arg => (arg && typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg)) |
|
|
|
.join(' '); |
|
|
|
const lines = txt.split(/[\n\r]+/); |
|
|
|
lines.forEach(line => { |
|
|
|
console.log(' '.repeat(consoleOffset), line); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
logClear(); |
|
|
|
} |
|
|
|
|
|
|
|
function log(...args) { |
|
|
|
logCache(...args); |
|
|
|
logFlush(); |
|
|
|
} |
|
|
|
|
|
|
|
function logOffset(offset) { |
|
|
|
consoleOffset = offset; |
|
|
|
} |
|
|
|
|
|
|
|
// ==============================================================================
|
|
|
|
// 执行迁移
|
|
|
|
if (fs.existsSync(tmpFolder)) { |
|
|
|
let demoFileCount = 0; |
|
|
|
let apiFileCount = 0; |
|
|
@ -14,7 +53,7 @@ if (fs.existsSync(tmpFolder)) { |
|
|
|
const files = glob |
|
|
|
.sync(path.join(tmpFolder, `components/**`)) |
|
|
|
.filter(file => file.endsWith('.md')); |
|
|
|
console.log('存在 ~demo 文件夹,先做迁移', files.length, '个文件'); |
|
|
|
log('存在 ~demo 文件夹,先做迁移', files.length, '个文件'); |
|
|
|
|
|
|
|
files.forEach(file => { |
|
|
|
const filePath = file.split(path.sep).splice(1).join(path.sep); |
|
|
@ -27,15 +66,17 @@ if (fs.existsSync(tmpFolder)) { |
|
|
|
} |
|
|
|
|
|
|
|
fs.ensureDirSync(path.dirname(filePath)); |
|
|
|
if (filePath.startsWith('components/overview')) { |
|
|
|
// overview 文件不需要迁移
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (filePath.endsWith('.en-US.md') || filePath.endsWith('.zh-CN.md')) { |
|
|
|
// 保留 meta 信息
|
|
|
|
const md = fs.readFileSync(filePath, 'utf-8'); |
|
|
|
const [, frontmatter] = md.match(/^(---[^]+?\n---)/); |
|
|
|
const legacyMD = fs.readFileSync(file, 'utf-8'); |
|
|
|
fs.writeFileSync(filePath, legacyMD.replace(/^(---[^]+?\n---)/, frontmatter)); |
|
|
|
} else if (filePath.startsWith('components/overview')) { |
|
|
|
// overview 文件不需要迁移
|
|
|
|
return; |
|
|
|
} else { |
|
|
|
fs.copyFileSync(file, filePath); |
|
|
|
} |
|
|
@ -47,7 +88,13 @@ if (fs.existsSync(tmpFolder)) { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
console.log('迁移完成,共迁移文件数:', apiFileCount, '个介绍文档', demoFileCount, '个 demo'); |
|
|
|
log('迁移完成,共迁移文件数:', apiFileCount, '个介绍文档', demoFileCount, '个 demo'); |
|
|
|
} |
|
|
|
|
|
|
|
// ==============================================================================
|
|
|
|
// 有一部分转换需要 hardcode,这里就不做分析简单替换了
|
|
|
|
function hardcodeMD(content) { |
|
|
|
return content.replace(/```.*\n.*IconDisplay.*\n.*mountNode.*\n```/, '<IconSearch></IconSearch>'); |
|
|
|
} |
|
|
|
|
|
|
|
// 重新生成所有的 Demo 文件
|
|
|
@ -98,46 +145,49 @@ components.forEach(component => { |
|
|
|
en = en.replace(/(\n---)/, '\ndemo:\n cols: 2$1'); |
|
|
|
} |
|
|
|
|
|
|
|
console.log('写入', component, 'md...'); |
|
|
|
fs.writeFileSync( |
|
|
|
zhPath, |
|
|
|
zh |
|
|
|
.replace( |
|
|
|
/(\n## api)/i, |
|
|
|
` |
|
|
|
logOffset(0); |
|
|
|
log(); |
|
|
|
log(chalk.yellow('Update', component, ':')); |
|
|
|
logOffset(1); |
|
|
|
|
|
|
|
// 中文
|
|
|
|
const zhContent = zh |
|
|
|
.replace( |
|
|
|
/(\n## api)/i, |
|
|
|
` |
|
|
|
## 代码演示 |
|
|
|
|
|
|
|
${codes.map(code => code.html['zh-CN']).join('\n')} |
|
|
|
$1`,
|
|
|
|
) |
|
|
|
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2') |
|
|
|
.replace(/\ncols: 1/, ''), |
|
|
|
'utf-8', |
|
|
|
); |
|
|
|
fs.writeFileSync( |
|
|
|
enPath, |
|
|
|
en |
|
|
|
.replace( |
|
|
|
/(\n## api)/i, |
|
|
|
` |
|
|
|
) |
|
|
|
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2') |
|
|
|
.replace(/\ncols: 1/, ''); |
|
|
|
|
|
|
|
fs.writeFileSync(zhPath, hardcodeMD(zhContent), 'utf-8'); |
|
|
|
|
|
|
|
// 英文
|
|
|
|
const enContent = en |
|
|
|
.replace( |
|
|
|
/(\n## api)/i, |
|
|
|
` |
|
|
|
## Examples |
|
|
|
|
|
|
|
${codes.map(code => code.html['en-US']).join('\n')} |
|
|
|
$1`,
|
|
|
|
) |
|
|
|
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2') |
|
|
|
.replace(/\ncols: 1/, ''), |
|
|
|
'utf-8', |
|
|
|
); |
|
|
|
) |
|
|
|
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2') |
|
|
|
.replace(/\ncols: 1/, ''); |
|
|
|
|
|
|
|
fs.writeFileSync(enPath, hardcodeMD(enContent), 'utf-8'); |
|
|
|
|
|
|
|
console.log('写入', component, 'demo & demo md...'); |
|
|
|
log('写入', component, 'demo & demo md...'); |
|
|
|
codes.forEach(code => { |
|
|
|
const extraMeta = Object.keys(code.meta).filter( |
|
|
|
key => !['title', 'order', 'debug'].includes(key), |
|
|
|
); |
|
|
|
|
|
|
|
if (extraMeta.length) { |
|
|
|
console.log('写入额外的 meta', code.meta); |
|
|
|
log('写入额外的 meta', code.meta); |
|
|
|
code.code = `/*\n${extraMeta.map(key => ` * ${key}: ${code.meta[key]}`).join('\n')}\n */\n\n${ |
|
|
|
code.code |
|
|
|
}`;
|
|
|
|