/* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) SPDX-License-Identifier: AGPL-3.0-only */ import MarkdownIt from 'markdown-it' import React, { ReactElement, RefObject, useMemo, useRef } from 'react' import { Alert } from 'react-bootstrap' import ReactHtmlParser from 'react-html-parser' import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' import { ApplicationState } from '../../redux' import { ShowIf } from '../common/show-if/show-if' import './markdown-renderer.scss' import { ComponentReplacer } from './replace-components/ComponentReplacer' import { AdditionalMarkdownRendererProps, LineKeys } from './types' import { buildTransformer } from './utils/html-react-transformer' import { calculateNewLineNumberMapping } from './utils/line-number-mapping' export interface BasicMarkdownRendererProps { componentReplacers?: () => ComponentReplacer[], markdownIt: MarkdownIt, documentReference?: RefObject onBeforeRendering?: () => void } export const BasicMarkdownRenderer: React.FC = ({ className, content, wide, componentReplacers, markdownIt, documentReference, onBeforeRendering }) => { const maxLength = useSelector((state: ApplicationState) => state.config.maxDocumentLength) const oldMarkdownLineKeys = useRef() const lastUsedLineId = useRef(0) const markdownReactDom: ReactElement[] = useMemo(() => { if (onBeforeRendering) { onBeforeRendering() } const trimmedContent = content.substr(0, maxLength) const html: string = markdownIt.render(trimmedContent) const contentLines = trimmedContent.split('\n') const { lines: newLines, lastUsedLineId: newLastUsedLineId } = calculateNewLineNumberMapping(contentLines, oldMarkdownLineKeys.current ?? [], lastUsedLineId.current) oldMarkdownLineKeys.current = newLines lastUsedLineId.current = newLastUsedLineId const transformer = componentReplacers ? buildTransformer(newLines, componentReplacers()) : undefined return ReactHtmlParser(html, { transform: transformer }) }, [onBeforeRendering, content, maxLength, markdownIt, componentReplacers]) return (
maxLength}>
{markdownReactDom}
) }