index.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 '../_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. remarkPlugins: PropTypes.arrayOf(PropTypes.object),
  37. rehypePlugins: PropTypes.arrayOf(PropTypes.object),
  38. }
  39. static __SemiComponentName__ = "MarkdownRender";
  40. static defaultProps = getDefaultPropsFromGlobalConfig(MarkdownRender.__SemiComponentName__, {
  41. format: "mdx"
  42. })
  43. componentDidUpdate(prevProps: Readonly<MarkdownRenderProps>, prevState: Readonly<MarkdownRenderState>, snapshot?: any) {
  44. if (prevProps.raw !== this.props.raw) {
  45. this.setState({ MDXContentComponent: this.foundation.evaluateSync(this.props.raw) });
  46. }
  47. }
  48. get adapter(): MarkdownRenderAdapter<MarkdownRenderProps, MarkdownRenderState> {
  49. return {
  50. ...super.adapter,
  51. getRuntime: ()=>runtime
  52. };
  53. }
  54. render() {
  55. const ComponentConstructor = this.state.MDXContentComponent;
  56. return <div className={cls(cssClasses.PREFIX, this.props.className)} style={this.props.style} {...this.getDataAttr()}>
  57. <ComponentConstructor components={{ ...SemiMarkdownComponents, ...this.props.components }} />
  58. </div>;
  59. }
  60. static defaultComponents = SemiMarkdownComponents;
  61. }
  62. export default MarkdownRender;