1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import * as React from 'react';
- import BaseComponent from '../_base/baseComponent';
- import CodeHighlightFoundation, {
- CodeHighlightAdapter,
- CodeHighlightBaseProps,
- CodeHighlightBaseState,
- } from '@douyinfe/semi-foundation/codeHighlight';
- import { CSSProperties } from 'react';
- import "@douyinfe/semi-foundation/codeHighlight/codeHighlight.scss";
- import { getDefaultPropsFromGlobalConfig } from '../_utils';
- import PropTypes from 'prop-types';
- import cls from "classnames";
- import { cssClasses } from "@douyinfe/semi-foundation/codeHighlight/constants";
- interface CodeHighlightProps extends CodeHighlightBaseProps {
- className?: string;
- style?: CSSProperties;
- defaultTheme?: boolean
- }
- interface CodeHighlightState extends CodeHighlightBaseState {
- }
- class CodeHighlight extends BaseComponent<CodeHighlightProps, CodeHighlightState> {
- codeRef = React.createRef<HTMLElement>()
- foundation = new CodeHighlightFoundation(this.adapter)
- static __SemiComponentName__ = "CodeHighlight";
- static propTypes = {
- className: PropTypes.string,
- style: PropTypes.any,
- code: PropTypes.string,
- language: PropTypes.string,
- lineNumber: PropTypes.bool,
- defaultTheme: PropTypes.bool,
- }
- static defaultProps = getDefaultPropsFromGlobalConfig(CodeHighlight.__SemiComponentName__, {
- lineNumber: true,
- defaultTheme: true
- })
- constructor(props: CodeHighlightProps) {
- super(props);
- this.state = {};
- }
- get adapter(): CodeHighlightAdapter<CodeHighlightProps, CodeHighlightState> {
- return {
- ...super.adapter
- };
- }
- componentDidMount() {
- super.componentDidMount();
- if (this.codeRef.current) {
- this.foundation.highlightCode(this.codeRef.current, this.props.language);
- }
- }
- componentDidUpdate(prevProps: Readonly<CodeHighlightProps>, prevState: Readonly<CodeHighlightState>, snapshot?: any) {
- if (this.codeRef.current && prevProps.code !== this.props.code || this.props.language !== this.props.language) {
- this.foundation.highlightCode(this.codeRef.current, this.props.language);
- }
- }
- render() {
- return <div style={this.props.style} className={cls(this.props.className, cssClasses.PREFIX, "semi-light-scrollbar", { [`${cssClasses.PREFIX}-defaultTheme`]: this.props.defaultTheme })} {...this.getDataAttr(this.props)}>
- <pre>
- <code ref={this.codeRef}>
- {this.props.code}
- </code>
- </pre>
- </div>;
- }
- }
- export default CodeHighlight;
|