-
Notifications
You must be signed in to change notification settings - Fork 20
/
serialize.ts
50 lines (45 loc) · 1.52 KB
/
serialize.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { RichTextField } from "@prismicio/types";
import { RichTextFunctionSerializer, TreeNode } from "./types";
import { asTree } from "./asTree";
/**
* Serializes a rich text or title field with a given serializer
*
* @remarks
* This is a low level helper mainly intended to be used by higher level
* packages Most users aren't expected to this function directly
* @typeParam SerializerReturnType - Return type of the serializer
* @param richTextField - A rich text or title field from Prismic
* @param serializer - A function serializer to apply
*
* @returns An array of serialized nodes
* @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript}
*/
export const serialize = <SerializerReturnType>(
richTextField: RichTextField,
serializer: RichTextFunctionSerializer<SerializerReturnType>,
): SerializerReturnType[] => {
return serializeTreeNodes<SerializerReturnType>(
asTree(richTextField).children,
serializer,
);
};
const serializeTreeNodes = <T>(
nodes: TreeNode[],
serializer: RichTextFunctionSerializer<T>,
): T[] => {
const serializedTreeNodes: T[] = [];
for (let i = 0; i < nodes.length; i++) {
const treeNode = nodes[i];
const serializedTreeNode = serializer(
treeNode.type,
treeNode.node,
treeNode.text,
serializeTreeNodes(treeNode.children, serializer),
treeNode.key,
);
if (serializedTreeNode != null) {
serializedTreeNodes.push(serializedTreeNode);
}
}
return serializedTreeNodes;
};