From 369b73860021cafe0888487c65e4ce90540f3ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E4=BA=91=E9=A3=9E?= Date: Tue, 1 Mar 2022 18:25:06 +0800 Subject: [PATCH] feat:compress output data size --- src/editor/utils/element.ts | 75 ++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/src/editor/utils/element.ts b/src/editor/utils/element.ts index 9e5b37e..1d28d37 100644 --- a/src/editor/utils/element.ts +++ b/src/editor/utils/element.ts @@ -11,7 +11,7 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement } let i = 0 while (i < elementList.length) { - const el = elementList[i] + let el = elementList[i] if (el.type === ElementType.TABLE) { const tableId = getUUID() el.id = tableId @@ -40,6 +40,14 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement elementList.splice(i, 1) // 追加字节点 if (valueList.length) { + // 元素展开 + if (valueList[0].value.length > 1) { + const deleteValue = valueList.splice(0, 1)[0] + const deleteTextList = deleteValue.value.split('') + for (let d = 0; d < deleteTextList.length; d++) { + valueList.splice(d, 0, { ...deleteValue, value: deleteTextList[d] }) + } + } const hyperlinkId = getUUID() for (let v = 0; v < valueList.length; v++) { const value = valueList[v] @@ -51,6 +59,13 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement } } i-- + } else if ((!el.type || el.type === ElementType.TEXT) && el.value.length > 1) { + elementList.splice(i, 1) + const valueList = el.value.split('') + for (let v = 0; v < valueList.length; v++) { + elementList.splice(i + v, 0, { ...el, value: valueList[v] }) + } + el = elementList[i] } if (el.value === '\n') { el.value = ZERO @@ -62,6 +77,33 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement } } +export function isSameElementExceptValue(source: IElement, target: IElement): boolean { + const sourceKeys = Object.keys(source) + const targetKeys = Object.keys(target) + if (sourceKeys.length !== targetKeys.length) return false + for (let s = 0; s < sourceKeys.length; s++) { + const key = sourceKeys[s] as never + if (key === 'value') continue + if (source[key] !== target[key]) { + return false + } + } + return true +} + +export function pickElementAttr(payload: IElement): IElement { + const element: IElement = { + value: payload.value === ZERO ? `\n` : payload.value, + } + EDITOR_ELEMENT_ZIP_ATTR.forEach(attr => { + const value = payload[attr] as never + if (value !== undefined) { + element[attr] = value + } + }) + return element +} + export function zipElementList(payload: IElement[]): IElement[] { const elementList = deepClone(payload) const zipElementListData: IElement[] = [] @@ -73,7 +115,7 @@ export function zipElementList(payload: IElement[]): IElement[] { e++ continue } - // 表格处理 + // 表格、超链接递归处理 if (element.type === ElementType.TABLE) { if (element.trList) { for (let t = 0; t < element.trList.length; t++) { @@ -112,18 +154,25 @@ export function zipElementList(payload: IElement[]): IElement[] { hyperlinkElement.valueList = zipElementList(valueList) element = hyperlinkElement } - // 压缩保留字段 - const newElement: IElement = { - value: element.value === ZERO ? `\n` : element.value, - } - EDITOR_ELEMENT_ZIP_ATTR.forEach(attr => { - const value = element[attr] as never - if (value !== undefined) { - newElement[attr] = value + // 组合元素 + const pickElement = pickElementAttr(element) + if (!element.type || element.type === ElementType.TEXT) { + while (e < elementList.length) { + const nextElement = elementList[e + 1] + e++ + if ( + nextElement + && isSameElementExceptValue(pickElement, pickElementAttr(nextElement)) + ) { + pickElement.value += nextElement.value + } else { + break + } } - }) - zipElementListData.push(newElement) - e++ + } else { + e++ + } + zipElementListData.push(pickElement) } return zipElementListData }