From cb2ea5fa6eabace7af2441a2dd3bb43f5253327f Mon Sep 17 00:00:00 2001 From: Tilman Vatteroth Date: Sun, 21 Jun 2020 12:00:21 +0200 Subject: [PATCH] Add subnode renderer Signed-off-by: Tilman Vatteroth --- .../editor/markdown-renderer/markdown-renderer.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/editor/markdown-renderer/markdown-renderer.tsx b/src/components/editor/markdown-renderer/markdown-renderer.tsx index 2a3e8d552..23ffd2cf1 100644 --- a/src/components/editor/markdown-renderer/markdown-renderer.tsx +++ b/src/components/editor/markdown-renderer/markdown-renderer.tsx @@ -34,15 +34,16 @@ export interface MarkdownPreviewProps { content: string } -export type ComponentReplacer = (node: DomElement, counterMap: Map) => (ReactElement | undefined); +export type SubNodeConverter = (node: DomElement, index: number) => ReactElement +export type ComponentReplacer = (node: DomElement, counterMap: Map, nodeConverter: SubNodeConverter) => (ReactElement | undefined); const allComponentReplacers: ComponentReplacer[] = [getYouTubeReplacement, getVimeoReplacement, getGistReplacement, getPDFReplacement] type ComponentReplacer2Identifier2CounterMap = Map> -const tryToReplaceNode = (node: DomElement, componentReplacer2Identifier2CounterMap: ComponentReplacer2Identifier2CounterMap) => { +const tryToReplaceNode = (node: DomElement, componentReplacer2Identifier2CounterMap: ComponentReplacer2Identifier2CounterMap, nodeConverter: SubNodeConverter) => { return allComponentReplacers .map((componentReplacer) => { const identifier2CounterMap = componentReplacer2Identifier2CounterMap.get(componentReplacer) || new Map() - return componentReplacer(node, identifier2CounterMap) + return componentReplacer(node, identifier2CounterMap, nodeConverter) }) .find((replacement) => !!replacement) } @@ -86,7 +87,9 @@ const MarkdownRenderer: React.FC = ({ content }) => { const componentReplacer2Identifier2CounterMap = new Map>() const html: string = markdownIt.render(content) const transform: Transform = (node, index) => { - return tryToReplaceNode(node, componentReplacer2Identifier2CounterMap) || convertNodeToElement(node, index, transform) + const maybeReplacement = tryToReplaceNode(node, componentReplacer2Identifier2CounterMap, + (subNode, subIndex) => convertNodeToElement(subNode, subIndex, transform)) + return maybeReplacement || convertNodeToElement(node, index, transform) } return ReactHtmlParser(html, { transform: transform }) }, [content, markdownIt])