import Tree from './tree'; import { Node, SpanNode, NodeElement } from './nodes'; import { RichTextBlock } from './richtext'; type Serializer = (type: string, element: NodeElement, text: string | null, children: T[], index: number) => T; function fromRichText(richText: RichTextBlock[], serialize: Serializer, htmlSerializer?: Serializer): T[] { const tree = Tree.fromRichText(richText); return tree.children.map((node: Node, index: number) => { return serializeNode(node, serialize, index, htmlSerializer); }); } function serializeNode(parentNode: Node, serializer: Serializer, index: number, htmlSerializer?: Serializer): T { function step(node: Node, idx: number): T { const text = node instanceof SpanNode ? node.text : null; const serializedChildren = node.children.reduce((acc: T[], node: Node, i: number) => { return acc.concat([step(node, i)]); }, []); const maybeSerialized = htmlSerializer && htmlSerializer(node.type, node.element, text, serializedChildren, idx); return maybeSerialized || serializer(node.type, node.element, text, serializedChildren, idx); } return step(parentNode, index); } export default fromRichText;