1
0

index.tsx 2.6 KB

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