64 lines
1.5 KiB
TypeScript
64 lines
1.5 KiB
TypeScript
import { SectionItem, TOCItem, CFI } from '@/libs/document';
|
|
|
|
export const findParentPath = (toc: TOCItem[], href: string): TOCItem[] => {
|
|
for (const item of toc) {
|
|
if (item.href === href) {
|
|
return [item];
|
|
}
|
|
if (item.subitems) {
|
|
const path = findParentPath(item.subitems, href);
|
|
if (path.length) {
|
|
return [item, ...path];
|
|
}
|
|
}
|
|
}
|
|
return [];
|
|
};
|
|
|
|
export const findTocItemBS = (toc: TOCItem[], cfi: string): TOCItem | null => {
|
|
let left = 0;
|
|
let right = toc.length - 1;
|
|
let result: TOCItem | null = null;
|
|
|
|
while (left <= right) {
|
|
const mid = Math.floor((left + right) / 2);
|
|
const currentCfi = toc[mid]!.cfi || '';
|
|
const comparison = CFI.compare(currentCfi, cfi);
|
|
if (comparison === 0) {
|
|
return toc[mid]!;
|
|
} else if (comparison < 0) {
|
|
result = toc[mid]!;
|
|
left = mid + 1;
|
|
} else {
|
|
right = mid - 1;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
export const updateTocID = (items: TOCItem[], index = 0): number => {
|
|
items.forEach((item) => {
|
|
item.id ??= index++;
|
|
if (item.subitems) {
|
|
index = updateTocID(item.subitems, index);
|
|
}
|
|
});
|
|
return index;
|
|
};
|
|
|
|
export const updateTocCFI = (items: TOCItem[], sections: { [id: string]: SectionItem }): void => {
|
|
items.forEach((item) => {
|
|
if (item.href) {
|
|
const id = item.href.split('#')[0]!;
|
|
const section = sections[id];
|
|
if (section) {
|
|
item.cfi = section.cfi;
|
|
}
|
|
}
|
|
if (item.subitems) {
|
|
updateTocCFI(item.subitems, sections);
|
|
}
|
|
});
|
|
};
|