parent
3d7d7e2107
commit
237c0f22cb
@ -0,0 +1,104 @@
|
|||||||
|
import { ICatalog, ICatalogItem } from '../../../interface/Catalog'
|
||||||
|
import { IElement } from '../../../interface/Element'
|
||||||
|
|
||||||
|
enum ElementType {
|
||||||
|
TITLE = 'title'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum TitleLevel {
|
||||||
|
FIRST = 'first',
|
||||||
|
SECOND = 'second',
|
||||||
|
THIRD = 'third',
|
||||||
|
FOURTH = 'fourth',
|
||||||
|
FIFTH = 'fifth',
|
||||||
|
SIXTH = 'sixth'
|
||||||
|
}
|
||||||
|
|
||||||
|
const titleOrderNumberMapping: Record<TitleLevel, number> = {
|
||||||
|
[TitleLevel.FIRST]: 1,
|
||||||
|
[TitleLevel.SECOND]: 2,
|
||||||
|
[TitleLevel.THIRD]: 3,
|
||||||
|
[TitleLevel.FOURTH]: 4,
|
||||||
|
[TitleLevel.FIFTH]: 5,
|
||||||
|
[TitleLevel.SIXTH]: 6
|
||||||
|
}
|
||||||
|
|
||||||
|
const ZERO = '\u200B'
|
||||||
|
|
||||||
|
function getCatalog(elementList: IElement[]): ICatalog | null {
|
||||||
|
// 筛选标题
|
||||||
|
const titleElementList: IElement[] = []
|
||||||
|
let t = 0
|
||||||
|
while (t < elementList.length) {
|
||||||
|
const element = elementList[t]
|
||||||
|
if (element.titleId) {
|
||||||
|
const titleId = element.titleId
|
||||||
|
const level = element.level
|
||||||
|
const titleElement: IElement = {
|
||||||
|
type: ElementType.TITLE,
|
||||||
|
value: '',
|
||||||
|
level,
|
||||||
|
titleId
|
||||||
|
}
|
||||||
|
const valueList: IElement[] = []
|
||||||
|
while (t < elementList.length) {
|
||||||
|
const titleE = elementList[t]
|
||||||
|
if (titleId !== titleE.titleId) {
|
||||||
|
t--
|
||||||
|
break
|
||||||
|
}
|
||||||
|
valueList.push(titleE)
|
||||||
|
t++
|
||||||
|
}
|
||||||
|
titleElement.value = valueList.map(s => s.value)
|
||||||
|
.join('')
|
||||||
|
.replace(new RegExp(ZERO, 'g'), '')
|
||||||
|
titleElementList.push(titleElement)
|
||||||
|
}
|
||||||
|
t++
|
||||||
|
}
|
||||||
|
if (!titleElementList.length) return null
|
||||||
|
// 查找到比最新元素大的标题时终止
|
||||||
|
const recursiveInsert = (title: IElement, catalogItem: ICatalogItem) => {
|
||||||
|
const subCatalogItem = catalogItem.subCatalog[catalogItem.subCatalog.length - 1]
|
||||||
|
const catalogItemLevel = titleOrderNumberMapping[subCatalogItem?.level]
|
||||||
|
const titleLevel = titleOrderNumberMapping[title.level!]
|
||||||
|
if (subCatalogItem && titleLevel > catalogItemLevel) {
|
||||||
|
recursiveInsert(title, subCatalogItem)
|
||||||
|
} else {
|
||||||
|
catalogItem.subCatalog.push({
|
||||||
|
id: title.titleId!,
|
||||||
|
name: title.value,
|
||||||
|
level: title.level!,
|
||||||
|
subCatalog: []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 循环标题组
|
||||||
|
// 如果当前列表级别小于标题组最新标题级别:则递归查找最小级别并追加
|
||||||
|
// 如果大于:则直接追加至当前标题组
|
||||||
|
const catalog: ICatalog = []
|
||||||
|
for (let e = 0; e < titleElementList.length; e++) {
|
||||||
|
const title = titleElementList[e]
|
||||||
|
const catalogItem = catalog[catalog.length - 1]
|
||||||
|
const catalogItemLevel = titleOrderNumberMapping[catalogItem?.level]
|
||||||
|
const titleLevel = titleOrderNumberMapping[title.level!]
|
||||||
|
if (catalogItem && titleLevel > catalogItemLevel) {
|
||||||
|
recursiveInsert(title, catalogItem)
|
||||||
|
} else {
|
||||||
|
catalog.push({
|
||||||
|
id: title.titleId!,
|
||||||
|
name: title.value,
|
||||||
|
level: title.level!,
|
||||||
|
subCatalog: []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
|
||||||
|
onmessage = (evt) => {
|
||||||
|
const elementList = <IElement[]>evt.data
|
||||||
|
const catalog = getCatalog(elementList)
|
||||||
|
postMessage(catalog)
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
import { TitleLevel } from '../dataset/enum/Title'
|
||||||
|
|
||||||
|
export interface ICatalogItem {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
level: TitleLevel;
|
||||||
|
subCatalog: ICatalogItem[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ICatalog = ICatalogItem[]
|
||||||
Loading…
Reference in new issue