index.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import * as React from 'react';
  2. import BaseComponent from '../_base/baseComponent';
  3. import MarkdownRenderFoundation, {
  4. MarkdownRenderAdapter,
  5. MarkdownRenderBaseProps,
  6. MarkdownRenderBaseState,
  7. } from '@douyinfe/semi-foundation/markdownRender/foundation';
  8. import "@douyinfe/semi-foundation/markdownRender/markdownRender.scss";
  9. import { CSSProperties } from 'react';
  10. import * as runtime from 'react/jsx-runtime';
  11. import { cssClasses } from '@douyinfe/semi-foundation/markdownRender/constants';
  12. import * as SemiMarkdownComponents from "./components";
  13. import cls from "classnames";
  14. import PropTypes from 'prop-types';
  15. import { getDefaultPropsFromGlobalConfig } from '@douyinfe/semi-ui/_utils';
  16. export interface MarkdownRenderProps extends MarkdownRenderBaseProps{
  17. style?: CSSProperties;
  18. className?: string
  19. }
  20. export interface MarkdownRenderState extends MarkdownRenderBaseState{
  21. }
  22. class MarkdownRender extends BaseComponent<MarkdownRenderProps, MarkdownRenderState> {
  23. foundation = new MarkdownRenderFoundation(this.adapter)
  24. constructor(props: MarkdownRenderProps) {
  25. super(props);
  26. this.state = {
  27. MDXContentComponent: this.foundation.evaluateSync(this.props.raw)
  28. };
  29. }
  30. static propTypes = {
  31. className: PropTypes.string,
  32. style: PropTypes.object,
  33. format: PropTypes.string,
  34. components: PropTypes.any,
  35. raw: PropTypes.string
  36. }
  37. static __SemiComponentName__ = "MarkdownRender";
  38. static defaultProps = getDefaultPropsFromGlobalConfig(MarkdownRender.__SemiComponentName__, {
  39. format: "mdx"
  40. })
  41. componentDidUpdate(prevProps: Readonly<MarkdownRenderProps>, prevState: Readonly<MarkdownRenderState>, snapshot?: any) {
  42. if (prevProps.raw !== this.props.raw) {
  43. this.setState({ MDXContentComponent: this.foundation.evaluateSync(this.props.raw) });
  44. }
  45. }
  46. get adapter(): MarkdownRenderAdapter<MarkdownRenderProps, MarkdownRenderState> {
  47. return {
  48. ...super.adapter,
  49. getRuntime: ()=>runtime
  50. };
  51. }
  52. render() {
  53. const ComponentConstructor = this.state.MDXContentComponent;
  54. return <div className={cls(cssClasses.PREFIX, this.props.className)} style={this.props.style}>
  55. <ComponentConstructor components={{ ...SemiMarkdownComponents, ...this.props.components }} />
  56. </div>;
  57. }
  58. }
  59. export default MarkdownRender;