
remark-react-docgen
remark plugin to transform React component to Markdown by react-docgen
Getting Started
yarn add -D remark-react-docgen
import * as remark from 'remark';
import * as reactDocgen from 'remark-react-docgen';
import * as vfile from 'to-vfile';
const doc = vfile.readSync('README.md');
console.log(remark().use(reactDocgen).processSync(doc).contents);
The Component Column.tsx
import * as React from "react";
export interface IColumnProps {
prop1?: string;
prop2: number;
prop3: () => void;
prop4: "option1" | "option2" | "option3";
}
export class Column extends React.Component<IColumnProps> {
static defaultProps = {
prop1: "red",
};
render() {
return <div>Test</div>;
}
}
Convert the following Markdown:
# foo-components
## API
[Column](./Column.tsx "react-docgen:")
Into
# foo-components
## API
### Column
Form column.
#### Props
| Name | Type | Default value | Description |
| ------------------ | ----------------------------------- | ------------- | ------------------------ |
| prop1 | string | "red" | prop1 description |
| prop2 _(required)_ | number | | prop2 description |
| prop3 _(required)_ | () => void | | prop3 description a \| b |
| prop4 _(required)_ | "option1" \| "option2" \| "option3" | | prop4 description 中文 |
Options
remark().use(reactDocgen[, options])
render
Custom document rendering
import * as remark from 'remark';
import * as reactDocgen from 'remark-react-docgen';
import { ReactDocgenRender } from 'remark-react-docgen/build/types';
import * as vfile from 'to-vfile';
import * as stringWidth from 'string-width';
import { tableMdastBuilder } from 'react-docgen-markdown-render';
const tableRender = (doc: DocumentationObject): Table => {
const dataSource = Object.keys(doc.props).map(name => ({...doc.props[name], name}));
return tableMdastBuilder(dataSource, [
{ title: '属性', render: (vo) => u('strong', [u('text', vo.name)]) },
{ title: '描述', render: (vo) => vo.description,},
{ title: '类型', render: (vo) => u('inlineCode', generatePropType(vo)) },
{ title: '默认值', render: (vo) => vo.defaultValue ? vo.defaultValue.value : '-' },
])
};
const render: ReactDocgenRender = (docs) => u('root', docs.map(vo => tableRender(vo)));
const doc = vfile.readSync('README.md');
const { contents } = remark()
.use({
settings: { stringLength: stringWidth }
})
.use(reactDocgen, { render })
.processSync(doc);
console.log(contents);
License
Licensed under the APLv2. See the LICENSE file for details.