Merge pull request #20 from Hufe921/feature/compress-data
feat:compress output data size
This commit is contained in:
+62
-13
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user