| 1 | import { |
| 2 | isInternalDocumentPlanPageReason, |
| 3 | type DocumentPlanPageSkeletonItem |
| 4 | } from '../../shared/generation' |
| 5 | import { |
| 6 | deriveOutlinePageCandidates, |
| 7 | type DocumentOutlinePageCandidate, |
| 8 | type DocumentOutlineScan |
| 9 | } from './document-outline-scan' |
| 10 | |
| 11 | export const buildDocumentPlanPageSkeleton = (args: { |
| 12 | scan: DocumentOutlineScan | null |
| 13 | pageCandidates?: DocumentOutlinePageCandidate[] |
| 14 | pageCount: number |
| 15 | }): DocumentPlanPageSkeletonItem[] => { |
| 16 | if (!args.scan) return [] |
| 17 | const candidates = args.pageCandidates ?? deriveOutlinePageCandidates(args.scan) |
| 18 | if (candidates.length === 0 || candidates.length !== args.pageCount) return [] |
| 19 | return candidates.map((candidate, index) => ({ |
| 20 | id: `page-${index + 1}`, |
| 21 | pageNumber: index + 1, |
| 22 | title: candidate.title, |
| 23 | role: candidate.role, |
| 24 | sourceHeading: candidate.sourceHeading, |
| 25 | headingLevel: candidate.headingLevel, |
| 26 | lineStart: candidate.lineStart, |
| 27 | lineEnd: candidate.lineEnd, |
| 28 | reason: candidate.reason |
| 29 | })) |
| 30 | } |
| 31 | |
| 32 | export const sanitizeDocumentPlanPageSkeletonContent = (args: { |
| 33 | pageSkeleton: DocumentPlanPageSkeletonItem[] |
| 34 | }): DocumentPlanPageSkeletonItem[] => { |
| 35 | return args.pageSkeleton.map((item) => ({ |
| 36 | ...item, |
| 37 | reason: item.reason && !isInternalDocumentPlanPageReason(item.reason) ? item.reason : '' |
| 38 | })) |
| 39 | } |
| 40 |