feat: get catalog api
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { IElement, ImageDisplay, INavigateInfo, ListStyle, ListType, TableBorder, TitleLevel, VerticalAlign } from '../..'
|
import { IElement, ImageDisplay, INavigateInfo, ListStyle, ListType, TableBorder, TitleLevel, VerticalAlign } from '../..'
|
||||||
import { EditorMode, PageMode, PaperDirection } from '../../dataset/enum/Editor'
|
import { EditorMode, PageMode, PaperDirection } from '../../dataset/enum/Editor'
|
||||||
import { RowFlex } from '../../dataset/enum/Row'
|
import { RowFlex } from '../../dataset/enum/Row'
|
||||||
|
import { ICatalog } from '../../interface/Catalog'
|
||||||
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
||||||
import { IEditorResult } from '../../interface/Editor'
|
import { IEditorResult } from '../../interface/Editor'
|
||||||
import { IMargin } from '../../interface/Margin'
|
import { IMargin } from '../../interface/Margin'
|
||||||
@@ -85,6 +86,7 @@ export class Command {
|
|||||||
private static insertElementList: CommandAdapt['insertElementList']
|
private static insertElementList: CommandAdapt['insertElementList']
|
||||||
private static removeControl: CommandAdapt['removeControl']
|
private static removeControl: CommandAdapt['removeControl']
|
||||||
private static setLocale: CommandAdapt['setLocale']
|
private static setLocale: CommandAdapt['setLocale']
|
||||||
|
private static getCatalog: CommandAdapt['getCatalog']
|
||||||
|
|
||||||
constructor(adapt: CommandAdapt) {
|
constructor(adapt: CommandAdapt) {
|
||||||
Command.mode = adapt.mode.bind(adapt)
|
Command.mode = adapt.mode.bind(adapt)
|
||||||
@@ -163,6 +165,7 @@ export class Command {
|
|||||||
Command.insertElementList = adapt.insertElementList.bind(adapt)
|
Command.insertElementList = adapt.insertElementList.bind(adapt)
|
||||||
Command.removeControl = adapt.removeControl.bind(adapt)
|
Command.removeControl = adapt.removeControl.bind(adapt)
|
||||||
Command.setLocale = adapt.setLocale.bind(adapt)
|
Command.setLocale = adapt.setLocale.bind(adapt)
|
||||||
|
Command.getCatalog = adapt.getCatalog.bind(adapt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 全局命令
|
// 全局命令
|
||||||
@@ -476,4 +479,8 @@ export class Command {
|
|||||||
return Command.setLocale(payload)
|
return Command.setLocale(payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getCatalog(): Promise<ICatalog | null> {
|
||||||
|
return Command.getCatalog()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ import { RowFlex } from '../../dataset/enum/Row'
|
|||||||
import { TableBorder } from '../../dataset/enum/table/Table'
|
import { TableBorder } from '../../dataset/enum/table/Table'
|
||||||
import { TitleLevel } from '../../dataset/enum/Title'
|
import { TitleLevel } from '../../dataset/enum/Title'
|
||||||
import { VerticalAlign } from '../../dataset/enum/VerticalAlign'
|
import { VerticalAlign } from '../../dataset/enum/VerticalAlign'
|
||||||
|
import { ICatalog } from '../../interface/Catalog'
|
||||||
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
import { IDrawImagePayload, IPainterOptions } from '../../interface/Draw'
|
||||||
import { IEditorOption, IEditorResult } from '../../interface/Editor'
|
import { IEditorOption, IEditorResult } from '../../interface/Editor'
|
||||||
import { IElement, IElementStyle } from '../../interface/Element'
|
import { IElement, IElementStyle } from '../../interface/Element'
|
||||||
@@ -1655,4 +1656,8 @@ export class CommandAdapt {
|
|||||||
this.i18n.setLocale(payload)
|
this.i18n.setLocale(payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getCatalog(): Promise<ICatalog | null> {
|
||||||
|
return this.workerManager.getCatalog()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,19 @@
|
|||||||
import { Draw } from '../draw/Draw'
|
import { Draw } from '../draw/Draw'
|
||||||
import WordCountWorker from './works/wordCount?worker&inline'
|
import WordCountWorker from './works/wordCount?worker&inline'
|
||||||
|
import CatalogWorker from './works/catalog?worker&inline'
|
||||||
|
import { ICatalog } from '../../interface/Catalog'
|
||||||
|
|
||||||
|
|
||||||
export class WorkerManager {
|
export class WorkerManager {
|
||||||
|
|
||||||
private draw: Draw
|
private draw: Draw
|
||||||
private wordCountWorker: Worker
|
private wordCountWorker: Worker
|
||||||
|
private catalogWorker: Worker
|
||||||
|
|
||||||
constructor(draw: Draw) {
|
constructor(draw: Draw) {
|
||||||
this.draw = draw
|
this.draw = draw
|
||||||
this.wordCountWorker = new WordCountWorker()
|
this.wordCountWorker = new WordCountWorker()
|
||||||
|
this.catalogWorker = new CatalogWorker()
|
||||||
}
|
}
|
||||||
|
|
||||||
public getWordCount(): Promise<number> {
|
public getWordCount(): Promise<number> {
|
||||||
@@ -26,4 +31,19 @@ export class WorkerManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getCatalog(): Promise<ICatalog | null> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.catalogWorker.onmessage = (evt) => {
|
||||||
|
resolve(evt.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.catalogWorker.onerror = (evt) => {
|
||||||
|
reject(evt)
|
||||||
|
}
|
||||||
|
|
||||||
|
const elementList = this.draw.getOriginalMainElementList()
|
||||||
|
this.catalogWorker.postMessage(elementList)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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[]
|
||||||
Reference in New Issue
Block a user