mirror of
https://github.com/ant-design/ant-design.git
synced 2024-11-25 19:50:05 +08:00
cbcfd38ca7
* build: try to use dumi as doc tool
* docs: migrate demo structure to dumi way
* refactor: use type export & import
* docs: migrate demo previewer to dumi
* docs: create empty layout & components
* docs: apply custom rehype plugin
* docs: create empty extra pages
* docs: Add Banner component
* chore: move theme tsconfig.json
* docs: home page init
* docs: migrate header (#37896)
* docs: header
* docs: update
* docs: home init
* clean up
* test: fix site lint
* chore: tsc ignore demo
* chore: dumi demo migrate script
* chore: cards
* docs: home layout
* docs: Update locale logic
* docs: fix getLink logic
* chore: fix ci (#37899)
* chore: fix ci
* ci: remove check-ts-demo
* ci: preview build
* test: ignore demo.tsx
* chore: update script
* test: update snapshot
* test: update node and image test
* chore: add .surgeignore
* docs: layout providers (#37908)
* docs: add components sidebar (#37923)
* docs: sidebar
* docs: update docs title
* docs: update design doc
* chore: code clean
* docs: handle changelog page
* docs: add title
* docs: add subtitle
* docs: active header nav
* chore: code clean
* docs: overview
* chore: code clean
* docs: update intl (#37918)
* docs: update intl
* chore: code clean
* docs: update favicons
* chore: update testPathIgnorePatterns
* chore: code clean
* chore: code clean
* chore: copy 404.html (#37996)
* docs: Home page theme picker
* chore: Update migrate script
* docs: home page update
* docs: theme editor style
* docs: theme lang
* chore: update migrate.js
* docs: fix demo (#38094)
* chore: update migrate.js
* docs: update md
* docs: update demo
* test: fix snapshot
* chore: move debug to code attr in migrate script
* chore: update md
Co-authored-by: PeachScript <scdzwyxst@gmail.com>
* feat: overview page
* feat: Migrate `404` page (#38118)
* feat: migrate IconSearch component (#37916)
* feat<site/IconSearch>: copy IconDisplay from site to .dumi
* feat<site/IconSearch>: change docs of icon
* feat<site/IconSearch>: tweak
* feat<site/IconSearch>: use useIntl instead of injectIntl
* feat<site/IconSearch>: fix ts type error
* feat<site/IconSearch>: use intl.formatMessage to render text
* docs: Adjust home btn sizw
* docs: Update doc
* feat: v5 site overview page (#38131)
* feat: site
* fix: fix
* feat: v5 site overview page
* fix: fix path
* fix: fix
* fix: fix
* docs: fix margin logic
* feat: v5 site change-log page (#38137)
* feat: v5 site change-log page (#38162)
* docs: site redirect to home pag
* docs: theme picker
* docs: use react-intl from dumi (#38183)
* docs: Theme Picker
* docs: update dumi config
* docs: home back fix
* docs: picker colorful
* docs: locale of it
* docs: update components desc
* docs: site of links
* docs: update components list
* docs: update desc
* feat: Migrate `DemoWrapper` component (#38166)
* feat: Migrate `DemoWrapper` component
* feat: remove invalid comments and add comment for `key` prop
* docs: FloatButton pure panel
* chore: update demo
* chore: update dumi config
* Revert "chore: update demo"
This reverts commit 028265d3ba
.
* chore: test logic adjust to support cnpm modules
* chore: add locale alias
* docs: /index to /
* docs: add locale redirect head script
* chore: adjust compact
* docs: fix missing token
* feat: compact switch
* chore: code clean
* docs: update home
* docs: fix radius token
* docs: hash of it
* chore: adjust home page
* docs: Add background map
* docs: site theme bac logic
* docs: avatar
* docs: update logo color
* docs: home banner
* docs: adjust tour size
* docs: purepanl update
* docs: transfooter
* docs: update banner gif
* docs: content (#38361)
* docs: title & EditButton
* docs: content
* chore: fix toc
* docs: resource page
* docs: transform resource data from hast
* docs: filename & Resource Card
* chore: enable prerender
* chore: remove less
* docs: toc style
* chore: fix lint
* docs: fix Layout page
* docs: fix CP page
* chore: update demos
* docs: workaround for export dynamic html
* chore: enable demo eslint
* docs: table style
* fix: header shadow
* chore: update snapshot
* fix: toc style
* docs: add title
* docs: Adjust site
* feat: helmet
* docs: site css
* fix: description
* feat: toc debug
* docs: update config-provider
* feat: use colorPanel
* fix: colorPanel value
* feat: anchor ink ball style
* feat: apply theme editor
* fix: code block style
* chore: update demo
* chore: fix lint
* chore: code clean
* chore: update snapshot
* feat: ts2js
* chore: description
* docs: site ready for ssr
includes:
- move client render logic to useEffect in site theme
- extract antd cssinjs to a single css file like bisheng
- workaround to support react@18 pipeableStream for emotion
* chore: bump testing lib
* docs: font size of title
* chore: remove react-sortable-hoc
* chore: update snapshot
* chore: update script
Co-authored-by: PeachScript <scdzwyxst@gmail.com>
Co-authored-by: MadCcc <1075746765@qq.com>
Co-authored-by: zqran <uuxnet@gmail.com>
Co-authored-by: TrickyPi <530257315@qq.com>
Co-authored-by: lijianan <574980606@qq.com>
207 lines
6.5 KiB
JavaScript
207 lines
6.5 KiB
JavaScript
/* 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;
|
||
//
|
||
// const files = glob
|
||
// .sync(path.join(tmpFolder, `components/**`))
|
||
// .filter(file => file.endsWith('.md'));
|
||
// log('存在 ~demo 文件夹,先做迁移', files.length, '个文件');
|
||
//
|
||
// files.forEach(file => {
|
||
// const filePath = file.split(path.sep).splice(1).join(path.sep);
|
||
// if (fs.statSync(filePath).isDirectory()) {
|
||
// return;
|
||
// }
|
||
//
|
||
// if (!filePath.startsWith('components')) {
|
||
// throw new Error('Tmp demo path not correct');
|
||
// }
|
||
//
|
||
// 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 {
|
||
// fs.copyFileSync(file, filePath);
|
||
// }
|
||
//
|
||
// if (filePath.includes('demo')) {
|
||
// demoFileCount += 1;
|
||
// } else {
|
||
// apiFileCount += 1;
|
||
// }
|
||
// });
|
||
//
|
||
// log('迁移完成,共迁移文件数:', apiFileCount, '个介绍文档', demoFileCount, '个 demo');
|
||
// }
|
||
|
||
// ==============================================================================
|
||
// 有一部分转换需要 hardcode,这里就不做分析简单替换了
|
||
function hardcodeMD(content) {
|
||
return content.replace(/```.*\n.*IconDisplay.*\n.*mountNode.*\n```/, '<IconSearch></IconSearch>');
|
||
}
|
||
|
||
// 重新生成所有的 Demo 文件
|
||
const componentsPath = path.join(__dirname, '../components');
|
||
const components = fs
|
||
.readdirSync(componentsPath)
|
||
.filter(d => fs.existsSync(path.join(componentsPath, d, 'demo')));
|
||
|
||
components.forEach(component => {
|
||
const demoPath = path.join(componentsPath, component, 'demo');
|
||
const demos = fs.readdirSync(demoPath).filter(demo => demo.endsWith('.md'));
|
||
const codes = demos
|
||
.filter(demo => {
|
||
const mdPath = path.join(demoPath, demo);
|
||
const md = fs.readFileSync(mdPath, 'utf-8');
|
||
return md.match(/^(---[^]+?\n---)\s+([^]+?)?\s+(```(?:tsx|jsx)[^]+?\n```)([^]*)$/);
|
||
})
|
||
.map(demo => {
|
||
const mdPath = path.join(demoPath, demo);
|
||
const md = fs.readFileSync(mdPath, 'utf-8');
|
||
const [, frontmatter, content, code, extra] = md.match(
|
||
/^(---[^]+?\n---)\s+([^]+?)?\s+(```(?:tsx|jsx)[^]+?\n```)([^]*)$/,
|
||
);
|
||
const meta = yaml.load(frontmatter.replace(/^---|---$/g, ''));
|
||
const name = path.basename(demo, '.md');
|
||
|
||
return {
|
||
name,
|
||
meta,
|
||
html: {
|
||
'zh-CN': `<code src="./demo/${name}.tsx"${meta.debug ? ' debug' : ''}${
|
||
meta.iframe ? ' iframe' : ''
|
||
}>${meta.title['zh-CN']}</code>`,
|
||
'en-US': `<code src="./demo/${name}.tsx"${meta.debug ? ' debug' : ''}${
|
||
meta.iframe ? ' iframe' : ''
|
||
}>${meta.title['en-US']}</code>`,
|
||
},
|
||
md: content + extra,
|
||
code: code.replace(/^```(tsx|jsx)\n|```$/g, ''),
|
||
};
|
||
})
|
||
.sort((a, b) => a.meta.order - b.meta.order);
|
||
const zhPath = path.join(componentsPath, component, 'index.zh-CN.md');
|
||
const enPath = path.join(componentsPath, component, 'index.en-US.md');
|
||
const zh = fs.readFileSync(zhPath, 'utf-8');
|
||
const en = fs.readFileSync(enPath, 'utf-8');
|
||
|
||
// if (!/cols: /.test(zh)) {
|
||
// zh = zh.replace(/(\n---)/, '\ndemo:\n cols: 2$1');
|
||
// }
|
||
//
|
||
// if (!/cols: /.test(en)) {
|
||
// en = en.replace(/(\n---)/, '\ndemo:\n cols: 2$1');
|
||
// }
|
||
|
||
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/, '');
|
||
|
||
fs.writeFileSync(zhPath, hardcodeMD(zhContent), 'utf-8');
|
||
|
||
// 英文
|
||
const enContent = en
|
||
.replace(/(\n## api)/i, `${codes.map(code => code.html['en-US']).join('\n')}$1`)
|
||
.replace(/\ncols: 2(.*?)(\n---)/, '$1\ndemo:\n cols: 2$2')
|
||
.replace(/\ncols: 1/, '');
|
||
|
||
fs.writeFileSync(enPath, hardcodeMD(enContent), 'utf-8');
|
||
|
||
log('写入', component, 'demo & demo md...');
|
||
codes.forEach(code => {
|
||
// const extraMeta = Object.keys(code.meta).filter(
|
||
// key => !['title', 'order', 'debug'].includes(key),
|
||
// );
|
||
|
||
// if (extraMeta.length) {
|
||
// log('写入额外的 meta', code.meta);
|
||
// code.code = `/*\n${extraMeta.map(key => ` * ${key}: ${code.meta[key]}`).join('\n')}\n */\n\n${
|
||
// code.code
|
||
// }`;
|
||
// }
|
||
|
||
let importReactContent = "import React from 'react';";
|
||
|
||
const importReactReg = /import React(\D*)from 'react';\n/;
|
||
const matchImportReact = code.code.match(importReactReg);
|
||
if (matchImportReact) {
|
||
[importReactContent] = matchImportReact;
|
||
code.code = code.code.replace(importReactReg, '').trim();
|
||
}
|
||
fs.writeFileSync(
|
||
path.join(demoPath, `${code.name}.tsx`),
|
||
`${importReactContent}${code.code}\n`,
|
||
'utf-8',
|
||
);
|
||
if (code.md.trim()) {
|
||
fs.writeFileSync(path.join(demoPath, `${code.name}.md`), code.md, 'utf-8');
|
||
} else {
|
||
fs.unlinkSync(path.join(demoPath, `${code.name}.md`));
|
||
}
|
||
});
|
||
});
|