{"version":3,"sources":["../src/helpers/buildTocTree.ts"],"names":[],"mappings":";AAYO,IAAM,aAAa,CAAC,EAAE,UAAU,CAAA,EAAG,GAAG,KAAI,KAA4B;AAEtE,IAAM,YAAA,GAAe,CAC1B,KAAA,EACA,WAAA,EACA,eACA,gBAAA,KACc;AACd,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,QAAQ,WAAA,EAAY;AAE1B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACtC,IAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,aAAa,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA;AACtF,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,IAAA,GAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAEhD,IAAA,MAAM,QAAA,GAAoB;AAAA,MACxB,EAAA,EAAI,KAAA;AAAA,MACJ,IAAA;AAAA,MACA,KAAA,EAAO,KAAK,KAAA,KACV,gBAAA,GACI,GAAI,gBAAiB,CAAA,CAAA,EAAK,OAAQ,CAAA,CAAA,GAClC,KAAA,CAAA;AAAA,MAEN,QAAA,EAAU,eAAe,IAAA,CAAK,CAAC,aAAa,QAAA,CAAS,IAAA,KAAS,IAAI,CAAA,EAAG,SAAA,CAAU;AAAA,KACjF;AAEA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,QAAA,CAAS,WAAW,YAAA,CAAa,IAAA,CAAK,SAAS,KAAA,EAAO,WAAA,EAAa,eAAe,gBAAgB,CAAA;AAAA,IACpG;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAkB,EAAA,KAAoC;AACpF,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC3B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC/C,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAkB,IAAA,KAAsC;AAExF,EAAA,MAAM,QAAQ,cAAA,CAAe,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,IAAI,CAAA;AAChE,EAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClC,EAAA,OAAO,cAAA,CAAe,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAAM,QAAQ,CAAA;AAC7E;AAEA,IAAM,cAAA,GAAiB,CAAC,KAAA,EAAkB,SAAA,KAA+D;AACvG,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG,OAAO,IAAA;AAC5B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,SAAS,CAAA;AACrD,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT,CAAA","file":"chunk-TEZB4ULX.mjs","sourcesContent":["import { Link, Locator } from \"@readium/shared\";\n\nexport interface TocItem {\n  id: string;\n  href: string;\n  title?: string;\n  children?: TocItem[];\n  position?: number;\n}\n\nexport type TocEntryRef = Omit<TocItem, \"children\">;\n\nexport const toEntryRef = ({ children: _, ...ref }: TocItem): TocEntryRef => ref;\n\nexport const buildTocTree = (\n  links: Link[],\n  idGenerator: () => string,\n  positionsList?: Locator[],\n  publicationTitle?: string\n): TocItem[] => {\n  return links.map((link) => {\n    const newId = idGenerator();\n\n    let href = link.href;\n    const fragmentIndex = href.indexOf(\"#\");\n    if (fragmentIndex !== -1) {\n      const baseHref = href.substring(0, fragmentIndex);\n      const duplicateLink = links.find((l) => l.href.startsWith(baseHref) && l.href !== href);\n      if (!duplicateLink) {\n        href = baseHref;\n      }\n    }\n\n    const counter = parseInt(newId.split(\"-\")[1], 10);\n\n    const treeNode: TocItem = {\n      id: newId,\n      href: href,\n      title: link.title || (\n        publicationTitle\n          ? `${ publicationTitle } ${ counter }`\n          : newId\n      ),\n      position: positionsList?.find((position) => position.href === href)?.locations.position\n    };\n\n    if (link.children) {\n      treeNode.children = buildTocTree(link.children.items, idGenerator, positionsList, publicationTitle);\n    }\n\n    return treeNode;\n  });\n};\n\nexport const findTocItemById = (items: TocItem[], id: string): TocItem | undefined => {\n  for (const item of items) {\n    if (item.id === id) return item;\n    if (item.children) {\n      const found = findTocItemById(item.children, id);\n      if (found) return found;\n    }\n  }\n  return undefined;\n};\n\nexport const findTocItemByHref = (items: TocItem[], href: string): TocItem | undefined => {\n  // Pass 1: exact href match\n  const exact = searchTocItems(items, (item) => item.href === href);\n  if (exact) return exact;\n\n  // Pass 2: bare href match (strip fragment on both sides)\n  const bareHref = href.split(\"#\")[0];\n  return searchTocItems(items, (item) => item.href.split(\"#\")[0] === bareHref);\n};\n\nconst searchTocItems = (items: TocItem[], predicate: (item: TocItem) => boolean): TocItem | undefined => {\n  for (const item of items) {\n    if (predicate(item)) return item;\n    if (item.children) {\n      const found = searchTocItems(item.children, predicate);\n      if (found) return found;\n    }\n  }\n  return undefined;\n};\n"]}