@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.
- package/lib/_chunks-es/helpers.js +81 -9
- package/lib/_chunks-es/helpers.js.map +1 -1
- package/lib/index.js +14 -18
- package/lib/index.js.map +1 -1
- package/package.json +7 -10
- package/src/HtmlDeserializer/flatten-nested-blocks.test.ts +0 -248
- package/src/HtmlDeserializer/flatten-nested-blocks.ts +0 -173
- package/src/HtmlDeserializer/helpers.ts +0 -108
- package/src/HtmlDeserializer/index.ts +0 -315
- package/src/HtmlDeserializer/preprocessors/index.ts +0 -15
- package/src/HtmlDeserializer/preprocessors/preprocessor.gdocs.ts +0 -66
- package/src/HtmlDeserializer/preprocessors/preprocessor.html.ts +0 -57
- package/src/HtmlDeserializer/preprocessors/preprocessor.notion.ts +0 -25
- package/src/HtmlDeserializer/preprocessors/preprocessor.whitespace.ts +0 -56
- package/src/HtmlDeserializer/preprocessors/preprocessor.word.ts +0 -92
- package/src/HtmlDeserializer/preprocessors/xpathResult.ts +0 -13
- package/src/HtmlDeserializer/rules/index.ts +0 -21
- package/src/HtmlDeserializer/rules/rules.gdocs.ts +0 -188
- package/src/HtmlDeserializer/rules/rules.html.ts +0 -356
- package/src/HtmlDeserializer/rules/rules.notion.ts +0 -57
- package/src/HtmlDeserializer/rules/rules.whitespace-text-node.ts +0 -31
- package/src/HtmlDeserializer/rules/rules.word.ts +0 -95
- package/src/HtmlDeserializer/trim-whitespace.ts +0 -157
- package/src/HtmlDeserializer/word-online/asserters.word-online.ts +0 -153
- package/src/HtmlDeserializer/word-online/preprocessor.word-online.ts +0 -263
- package/src/HtmlDeserializer/word-online/rules.word-online.ts +0 -390
- package/src/constants.ts +0 -104
- package/src/index.ts +0 -49
- package/src/rules/_exports/index.ts +0 -1
- package/src/rules/flatten-tables.test.ts +0 -495
- package/src/rules/flatten-tables.ts +0 -216
- package/src/rules/index.ts +0 -1
- package/src/schema-matchers.ts +0 -41
- package/src/types.ts +0 -100
- package/src/util/findBlockType.ts +0 -13
- package/src/util/normalizeBlock.ts +0 -171
- package/src/util/randomKey.ts +0 -28
- 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" &&
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.
|
|
9
|
-
|
|
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(
|
|
11
|
+
return { cleaned: t.replace(u, ""), encoded: ((e = t.match(u)) == null ? void 0 : e[0]) || "" };
|
|
14
12
|
}
|
|
15
|
-
function
|
|
16
|
-
return t && JSON.parse(
|
|
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 &&
|
|
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 =
|
|
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) =>
|
|
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) &&
|
|
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) => {
|