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
|
let i = 0
|
||||||
while (i < elementList.length) {
|
while (i < elementList.length) {
|
||||||
const el = elementList[i]
|
let el = elementList[i]
|
||||||
if (el.type === ElementType.TABLE) {
|
if (el.type === ElementType.TABLE) {
|
||||||
const tableId = getUUID()
|
const tableId = getUUID()
|
||||||
el.id = tableId
|
el.id = tableId
|
||||||
@@ -40,6 +40,14 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement
|
|||||||
elementList.splice(i, 1)
|
elementList.splice(i, 1)
|
||||||
// 追加字节点
|
// 追加字节点
|
||||||
if (valueList.length) {
|
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()
|
const hyperlinkId = getUUID()
|
||||||
for (let v = 0; v < valueList.length; v++) {
|
for (let v = 0; v < valueList.length; v++) {
|
||||||
const value = valueList[v]
|
const value = valueList[v]
|
||||||
@@ -51,6 +59,13 @@ export function formatElementList(elementList: IElement[], isHandleFirstElement
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
i--
|
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') {
|
if (el.value === '\n') {
|
||||||
el.value = ZERO
|
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[] {
|
export function zipElementList(payload: IElement[]): IElement[] {
|
||||||
const elementList = deepClone(payload)
|
const elementList = deepClone(payload)
|
||||||
const zipElementListData: IElement[] = []
|
const zipElementListData: IElement[] = []
|
||||||
@@ -73,7 +115,7 @@ export function zipElementList(payload: IElement[]): IElement[] {
|
|||||||
e++
|
e++
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 表格处理
|
// 表格、超链接递归处理
|
||||||
if (element.type === ElementType.TABLE) {
|
if (element.type === ElementType.TABLE) {
|
||||||
if (element.trList) {
|
if (element.trList) {
|
||||||
for (let t = 0; t < element.trList.length; t++) {
|
for (let t = 0; t < element.trList.length; t++) {
|
||||||
@@ -112,18 +154,25 @@ export function zipElementList(payload: IElement[]): IElement[] {
|
|||||||
hyperlinkElement.valueList = zipElementList(valueList)
|
hyperlinkElement.valueList = zipElementList(valueList)
|
||||||
element = hyperlinkElement
|
element = hyperlinkElement
|
||||||
}
|
}
|
||||||
// 压缩保留字段
|
// 组合元素
|
||||||
const newElement: IElement = {
|
const pickElement = pickElementAttr(element)
|
||||||
value: element.value === ZERO ? `\n` : element.value,
|
if (!element.type || element.type === ElementType.TEXT) {
|
||||||
}
|
while (e < elementList.length) {
|
||||||
EDITOR_ELEMENT_ZIP_ATTR.forEach(attr => {
|
const nextElement = elementList[e + 1]
|
||||||
const value = element[attr] as never
|
|
||||||
if (value !== undefined) {
|
|
||||||
newElement[attr] = value
|
|
||||||
}
|
|
||||||
})
|
|
||||||
zipElementListData.push(newElement)
|
|
||||||
e++
|
e++
|
||||||
|
if (
|
||||||
|
nextElement
|
||||||
|
&& isSameElementExceptValue(pickElement, pickElementAttr(nextElement))
|
||||||
|
) {
|
||||||
|
pickElement.value += nextElement.value
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
e++
|
||||||
|
}
|
||||||
|
zipElementListData.push(pickElement)
|
||||||
}
|
}
|
||||||
return zipElementListData
|
return zipElementListData
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user