@portabletext/block-tools 4.1.8 → 4.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/_chunks-es/helpers.js +81 -9
  2. package/lib/_chunks-es/helpers.js.map +1 -1
  3. package/lib/index.js +14 -18
  4. package/lib/index.js.map +1 -1
  5. package/package.json +7 -10
  6. package/src/HtmlDeserializer/flatten-nested-blocks.test.ts +0 -248
  7. package/src/HtmlDeserializer/flatten-nested-blocks.ts +0 -173
  8. package/src/HtmlDeserializer/helpers.ts +0 -108
  9. package/src/HtmlDeserializer/index.ts +0 -315
  10. package/src/HtmlDeserializer/preprocessors/index.ts +0 -15
  11. package/src/HtmlDeserializer/preprocessors/preprocessor.gdocs.ts +0 -66
  12. package/src/HtmlDeserializer/preprocessors/preprocessor.html.ts +0 -57
  13. package/src/HtmlDeserializer/preprocessors/preprocessor.notion.ts +0 -25
  14. package/src/HtmlDeserializer/preprocessors/preprocessor.whitespace.ts +0 -56
  15. package/src/HtmlDeserializer/preprocessors/preprocessor.word.ts +0 -92
  16. package/src/HtmlDeserializer/preprocessors/xpathResult.ts +0 -13
  17. package/src/HtmlDeserializer/rules/index.ts +0 -21
  18. package/src/HtmlDeserializer/rules/rules.gdocs.ts +0 -188
  19. package/src/HtmlDeserializer/rules/rules.html.ts +0 -356
  20. package/src/HtmlDeserializer/rules/rules.notion.ts +0 -57
  21. package/src/HtmlDeserializer/rules/rules.whitespace-text-node.ts +0 -31
  22. package/src/HtmlDeserializer/rules/rules.word.ts +0 -95
  23. package/src/HtmlDeserializer/trim-whitespace.ts +0 -157
  24. package/src/HtmlDeserializer/word-online/asserters.word-online.ts +0 -153
  25. package/src/HtmlDeserializer/word-online/preprocessor.word-online.ts +0 -263
  26. package/src/HtmlDeserializer/word-online/rules.word-online.ts +0 -390
  27. package/src/constants.ts +0 -104
  28. package/src/index.ts +0 -49
  29. package/src/rules/_exports/index.ts +0 -1
  30. package/src/rules/flatten-tables.test.ts +0 -495
  31. package/src/rules/flatten-tables.ts +0 -216
  32. package/src/rules/index.ts +0 -1
  33. package/src/schema-matchers.ts +0 -41
  34. package/src/types.ts +0 -100
  35. package/src/util/findBlockType.ts +0 -13
  36. package/src/util/normalizeBlock.ts +0 -171
  37. package/src/util/randomKey.ts +0 -28
  38. package/src/util/resolveJsType.ts +0 -44
@@ -1,6 +1,4 @@
1
1
  import { isTextBlock, isSpan } from "@portabletext/schema";
2
- import isEqual from "lodash/isEqual.js";
3
- import uniq from "lodash/uniq.js";
4
2
  const objectToString = Object.prototype.toString;
5
3
  function resolveJsType(val) {
6
4
  switch (objectToString.call(val)) {
@@ -19,6 +17,77 @@ function resolveJsType(val) {
19
17
  }
20
18
  return val === null ? "null" : val === void 0 ? "undefined" : val && typeof val == "object" && "nodeType" in val && val.nodeType === 1 ? "element" : val === Object(val) ? "object" : typeof val;
21
19
  }
20
+ function isEqualMarks(a, b) {
21
+ if (!a || !b)
22
+ return a === b;
23
+ if (a.length !== b.length)
24
+ return !1;
25
+ for (let index = 0; index < a.length; index++)
26
+ if (a[index] !== b[index])
27
+ return !1;
28
+ return !0;
29
+ }
30
+ function isDeepEqual(data, other) {
31
+ return isDeepEqualImplementation(data, other);
32
+ }
33
+ function isDeepEqualImplementation(data, other) {
34
+ if (data === other || Object.is(data, other))
35
+ return !0;
36
+ if (typeof data != "object" || typeof other != "object" || data === null || other === null || Object.getPrototypeOf(data) !== Object.getPrototypeOf(other))
37
+ return !1;
38
+ if (Array.isArray(data))
39
+ return isDeepEqualArrays(data, other);
40
+ if (data instanceof Map)
41
+ return isDeepEqualMaps(data, other);
42
+ if (data instanceof Set)
43
+ return isDeepEqualSets(data, other);
44
+ if (data instanceof Date)
45
+ return data.getTime() === other.getTime();
46
+ if (data instanceof RegExp)
47
+ return data.toString() === other.toString();
48
+ if (Object.keys(data).length !== Object.keys(other).length)
49
+ return !1;
50
+ for (const [key, value] of Object.entries(data))
51
+ if (!(key in other) || !isDeepEqualImplementation(
52
+ value,
53
+ // @ts-expect-error [ts7053] - We already checked that `other` has `key`
54
+ other[key]
55
+ ))
56
+ return !1;
57
+ return !0;
58
+ }
59
+ function isDeepEqualArrays(data, other) {
60
+ if (data.length !== other.length)
61
+ return !1;
62
+ for (const [index, item] of data.entries())
63
+ if (!isDeepEqualImplementation(item, other[index]))
64
+ return !1;
65
+ return !0;
66
+ }
67
+ function isDeepEqualMaps(data, other) {
68
+ if (data.size !== other.size)
69
+ return !1;
70
+ for (const [key, value] of data.entries())
71
+ if (!other.has(key) || !isDeepEqualImplementation(value, other.get(key)))
72
+ return !1;
73
+ return !0;
74
+ }
75
+ function isDeepEqualSets(data, other) {
76
+ if (data.size !== other.size)
77
+ return !1;
78
+ const otherCopy = [...other];
79
+ for (const dataItem of data) {
80
+ let isFound = !1;
81
+ for (const [index, otherItem] of otherCopy.entries())
82
+ if (isDeepEqualImplementation(dataItem, otherItem)) {
83
+ isFound = !0, otherCopy.splice(index, 1);
84
+ break;
85
+ }
86
+ if (!isFound)
87
+ return !1;
88
+ }
89
+ return !0;
90
+ }
22
91
  function isArbitraryTypedObject(object) {
23
92
  return isRecord(object) && typeof object._type == "string";
24
93
  }
@@ -37,7 +106,7 @@ function flattenNestedBlocks(context, blocks) {
37
106
  );
38
107
  if (hasBlockObjects || hasBlocks) {
39
108
  const splitChildren = getSplitChildren(context, block);
40
- return splitChildren.length === 1 && splitChildren[0].type === "children" && isEqual(splitChildren[0].children, block.children) ? [block] : splitChildren.flatMap((slice) => slice.type === "block object" ? [slice.block] : slice.type === "block" ? flattenNestedBlocks(context, [
109
+ return splitChildren.length === 1 && splitChildren[0].type === "children" && isDeepEqual(splitChildren[0].children, block.children) ? [block] : splitChildren.flatMap((slice) => slice.type === "block object" ? [slice.block] : slice.type === "block" ? flattenNestedBlocks(context, [
41
110
  slice.block
42
111
  ]) : slice.children.length > 0 ? slice.children.every(
43
112
  (child) => isSpan(context, child) && child.text.trim() === ""
@@ -148,12 +217,14 @@ const PRESERVE_WHITESPACE_TAGS = ["pre", "textarea", "code"], BLOCK_DEFAULT_STYL
148
217
  ...HTML_HEADER_TAGS,
149
218
  ...HTML_MISC_TAGS
150
219
  };
151
- uniq(
152
- Object.values(ELEMENT_MAP).filter((tag) => "style" in tag).map((tag) => tag.style)
153
- );
154
- uniq(
155
- Object.values(HTML_DECORATOR_TAGS)
156
- );
220
+ [
221
+ ...new Set(
222
+ Object.values(ELEMENT_MAP).filter((tag) => "style" in tag).map((tag) => tag.style)
223
+ )
224
+ ];
225
+ [
226
+ ...new Set(Object.values(HTML_DECORATOR_TAGS))
227
+ ];
157
228
  function tagName(el) {
158
229
  if (el && "tagName" in el)
159
230
  return el.tagName.toLowerCase();
@@ -214,6 +285,7 @@ export {
214
285
  ensureRootIsBlocks,
215
286
  flattenNestedBlocks,
216
287
  isElement,
288
+ isEqualMarks,
217
289
  isMinimalBlock,
218
290
  isMinimalSpan,
219
291
  isNodeList,
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../src/util/resolveJsType.ts","../../src/types.ts","../../src/HtmlDeserializer/flatten-nested-blocks.ts","../../src/constants.ts","../../src/HtmlDeserializer/helpers.ts"],"sourcesContent":["const objectToString = Object.prototype.toString\n\n// Copied from https://github.com/ForbesLindesay/type-of\n// but inlined to have fine grained control\nexport function resolveJsType(val: unknown) {\n switch (objectToString.call(val)) {\n case '[object Function]':\n return 'function'\n case '[object Date]':\n return 'date'\n case '[object RegExp]':\n return 'regexp'\n case '[object Arguments]':\n return 'arguments'\n case '[object Array]':\n return 'array'\n case '[object String]':\n return 'string'\n default:\n }\n\n if (val === null) {\n return 'null'\n }\n\n if (val === undefined) {\n return 'undefined'\n }\n\n if (\n val &&\n typeof val === 'object' &&\n 'nodeType' in val &&\n (val as {nodeType: unknown}).nodeType === 1\n ) {\n return 'element'\n }\n\n if (val === Object(val)) {\n return 'object'\n }\n\n return typeof val\n}\n","import type {PortableTextObject} from '@portabletext/schema'\nimport type {SchemaMatchers} from './schema-matchers'\n\n/**\n * @public\n */\nexport interface TypedObject {\n _type: string\n _key?: string\n}\n\n/**\n * @public\n */\nexport interface ArbitraryTypedObject extends TypedObject {\n [key: string]: unknown\n}\n\nexport function isArbitraryTypedObject(\n object: unknown,\n): object is ArbitraryTypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n\nexport interface MinimalSpan {\n _type: 'span'\n _key?: string\n text: string\n marks?: string[]\n}\n\nexport interface MinimalBlock extends TypedObject {\n _type: 'block'\n children: TypedObject[]\n markDefs?: TypedObject[]\n style?: string\n level?: number\n listItem?: string\n}\n\nexport interface PlaceholderDecorator {\n _type: '__decorator'\n name: string\n children: TypedObject[]\n}\n\nexport interface PlaceholderAnnotation {\n _type: '__annotation'\n markDef: PortableTextObject\n children: TypedObject[]\n}\n\n/**\n * @public\n */\nexport type HtmlParser = (html: string) => Document\n\n/**\n * @public\n */\nexport type WhiteSpacePasteMode = 'preserve' | 'remove' | 'normalize'\n\n/**\n * @public\n */\nexport interface HtmlDeserializerOptions {\n keyGenerator?: () => string\n rules?: DeserializerRule[]\n parseHtml?: HtmlParser\n unstable_whitespaceOnPasteMode?: WhiteSpacePasteMode\n /**\n * Custom schema matchers to use when deserializing HTML to Portable Text.\n * @beta\n */\n matchers?: SchemaMatchers\n}\n\nexport interface HtmlPreprocessorOptions {\n unstable_whitespaceOnPasteMode?: WhiteSpacePasteMode\n}\n\n/**\n * @public\n */\nexport interface DeserializerRule {\n deserialize: (\n el: Node,\n next: (\n elements: Node | Node[] | NodeList,\n ) => TypedObject | TypedObject[] | undefined,\n createBlock: (props: ArbitraryTypedObject) => {\n _type: string\n block: ArbitraryTypedObject\n },\n ) => TypedObject | TypedObject[] | undefined\n}\n","import type {Schema} from '@portabletext/schema'\nimport {\n isSpan,\n isTextBlock,\n type PortableTextBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@portabletext/schema'\nimport {isEqual} from 'lodash'\nimport {\n isArbitraryTypedObject,\n type ArbitraryTypedObject,\n type TypedObject,\n} from '../types'\n\nexport function flattenNestedBlocks(\n context: {\n schema: Schema\n },\n blocks: Array<ArbitraryTypedObject>,\n): TypedObject[] {\n const flattened = blocks.flatMap((block) => {\n if (isBlockContainer(block)) {\n return flattenNestedBlocks(context, [block.block])\n }\n\n if (isTextBlock(context, block)) {\n const hasBlockObjects = block.children.some((child) => {\n const knownBlockObject = context.schema.blockObjects.some(\n (blockObject) => blockObject.name === child._type,\n )\n return knownBlockObject\n })\n const hasBlocks = block.children.some(\n (child) => child._type === '__block' || child._type === 'block',\n )\n\n if (hasBlockObjects || hasBlocks) {\n const splitChildren = getSplitChildren(context, block)\n\n if (\n splitChildren.length === 1 &&\n splitChildren[0].type === 'children' &&\n isEqual(splitChildren[0].children, block.children)\n ) {\n return [block]\n }\n\n return splitChildren.flatMap((slice) => {\n if (slice.type === 'block object') {\n return [slice.block]\n }\n\n if (slice.type === 'block') {\n return flattenNestedBlocks(context, [\n slice.block as ArbitraryTypedObject,\n ])\n }\n\n if (slice.children.length > 0) {\n if (\n slice.children.every(\n (child) => isSpan(context, child) && child.text.trim() === '',\n )\n ) {\n return []\n }\n\n return flattenNestedBlocks(context, [\n {\n ...block,\n children: slice.children,\n },\n ])\n }\n\n return []\n })\n }\n\n return [block]\n }\n\n return [block]\n })\n\n return flattened\n}\n\nfunction isBlockContainer(\n block: ArbitraryTypedObject,\n): block is BlockContainer {\n return block._type === '__block' && isArbitraryTypedObject(block.block)\n}\n\ntype BlockContainer = {\n _type: '__block'\n block: ArbitraryTypedObject\n}\n\nfunction getSplitChildren(\n context: {schema: Schema},\n block: PortableTextTextBlock,\n) {\n return block.children.reduce(\n (slices, child) => {\n const knownInlineObject = context.schema.inlineObjects.some(\n (inlineObject) => inlineObject.name === child._type,\n )\n const knownBlockObject = context.schema.blockObjects.some(\n (blockObject) => blockObject.name === child._type,\n )\n\n const lastSlice = slices.pop()\n\n if (!isSpan(context, child) && !knownInlineObject) {\n if (knownBlockObject) {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'block object' as const, block: child},\n ]\n }\n }\n\n if (child._type === '__block') {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {\n type: 'block object' as const,\n block: (child as any).block,\n },\n ]\n }\n\n if (child._type === 'block') {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'block' as const, block: child},\n ]\n }\n\n if (lastSlice) {\n if (lastSlice.type === 'children') {\n return [\n ...slices,\n {\n type: 'children' as const,\n children: [...lastSlice.children, child],\n },\n ]\n }\n }\n\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'children' as const, children: [child]},\n ]\n },\n [] as Array<\n | {\n type: 'children'\n children: Array<PortableTextSpan | PortableTextObject>\n }\n | {type: 'block object'; block: PortableTextObject}\n | {type: 'block'; block: PortableTextBlock}\n >,\n )\n}\n","import {uniq} from 'lodash'\n\nexport interface PartialBlock {\n _type: string\n markDefs: string[]\n style: string\n level?: number\n listItem?: string\n}\n\nexport const PRESERVE_WHITESPACE_TAGS = ['pre', 'textarea', 'code']\n\nexport const BLOCK_DEFAULT_STYLE = 'normal'\n\nexport const DEFAULT_BLOCK: PartialBlock = Object.freeze({\n _type: 'block',\n markDefs: [],\n style: BLOCK_DEFAULT_STYLE,\n})\n\nexport const DEFAULT_SPAN = Object.freeze({\n _type: 'span',\n marks: [] as string[],\n})\n\nexport const HTML_BLOCK_TAGS = {\n p: DEFAULT_BLOCK,\n blockquote: {...DEFAULT_BLOCK, style: 'blockquote'} as PartialBlock,\n}\n\nexport const HTML_SPAN_TAGS = {\n span: {object: 'text'},\n}\n\nexport const HTML_LIST_CONTAINER_TAGS: Record<\n string,\n {object: null} | undefined\n> = {\n ol: {object: null},\n ul: {object: null},\n}\n\nexport const HTML_HEADER_TAGS: Record<string, PartialBlock | undefined> = {\n h1: {...DEFAULT_BLOCK, style: 'h1'},\n h2: {...DEFAULT_BLOCK, style: 'h2'},\n h3: {...DEFAULT_BLOCK, style: 'h3'},\n h4: {...DEFAULT_BLOCK, style: 'h4'},\n h5: {...DEFAULT_BLOCK, style: 'h5'},\n h6: {...DEFAULT_BLOCK, style: 'h6'},\n}\n\nexport const HTML_MISC_TAGS = {\n br: {...DEFAULT_BLOCK, style: BLOCK_DEFAULT_STYLE} as PartialBlock,\n}\n\nexport const HTML_DECORATOR_TAGS: Record<string, string | undefined> = {\n b: 'strong',\n strong: 'strong',\n\n i: 'em',\n em: 'em',\n\n u: 'underline',\n s: 'strike-through',\n strike: 'strike-through',\n del: 'strike-through',\n\n code: 'code',\n sup: 'sup',\n sub: 'sub',\n ins: 'ins',\n mark: 'mark',\n small: 'small',\n}\n\nexport const HTML_LIST_ITEM_TAGS: Record<string, PartialBlock | undefined> = {\n li: {\n ...DEFAULT_BLOCK,\n style: BLOCK_DEFAULT_STYLE,\n level: 1,\n listItem: 'bullet',\n },\n}\n\nexport const ELEMENT_MAP = {\n ...HTML_BLOCK_TAGS,\n ...HTML_SPAN_TAGS,\n ...HTML_LIST_CONTAINER_TAGS,\n ...HTML_LIST_ITEM_TAGS,\n ...HTML_HEADER_TAGS,\n ...HTML_MISC_TAGS,\n}\n\nexport const DEFAULT_SUPPORTED_STYLES = uniq(\n Object.values(ELEMENT_MAP)\n .filter((tag): tag is PartialBlock => 'style' in tag)\n .map((tag) => tag.style),\n)\n\nexport const DEFAULT_SUPPORTED_DECORATORS = uniq(\n Object.values(HTML_DECORATOR_TAGS),\n)\n\nexport const DEFAULT_SUPPORTED_ANNOTATIONS = ['link']\n","import type {Schema} from '@portabletext/schema'\nimport {isTextBlock, type PortableTextObject} from '@portabletext/schema'\nimport {DEFAULT_BLOCK} from '../constants'\nimport type {\n ArbitraryTypedObject,\n HtmlParser,\n MinimalBlock,\n MinimalSpan,\n PlaceholderAnnotation,\n PlaceholderDecorator,\n TypedObject,\n} from '../types'\nimport {resolveJsType} from '../util/resolveJsType'\n\n/**\n * Utility function that always return a lowerCase version of the element.tagName\n *\n * @param el - Element to get tag name for\n * @returns Lowercase tagName for that element, or undefined if not an element\n */\nexport function tagName(el: HTMLElement | Node | null): string | undefined {\n if (el && 'tagName' in el) {\n return el.tagName.toLowerCase()\n }\n\n return undefined\n}\n\n/**\n * A default `parseHtml` function that returns the html using `DOMParser`.\n *\n * @returns HTML Parser based on `DOMParser`\n */\nexport function defaultParseHtml(): HtmlParser {\n if (resolveJsType(DOMParser) === 'undefined') {\n throw new Error(\n 'The native `DOMParser` global which the `Html` deserializer uses by ' +\n 'default is not present in this environment. ' +\n 'You must supply the `options.parseHtml` function instead.',\n )\n }\n return (html) => {\n return new DOMParser().parseFromString(html, 'text/html')\n }\n}\n\nexport function ensureRootIsBlocks(\n schema: Schema,\n objects: Array<ArbitraryTypedObject>,\n): ArbitraryTypedObject[] {\n return objects.reduce((blocks, node, i, original) => {\n if (node._type === 'block') {\n blocks.push(node)\n return blocks\n }\n\n if (node._type === '__block') {\n blocks.push((node as any).block)\n return blocks\n }\n\n const lastBlock = blocks[blocks.length - 1]\n if (\n i > 0 &&\n !isTextBlock({schema}, original[i - 1]) &&\n isTextBlock({schema}, lastBlock)\n ) {\n lastBlock.children.push(node as PortableTextObject)\n return blocks\n }\n\n const block = {\n ...DEFAULT_BLOCK,\n children: [node],\n }\n\n blocks.push(block)\n return blocks\n }, [] as ArbitraryTypedObject[])\n}\n\nexport function isNodeList(node: unknown): node is NodeList {\n return Object.prototype.toString.call(node) === '[object NodeList]'\n}\n\nexport function isMinimalSpan(node: TypedObject): node is MinimalSpan {\n return node._type === 'span'\n}\n\nexport function isMinimalBlock(node: TypedObject): node is MinimalBlock {\n return node._type === 'block'\n}\n\nexport function isPlaceholderDecorator(\n node: TypedObject,\n): node is PlaceholderDecorator {\n return node._type === '__decorator'\n}\n\nexport function isPlaceholderAnnotation(\n node: TypedObject,\n): node is PlaceholderAnnotation {\n return node._type === '__annotation'\n}\n\nexport function isElement(node: Node): node is Element {\n return node.nodeType === 1\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../src/util/resolveJsType.ts","../../src/equality.ts","../../src/types.ts","../../src/HtmlDeserializer/flatten-nested-blocks.ts","../../src/constants.ts","../../src/HtmlDeserializer/helpers.ts"],"sourcesContent":["const objectToString = Object.prototype.toString\n\n// Copied from https://github.com/ForbesLindesay/type-of\n// but inlined to have fine grained control\nexport function resolveJsType(val: unknown) {\n switch (objectToString.call(val)) {\n case '[object Function]':\n return 'function'\n case '[object Date]':\n return 'date'\n case '[object RegExp]':\n return 'regexp'\n case '[object Arguments]':\n return 'arguments'\n case '[object Array]':\n return 'array'\n case '[object String]':\n return 'string'\n default:\n }\n\n if (val === null) {\n return 'null'\n }\n\n if (val === undefined) {\n return 'undefined'\n }\n\n if (\n val &&\n typeof val === 'object' &&\n 'nodeType' in val &&\n (val as {nodeType: unknown}).nodeType === 1\n ) {\n return 'element'\n }\n\n if (val === Object(val)) {\n return 'object'\n }\n\n return typeof val\n}\n","export function isEqualMarks(\n a: Array<string> | undefined,\n b: Array<string> | undefined,\n): boolean {\n if (!a || !b) {\n return a === b\n }\n\n if (a.length !== b.length) {\n return false\n }\n\n for (let index = 0; index < a.length; index++) {\n if (a[index] !== b[index]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * More or less copied from Remeda (https://github.com/remeda/remeda/blob/main/packages/remeda/src/isDeepEqual.ts)\n */\nexport function isDeepEqual<A, B>(data: A, other: B) {\n return isDeepEqualImplementation(data, other)\n}\n\nfunction isDeepEqualImplementation<T>(data: unknown, other: T): data is T {\n if (data === other) {\n return true\n }\n\n if (Object.is(data, other)) {\n // We want to ignore the slight differences between `===` and `Object.is` as\n // both of them largely define equality from a semantic point-of-view.\n return true\n }\n\n if (typeof data !== 'object' || typeof other !== 'object') {\n return false\n }\n\n if (data === null || other === null) {\n return false\n }\n\n if (Object.getPrototypeOf(data) !== Object.getPrototypeOf(other)) {\n // If the objects don't share a prototype it's unlikely that they are\n // semantically equal. It is technically possible to build 2 prototypes that\n // act the same but are not equal (at the reference level, checked via\n // `===`) and then create 2 objects that are equal although we would fail on\n // them. Because this is so unlikely, the optimization we gain here for the\n // rest of the function by assuming that `other` is of the same type as\n // `data` is more than worth it.\n return false\n }\n\n if (Array.isArray(data)) {\n return isDeepEqualArrays(data, other as unknown as ReadonlyArray<unknown>)\n }\n\n if (data instanceof Map) {\n return isDeepEqualMaps(data, other as unknown as Map<unknown, unknown>)\n }\n\n if (data instanceof Set) {\n return isDeepEqualSets(data, other as unknown as Set<unknown>)\n }\n\n if (data instanceof Date) {\n return data.getTime() === (other as unknown as Date).getTime()\n }\n\n if (data instanceof RegExp) {\n return data.toString() === (other as unknown as RegExp).toString()\n }\n\n // At this point we only know that the 2 objects share a prototype and are not\n // any of the previous types. They could be plain objects (Object.prototype),\n // they could be classes, they could be other built-ins, or they could be\n // something weird. We assume that comparing values by keys is enough to judge\n // their equality.\n\n if (Object.keys(data).length !== Object.keys(other).length) {\n return false\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (!(key in other)) {\n return false\n }\n\n if (\n !isDeepEqualImplementation(\n value,\n // @ts-expect-error [ts7053] - We already checked that `other` has `key`\n other[key],\n )\n ) {\n return false\n }\n }\n\n return true\n}\n\nfunction isDeepEqualArrays(\n data: ReadonlyArray<unknown>,\n other: ReadonlyArray<unknown>,\n): boolean {\n if (data.length !== other.length) {\n return false\n }\n\n for (const [index, item] of data.entries()) {\n if (!isDeepEqualImplementation(item, other[index])) {\n return false\n }\n }\n\n return true\n}\n\nfunction isDeepEqualMaps(\n data: ReadonlyMap<unknown, unknown>,\n other: ReadonlyMap<unknown, unknown>,\n): boolean {\n if (data.size !== other.size) {\n return false\n }\n\n for (const [key, value] of data.entries()) {\n if (!other.has(key)) {\n return false\n }\n\n if (!isDeepEqualImplementation(value, other.get(key))) {\n return false\n }\n }\n\n return true\n}\n\nfunction isDeepEqualSets(\n data: ReadonlySet<unknown>,\n other: ReadonlySet<unknown>,\n): boolean {\n if (data.size !== other.size) {\n return false\n }\n\n // To ensure we only count each item once we need to \"remember\" which items of\n // the other set we've already matched against. We do this by creating a copy\n // of the other set and removing items from it as we find them in the data\n // set.\n const otherCopy = [...other]\n\n for (const dataItem of data) {\n let isFound = false\n\n for (const [index, otherItem] of otherCopy.entries()) {\n if (isDeepEqualImplementation(dataItem, otherItem)) {\n isFound = true\n otherCopy.splice(index, 1)\n break\n }\n }\n\n if (!isFound) {\n return false\n }\n }\n\n return true\n}\n","import type {PortableTextObject} from '@portabletext/schema'\nimport type {SchemaMatchers} from './schema-matchers'\n\n/**\n * @public\n */\nexport interface TypedObject {\n _type: string\n _key?: string\n}\n\n/**\n * @public\n */\nexport interface ArbitraryTypedObject extends TypedObject {\n [key: string]: unknown\n}\n\nexport function isArbitraryTypedObject(\n object: unknown,\n): object is ArbitraryTypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n\nexport interface MinimalSpan {\n _type: 'span'\n _key?: string\n text: string\n marks?: string[]\n}\n\nexport interface MinimalBlock extends TypedObject {\n _type: 'block'\n children: TypedObject[]\n markDefs?: TypedObject[]\n style?: string\n level?: number\n listItem?: string\n}\n\nexport interface PlaceholderDecorator {\n _type: '__decorator'\n name: string\n children: TypedObject[]\n}\n\nexport interface PlaceholderAnnotation {\n _type: '__annotation'\n markDef: PortableTextObject\n children: TypedObject[]\n}\n\n/**\n * @public\n */\nexport type HtmlParser = (html: string) => Document\n\n/**\n * @public\n */\nexport type WhiteSpacePasteMode = 'preserve' | 'remove' | 'normalize'\n\n/**\n * @public\n */\nexport interface HtmlDeserializerOptions {\n keyGenerator?: () => string\n rules?: DeserializerRule[]\n parseHtml?: HtmlParser\n unstable_whitespaceOnPasteMode?: WhiteSpacePasteMode\n /**\n * Custom schema matchers to use when deserializing HTML to Portable Text.\n * @beta\n */\n matchers?: SchemaMatchers\n}\n\nexport interface HtmlPreprocessorOptions {\n unstable_whitespaceOnPasteMode?: WhiteSpacePasteMode\n}\n\n/**\n * @public\n */\nexport interface DeserializerRule {\n deserialize: (\n el: Node,\n next: (\n elements: Node | Node[] | NodeList,\n ) => TypedObject | TypedObject[] | undefined,\n createBlock: (props: ArbitraryTypedObject) => {\n _type: string\n block: ArbitraryTypedObject\n },\n ) => TypedObject | TypedObject[] | undefined\n}\n","import type {Schema} from '@portabletext/schema'\nimport {\n isSpan,\n isTextBlock,\n type PortableTextBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@portabletext/schema'\nimport {isDeepEqual} from '../equality'\nimport {\n isArbitraryTypedObject,\n type ArbitraryTypedObject,\n type TypedObject,\n} from '../types'\n\nexport function flattenNestedBlocks(\n context: {\n schema: Schema\n },\n blocks: Array<ArbitraryTypedObject>,\n): TypedObject[] {\n const flattened = blocks.flatMap((block) => {\n if (isBlockContainer(block)) {\n return flattenNestedBlocks(context, [block.block])\n }\n\n if (isTextBlock(context, block)) {\n const hasBlockObjects = block.children.some((child) => {\n const knownBlockObject = context.schema.blockObjects.some(\n (blockObject) => blockObject.name === child._type,\n )\n return knownBlockObject\n })\n const hasBlocks = block.children.some(\n (child) => child._type === '__block' || child._type === 'block',\n )\n\n if (hasBlockObjects || hasBlocks) {\n const splitChildren = getSplitChildren(context, block)\n\n if (\n splitChildren.length === 1 &&\n splitChildren[0].type === 'children' &&\n isDeepEqual(splitChildren[0].children, block.children)\n ) {\n return [block]\n }\n\n return splitChildren.flatMap((slice) => {\n if (slice.type === 'block object') {\n return [slice.block]\n }\n\n if (slice.type === 'block') {\n return flattenNestedBlocks(context, [\n slice.block as ArbitraryTypedObject,\n ])\n }\n\n if (slice.children.length > 0) {\n if (\n slice.children.every(\n (child) => isSpan(context, child) && child.text.trim() === '',\n )\n ) {\n return []\n }\n\n return flattenNestedBlocks(context, [\n {\n ...block,\n children: slice.children,\n },\n ])\n }\n\n return []\n })\n }\n\n return [block]\n }\n\n return [block]\n })\n\n return flattened\n}\n\nfunction isBlockContainer(\n block: ArbitraryTypedObject,\n): block is BlockContainer {\n return block._type === '__block' && isArbitraryTypedObject(block.block)\n}\n\ntype BlockContainer = {\n _type: '__block'\n block: ArbitraryTypedObject\n}\n\nfunction getSplitChildren(\n context: {schema: Schema},\n block: PortableTextTextBlock,\n) {\n return block.children.reduce(\n (slices, child) => {\n const knownInlineObject = context.schema.inlineObjects.some(\n (inlineObject) => inlineObject.name === child._type,\n )\n const knownBlockObject = context.schema.blockObjects.some(\n (blockObject) => blockObject.name === child._type,\n )\n\n const lastSlice = slices.pop()\n\n if (!isSpan(context, child) && !knownInlineObject) {\n if (knownBlockObject) {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'block object' as const, block: child},\n ]\n }\n }\n\n if (child._type === '__block') {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {\n type: 'block object' as const,\n block: (child as any).block,\n },\n ]\n }\n\n if (child._type === 'block') {\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'block' as const, block: child},\n ]\n }\n\n if (lastSlice) {\n if (lastSlice.type === 'children') {\n return [\n ...slices,\n {\n type: 'children' as const,\n children: [...lastSlice.children, child],\n },\n ]\n }\n }\n\n return [\n ...slices,\n ...(lastSlice ? [lastSlice] : []),\n {type: 'children' as const, children: [child]},\n ]\n },\n [] as Array<\n | {\n type: 'children'\n children: Array<PortableTextSpan | PortableTextObject>\n }\n | {type: 'block object'; block: PortableTextObject}\n | {type: 'block'; block: PortableTextBlock}\n >,\n )\n}\n","export interface PartialBlock {\n _type: string\n markDefs: string[]\n style: string\n level?: number\n listItem?: string\n}\n\nexport const PRESERVE_WHITESPACE_TAGS = ['pre', 'textarea', 'code']\n\nexport const BLOCK_DEFAULT_STYLE = 'normal'\n\nexport const DEFAULT_BLOCK: PartialBlock = Object.freeze({\n _type: 'block',\n markDefs: [],\n style: BLOCK_DEFAULT_STYLE,\n})\n\nexport const DEFAULT_SPAN = Object.freeze({\n _type: 'span',\n marks: [] as string[],\n})\n\nexport const HTML_BLOCK_TAGS = {\n p: DEFAULT_BLOCK,\n blockquote: {...DEFAULT_BLOCK, style: 'blockquote'} as PartialBlock,\n}\n\nexport const HTML_SPAN_TAGS = {\n span: {object: 'text'},\n}\n\nexport const HTML_LIST_CONTAINER_TAGS: Record<\n string,\n {object: null} | undefined\n> = {\n ol: {object: null},\n ul: {object: null},\n}\n\nexport const HTML_HEADER_TAGS: Record<string, PartialBlock | undefined> = {\n h1: {...DEFAULT_BLOCK, style: 'h1'},\n h2: {...DEFAULT_BLOCK, style: 'h2'},\n h3: {...DEFAULT_BLOCK, style: 'h3'},\n h4: {...DEFAULT_BLOCK, style: 'h4'},\n h5: {...DEFAULT_BLOCK, style: 'h5'},\n h6: {...DEFAULT_BLOCK, style: 'h6'},\n}\n\nexport const HTML_MISC_TAGS = {\n br: {...DEFAULT_BLOCK, style: BLOCK_DEFAULT_STYLE} as PartialBlock,\n}\n\nexport const HTML_DECORATOR_TAGS: Record<string, string | undefined> = {\n b: 'strong',\n strong: 'strong',\n\n i: 'em',\n em: 'em',\n\n u: 'underline',\n s: 'strike-through',\n strike: 'strike-through',\n del: 'strike-through',\n\n code: 'code',\n sup: 'sup',\n sub: 'sub',\n ins: 'ins',\n mark: 'mark',\n small: 'small',\n}\n\nexport const HTML_LIST_ITEM_TAGS: Record<string, PartialBlock | undefined> = {\n li: {\n ...DEFAULT_BLOCK,\n style: BLOCK_DEFAULT_STYLE,\n level: 1,\n listItem: 'bullet',\n },\n}\n\nexport const ELEMENT_MAP = {\n ...HTML_BLOCK_TAGS,\n ...HTML_SPAN_TAGS,\n ...HTML_LIST_CONTAINER_TAGS,\n ...HTML_LIST_ITEM_TAGS,\n ...HTML_HEADER_TAGS,\n ...HTML_MISC_TAGS,\n}\n\nexport const DEFAULT_SUPPORTED_STYLES = [\n ...new Set(\n Object.values(ELEMENT_MAP)\n .filter((tag): tag is PartialBlock => 'style' in tag)\n .map((tag) => tag.style),\n ),\n]\n\nexport const DEFAULT_SUPPORTED_DECORATORS = [\n ...new Set(Object.values(HTML_DECORATOR_TAGS)),\n]\n\nexport const DEFAULT_SUPPORTED_ANNOTATIONS = ['link']\n","import type {Schema} from '@portabletext/schema'\nimport {isTextBlock, type PortableTextObject} from '@portabletext/schema'\nimport {DEFAULT_BLOCK} from '../constants'\nimport type {\n ArbitraryTypedObject,\n HtmlParser,\n MinimalBlock,\n MinimalSpan,\n PlaceholderAnnotation,\n PlaceholderDecorator,\n TypedObject,\n} from '../types'\nimport {resolveJsType} from '../util/resolveJsType'\n\n/**\n * Utility function that always return a lowerCase version of the element.tagName\n *\n * @param el - Element to get tag name for\n * @returns Lowercase tagName for that element, or undefined if not an element\n */\nexport function tagName(el: HTMLElement | Node | null): string | undefined {\n if (el && 'tagName' in el) {\n return el.tagName.toLowerCase()\n }\n\n return undefined\n}\n\n/**\n * A default `parseHtml` function that returns the html using `DOMParser`.\n *\n * @returns HTML Parser based on `DOMParser`\n */\nexport function defaultParseHtml(): HtmlParser {\n if (resolveJsType(DOMParser) === 'undefined') {\n throw new Error(\n 'The native `DOMParser` global which the `Html` deserializer uses by ' +\n 'default is not present in this environment. ' +\n 'You must supply the `options.parseHtml` function instead.',\n )\n }\n return (html) => {\n return new DOMParser().parseFromString(html, 'text/html')\n }\n}\n\nexport function ensureRootIsBlocks(\n schema: Schema,\n objects: Array<ArbitraryTypedObject>,\n): ArbitraryTypedObject[] {\n return objects.reduce((blocks, node, i, original) => {\n if (node._type === 'block') {\n blocks.push(node)\n return blocks\n }\n\n if (node._type === '__block') {\n blocks.push((node as any).block)\n return blocks\n }\n\n const lastBlock = blocks[blocks.length - 1]\n if (\n i > 0 &&\n !isTextBlock({schema}, original[i - 1]) &&\n isTextBlock({schema}, lastBlock)\n ) {\n lastBlock.children.push(node as PortableTextObject)\n return blocks\n }\n\n const block = {\n ...DEFAULT_BLOCK,\n children: [node],\n }\n\n blocks.push(block)\n return blocks\n }, [] as ArbitraryTypedObject[])\n}\n\nexport function isNodeList(node: unknown): node is NodeList {\n return Object.prototype.toString.call(node) === '[object NodeList]'\n}\n\nexport function isMinimalSpan(node: TypedObject): node is MinimalSpan {\n return node._type === 'span'\n}\n\nexport function isMinimalBlock(node: TypedObject): node is MinimalBlock {\n return node._type === 'block'\n}\n\nexport function isPlaceholderDecorator(\n node: TypedObject,\n): node is PlaceholderDecorator {\n return node._type === '__decorator'\n}\n\nexport function isPlaceholderAnnotation(\n node: TypedObject,\n): node is PlaceholderAnnotation {\n return node._type === '__annotation'\n}\n\nexport function isElement(node: Node): node is Element {\n return node.nodeType === 1\n}\n"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1,19 +1,17 @@
1
1
  import { sanitySchemaToPortableTextSchema } from "@portabletext/sanity-bridge";
2
2
  import { isTextBlock, isSpan } from "@portabletext/schema";
3
- import flatten from "lodash/flatten.js";
4
- import { isElement, tagName, PRESERVE_WHITESPACE_TAGS, HTML_BLOCK_TAGS, HTML_HEADER_TAGS, DEFAULT_SPAN, DEFAULT_BLOCK, BLOCK_DEFAULT_STYLE, HTML_LIST_CONTAINER_TAGS, HTML_SPAN_TAGS, HTML_LIST_ITEM_TAGS, HTML_DECORATOR_TAGS, isMinimalSpan, defaultParseHtml, flattenNestedBlocks, ensureRootIsBlocks, resolveJsType, isPlaceholderDecorator, isPlaceholderAnnotation, isMinimalBlock, isNodeList } from "./_chunks-es/helpers.js";
5
- import isEqual from "lodash/isEqual.js";
6
- var s = { 0: 8203, 1: 8204, 2: 8205, 3: 8290, 4: 8291, 5: 8288, 6: 65279, 7: 8289, 8: 119155, 9: 119156, a: 119157, b: 119158, c: 119159, d: 119160, e: 119161, f: 119162 }, c = { 0: 8203, 1: 8204, 2: 8205, 3: 65279 };
7
- new Array(4).fill(String.fromCodePoint(c[0])).join("");
8
- Object.fromEntries(Object.entries(c).map((t) => t.reverse()));
9
- Object.fromEntries(Object.entries(s).map((t) => t.reverse()));
10
- var S = `${Object.values(s).map((t) => `\\u{${t.toString(16)}}`).join("")}`, f = new RegExp(`[${S}]{4,}`, "gu");
11
- function _(t) {
3
+ import { isElement, tagName, PRESERVE_WHITESPACE_TAGS, HTML_BLOCK_TAGS, HTML_HEADER_TAGS, DEFAULT_SPAN, DEFAULT_BLOCK, BLOCK_DEFAULT_STYLE, HTML_LIST_CONTAINER_TAGS, HTML_SPAN_TAGS, HTML_LIST_ITEM_TAGS, HTML_DECORATOR_TAGS, isMinimalSpan, isEqualMarks, defaultParseHtml, flattenNestedBlocks, ensureRootIsBlocks, resolveJsType, isPlaceholderDecorator, isPlaceholderAnnotation, isMinimalBlock, isNodeList } from "./_chunks-es/helpers.js";
4
+ var l = { 0: 8203, 1: 8204, 2: 8205, 3: 8290, 4: 8291, 5: 8288, 6: 65279, 7: 8289, 8: 119155, 9: 119156, a: 119157, b: 119158, c: 119159, d: 119160, e: 119161, f: 119162 }, d = { 0: 8203, 1: 8204, 2: 8205, 3: 65279 }, a = { 0: String.fromCodePoint(d[0]), 1: String.fromCodePoint(d[1]), 2: String.fromCodePoint(d[2]), 3: String.fromCodePoint(d[3]) };
5
+ new Array(4).fill(String.fromCodePoint(d[0])).join("");
6
+ Object.fromEntries(Object.entries(a).map((t) => [t[1], +t[0]]));
7
+ Object.fromEntries(Object.entries(l).map((t) => t.reverse()));
8
+ var _ = `${Object.values(l).map((t) => `\\u{${t.toString(16)}}`).join("")}`, u = new RegExp(`[${_}]{4,}`, "gu");
9
+ function D(t) {
12
10
  var e;
13
- return { cleaned: t.replace(f, ""), encoded: ((e = t.match(f)) == null ? void 0 : e[0]) || "" };
11
+ return { cleaned: t.replace(u, ""), encoded: ((e = t.match(u)) == null ? void 0 : e[0]) || "" };
14
12
  }
15
- function O(t) {
16
- return t && JSON.parse(_(JSON.stringify(t)).cleaned);
13
+ function M(t) {
14
+ return t && JSON.parse(D(JSON.stringify(t)).cleaned);
17
15
  }
18
16
  function keyGenerator() {
19
17
  return randomKey(12);
@@ -1047,7 +1045,7 @@ function trimTextBlockWhitespace(block) {
1047
1045
  continue;
1048
1046
  }
1049
1047
  const nextChild = nextSpan(block, index), prevChild = prevSpan(block, index);
1050
- index === 0 && (child.text = child.text.replace(/^[^\S\n]+/g, "")), index === block.children.length - 1 && (child.text = child.text.replace(/[^\S\n]+$/g, "")), /\s/.test(child.text.slice(Math.max(0, child.text.length - 1))) && nextChild && isMinimalSpan(nextChild) && /\s/.test(nextChild.text.slice(0, 1)) && (child.text = child.text.replace(/[^\S\n]+$/g, "")), /\s/.test(child.text.slice(0, 1)) && prevChild && isMinimalSpan(prevChild) && /\s/.test(prevChild.text.slice(Math.max(0, prevChild.text.length - 1))) && (child.text = child.text.replace(/^[^\S\n]+/g, "")), child.text || block.children.splice(index, 1), prevChild && isEqual(prevChild.marks, child.marks) && isWhiteSpaceChar(child.text) ? (prevChild.text += " ", block.children.splice(index, 1)) : nextChild && isEqual(nextChild.marks, child.marks) && isWhiteSpaceChar(child.text) && (nextChild.text = ` ${nextChild.text}`, block.children.splice(index, 1)), index++;
1048
+ index === 0 && (child.text = child.text.replace(/^[^\S\n]+/g, "")), index === block.children.length - 1 && (child.text = child.text.replace(/[^\S\n]+$/g, "")), /\s/.test(child.text.slice(Math.max(0, child.text.length - 1))) && nextChild && isMinimalSpan(nextChild) && /\s/.test(nextChild.text.slice(0, 1)) && (child.text = child.text.replace(/[^\S\n]+$/g, "")), /\s/.test(child.text.slice(0, 1)) && prevChild && isMinimalSpan(prevChild) && /\s/.test(prevChild.text.slice(Math.max(0, prevChild.text.length - 1))) && (child.text = child.text.replace(/^[^\S\n]+/g, "")), child.text || block.children.splice(index, 1), prevChild && Array.isArray(prevChild.marks) && isEqualMarks(prevChild.marks, child.marks) && isWhiteSpaceChar(child.text) ? (prevChild.text += " ", block.children.splice(index, 1)) : nextChild && Array.isArray(nextChild.marks) && isEqualMarks(nextChild.marks, child.marks) && isWhiteSpaceChar(child.text) && (nextChild.text = ` ${nextChild.text}`, block.children.splice(index, 1)), index++;
1051
1049
  }
1052
1050
  return block;
1053
1051
  }
@@ -1083,7 +1081,7 @@ class HtmlDeserializer {
1083
1081
  this.schema = schema, this.keyGenerator = options.keyGenerator ?? keyGenerator, this.rules = [...rules, ...standardRules], this.whitespaceMode = unstable_whitespaceOnPasteMode;
1084
1082
  const parseHtml = options.parseHtml || defaultParseHtml();
1085
1083
  this.parseHtml = (html) => {
1086
- const cleanHTML = O(html), doc = parseHtml(cleanHTML);
1084
+ const cleanHTML = M(html), doc = parseHtml(cleanHTML);
1087
1085
  for (const processor of preprocessors)
1088
1086
  processor(cleanHTML, doc);
1089
1087
  return doc.body;
@@ -1110,9 +1108,7 @@ class HtmlDeserializer {
1110
1108
  );
1111
1109
  return this._markDefs.length > 0 && blocks2.filter((block) => isTextBlock({ schema: this.schema }, block)).forEach((block) => {
1112
1110
  block.markDefs = block.markDefs || [], block.markDefs = block.markDefs.concat(
1113
- this._markDefs.filter((def) => flatten(
1114
- block.children.map((child) => child.marks || [])
1115
- ).includes(def._key))
1111
+ this._markDefs.filter((def) => block.children.flatMap((child) => child.marks || []).includes(def._key))
1116
1112
  );
1117
1113
  }), blocks2.map((block) => (block._type === "block" && (block._type = this.schema.block.name), block));
1118
1114
  };
@@ -1266,7 +1262,7 @@ function normalizeBlock(node, options = {}) {
1266
1262
  return block.children = block.children.reduce(
1267
1263
  (acc, child) => {
1268
1264
  const previousChild = acc[acc.length - 1];
1269
- return previousChild && isSpan({ schema }, child) && isSpan({ schema }, previousChild) && isEqual(previousChild.marks, child.marks) ? (lastChild && lastChild === child && child.text === "" && block.children.length > 1 || (previousChild.text += child.text), acc) : (acc.push(child), acc);
1265
+ return previousChild && isSpan({ schema }, child) && isSpan({ schema }, previousChild) && isEqualMarks(previousChild.marks, child.marks) ? (lastChild && lastChild === child && child.text === "" && block.children.length > 1 || (previousChild.text += child.text), acc) : (acc.push(child), acc);
1270
1266
  },
1271
1267
  []
1272
1268
  ).map((child) => {