@prose-reader/streamer 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archives/createArchiveFromJszip.d.ts +1 -1
- package/dist/archives/types.d.ts +1 -1
- package/dist/generators/manifest/hooks/default.d.ts +1 -1
- package/dist/generators/manifest/hooks/navigationFallback.d.ts +12 -0
- package/dist/parsers/kobo.d.ts +1 -1
- package/dist/prose-streamer.js +209 -189
- package/dist/prose-streamer.js.map +1 -1
- package/dist/prose-streamer.umd.cjs +6 -6
- package/dist/prose-streamer.umd.cjs.map +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prose-streamer.js","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/utils/sortByTitleComparator.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = Manifest[`nav`][`toc`]\ntype TocItem = Manifest[`nav`][`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Manifest[`nav`][`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type,\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n // 'Cache-Control': `no-cache, no-store, no-transform`\n },\n },\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n nav: {\n toc: [],\n },\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","sortByTitleComparator","a","b","alist","blist","i","len","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":";;AAQA,MAAMA,IAAoB,CAACC,GAAgB,EAAE,aAAAC,GAAa,SAAAC,QAAwD;AAChH,QAAMC,IAAe;AAAA,IACnB,UAAU,CAAC;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAET,MAAIC,IAAcJ,EAAG,WAAW,MAAM,KAAKA,EAAG,WAAW,GAAG;AACxD,EAAAG,EAAA,SAAQC,KAAA,gBAAAA,EAAa,KAAK,WAASA,KAAA,gBAAAA,EAAa,IAAI,WAAUD,EAAI;AACtE,MAAIE,IAAOD,KAAA,gBAAAA,EAAa;AACxB,EAAIC,MAAS,QACGD,IAAAJ,EAAG,mBAAmB,GAAGK,KAAQ,GAC3CD,MACKC,IAAAD,EAAY,KAAK,iBAGxBC,MAAS,QAAOD,KAAA,QAAAA,EAAa,KAAK,UACpCD,EAAI,OAAOG,EAAQL,GAAaG,EAAY,KAAK,IAAI,GACrDD,EAAI,OAAOG,EAAQJ,GAASD,GAAaG,EAAY,KAAK,IAAI;AAE1D,QAAAG,IAAcP,EAAG,WAAW,IAAI;AACtC,MAAIO,GAAa;AACT,UAAAC,IAAWD,EAAY,cAAc,IAAI;AAC3C,IAAAC,KAAYA,EAAS,SAAS,MAC5BL,EAAA,WAAWK,EAAS,IAAI,CAACC,MAAUV,EAAkBU,GAAO,EAAE,aAAAR,GAAa,SAAAC,EAAQ,CAAC,CAAC;AAAA,EAE7F;AAEO,SAAAC;AACT,GAEMO,IAAkB,CAACC,GAAyB,EAAE,aAAAV,GAAa,SAAAC,QAAwD;;AACvH,QAAMU,IAAW,CAAA;AAEb,MAAAC;AACA,SAAAF,EAAI,mBAAmB,aAAa,IACpBE,KAAAC,IAAAH,EAAI,mBAAmB,aAAa,MAApC,gBAAAG,EAAuC,WAChDH,EAAI,mBAAmB,qBAAqB,MACnCE,KAAAE,IAAAJ,EAAI,mBAAmB,qBAAqB,MAA5C,gBAAAI,EAA+C,WAG/DF,KAAmBA,EAAgB,SAAS,KAC9CA,EACG,OAAO,CAACb,MAAQA,EAAkB,SAAS,IAAI,EAC/C,QAAQ,CAACA,MAAOY,EAAI,KAAKb,EAAkBC,GAAkB,EAAE,aAAAC,GAAa,SAAAC,GAAS,CAAC,CAAC,GAGrFU;AACT,GAEMI,IAAsB,OAC1BC,GACAC,GACA,EAAE,aAAAjB,GAAa,SAAAC,QACZ;;AAEH,QAAMiB,KAAUL,IAAAG,EACb,WAAW,UAAU,MADR,gBAAAH,EAEZ,cAAc,QACf,KAAK,CAACL,MAAUA,EAAM,KAAK,eAAe;AAE7C,MAAIU,GAAS;AACX,UAAMC,IAAU,OAAO,OAAOF,EAAQ,KAAK,EAAE,KAAK,CAACG,MAASA,EAAK,IAAI,SAASF,EAAQ,KAAK,QAAQ,EAAE,CAAC;AACtG,QAAIC,GAAS;AACX,YAAMT,IAAM,IAAIW,EAAO,YAAY,MAAMF,EAAQ,QAAQ;AACzD,aAAOV,EAAgBC,GAAK,EAAE,aAAAV,GAAa,SAAAC,EAAS,CAAA;AAAA,IACtD;AAAA,EACF;AACF,GAEMqB,IAAgB,CACpBC,GACA,EAAE,aAAAvB,GAAa,SAAAC,GAAS,QAAAuB,QACrB;;AACH,QAAMC,MAAMZ,IAAAU,KAAA,gBAAAA,EAAO,WAAW,GAAGC,gBAArB,gBAAAX,EAAuC,KAAK,QAAO,IAEzDa,IAAe;AAAA,IACnB,SAAOZ,IAAAS,KAAA,gBAAAA,EAAO,mBAAmB,GAAGC,aAAkBA,aAA/C,gBAAAV,EAA8D,QAAO;AAAA,IAC5E,MAAMT,EAAQL,GAAayB,CAAG;AAAA,IAC9B,MAAMpB,EAAQJ,GAASD,GAAayB,CAAG;AAAA,IACvC,UAAU,CAAC;AAAA,EAAA,GAEPlB,IAAWgB,EAAM,cAAc,GAAGC,WAAgB;AACpD,SAAAjB,KAAYA,EAAS,SAAS,MAChCmB,EAAI,WAAWnB,EAAS,IAAI,CAACoB,MAAOL,EAAcK,GAAI,EAAE,aAAA3B,GAAa,SAAAC,GAAS,QAAAuB,EAAO,CAAC,CAAC,IAGlFE;AACT,GAEME,IAAkB,CAACC,GAA6B,EAAE,aAAA7B,GAAa,SAAAC,QAAwD;;AAC3H,QAAMU,IAA8B,CAAA,GAE9BmB,IAAcD,EAAQ;AAC5B,MAAIL,IAAS;AACb,SAAIM,EAAY,QAAQ,GAAG,MAAM,OAC/BN,IAASM,EAAY,MAAM,GAAG,EAAE,KAAK,OAIpCjB,IAAAgB,EAAA,WAAW,GAAGL,SAAc,MAA5B,QAAAX,EACC,cAAc,GAAGW,aAClB,QAAQ,CAACD,MAAUZ,EAAI,KAAKW,EAAcC,GAAO,EAAE,aAAAvB,GAAa,SAAAC,GAAS,QAAAuB,EAAQ,CAAA,CAAC,IAE9Eb;AACT,GAEMoB,IAAkB,OAAO;AAAA,EAC7B,SAAAC;AAAA,EACA,aAAAhC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAgB;AACF,MAKM;;AACE,QAAAgB,IAAQD,EAAQ,WAAW,OAAO,GAClCE,IAAQD,KAASA,EAAM,KAAK;AAElC,MAAIC,GAAO;AACT,UAAMC,KAAUtB,IAAAmB,EACb,WAAW,UAAU,MADR,gBAAAnB,EAEZ,cAAc,QACf,KAAK,CAACO,MAASA,EAAK,KAAK,OAAOc;AAEnC,QAAIC,GAAS;AACL,YAAAC,IAAU,GAAGpC,IAAcA,MAAgB,KAAK,KAAK,MAAMmC,EAAQ,KAAK,QAExEE,IAAO,OAAO,OAAOpB,EAAQ,KAAK,EAAE,KAAK,CAACG,MAASA,EAAK,IAAI,SAASgB,CAAO,CAAC;AAEnF,UAAIC,GAAM;AACR,cAAMR,IAAU,IAAIR,EAAO,YAAY,MAAMgB,EAAK,QAAQ;AAE1D,eAAOT,EAAgBC,GAAS,EAAE,aAAA7B,GAAa,SAAAC,EAAS,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF,GAEaqC,IAAW,OAAOtB,GAA+BC,GAAkB,EAAE,SAAAhB,QAAmC;AACnH,QAAM,EAAE,UAAUD,EAAA,IAAgBuC,EAAkBtB,CAAO,KAAK,IAE1DuB,IAAa,MAAMT,EAAgB;AAAA,IACvC,SAASf;AAAA,IACT,aAAAhB;AAAA,IACA,SAAAiB;AAAA,IACA,SAAAhB;AAAA,EAAA,CACD;AAED,SAAIuC,KAIG,MAAMzB,EAAoBC,GAAWC,GAAS,EAAE,aAAAjB,GAAa,SAAAC,GAAS;AAC/E,GC7JawC,IAAoC,OAAOxB,MAAqB;AAC3E,QAAMyB,IAAmC;AAAA,IACvC,iBAAiB;AAAA,EAAA;AAGnB,eAAM,QAAQ;AAAA,IACZzB,EAAQ,MAAM,IAAI,OAAOoB,MAAS;;AAChC,UAAIA,EAAK,IAAI,SAAS,mCAAmC,GAAG;AAE1D,cAAMM,KAAgB9B,IADJ,IAAIQ,EAAO,YAAY,MAAMgB,EAAK,QAAQ,EAC5B,WAAW,UAAU,MAA/B,gBAAAxB,EAAkC,WAAW;AACnE,UAAIC,IAAA6B,KAAA,gBAAAA,EAAe,SAAf,gBAAA7B,EAAqB,UAAS,kBAAkB6B,EAAc,QAAQ,WACxED,EAAgB,kBAAkB;AAAA,MAEtC;AAAA,IAAA,CACD;AAAA,EAAA,GAGIA;AACT;ACzBA,IAAIE,IAAU;AAEP,MAAMC,IAAS;AAAA,EACpB,QAAQ,CAACC,MAAoB;AACjB,IAAAF,IAAAE;AAAA,EACZ;AAAA,EAEA,KAAK,IAAIC,MAAgB;AACvB,IAAIH,KAEM,QAAA,IAAI,2BAA2B,GAAGG,CAAI;AAAA,EAElD;AAAA,EAEA,MAAM,IAAIA,MAAgB;AACxB,IAAIH,KAEM,QAAA,KAAK,2BAA2B,GAAGG,CAAI;AAAA,EAEnD;AAAA,EAEA,OAAO,IAAIA,MAAgB;AAEjB,YAAA,MAAM,GAAGA,CAAI;AAAA,EACvB;AAAA,EACA,MAAM,CAACC,MAA+B;AACpC,IAAIJ,KAEM,QAAA,KAAK,oCAAoCI,GAAO;AAAA,EAE5D;AAAA,EACA,SAAS,CAACA,MAA+B;AACvC,IAAIJ,KAEM,QAAA,QAAQ,oCAAoCI,GAAO;AAAA,EAE/D;AAAA,EACA,QAAQ,CAACC,GAAsDC,IAAiB,UAAa;AAC3F,UAAMC,IAAW,OAAOF,KAAqB,WAAWA,IAAmBA,EAAiB;AAC5F,IAAIL,MACEK,EAAiB,YAAYC,IAE/B,QAAQ,IAAI,qCAAqC,GAAGD,EAAiB,aAAaE,KAAY,IAGtF,QAAA;AAAA,MACN;AAAA,MACA,GAAGF,EAAiB,aAAaA,EAAiB,iCAAiCC;AAAA,IAAA;AAAA,EAI3F;AAAA,EAEA,oBAAoB,CAAoCE,GAAcF,IAAiB,IAAIG,MAClF,IAAIC,MAAuC;AAC1C,UAAAC,IAAK,YAAY,OAGjBC,IAAWH,EAAkB,GAAIC,CAAY;AAE/C,QAAAE,KAAYA,EAAS;AAChB,aAAAA,EAAS,KAAK,CAACC,MAAa;AAC3BC,cAAAA,IAAK,YAAY;AACvB,eAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAClDO;AAAA,MAAA,CACR;AAGG,UAAAC,IAAK,YAAY;AACvB,WAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAElDM;AAAA,EAAA;AAGb,GCxEajB,IAAoB,CAACtB,MAAqB;AAE/C,QAAAoB,IADe,OAAO,OAAOpB,EAAQ,KAAK,EAAE,OAAO,CAACoB,MAAS,CAACA,EAAK,GAAG,EAClD,KAAK,CAACA,MAASA,EAAK,IAAI,SAAS,MAAM,CAAC;AAE3D,SAAA;AAAA,IACL,MAAMA;AAAA,IACN,WAAUA,KAAA,gBAAAA,EAAM,IAAI,UAAU,GAAGA,EAAK,IAAI,YAAY,GAAG,OAAM;AAAA,EAAA;AAEnE,GCNasB,IAA+B,OAAO,EAAE,SAAA1C,QAAoC;AACjF,QAAA,EAAE,MAAM2C,GAAS,UAAU5D,MAAgBuC,EAAkBtB,CAAO,KAAK,IAEzE8B,IAAO,OAAMa,KAAA,gBAAAA,EAAS;AAE5B,MAAI,CAACb;AAAM,WAAO;AAElB,QAAMc,IAAa,IAAIxC,EAAO,YAAY0B,CAAI,GAExCe,IAAcD,EAAW,WAAW,UAAU,GAC9CE,IAAWF,EAAW,WAAW,OAAO,GAExCG,IAAeD,KAAA,gBAAAA,EAAU,cAAc,WAAW,IAAI,CAAC3C,MAASA,EAAK,KAAK,QAC1E6C,KACJH,KAAA,gBAAAA,EAAa,cAAc,QAAQ,OAAO,CAAC1C,MAAS4C,EAAa,SAAS5C,EAAK,KAAK,MAAM,EAAE,OAAM;AAS7F,SAPmBH,EAAQ,MAAM,OAAO,CAACoB,MACvC4B,EAAuB,KAAK,CAAC7C,MAC7BpB,IACE,GAAGA,KAAeoB,EAAK,KAAK,WAAWiB,EAAK,MAD1B,GAAGjB,EAAK,KAAK,WAAWiB,EAAK,GAEvD,CACF;AAGH,GCjBa6B,IAAkB,CAACxD,MAA4B;;AACpD,QAAAoD,IAAcpD,EAAI,WAAW,UAAU;AAE7C,WACEG,IAAAiD,KAAA,gBAAAA,EAAa,cAAc,YAA3B,gBAAAjD,EAAoC,IAAI,CAACsD,OAAQ;AAAA,IAC/C,MAAMA,EAAG,KAAK,QAAQ;AAAA,IACtB,IAAIA,EAAG,KAAK,MAAM;AAAA,IAClB,WAAWA,EAAG,KAAK;AAAA,EAAA,QACd,CAAA;AAEX,GAEaC,KACX,CAAC,EAAE,SAAAnD,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;;AACzC,QAAA,EAAE,MAAMT,GAAS,UAAU5D,MAAgBuC,EAAkBtB,CAAO,KAAK,IACzEyB,IAAkB,MAAMD,EAAkCxB,CAAO;AAEvE,MAAI,CAAC2C;AACI,WAAAS;AAGH,QAAAtB,IAAO,MAAMa,EAAQ;AAEpB,EAAAf,EAAA,IAAIE,GAAML,CAAe;AAEhC,QAAM1B,IAAY,IAAIK,EAAO,YAAY0B,CAAI,GAEvCpC,IAAO,MAAM2B,EAAStB,GAAWC,GAAS,EAAE,SAAAhB,EAAA,CAAS,KAAM,IAE3DqE,IAActD,EAAU,WAAW,UAAU,GAC7C8C,IAAc9C,EAAU,WAAW,UAAU,GAC7C+C,IAAW/C,EAAU,WAAW,OAAO,GACvCuD,IAAWvD,EAAU,WAAW,OAAO,GACvCwD,IAAWF,KAAA,gBAAAA,EAAa,WAAW,aACnCG,KAAkBH,KAAA,gBAAAA,EAAa,cAAc,YAAW,IACxDI,IAAuBD,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,kBAAkB,GAC/FC,IAA2BH,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,gBAAgB,GACjGE,IAA6BJ,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,kBAAkB,GAErGG,IAA2BJ,KAAA,gBAAAA,EAAsB,KACjDK,IAAyBH,KAAA,gBAAAA,EAA0B,KAMnDI,IAAkBH,KAAA,gBAAAA,EAA4B,KAE9CI,KAAQT,KAAA,gBAAAA,EAAU,UAAO3D,IAAAI,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAiE,EAAI,MAAMA,CAAG,MAAnC,gBAAArE,EAAsC,aAAY,IAC3EsE,IAA2BpB,KAAA,gBAAAA,EAAU,KAAK,+BAI1CqB,KAFoB,MAAMzB,EAA6B,EAAE,SAAA1C,EAAS,CAAA,GAEpC,OAAO,CAACoE,GAAMhD,MAASA,EAAK,OAAOgD,GAAM,CAAC;AAEvE,SAAA;AAAA,IACL,UAAUpE,EAAQ;AAAA,IAClB,KAAK;AAAA,MACH,KAAAN;AAAA,IACF;AAAA,IACA,iBAAiBmE,KAA4BpC,EAAgB,mBAAmB;AAAA,IAChF,eAAeqC,KAA0B;AAAA,IACzC,iBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,kBAAkBE,KAA4B;AAAA,IAC9C,aACEpB,KAAA,gBAAAA,EAAU,cAAc,WAAW,IAAI,CAACuB,MAAe;;AACrD,YAAMC,IAAezB,KAAA,gBAAAA,EAAa,cAAc,QAAQ,KAAK,CAAC1C,MAASA,EAAK,KAAK,QAAOkE,KAAA,gBAAAA,EAAY,KAAK,SACnGE,KAAOD,KAAA,gBAAAA,EAAc,KAAK,SAAQ,IAClCE,MAAc5E,IAAAyE,KAAA,gBAAAA,EAAY,KAAK,eAAjB,gBAAAzE,EAA6B,MAAM,SAAQ,IACzD6E,MAAW5E,IAAAG,EAAQ,MAAM,KAAK,CAACoB,MAASA,EAAK,IAAI,SAASmD,CAAI,CAAC,MAApD,gBAAA1E,EAAuD,SAAQ,GAG1E6E,IAAc1F,KAAW;AAExB,aAAA;AAAA,QACL,KAAIsF,KAAA,gBAAAA,EAAc,KAAK,OAAM;AAAA,QAC7B,OAAMK,IAAAL,KAAA,gBAAAA,EAAc,KAAK,SAAnB,QAAAK,EAAyB,WAAW,cACtCL,KAAA,gBAAAA,EAAc,KAAK,OACnBvF,IACA,GAAG2F,IAAc3F,KAAeuF,KAAA,gBAAAA,EAAc,KAAK,SACnD,GAAGI,IAAcJ,KAAA,gBAAAA,EAAc,KAAK;AAAA,QACxC,iBAAiBT,KAA4B;AAAA,QAC7C,GAAIW,EAAW,KAAK,CAACI,MAAaA,MAAa,6BAA6B,KAAK;AAAA,UAC/E,iBAAiB;AAAA,QACnB;AAAA,QACA,mBAAmBH,IAAWN;AAAA,QAC9B,gBAAgBK,EAAW,KAAK,CAACI,MAAaA,MAAa,kBAAkB,KAAK;AAAA,QAClF,iBAAiBJ,EAAW,KAAK,CAACI,MAAaA,MAAa,mBAAmB,KAAK;AAAA,QAEpF,WAAWN,KAAA,gBAAAA,EAAc,KAAK;AAAA,MAAA;AAAA,IAEjC,OAAK,CAAC;AAAA,IACT,OAAOrB,EAAgBlD,CAAS;AAAA,IAChC,OAAOuD,KAAA,gBAAAA,EAAU,cAAc,aAAa,IAAI,CAACuB,OACxC;AAAA,MACL,MAAMA,EAAI,KAAK,QAAQ;AAAA,MACvB,OAAOA,EAAI,KAAK,SAAS;AAAA,MACzB,MAAMA,EAAI,KAAK;AAAA,IAAA;AAAA,EAElB;AAEL,GC9GWC,KAA8B,OAAO9E,GAAkB+E,MAAyB;AACrF,QAAA3D,IAAO,OAAO,OAAOpB,EAAQ,KAAK,EAAE,KAAK,CAACoB,MAASA,EAAK,QAAQ2D,CAAY,GAE5EC,IAAW,MAAMC,GAAYjF,GAAS+E,CAAY;AAExD,MAAI,CAAC3D;AACG,UAAA,IAAI,MAAM,eAAe;AAG3B,QAAA8D,IAAO,MAAM9D,EAAK;AAwCjB,SAAA;AAAA,IACL,MAAM8D;AAAA,IACN,QAAQ;AAAA,MACN,SAAS;AAAA,QACP,GAAIA,EAAK,QAAQ;AAAA,UACf,gBAAgBA,EAAK;AAAA,QACvB;AAAA,QACA,GAAI9D,EAAK,kBAAkB;AAAA,UACzB,gBAAgBA,EAAK;AAAA,QACvB;AAAA,QACA,GAAI4D,EAAS,aAAa;AAAA,UACxB,gBAAgBA,EAAS;AAAA,QAC3B;AAAA,MAEF;AAAA,IACF;AAAA,EAAA;AAEJ,GAEMC,KAAc,OAAOjF,GAAkB+E,MAAyB;;AAEpE,QAAMjD,IAAO,QAAMlC,IADH0B,EAAkBtB,CAAO,EACd,SAAR,gBAAAJ,EAAc;AAEjC,MAAIkC,GAAM;AACR,UAAM/B,IAAY,IAAIK,EAAO,YAAY0B,CAAI;AAGtC,WAAA;AAAA,MACL,YAAWjC,IAHCoD,EAAgBlD,CAAS,EAGpB,KAAK,CAACI,MAAS4E,EAAa,SAAS5E,EAAK,IAAI,CAAC,MAArD,gBAAAN,EAAwD;AAAA,IAAA;AAAA,EAEvE;AAEO,SAAA;AAAA,IACL,WAAWsF,GAA4BJ,CAAY;AAAA,EAAA;AAEvD,GAEMI,KAA8B,CAACC,MAAgB;AAC/C,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,QAAQ;AAChB,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEX,GCvGaC,KACX,CAAC,EAAE,SAAArF,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;;AACzC,QAAAkC,IAAQ,OAAO,OAAOtF,EAAQ,KAAK,EAAE,OAAO,CAACoB,MAAS,CAACA,EAAK,GAAG;AAE9D,SAAA;AAAA,IACL,UAAUpB,EAAQ;AAAA,IAClB,KAAK;AAAA,MACH,KAAK,CAAC;AAAA,IACR;AAAA,IACA,SAAOJ,IAAAI,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAiE,EAAU,MAAAA,CAAG,MAAnC,gBAAArE,EAAsC,SAAS,QAAQ,OAAO,QAAO;AAAA,IAC5E,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,YAAY0F,EAAM,IAAI,CAAClE,GAAMmE,OAAW;AAAA,MAItC,IAAI,GAAGA,KAASnE,EAAK;AAAA,MACrB,MAAM,GAAGpC,IAAUoC,EAAK;AAAA,MACxB,iBAAiB;AAAA,MACjB,mBAAmB,IAAIkE,EAAM;AAAA,MAC7B,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,WAAWlE,EAAK;AAAA,IAAA,EAChB;AAAA,IACF,OAAOkE,EAAM,IAAI,CAAClE,GAAMmE,OAAW;AAAA,MACjC,IAAI,GAAGA,KAASnE,EAAK;AAAA,MACrB,MAAM,GAAGpC,IAAUoC,EAAK;AAAA,IAAA,EACxB;AAAA,EAAA;AAEN,GC1BWoE,KACX,CAAC,EAAE,SAAAxF,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;;AACzC,QAAAqC,IAAgBzF,EAAQ,MAAM,KAAK,CAACoB,MAASA,EAAK,SAAS,YAAY,MAAM,eAAe;AAElG,MAAI,CAACqE;AACI,WAAArC;AAIH,QAAAsC,IAAU,MAAMD,EAAc,UAG9BE,MAAY/F,IAFH,IAAIQ,EAAO,YAAYsF,CAAO,EAEpB,WAAW,OAAO,MAAzB,gBAAA9F,EAA4B,QAA+B;AAEtE,SAAA;AAAA,IACL,GAAGwD;AAAA,IACH,YAAYA,EAAS,WAAW,OAAO,CAACjD,MAASA,EAAK,GAAG,kBAAkB,eAAe;AAAA,IAC1F,kBAAkBwF,MAAa,sBAAsB,QAAQ;AAAA,EAAA;AAEjE,GCvBIC,KAAqB,CAACnG,MAA4B;;AACtD,QAAMoG,KAAUjG,IAAAH,EACb,mBAAmB,MAAM,MADZ,gBAAAG,EAEZ,cAAc,QACf,KAAK,CAACT,MAASA,EAAK,KAAK,SAAS;AAErC,SAAO,CAAC,EAAE0G,KAAWA,EAAQ,KAAK,SAAS;AAC7C,GAEMC,KAA2B,CAACR,MAChCA,EAAM,OAAO,OAAOS,GAAQC,MAAY;AAKtC,MAFI,CAFY,MAAMD,KAKpB,CAACE,EAAmB;AAAA,IAClB,UAAUD,EAAQ;AAAA,IAClB,KAAKA,EAAQ;AAAA,EAAA,CACd;AAEM,WAAA;AAGH,QAAA5E,IAAO,MAAM4E,EAAQ;AAE3B,SAAK5E,IAEEwE,GAAmB,IAAIxF,EAAO,YAAYgB,CAAI,CAAC,IAFpC;AAGpB,GAAG,QAAQ,QAAQ,EAAI,CAAC,GAEb8E,KACX,CAAC,EAAE,SAAAlG,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;AAI/C,MAFEA,EAAS,oBAAoB,gBAAgBA,EAAS,WAAW,MAAM,CAACjD,MAASA,EAAK,oBAAoB,YAAY,GAE9F;AACxB,UAAMmF,IAAQ,MAAM5C,EAA6B,EAAE,SAAA1C,EAAS,CAAA;AAI5D,QAFuB,MAAM8F,GAAyBR,CAAK;AAGlD,aAAA;AAAA,QACL,GAAGlC;AAAA,QACH,YAAYA,EAAS,WAAW,IAAI,CAACjD,OAAU;AAAA,UAC7C,GAAGA;AAAA,UACH,iBAAiB;AAAA,QAAA,EACjB;AAAA,QACF,iBAAiB;AAAA,MAAA;AAAA,EAGvB;AAEO,SAAAiD;AACT,GCpDI+C,KAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO,CAAC;AAAA,EACR,KAAK;AAAA,IACH,KAAK,CAAC;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,OAAO;AACT,GAEaC,KAA8B,OAAOpG,GAAkB,EAAE,SAAAhB,IAAU,GAAG,IAA0B,OAAO;AAClH,QAAMqH,IAAQ;AAAA,IACZhB,GAAY,EAAE,SAAArF,GAAS,SAAAhB,GAAS;AAAA,IAChCmE,GAAS,EAAE,SAAAnD,GAAS,SAAAhB,GAAS;AAAA,IAC7BkH,GAAkB,EAAE,SAAAlG,GAAS,SAAAhB,GAAS;AAAA,IACtCwG,GAAc,EAAE,SAAAxF,GAAS,SAAAhB,GAAS;AAAA,EAAA;AAGhC,MAAA;AACF,UAAMoE,IAAW,MAAMiD,EAAM,OAAO,OAAOjD,GAAUkD,MAC5C,MAAMA,EAAI,MAAMlD,CAAQ,GAC9B,QAAQ,QAAQ+C,EAAY,CAAC;AAEzB,WAAAvE,EAAA,IAAI,sBAAsBwB,CAAQ,GAElCA;AAAA,WACAmD;AACP,UAAA3E,EAAO,MAAM2E,CAAC,GAERA;AAAA,EACR;AACF,GC1CaC,IAAiB,CAACpB,MAAgBA,EAAI,UAAUA,EAAI,YAAY,GAAG,IAAI,CAAC,KAAKA,GCS7EqB,KAAwB,OAAOC,GAAgBC,MAA8D;AACxH,QAAMC,IAAc;AAAA;AAAA;AAAA,4CAGsBD,KAAA,QAAAA,EAAS,mBAAmB,eAAe;AAAA,UAC7EA,KAAA,QAAAA,EAAS,mBAAmB,+DAA+D;AAAA;AAAA;AAAA,UAG3FD,EACC,IAAI,CAACG,MAAQ,aAAaL,EAAeK,CAAG,YAAYA,kBAAoBC,EAAuBD,CAAG,MAAM,EAC5G,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,UAGVH,EAAK,IAAI,CAACG,MAAQ,mBAAmBL,EAAeK,CAAG,OAAO,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,KAK3EE,IAAiCL,EAAK,IAAI,CAACG,OAAS;AAAA,IACxD,KAAK;AAAA,IACL,UAAUL,EAAeK,CAAG;AAAA,IAC5B,gBAAgBC,EAAuBD,CAAG;AAAA,IAC1C,KAAKA;AAAA,IACL,MAAM,MAAMH,EAAK;AAAA,IACjB,QAAQ,YAAY;AAAA,IACpB,MAAM,YAAY,IAAI,KAAK;AAAA,IAC3B,QAAQ,YAAY;AAAA,EACpB,EAAA;AAYK,SAAA;AAAA,IACL,UAAU;AAAA,IACV,OAAO,CAZiC;AAAA,MACxC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,YAAYE;AAAA,MACpB,MAAM,YAAY,IAAI,KAAK;AAAA,MAC3B,QAAQ,YAAYA;AAAA,IAAA,GAKH,GAAGG,CAAY;AAAA,EAAA;AAEpC,GCpDaC,KAAe,OAAO9B,MACjC,IAAI,QAAgB,CAAC+B,MAAY;AACzB,QAAAC,IAAS,IAAI;AACnB,EAAAA,EAAO,cAAchC,CAAI,GACzBgC,EAAO,YAAY,WAAY;AAC7B,UAAMC,IAAaD,EAAO;AAC1B,IAAAD,EAAQE,CAAU;AAAA,EAAA;AAEtB,CAAC,GCDUC,KAAwB,OACnC1B,GACA;AAAA,EACE,UAAA2B;AAAA,EACA,WAAAC;AACF,IAGI,EAAE,UAAU,mBACb;AACH,QAAMC,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAWqBD,KAAa;AAAA;AAAA;AAAA;AAAA;AAwCjD,SAlCkB;AAAA,IACvB,UAAU;AAAA,IACV,OAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,UAAUd,EAAe,eAAe;AAAA,QACxC,KAAK;AAAA,QACL,MAAM,YAAY,IAAI,KAAK,CAACe,CAAa,CAAC;AAAA,QAC1C,QAAQ,YAAYA;AAAA,QACpB,QAAQ,YAAY,KAAKA,CAAa;AAAA,QACtC,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,UAAUf,EAAe,SAAS;AAAA,QAClC,KAAK;AAAA,QACL,MAAM,YACA,OAAOd,KAAY,WAAiB,IAAI,KAAK,CAACA,CAAO,CAAC,IACnDA;AAAA,QAET,QAAQ,YACF,OAAOA,KAAY,WAAiBA,IACjCA,EAAQ;QAEjB,QAAQ,YACF,OAAOA,KAAY,WAAiB,KAAKA,CAAO,IAC7CsB,GAAatB,CAAO;AAAA,QAE7B,MAAM,OAAOA,KAAY,WAAWA,EAAQ,SAASA,EAAQ;AAAA,QAC7D,gBAAgB2B;AAAA,MAClB;AAAA,IACF;AAAA,EAAA;AAIJ,GCrEaG,IAAwB,CAACC,GAAWC,MAAc;;AACvD,QAAAC,IAAQF,EAAE,MAAM,OAAO,GACvBG,IAAQF,EAAE,MAAM,OAAO;AAE7B,WAASG,IAAI,GAAGC,IAAMH,EAAM,QAAQE,IAAIC,GAAKD;AACvC,QAAAF,EAAME,OAAOD,EAAMC;AACrB,cAAIjI,IAAA+H,EAAME,OAAN,QAAAjI,EAAU,MAAM,QACX,EAAE+H,EAAME,MAAM,MAAM,EAAED,EAAMC,MAAM,OAEjCF,EAAME,MAAM,IAAI,cAAcD,EAAMC,MAAM,EAAE;AAKnD,SAAA;AACT,GCmBaE,KAAyB,OACpCC,GACA,EAAE,cAAAC,GAAc,MAAA9F,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAImD,IAAQ,OAAO,OAAO0C,EAAM,KAAK;AAErC,EAAIC,MACM3C,IAAAA,EAAM,KAAK,CAACmC,GAAGC,MAAMF,EAAsBC,EAAE,MAAMC,EAAE,IAAI,CAAC;AAGpE,QAAM1H,IAAU;AAAA,IACd,UAAUmC,KAAQ;AAAA,IAClB,OAAOmD,EAAM,IAAI,CAAClE,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAUoF,EAAepF,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,MAAMA,EAAK,MAAM,MAAM;AAAA,MAC7B,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,GAAIA,EAAK,kBAAkB;AAAA,QACzB,QAAQA,EAAK;AAAA,MACf;AAAA,MAIA,MAAMA,EAAK,MAAM;AAAA,IAAA,EACjB;AAAA,EAAA;AAGG,SAAAQ,EAAA,IAAI,qBAAqB5B,CAAO,GAEhCA;AACT,GC9DakI,KAAmC,OAC9CC,GAMA,EAAE,cAAAF,GAAc,MAAA9F,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAImD,IAAQ6C;AAEZ,SAAIF,MACM3C,IAAAA,EAAM,KAAK,CAACmC,GAAGC,MAAMF,EAAsBC,EAAE,MAAMC,EAAE,IAAI,CAAC,IAG7D;AAAA,IACL,UAAUvF,KAAQ;AAAA,IAClB,OAAOmD,EAAM,IAAI,CAAClE,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAUoF,EAAepF,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,YAAY,IAAI,KAAK,CAAC,MAAMA,EAAK,KAAK,CAAC,CAAC;AAAA,MAC9C,QAAQ,YAAY;AACZ,cAAAU,IAAO,MAAMV,EAAK;AACjB,eAAA,OAAO,aAAa,MAAM,MAAM,MAAM,KAAK,IAAI,YAAYU,CAAI,CAAC,CAAC;AAAA,MAC1E;AAAA,MACA,QAAQ,YAEC;AAAA,MAET,MAAMV,EAAK;AAAA,IAAA,EACX;AAAA,EAAA;AAEN,GCnCagH,KAAY,CAAC,EAAE,cAAAC,EAAa,IAAgC,OAAO;AACvE,EAAAzG,EAAA,OAAO,CAAC,CAACyG,CAAY;AAC9B;"}
|
|
1
|
+
{"version":3,"file":"prose-streamer.js","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type,\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n // 'Cache-Control': `no-cache, no-store, no-transform`\n },\n },\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(filesSortedByAlpha).reduce((acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n }, [] as NonNullable<Manifest[\"nav\"]>[\"toc\"])\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":";;AAQA,MAAMA,IAAoB,CAACC,GAAgB,EAAE,aAAAC,GAAa,SAAAC,QAAwD;AAChH,QAAMC,IAAe;AAAA,IACnB,UAAU,CAAC;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAET,MAAIC,IAAcJ,EAAG,WAAW,MAAM,KAAKA,EAAG,WAAW,GAAG;AACxD,EAAAG,EAAA,SAAQC,KAAA,gBAAAA,EAAa,KAAK,WAASA,KAAA,gBAAAA,EAAa,IAAI,WAAUD,EAAI;AACtE,MAAIE,IAAOD,KAAA,gBAAAA,EAAa;AACxB,EAAIC,MAAS,QACGD,IAAAJ,EAAG,mBAAmB,GAAGK,KAAQ,GAC3CD,MACKC,IAAAD,EAAY,KAAK,iBAGxBC,MAAS,QAAOD,KAAA,QAAAA,EAAa,KAAK,UACpCD,EAAI,OAAOG,EAAQL,GAAaG,EAAY,KAAK,IAAI,GACrDD,EAAI,OAAOG,EAAQJ,GAASD,GAAaG,EAAY,KAAK,IAAI;AAE1D,QAAAG,IAAcP,EAAG,WAAW,IAAI;AACtC,MAAIO,GAAa;AACT,UAAAC,IAAWD,EAAY,cAAc,IAAI;AAC3C,IAAAC,KAAYA,EAAS,SAAS,MAC5BL,EAAA,WAAWK,EAAS,IAAI,CAACC,MAAUV,EAAkBU,GAAO,EAAE,aAAAR,GAAa,SAAAC,EAAQ,CAAC,CAAC;AAAA,EAE7F;AAEO,SAAAC;AACT,GAEMO,IAAkB,CAACC,GAAyB,EAAE,aAAAV,GAAa,SAAAC,QAAwD;;AACvH,QAAMU,IAAW,CAAA;AAEb,MAAAC;AACA,SAAAF,EAAI,mBAAmB,aAAa,IACpBE,KAAAC,IAAAH,EAAI,mBAAmB,aAAa,MAApC,gBAAAG,EAAuC,WAChDH,EAAI,mBAAmB,qBAAqB,MACnCE,KAAAE,IAAAJ,EAAI,mBAAmB,qBAAqB,MAA5C,gBAAAI,EAA+C,WAG/DF,KAAmBA,EAAgB,SAAS,KAC9CA,EACG,OAAO,CAACb,MAAQA,EAAkB,SAAS,IAAI,EAC/C,QAAQ,CAACA,MAAOY,EAAI,KAAKb,EAAkBC,GAAkB,EAAE,aAAAC,GAAa,SAAAC,GAAS,CAAC,CAAC,GAGrFU;AACT,GAEMI,IAAsB,OAC1BC,GACAC,GACA,EAAE,aAAAjB,GAAa,SAAAC,QACZ;;AAEH,QAAMiB,KAAUL,IAAAG,EACb,WAAW,UAAU,MADR,gBAAAH,EAEZ,cAAc,QACf,KAAK,CAACL,MAAUA,EAAM,KAAK,eAAe;AAE7C,MAAIU,GAAS;AACX,UAAMC,IAAU,OAAO,OAAOF,EAAQ,KAAK,EAAE,KAAK,CAACG,MAASA,EAAK,IAAI,SAASF,EAAQ,KAAK,QAAQ,EAAE,CAAC;AACtG,QAAIC,GAAS;AACX,YAAMT,IAAM,IAAIW,EAAO,YAAY,MAAMF,EAAQ,QAAQ;AACzD,aAAOV,EAAgBC,GAAK,EAAE,aAAAV,GAAa,SAAAC,EAAS,CAAA;AAAA,IACtD;AAAA,EACF;AACF,GAEMqB,IAAgB,CACpBC,GACA,EAAE,aAAAvB,GAAa,SAAAC,GAAS,QAAAuB,QACrB;;AACH,QAAMC,MAAMZ,IAAAU,KAAA,gBAAAA,EAAO,WAAW,GAAGC,gBAArB,gBAAAX,EAAuC,KAAK,QAAO,IAEzDa,IAAe;AAAA,IACnB,SAAOZ,IAAAS,KAAA,gBAAAA,EAAO,mBAAmB,GAAGC,aAAkBA,aAA/C,gBAAAV,EAA8D,QAAO;AAAA,IAC5E,MAAMT,EAAQL,GAAayB,CAAG;AAAA,IAC9B,MAAMpB,EAAQJ,GAASD,GAAayB,CAAG;AAAA,IACvC,UAAU,CAAC;AAAA,EAAA,GAEPlB,IAAWgB,EAAM,cAAc,GAAGC,WAAgB;AACpD,SAAAjB,KAAYA,EAAS,SAAS,MAChCmB,EAAI,WAAWnB,EAAS,IAAI,CAACoB,MAAOL,EAAcK,GAAI,EAAE,aAAA3B,GAAa,SAAAC,GAAS,QAAAuB,EAAO,CAAC,CAAC,IAGlFE;AACT,GAEME,IAAkB,CAACC,GAA6B,EAAE,aAAA7B,GAAa,SAAAC,QAAwD;;AAC3H,QAAMU,IAA2C,CAAA,GAE3CmB,IAAcD,EAAQ;AAC5B,MAAIL,IAAS;AACb,SAAIM,EAAY,QAAQ,GAAG,MAAM,OAC/BN,IAASM,EAAY,MAAM,GAAG,EAAE,KAAK,OAIpCjB,IAAAgB,EAAA,WAAW,GAAGL,SAAc,MAA5B,QAAAX,EACC,cAAc,GAAGW,aAClB,QAAQ,CAACD,MAAUZ,EAAI,KAAKW,EAAcC,GAAO,EAAE,aAAAvB,GAAa,SAAAC,GAAS,QAAAuB,EAAQ,CAAA,CAAC,IAE9Eb;AACT,GAEMoB,IAAkB,OAAO;AAAA,EAC7B,SAAAC;AAAA,EACA,aAAAhC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAgB;AACF,MAKM;;AACE,QAAAgB,IAAQD,EAAQ,WAAW,OAAO,GAClCE,IAAQD,KAASA,EAAM,KAAK;AAElC,MAAIC,GAAO;AACT,UAAMC,KAAUtB,IAAAmB,EACb,WAAW,UAAU,MADR,gBAAAnB,EAEZ,cAAc,QACf,KAAK,CAACO,MAASA,EAAK,KAAK,OAAOc;AAEnC,QAAIC,GAAS;AACL,YAAAC,IAAU,GAAGpC,IAAcA,MAAgB,KAAK,KAAK,MAAMmC,EAAQ,KAAK,QAExEE,IAAO,OAAO,OAAOpB,EAAQ,KAAK,EAAE,KAAK,CAACG,MAASA,EAAK,IAAI,SAASgB,CAAO,CAAC;AAEnF,UAAIC,GAAM;AACR,cAAMR,IAAU,IAAIR,EAAO,YAAY,MAAMgB,EAAK,QAAQ;AAE1D,eAAOT,EAAgBC,GAAS,EAAE,aAAA7B,GAAa,SAAAC,EAAS,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF,GAEaqC,IAAW,OAAOtB,GAA+BC,GAAkB,EAAE,SAAAhB,QAAmC;AACnH,QAAM,EAAE,UAAUD,EAAA,IAAgBuC,EAAkBtB,CAAO,KAAK,IAE1DuB,IAAa,MAAMT,EAAgB;AAAA,IACvC,SAASf;AAAA,IACT,aAAAhB;AAAA,IACA,SAAAiB;AAAA,IACA,SAAAhB;AAAA,EAAA,CACD;AAED,SAAIuC,KAIG,MAAMzB,EAAoBC,GAAWC,GAAS,EAAE,aAAAjB,GAAa,SAAAC,GAAS;AAC/E,GC7JawC,IAAoC,OAAOxB,MAAqB;AAC3E,QAAMyB,IAAmC;AAAA,IACvC,iBAAiB;AAAA,EAAA;AAGnB,eAAM,QAAQ;AAAA,IACZzB,EAAQ,MAAM,IAAI,OAAOoB,MAAS;;AAChC,UAAIA,EAAK,IAAI,SAAS,mCAAmC,GAAG;AAE1D,cAAMM,KAAgB9B,IADJ,IAAIQ,EAAO,YAAY,MAAMgB,EAAK,QAAQ,EAC5B,WAAW,UAAU,MAA/B,gBAAAxB,EAAkC,WAAW;AACnE,UAAIC,IAAA6B,KAAA,gBAAAA,EAAe,SAAf,gBAAA7B,EAAqB,UAAS,kBAAkB6B,EAAc,QAAQ,WACxED,EAAgB,kBAAkB;AAAA,MAEtC;AAAA,IAAA,CACD;AAAA,EAAA,GAGIA;AACT;ACzBA,IAAIE,IAAU;AAEP,MAAMC,IAAS;AAAA,EACpB,QAAQ,CAACC,MAAoB;AACjB,IAAAF,IAAAE;AAAA,EACZ;AAAA,EAEA,KAAK,IAAIC,MAAgB;AACvB,IAAIH,KAEM,QAAA,IAAI,2BAA2B,GAAGG,CAAI;AAAA,EAElD;AAAA,EAEA,MAAM,IAAIA,MAAgB;AACxB,IAAIH,KAEM,QAAA,KAAK,2BAA2B,GAAGG,CAAI;AAAA,EAEnD;AAAA,EAEA,OAAO,IAAIA,MAAgB;AAEjB,YAAA,MAAM,GAAGA,CAAI;AAAA,EACvB;AAAA,EACA,MAAM,CAACC,MAA+B;AACpC,IAAIJ,KAEM,QAAA,KAAK,oCAAoCI,GAAO;AAAA,EAE5D;AAAA,EACA,SAAS,CAACA,MAA+B;AACvC,IAAIJ,KAEM,QAAA,QAAQ,oCAAoCI,GAAO;AAAA,EAE/D;AAAA,EACA,QAAQ,CAACC,GAAsDC,IAAiB,UAAa;AAC3F,UAAMC,IAAW,OAAOF,KAAqB,WAAWA,IAAmBA,EAAiB;AAC5F,IAAIL,MACEK,EAAiB,YAAYC,IAE/B,QAAQ,IAAI,qCAAqC,GAAGD,EAAiB,aAAaE,KAAY,IAGtF,QAAA;AAAA,MACN;AAAA,MACA,GAAGF,EAAiB,aAAaA,EAAiB,iCAAiCC;AAAA,IAAA;AAAA,EAI3F;AAAA,EAEA,oBAAoB,CAAoCE,GAAcF,IAAiB,IAAIG,MAClF,IAAIC,MAAuC;AAC1C,UAAAC,IAAK,YAAY,OAGjBC,IAAWH,EAAkB,GAAIC,CAAY;AAE/C,QAAAE,KAAYA,EAAS;AAChB,aAAAA,EAAS,KAAK,CAACC,MAAa;AAC3BC,cAAAA,IAAK,YAAY;AACvB,eAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAClDO;AAAA,MAAA,CACR;AAGG,UAAAC,IAAK,YAAY;AACvB,WAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAElDM;AAAA,EAAA;AAGb,GCxEajB,IAAoB,CAACtB,MAAqB;AAE/C,QAAAoB,IADe,OAAO,OAAOpB,EAAQ,KAAK,EAAE,OAAO,CAACoB,MAAS,CAACA,EAAK,GAAG,EAClD,KAAK,CAACA,MAASA,EAAK,IAAI,SAAS,MAAM,CAAC;AAE3D,SAAA;AAAA,IACL,MAAMA;AAAA,IACN,WAAUA,KAAA,gBAAAA,EAAM,IAAI,UAAU,GAAGA,EAAK,IAAI,YAAY,GAAG,OAAM;AAAA,EAAA;AAEnE,GCNasB,IAA+B,OAAO,EAAE,SAAA1C,QAAoC;AACjF,QAAA,EAAE,MAAM2C,GAAS,UAAU5D,MAAgBuC,EAAkBtB,CAAO,KAAK,IAEzE8B,IAAO,OAAMa,KAAA,gBAAAA,EAAS;AAE5B,MAAI,CAACb;AAAM,WAAO;AAElB,QAAMc,IAAa,IAAIxC,EAAO,YAAY0B,CAAI,GAExCe,IAAcD,EAAW,WAAW,UAAU,GAC9CE,IAAWF,EAAW,WAAW,OAAO,GAExCG,IAAeD,KAAA,gBAAAA,EAAU,cAAc,WAAW,IAAI,CAAC3C,MAASA,EAAK,KAAK,QAC1E6C,KACJH,KAAA,gBAAAA,EAAa,cAAc,QAAQ,OAAO,CAAC1C,MAAS4C,EAAa,SAAS5C,EAAK,KAAK,MAAM,EAAE,OAAM;AAS7F,SAPmBH,EAAQ,MAAM,OAAO,CAACoB,MACvC4B,EAAuB,KAAK,CAAC7C,MAC7BpB,IACE,GAAGA,KAAeoB,EAAK,KAAK,WAAWiB,EAAK,MAD1B,GAAGjB,EAAK,KAAK,WAAWiB,EAAK,GAEvD,CACF;AAGH,GCjBa6B,IAAkB,CAACxD,MAA4B;;AACpD,QAAAoD,IAAcpD,EAAI,WAAW,UAAU;AAE7C,WACEG,IAAAiD,KAAA,gBAAAA,EAAa,cAAc,YAA3B,gBAAAjD,EAAoC,IAAI,CAACsD,OAAQ;AAAA,IAC/C,MAAMA,EAAG,KAAK,QAAQ;AAAA,IACtB,IAAIA,EAAG,KAAK,MAAM;AAAA,IAClB,WAAWA,EAAG,KAAK;AAAA,EAAA,QACd,CAAA;AAEX,GAEaC,KACX,CAAC,EAAE,SAAAnD,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;;AACzC,QAAA,EAAE,MAAMT,GAAS,UAAU5D,MAAgBuC,EAAkBtB,CAAO,KAAK,IACzEyB,IAAkB,MAAMD,EAAkCxB,CAAO;AAEvE,MAAI,CAAC2C;AACI,WAAAS;AAGH,QAAAtB,IAAO,MAAMa,EAAQ;AAEpB,EAAAf,EAAA,IAAIE,GAAML,CAAe;AAEhC,QAAM1B,IAAY,IAAIK,EAAO,YAAY0B,CAAI,GAEvCpC,IAAO,MAAM2B,EAAStB,GAAWC,GAAS,EAAE,SAAAhB,EAAA,CAAS,KAAM,IAE3DqE,IAActD,EAAU,WAAW,UAAU,GAC7C8C,IAAc9C,EAAU,WAAW,UAAU,GAC7C+C,IAAW/C,EAAU,WAAW,OAAO,GACvCuD,IAAWvD,EAAU,WAAW,OAAO,GACvCwD,IAAWF,KAAA,gBAAAA,EAAa,WAAW,aACnCG,KAAkBH,KAAA,gBAAAA,EAAa,cAAc,YAAW,IACxDI,IAAuBD,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,kBAAkB,GAC/FC,IAA2BH,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,gBAAgB,GACjGE,IAA6BJ,EAAgB,KAAK,CAACE,MAASA,EAAK,KAAK,aAAa,kBAAkB,GAErGG,IAA2BJ,KAAA,gBAAAA,EAAsB,KACjDK,IAAyBH,KAAA,gBAAAA,EAA0B,KAMnDI,IAAkBH,KAAA,gBAAAA,EAA4B,KAE9CI,KAAQT,KAAA,gBAAAA,EAAU,UAAO3D,IAAAI,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAiE,EAAI,MAAMA,CAAG,MAAnC,gBAAArE,EAAsC,aAAY,IAC3EsE,IAA2BpB,KAAA,gBAAAA,EAAU,KAAK,+BAI1CqB,KAFoB,MAAMzB,EAA6B,EAAE,SAAA1C,EAAS,CAAA,GAEpC,OAAO,CAACoE,GAAMhD,MAASA,EAAK,OAAOgD,GAAM,CAAC;AAEvE,SAAA;AAAA,IACL,UAAUpE,EAAQ;AAAA,IAClB,KAAK;AAAA,MACH,KAAAN;AAAA,IACF;AAAA,IACA,iBAAiBmE,KAA4BpC,EAAgB,mBAAmB;AAAA,IAChF,eAAeqC,KAA0B;AAAA,IACzC,iBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,kBAAkBE,KAA4B;AAAA,IAC9C,aACEpB,KAAA,gBAAAA,EAAU,cAAc,WAAW,IAAI,CAACuB,MAAe;;AACrD,YAAMC,IAAezB,KAAA,gBAAAA,EAAa,cAAc,QAAQ,KAAK,CAAC1C,MAASA,EAAK,KAAK,QAAOkE,KAAA,gBAAAA,EAAY,KAAK,SACnGE,KAAOD,KAAA,gBAAAA,EAAc,KAAK,SAAQ,IAClCE,MAAc5E,IAAAyE,KAAA,gBAAAA,EAAY,KAAK,eAAjB,gBAAAzE,EAA6B,MAAM,SAAQ,IACzD6E,MAAW5E,IAAAG,EAAQ,MAAM,KAAK,CAACoB,MAASA,EAAK,IAAI,SAASmD,CAAI,CAAC,MAApD,gBAAA1E,EAAuD,SAAQ,GAG1E6E,IAAc1F,KAAW;AAExB,aAAA;AAAA,QACL,KAAIsF,KAAA,gBAAAA,EAAc,KAAK,OAAM;AAAA,QAC7B,OAAMK,IAAAL,KAAA,gBAAAA,EAAc,KAAK,SAAnB,QAAAK,EAAyB,WAAW,cACtCL,KAAA,gBAAAA,EAAc,KAAK,OACnBvF,IACA,GAAG2F,IAAc3F,KAAeuF,KAAA,gBAAAA,EAAc,KAAK,SACnD,GAAGI,IAAcJ,KAAA,gBAAAA,EAAc,KAAK;AAAA,QACxC,iBAAiBT,KAA4B;AAAA,QAC7C,GAAIW,EAAW,KAAK,CAACI,MAAaA,MAAa,6BAA6B,KAAK;AAAA,UAC/E,iBAAiB;AAAA,QACnB;AAAA,QACA,mBAAmBH,IAAWN;AAAA,QAC9B,gBAAgBK,EAAW,KAAK,CAACI,MAAaA,MAAa,kBAAkB,KAAK;AAAA,QAClF,iBAAiBJ,EAAW,KAAK,CAACI,MAAaA,MAAa,mBAAmB,KAAK;AAAA,QAEpF,WAAWN,KAAA,gBAAAA,EAAc,KAAK;AAAA,MAAA;AAAA,IAEjC,OAAK,CAAC;AAAA,IACT,OAAOrB,EAAgBlD,CAAS;AAAA,IAChC,OAAOuD,KAAA,gBAAAA,EAAU,cAAc,aAAa,IAAI,CAACuB,OACxC;AAAA,MACL,MAAMA,EAAI,KAAK,QAAQ;AAAA,MACvB,OAAOA,EAAI,KAAK,SAAS;AAAA,MACzB,MAAMA,EAAI,KAAK;AAAA,IAAA;AAAA,EAElB;AAEL,GC9GWC,KAA8B,OAAO9E,GAAkB+E,MAAyB;AACrF,QAAA3D,IAAO,OAAO,OAAOpB,EAAQ,KAAK,EAAE,KAAK,CAACoB,MAASA,EAAK,QAAQ2D,CAAY,GAE5EC,IAAW,MAAMC,GAAYjF,GAAS+E,CAAY;AAExD,MAAI,CAAC3D;AACG,UAAA,IAAI,MAAM,eAAe;AAG3B,QAAA8D,IAAO,MAAM9D,EAAK;AAwCjB,SAAA;AAAA,IACL,MAAM8D;AAAA,IACN,QAAQ;AAAA,MACN,SAAS;AAAA,QACP,GAAIA,EAAK,QAAQ;AAAA,UACf,gBAAgBA,EAAK;AAAA,QACvB;AAAA,QACA,GAAI9D,EAAK,kBAAkB;AAAA,UACzB,gBAAgBA,EAAK;AAAA,QACvB;AAAA,QACA,GAAI4D,EAAS,aAAa;AAAA,UACxB,gBAAgBA,EAAS;AAAA,QAC3B;AAAA,MAEF;AAAA,IACF;AAAA,EAAA;AAEJ,GAEMC,KAAc,OAAOjF,GAAkB+E,MAAyB;;AAEpE,QAAMjD,IAAO,QAAMlC,IADH0B,EAAkBtB,CAAO,EACd,SAAR,gBAAAJ,EAAc;AAEjC,MAAIkC,GAAM;AACR,UAAM/B,IAAY,IAAIK,EAAO,YAAY0B,CAAI;AAGtC,WAAA;AAAA,MACL,YAAWjC,IAHCoD,EAAgBlD,CAAS,EAGpB,KAAK,CAACI,MAAS4E,EAAa,SAAS5E,EAAK,IAAI,CAAC,MAArD,gBAAAN,EAAwD;AAAA,IAAA;AAAA,EAEvE;AAEO,SAAA;AAAA,IACL,WAAWsF,GAA4BJ,CAAY;AAAA,EAAA;AAEvD,GAEMI,KAA8B,CAACC,MAAgB;AAC/C,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,QAAQ;AAChB,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEX,GCvGaC,KACX,CAAC,EAAE,SAAArF,GAAS,SAAAhB,QACZ,YAA+B;;AACvB,QAAAsG,IAAQ,OAAO,OAAOtF,EAAQ,KAAK,EAAE,OAAO,CAACoB,MAAS,CAACA,EAAK,GAAG;AAE9D,SAAA;AAAA,IACL,UAAUpB,EAAQ;AAAA,IAClB,SAAOJ,IAAAI,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAiE,EAAU,MAAAA,CAAG,MAAnC,gBAAArE,EAAsC,SAAS,QAAQ,OAAO,QAAO;AAAA,IAC5E,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,YAAY0F,EAAM,IAAI,CAAClE,GAAMmE,OAAW;AAAA,MAItC,IAAI,GAAGA,KAASnE,EAAK;AAAA,MACrB,MAAM,UAAU,GAAGpC,IAAUoC,EAAK,KAAK;AAAA,MACvC,iBAAiB;AAAA,MACjB,mBAAmB,IAAIkE,EAAM;AAAA,MAC7B,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,WAAWlE,EAAK;AAAA,IAAA,EAChB;AAAA,IACF,OAAOkE,EAAM,IAAI,CAAClE,GAAMmE,OAAW;AAAA,MACjC,IAAI,GAAGA,KAASnE,EAAK;AAAA,MACrB,MAAM,GAAGpC,IAAUoC,EAAK;AAAA,IAAA,EACxB;AAAA,EAAA;AAEN,GCvBWoE,KACX,CAAC,EAAE,SAAAxF,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;;AACzC,QAAAqC,IAAgBzF,EAAQ,MAAM,KAAK,CAACoB,MAASA,EAAK,SAAS,YAAY,MAAM,eAAe;AAElG,MAAI,CAACqE;AACI,WAAArC;AAIH,QAAAsC,IAAU,MAAMD,EAAc,UAG9BE,MAAY/F,IAFH,IAAIQ,EAAO,YAAYsF,CAAO,EAEpB,WAAW,OAAO,MAAzB,gBAAA9F,EAA4B,QAA+B;AAEtE,SAAA;AAAA,IACL,GAAGwD;AAAA,IACH,YAAYA,EAAS,WAAW,OAAO,CAACjD,MAASA,EAAK,GAAG,kBAAkB,eAAe;AAAA,IAC1F,kBAAkBwF,MAAa,sBAAsB,QAAQ;AAAA,EAAA;AAEjE,GCvBIC,KAAqB,CAACnG,MAA4B;;AACtD,QAAMoG,KAAUjG,IAAAH,EACb,mBAAmB,MAAM,MADZ,gBAAAG,EAEZ,cAAc,QACf,KAAK,CAACT,MAASA,EAAK,KAAK,SAAS;AAErC,SAAO,CAAC,EAAE0G,KAAWA,EAAQ,KAAK,SAAS;AAC7C,GAEMC,KAA2B,CAACR,MAChCA,EAAM,OAAO,OAAOS,GAAQC,MAAY;AAKtC,MAFI,CAFY,MAAMD,KAKpB,CAACE,EAAmB;AAAA,IAClB,UAAUD,EAAQ;AAAA,IAClB,KAAKA,EAAQ;AAAA,EAAA,CACd;AAEM,WAAA;AAGH,QAAA5E,IAAO,MAAM4E,EAAQ;AAE3B,SAAK5E,IAEEwE,GAAmB,IAAIxF,EAAO,YAAYgB,CAAI,CAAC,IAFpC;AAGpB,GAAG,QAAQ,QAAQ,EAAI,CAAC,GAEb8E,KACX,CAAC,EAAE,SAAAlG,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;AAI/C,MAFEA,EAAS,oBAAoB,gBAAgBA,EAAS,WAAW,MAAM,CAACjD,MAASA,EAAK,oBAAoB,YAAY,GAE9F;AACxB,UAAMmF,IAAQ,MAAM5C,EAA6B,EAAE,SAAA1C,EAAS,CAAA;AAI5D,QAFuB,MAAM8F,GAAyBR,CAAK;AAGlD,aAAA;AAAA,QACL,GAAGlC;AAAA,QACH,YAAYA,EAAS,WAAW,IAAI,CAACjD,OAAU;AAAA,UAC7C,GAAGA;AAAA,UACH,iBAAiB;AAAA,QAAA,EACjB;AAAA,QACF,iBAAiB;AAAA,MAAA;AAAA,EAGvB;AAEO,SAAAiD;AACT,GC5DW+C,IAAwB,CAACC,GAAWC,MAAc;;AACvD,QAAAC,IAAQF,EAAE,MAAM,OAAO,GACvBG,IAAQF,EAAE,MAAM,OAAO;AAE7B,WAASG,IAAI,GAAGC,IAAMH,EAAM,QAAQE,IAAIC,GAAKD;AACvC,QAAAF,EAAME,OAAOD,EAAMC;AACrB,cAAI5G,IAAA0G,EAAME,OAAN,QAAA5G,EAAU,MAAM,QACX,EAAE0G,EAAME,MAAM,MAAM,EAAED,EAAMC,MAAM,OAEjCF,EAAME,MAAM,IAAI,cAAcD,EAAMC,MAAM,EAAE;AAKnD,SAAA;AACT,GCLaE,KACX,CAAC,EAAE,SAAA1G,GAAS,SAAAhB,EAAQ,MACpB,OAAOoE,MAA0C;AAC/C,MAAIA,EAAS;AAAY,WAAAA;AAEzB,QAAMuD,IAAqB,CAAC,GAAG3G,EAAQ,KAAK,EAAE,KAAK,CAACoG,GAAGC,MAAMF,EAAsBC,EAAE,KAAKC,EAAE,GAAG,CAAC,GAE1F3G,IAA2C,OAAO,OAAOiH,CAAkB,EAAE,OAAO,CAACC,GAAKxF,MAAS;AACvG,UAAMyF,IAAQzF,EAAK,IAAI,MAAM,GAAG;AAKhC,WAF0B,CAACA,EAAK,OAAOyF,EAAM,SAAS,KAG9CA,EAAA,QAAQ,CAACC,GAAMC,MAAU;AAGzB,UAFmBA,MAAUF,EAAM,SAAS;AAE5B;AAIpB,MAFwBD,EAAI,KAAK,CAAC,EAAE,OAAA5C,QAAYA,MAAU8C,CAAI,KAK5DF,EAAI,KAAK;AAAA,QACP,UAAU,CAAC;AAAA,QACX,MAAMxH,EAAQJ,GAAS,UAAUoC,EAAK,GAAG,CAAC,EAAE,QAAQ,OAAO,EAAE;AAAA,QAC7D,MAAMA,EAAK,IAAI,QAAQ,OAAO,EAAE;AAAA,QAChC,OAAOyF,EAAM,MAAM;AAAA,MAAA,CACpB;AAAA,IACH,CACD,GAGID;AAAA,EACT,GAAG,CAAyC,CAAA;AAE5C,SAAIlH,EAAI,WAAW,IAAU0D,IAEtB;AAAA,IACL,GAAGA;AAAA,IACH,KAAK;AAAA,MACH,KAAA1D;AAAA,IACF;AAAA,EAAA;AAEJ,GC9CIsH,KAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO,CAAC;AAAA,EACR,KAAK;AAAA,IACH,KAAK,CAAC;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,OAAO;AACT,GAEaC,KAA8B,OAAOjH,GAAkB,EAAE,SAAAhB,IAAU,GAAG,IAA0B,OAAO;AAClH,QAAMkI,IAAQ;AAAA,IACZ7B,GAAY,EAAE,SAAArF,GAAS,SAAAhB,GAAS;AAAA,IAChCmE,GAAS,EAAE,SAAAnD,GAAS,SAAAhB,GAAS;AAAA,IAC7BkH,GAAkB,EAAE,SAAAlG,GAAS,SAAAhB,GAAS;AAAA,IACtCwG,GAAc,EAAE,SAAAxF,GAAS,SAAAhB,GAAS;AAAA,IAClC0H,GAAuB,EAAE,SAAA1G,GAAS,SAAAhB,GAAS;AAAA,EAAA;AAGzC,MAAA;AACF,UAAMoE,IAAW,MAAM8D,EAAM,OAAO,OAAO9D,GAAU+D,MAC5C,MAAMA,EAAI,MAAM/D,CAAQ,GAC9B,QAAQ,QAAQ4D,EAAY,CAAC;AAEzB,WAAApF,EAAA,IAAI,sBAAsBwB,CAAQ,GAElCA;AAAA,WACAgE;AACP,UAAAxF,EAAO,MAAMwF,CAAC,GAERA;AAAA,EACR;AACF,GC5CaC,IAAiB,CAACjC,MAAgBA,EAAI,UAAUA,EAAI,YAAY,GAAG,IAAI,CAAC,KAAKA,GCS7EkC,KAAwB,OAAOC,GAAgBC,MAA8D;AACxH,QAAMC,IAAc;AAAA;AAAA;AAAA,4CAGsBD,KAAA,QAAAA,EAAS,mBAAmB,eAAe;AAAA,UAC7EA,KAAA,QAAAA,EAAS,mBAAmB,+DAA+D;AAAA;AAAA;AAAA,UAG3FD,EACC,IAAI,CAACG,MAAQ,aAAaL,EAAeK,CAAG,YAAYA,kBAAoBC,EAAuBD,CAAG,MAAM,EAC5G,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,UAGVH,EAAK,IAAI,CAACG,MAAQ,mBAAmBL,EAAeK,CAAG,OAAO,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,KAK3EE,IAAiCL,EAAK,IAAI,CAACG,OAAS;AAAA,IACxD,KAAK;AAAA,IACL,UAAUL,EAAeK,CAAG;AAAA,IAC5B,gBAAgBC,EAAuBD,CAAG;AAAA,IAC1C,KAAKA;AAAA,IACL,MAAM,MAAMH,EAAK;AAAA,IACjB,QAAQ,YAAY;AAAA,IACpB,MAAM,YAAY,IAAI,KAAK;AAAA,IAC3B,QAAQ,YAAY;AAAA,EACpB,EAAA;AAYK,SAAA;AAAA,IACL,UAAU;AAAA,IACV,OAAO,CAZiC;AAAA,MACxC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,YAAYE;AAAA,MACpB,MAAM,YAAY,IAAI,KAAK;AAAA,MAC3B,QAAQ,YAAYA;AAAA,IAAA,GAKH,GAAGG,CAAY;AAAA,EAAA;AAEpC,GCpDaC,KAAe,OAAO3C,MACjC,IAAI,QAAgB,CAAC4C,MAAY;AACzB,QAAAC,IAAS,IAAI;AACnB,EAAAA,EAAO,cAAc7C,CAAI,GACzB6C,EAAO,YAAY,WAAY;AAC7B,UAAMC,IAAaD,EAAO;AAC1B,IAAAD,EAAQE,CAAU;AAAA,EAAA;AAEtB,CAAC,GCDUC,KAAwB,OACnCvC,GACA;AAAA,EACE,UAAAwC;AAAA,EACA,WAAAC;AACF,IAGI,EAAE,UAAU,mBACb;AACH,QAAMC,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAWqBD,KAAa;AAAA;AAAA;AAAA;AAAA;AAwCjD,SAlCkB;AAAA,IACvB,UAAU;AAAA,IACV,OAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,UAAUd,EAAe,eAAe;AAAA,QACxC,KAAK;AAAA,QACL,MAAM,YAAY,IAAI,KAAK,CAACe,CAAa,CAAC;AAAA,QAC1C,QAAQ,YAAYA;AAAA,QACpB,QAAQ,YAAY,KAAKA,CAAa;AAAA,QACtC,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,UAAUf,EAAe,SAAS;AAAA,QAClC,KAAK;AAAA,QACL,MAAM,YACA,OAAO3B,KAAY,WAAiB,IAAI,KAAK,CAACA,CAAO,CAAC,IACnDA;AAAA,QAET,QAAQ,YACF,OAAOA,KAAY,WAAiBA,IACjCA,EAAQ;QAEjB,QAAQ,YACF,OAAOA,KAAY,WAAiB,KAAKA,CAAO,IAC7CmC,GAAanC,CAAO;AAAA,QAE7B,MAAM,OAAOA,KAAY,WAAWA,EAAQ,SAASA,EAAQ;AAAA,QAC7D,gBAAgBwC;AAAA,MAClB;AAAA,IACF;AAAA,EAAA;AAIJ,GCnCaG,KAAyB,OACpCC,GACA,EAAE,cAAAC,GAAc,MAAApG,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAImD,IAAQ,OAAO,OAAOgD,EAAM,KAAK;AAErC,EAAIC,MACMjD,IAAAA,EAAM,KAAK,CAACc,GAAGC,MAAMF,EAAsBC,EAAE,MAAMC,EAAE,IAAI,CAAC;AAGpE,QAAMrG,IAAU;AAAA,IACd,UAAUmC,KAAQ;AAAA,IAClB,OAAOmD,EAAM,IAAI,CAAClE,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAUiG,EAAejG,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,MAAMA,EAAK,MAAM,MAAM;AAAA,MAC7B,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,GAAIA,EAAK,kBAAkB;AAAA,QACzB,QAAQA,EAAK;AAAA,MACf;AAAA,MAIA,MAAMA,EAAK,MAAM;AAAA,IAAA,EACjB;AAAA,EAAA;AAGG,SAAAQ,EAAA,IAAI,qBAAqB5B,CAAO,GAEhCA;AACT,GC9DawI,KAAmC,OAC9CC,GAMA,EAAE,cAAAF,GAAc,MAAApG,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAImD,IAAQmD;AAEZ,SAAIF,MACMjD,IAAAA,EAAM,KAAK,CAACc,GAAGC,MAAMF,EAAsBC,EAAE,MAAMC,EAAE,IAAI,CAAC,IAG7D;AAAA,IACL,UAAUlE,KAAQ;AAAA,IAClB,OAAOmD,EAAM,IAAI,CAAClE,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAUiG,EAAejG,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,YAAY,IAAI,KAAK,CAAC,MAAMA,EAAK,KAAK,CAAC,CAAC;AAAA,MAC9C,QAAQ,YAAY;AACZ,cAAAU,IAAO,MAAMV,EAAK;AACjB,eAAA,OAAO,aAAa,MAAM,MAAM,MAAM,KAAK,IAAI,YAAYU,CAAI,CAAC,CAAC;AAAA,MAC1E;AAAA,MACA,QAAQ,YAEC;AAAA,MAET,MAAMV,EAAK;AAAA,IAAA,EACX;AAAA,EAAA;AAEN,GCnCasH,KAAY,CAAC,EAAE,cAAAC,EAAa,IAAgC,OAAO;AACvE,EAAA/G,EAAA,OAAO,CAAC,CAAC+G,CAAY;AAC9B;"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
(function(m,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("xmldoc"),require("@prose-reader/shared")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared"],p):(m=typeof globalThis<"u"?globalThis:m||self,p(m["prose-streamer"]={},m.xmldoc,m["@prose-reader/shared"]))})(this,function(m,p,y){"use strict";const I=(e,{opfBasePath:i,baseUrl:a})=>{const r={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");r.title=(n==null?void 0:n.attr.title)||(n==null?void 0:n.val.trim())||r.title;let t=n==null?void 0:n.name;t!=="a"&&(n=e.descendantWithPath(`${t}.a`),n&&(t=n.name.toLowerCase())),t==="a"&&(n!=null&&n.attr.href)&&(r.path=y.urlJoin(i,n.attr.href),r.href=y.urlJoin(a,i,n.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(r.contents=s.map(d=>I(d,{opfBasePath:i,baseUrl:a})))}return r},R=(e,{opfBasePath:i,baseUrl:a})=>{var t,o;const r=[];let n;return e.descendantWithPath("body.nav.ol")?n=(t=e.descendantWithPath("body.nav.ol"))==null?void 0:t.children:e.descendantWithPath("body.section.nav.ol")&&(n=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),n&&n.length>0&&n.filter(s=>s.name==="li").forEach(s=>r.push(I(s,{opfBasePath:i,baseUrl:a}))),r},B=async(e,i,{opfBasePath:a,baseUrl:r})=>{var t;const n=(t=e.childNamed("manifest"))==null?void 0:t.childrenNamed("item").find(o=>o.attr.properties==="nav");if(n){const o=Object.values(i.files).find(s=>s.uri.endsWith(n.attr.href||""));if(o){const s=new p.XmlDocument(await o.string());return R(s,{opfBasePath:a,baseUrl:r})}}},S=(e,{opfBasePath:i,baseUrl:a,prefix:r})=>{var s,d;const n=((s=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:s.attr.src)||"",t={title:((d=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:d.val)||"",path:y.urlJoin(i,n),href:y.urlJoin(a,i,n),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(t.contents=o.map(u=>S(u,{opfBasePath:i,baseUrl:a,prefix:r}))),t},J=(e,{opfBasePath:i,baseUrl:a})=>{var o;const r=[],n=e.name;let t="";return n.indexOf(":")!==-1&&(t=n.split(":")[0]+":"),(o=e.childNamed(`${t}navMap`))==null||o.childrenNamed(`${t}navPoint`).forEach(s=>r.push(S(s,{opfBasePath:i,baseUrl:a,prefix:t}))),r},H=async({opfData:e,opfBasePath:i,baseUrl:a,archive:r})=>{var o;const n=e.childNamed("spine"),t=n&&n.attr.toc;if(t){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(d=>d.attr.id===t);if(s){const d=`${i}${i===""?"":"/"}${s.attr.href}`,u=Object.values(r.files).find(f=>f.uri.endsWith(d));if(u){const f=new p.XmlDocument(await u.string());return J(f,{opfBasePath:i,baseUrl:a})}}}},V=async(e,i,{baseUrl:a})=>{const{basePath:r}=F(i)||{},n=await H({opfData:e,opfBasePath:r,archive:i,baseUrl:a});return n||await B(e,i,{opfBasePath:r,baseUrl:a})},q=async e=>{const i={renditionLayout:void 0};return await Promise.all(e.files.map(async a=>{var r,n;if(a.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new p.XmlDocument(await a.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((n=o==null?void 0:o.attr)==null?void 0:n.name)==="fixed-layout"&&o.val==="true"&&(i.renditionLayout="pre-paginated")}})),i};let v=!1;const b={enable:e=>{v=e},log:(...e)=>{v&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{v&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{v&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{v&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,i=1/0)=>{const a=typeof e=="number"?e:e.duration;v&&(e.duration<=i?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${a}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`))},measurePerformance:(e,i=10,a)=>(...r)=>{const n=performance.now(),t=a(...r);if(t&&t.then)return t.then(s=>{const d=performance.now();return b.metric({name:e,duration:d-n},i),s});const o=performance.now();return b.metric({name:e,duration:o-n},i),t}},F=e=>{const a=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:a,basePath:(a==null?void 0:a.uri.substring(0,a.uri.lastIndexOf("/")))||""}},k=async({archive:e})=>{const{data:i,basePath:a}=F(e)||{},r=await(i==null?void 0:i.string());if(!r)return[];const n=new p.XmlDocument(r),t=n.childNamed("manifest"),o=n.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(f=>f.attr.idref),d=(t==null?void 0:t.childrenNamed("item").filter(f=>s.includes(f.attr.id||"")))||[];return e.files.filter(f=>d.find(h=>a?`${a}/${h.attr.href}`===f.uri:`${h.attr.href}`===f.uri))},C=e=>{var a;const i=e.childNamed("manifest");return((a=i==null?void 0:i.childrenNamed("item"))==null?void 0:a.map(r=>({href:r.attr.href||"",id:r.attr.id||"",mediaType:r.attr["media-type"]})))||[]},U=({archive:e,baseUrl:i})=>async a=>{var z;const{data:r,basePath:n}=F(e)||{},t=await q(e);if(!r)return a;const o=await r.string();b.log(o,t);const s=new p.XmlDocument(o),d=await V(s,e,{baseUrl:i})||[],u=s.childNamed("metadata"),f=s.childNamed("manifest"),h=s.childNamed("spine"),$=s.childNamed("guide"),N=u==null?void 0:u.childNamed("dc:title"),T=(u==null?void 0:u.childrenNamed("meta"))||[],x=T.find(l=>l.attr.property==="rendition:layout"),A=T.find(l=>l.attr.property==="rendition:flow"),L=T.find(l=>l.attr.property==="rendition:spread"),P=x==null?void 0:x.val,de=A==null?void 0:A.val,le=L==null?void 0:L.val,me=(N==null?void 0:N.val)||((z=e.files.find(({dir:l})=>l))==null?void 0:z.basename)||"",fe=h==null?void 0:h.attr["page-progression-direction"],pe=(await k({archive:e})).reduce((l,c)=>c.size+l,0);return{filename:e.filename,nav:{toc:d},renditionLayout:P||t.renditionLayout||"reflowable",renditionFlow:de||"auto",renditionSpread:le,title:me,readingDirection:fe||"ltr",spineItems:(h==null?void 0:h.childrenNamed("itemref").map(l=>{var X,j,M;const c=f==null?void 0:f.childrenNamed("item").find(g=>g.attr.id===(l==null?void 0:l.attr.idref)),ue=(c==null?void 0:c.attr.href)||"",D=((X=l==null?void 0:l.attr.properties)==null?void 0:X.split(" "))||[],he=((j=e.files.find(g=>g.uri.endsWith(ue)))==null?void 0:j.size)||0,O=i??"";return{id:(c==null?void 0:c.attr.id)||"",href:(M=c==null?void 0:c.attr.href)!=null&&M.startsWith("https://")?c==null?void 0:c.attr.href:n?`${O}${n}/${c==null?void 0:c.attr.href}`:`${O}${c==null?void 0:c.attr.href}`,renditionLayout:P||"reflowable",...D.find(g=>g==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:he/pe,pageSpreadLeft:D.some(g=>g==="page-spread-left")||void 0,pageSpreadRight:D.some(g=>g==="page-spread-right")||void 0,mediaType:c==null?void 0:c.attr["media-type"]}}))||[],items:C(s),guide:$==null?void 0:$.childrenNamed("reference").map(l=>({href:l.attr.href||"",title:l.attr.title||"",type:l.attr.type}))}},_=async(e,i)=>{const a=Object.values(e.files).find(t=>t.uri===i),r=await G(e,i);if(!a)throw new Error("no file found");const n=await a.blob();return{body:n,params:{headers:{...n.type&&{"Content-Type":n.type},...a.encodingFormat&&{"Content-Type":a.encodingFormat},...r.mediaType&&{"Content-Type":r.mediaType}}}}},G=async(e,i)=>{var n,t;const r=await((n=F(e).data)==null?void 0:n.string());if(r){const o=new p.XmlDocument(r);return{mediaType:(t=C(o).find(d=>i.endsWith(d.href)))==null?void 0:t.mediaType}}return{mediaType:K(i)}},K=e=>{if(e.endsWith(".css"))return"text/css; charset=UTF-8";if(e.endsWith(".jpg"))return"image/jpg";if(e.endsWith(".xhtml"))return"application/xhtml+xml";if(e.endsWith(".mp4"))return"video/mp4";if(e.endsWith(".svg"))return"image/svg+xml"},Y=({archive:e,baseUrl:i})=>async a=>{var n;const r=Object.values(e.files).filter(t=>!t.dir);return{filename:e.filename,nav:{toc:[]},title:((n=e.files.find(({dir:t})=>t))==null?void 0:n.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${i}${t.uri}`,renditionLayout:"pre-paginated",progressionWeight:1/r.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:t.encodingFormat})),items:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${i}${t.uri}`}))}},Q=({archive:e,baseUrl:i})=>async a=>{var s;const r=e.files.find(d=>d.basename.toLowerCase()==="comicinfo.xml");if(!r)return a;const n=await r.string(),o=((s=new p.XmlDocument(n).childNamed("Manga"))==null?void 0:s.val)||"unknown";return{...a,spineItems:a.spineItems.filter(d=>d.id.toLowerCase()!=="comicinfo.xml"),readingDirection:o==="YesAndRightToLeft"?"rtl":"ltr"}},Z=e=>{var a;const i=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(r=>r.attr.name==="viewport");return!!(i&&i.attr.name==="viewport")},E=e=>e.reduce(async(i,a)=>{if(!await i||!y.isXmlBasedMimeType({mimeType:a.encodingFormat,uri:a.uri}))return!1;const n=await a.string();return n?Z(new p.XmlDocument(n)):!1},Promise.resolve(!0)),ee=({archive:e,baseUrl:i})=>async a=>{if(a.renditionLayout==="reflowable"&&a.spineItems.every(n=>n.renditionLayout==="reflowable")){const n=await k({archive:e});if(await E(n))return{...a,spineItems:a.spineItems.map(o=>({...o,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return a},te={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},ne=async(e,{baseUrl:i=""}={})=>{const a=[Y({archive:e,baseUrl:i}),U({archive:e,baseUrl:i}),ee({archive:e,baseUrl:i}),Q({archive:e,baseUrl:i})];try{const r=await a.reduce(async(n,t)=>await t(await n),Promise.resolve(te));return b.log("Generated manifest",r),r}catch(r){throw b.error(r),r}},w=e=>e.substring(e.lastIndexOf("/")+1)||e,re=async(e,i)=>{const a=`
|
|
1
|
+
(function(f,u){typeof exports=="object"&&typeof module<"u"?u(exports,require("xmldoc"),require("@prose-reader/shared")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared"],u):(f=typeof globalThis<"u"?globalThis:f||self,u(f["prose-streamer"]={},f.xmldoc,f["@prose-reader/shared"]))})(this,function(f,u,y){"use strict";const k=(e,{opfBasePath:i,baseUrl:n})=>{const a={contents:[],path:"",href:"",title:""};let t=e.childNamed("span")||e.childNamed("a");a.title=(t==null?void 0:t.attr.title)||(t==null?void 0:t.val.trim())||a.title;let r=t==null?void 0:t.name;r!=="a"&&(t=e.descendantWithPath(`${r}.a`),t&&(r=t.name.toLowerCase())),r==="a"&&(t!=null&&t.attr.href)&&(a.path=y.urlJoin(i,t.attr.href),a.href=y.urlJoin(n,i,t.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(a.contents=s.map(d=>k(d,{opfBasePath:i,baseUrl:n})))}return a},M=(e,{opfBasePath:i,baseUrl:n})=>{var r,o;const a=[];let t;return e.descendantWithPath("body.nav.ol")?t=(r=e.descendantWithPath("body.nav.ol"))==null?void 0:r.children:e.descendantWithPath("body.section.nav.ol")&&(t=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),t&&t.length>0&&t.filter(s=>s.name==="li").forEach(s=>a.push(k(s,{opfBasePath:i,baseUrl:n}))),a},B=async(e,i,{opfBasePath:n,baseUrl:a})=>{var r;const t=(r=e.childNamed("manifest"))==null?void 0:r.childrenNamed("item").find(o=>o.attr.properties==="nav");if(t){const o=Object.values(i.files).find(s=>s.uri.endsWith(t.attr.href||""));if(o){const s=new u.XmlDocument(await o.string());return M(s,{opfBasePath:n,baseUrl:a})}}},S=(e,{opfBasePath:i,baseUrl:n,prefix:a})=>{var s,d;const t=((s=e==null?void 0:e.childNamed(`${a}content`))==null?void 0:s.attr.src)||"",r={title:((d=e==null?void 0:e.descendantWithPath(`${a}navLabel.${a}text`))==null?void 0:d.val)||"",path:y.urlJoin(i,t),href:y.urlJoin(n,i,t),contents:[]},o=e.childrenNamed(`${a}navPoint`);return o&&o.length>0&&(r.contents=o.map(p=>S(p,{opfBasePath:i,baseUrl:n,prefix:a}))),r},J=(e,{opfBasePath:i,baseUrl:n})=>{var o;const a=[],t=e.name;let r="";return t.indexOf(":")!==-1&&(r=t.split(":")[0]+":"),(o=e.childNamed(`${r}navMap`))==null||o.childrenNamed(`${r}navPoint`).forEach(s=>a.push(S(s,{opfBasePath:i,baseUrl:n,prefix:r}))),a},U=async({opfData:e,opfBasePath:i,baseUrl:n,archive:a})=>{var o;const t=e.childNamed("spine"),r=t&&t.attr.toc;if(r){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(d=>d.attr.id===r);if(s){const d=`${i}${i===""?"":"/"}${s.attr.href}`,p=Object.values(a.files).find(m=>m.uri.endsWith(d));if(p){const m=new u.XmlDocument(await p.string());return J(m,{opfBasePath:i,baseUrl:n})}}}},H=async(e,i,{baseUrl:n})=>{const{basePath:a}=F(i)||{},t=await U({opfData:e,opfBasePath:a,archive:i,baseUrl:n});return t||await B(e,i,{opfBasePath:a,baseUrl:n})},V=async e=>{const i={renditionLayout:void 0};return await Promise.all(e.files.map(async n=>{var a,t;if(n.uri.endsWith("com.kobobooks.display-options.xml")){const o=(a=new u.XmlDocument(await n.string()).childNamed("platform"))==null?void 0:a.childNamed("option");((t=o==null?void 0:o.attr)==null?void 0:t.name)==="fixed-layout"&&o.val==="true"&&(i.renditionLayout="pre-paginated")}})),i};let v=!1;const b={enable:e=>{v=e},log:(...e)=>{v&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{v&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{v&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{v&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,i=1/0)=>{const n=typeof e=="number"?e:e.duration;v&&(e.duration<=i?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${n}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`))},measurePerformance:(e,i=10,n)=>(...a)=>{const t=performance.now(),r=n(...a);if(r&&r.then)return r.then(s=>{const d=performance.now();return b.metric({name:e,duration:d-t},i),s});const o=performance.now();return b.metric({name:e,duration:o-t},i),r}},F=e=>{const n=Object.values(e.files).filter(a=>!a.dir).find(a=>a.uri.endsWith(".opf"));return{data:n,basePath:(n==null?void 0:n.uri.substring(0,n.uri.lastIndexOf("/")))||""}},C=async({archive:e})=>{const{data:i,basePath:n}=F(e)||{},a=await(i==null?void 0:i.string());if(!a)return[];const t=new u.XmlDocument(a),r=t.childNamed("manifest"),o=t.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(m=>m.attr.idref),d=(r==null?void 0:r.childrenNamed("item").filter(m=>s.includes(m.attr.id||"")))||[];return e.files.filter(m=>d.find(h=>n?`${n}/${h.attr.href}`===m.uri:`${h.attr.href}`===m.uri))},W=e=>{var n;const i=e.childNamed("manifest");return((n=i==null?void 0:i.childrenNamed("item"))==null?void 0:n.map(a=>({href:a.attr.href||"",id:a.attr.id||"",mediaType:a.attr["media-type"]})))||[]},q=({archive:e,baseUrl:i})=>async n=>{var P;const{data:a,basePath:t}=F(e)||{},r=await V(e);if(!a)return n;const o=await a.string();b.log(o,r);const s=new u.XmlDocument(o),d=await H(s,e,{baseUrl:i})||[],p=s.childNamed("metadata"),m=s.childNamed("manifest"),h=s.childNamed("spine"),N=s.childNamed("guide"),$=p==null?void 0:p.childNamed("dc:title"),x=(p==null?void 0:p.childrenNamed("meta"))||[],A=x.find(l=>l.attr.property==="rendition:layout"),I=x.find(l=>l.attr.property==="rendition:flow"),L=x.find(l=>l.attr.property==="rendition:spread"),O=A==null?void 0:A.val,le=I==null?void 0:I.val,me=L==null?void 0:L.val,fe=($==null?void 0:$.val)||((P=e.files.find(({dir:l})=>l))==null?void 0:P.basename)||"",pe=h==null?void 0:h.attr["page-progression-direction"],ue=(await C({archive:e})).reduce((l,c)=>c.size+l,0);return{filename:e.filename,nav:{toc:d},renditionLayout:O||r.renditionLayout||"reflowable",renditionFlow:le||"auto",renditionSpread:me,title:fe,readingDirection:pe||"ltr",spineItems:(h==null?void 0:h.childrenNamed("itemref").map(l=>{var j,X,R;const c=m==null?void 0:m.childrenNamed("item").find(g=>g.attr.id===(l==null?void 0:l.attr.idref)),he=(c==null?void 0:c.attr.href)||"",D=((j=l==null?void 0:l.attr.properties)==null?void 0:j.split(" "))||[],ge=((X=e.files.find(g=>g.uri.endsWith(he)))==null?void 0:X.size)||0,z=i??"";return{id:(c==null?void 0:c.attr.id)||"",href:(R=c==null?void 0:c.attr.href)!=null&&R.startsWith("https://")?c==null?void 0:c.attr.href:t?`${z}${t}/${c==null?void 0:c.attr.href}`:`${z}${c==null?void 0:c.attr.href}`,renditionLayout:O||"reflowable",...D.find(g=>g==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:ge/ue,pageSpreadLeft:D.some(g=>g==="page-spread-left")||void 0,pageSpreadRight:D.some(g=>g==="page-spread-right")||void 0,mediaType:c==null?void 0:c.attr["media-type"]}}))||[],items:W(s),guide:N==null?void 0:N.childrenNamed("reference").map(l=>({href:l.attr.href||"",title:l.attr.title||"",type:l.attr.type}))}},_=async(e,i)=>{const n=Object.values(e.files).find(r=>r.uri===i),a=await G(e,i);if(!n)throw new Error("no file found");const t=await n.blob();return{body:t,params:{headers:{...t.type&&{"Content-Type":t.type},...n.encodingFormat&&{"Content-Type":n.encodingFormat},...a.mediaType&&{"Content-Type":a.mediaType}}}}},G=async(e,i)=>{var t,r;const a=await((t=F(e).data)==null?void 0:t.string());if(a){const o=new u.XmlDocument(a);return{mediaType:(r=W(o).find(d=>i.endsWith(d.href)))==null?void 0:r.mediaType}}return{mediaType:K(i)}},K=e=>{if(e.endsWith(".css"))return"text/css; charset=UTF-8";if(e.endsWith(".jpg"))return"image/jpg";if(e.endsWith(".xhtml"))return"application/xhtml+xml";if(e.endsWith(".mp4"))return"video/mp4";if(e.endsWith(".svg"))return"image/svg+xml"},Y=({archive:e,baseUrl:i})=>async()=>{var a;const n=Object.values(e.files).filter(t=>!t.dir);return{filename:e.filename,title:((a=e.files.find(({dir:t})=>t))==null?void 0:a.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:n.map((t,r)=>({id:`${r}.${t.basename}`,href:encodeURI(`${i}${t.uri}`),renditionLayout:"pre-paginated",progressionWeight:1/n.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:t.encodingFormat})),items:n.map((t,r)=>({id:`${r}.${t.basename}`,href:`${i}${t.uri}`}))}},Q=({archive:e,baseUrl:i})=>async n=>{var s;const a=e.files.find(d=>d.basename.toLowerCase()==="comicinfo.xml");if(!a)return n;const t=await a.string(),o=((s=new u.XmlDocument(t).childNamed("Manga"))==null?void 0:s.val)||"unknown";return{...n,spineItems:n.spineItems.filter(d=>d.id.toLowerCase()!=="comicinfo.xml"),readingDirection:o==="YesAndRightToLeft"?"rtl":"ltr"}},Z=e=>{var n;const i=(n=e.descendantWithPath("head"))==null?void 0:n.childrenNamed("meta").find(a=>a.attr.name==="viewport");return!!(i&&i.attr.name==="viewport")},E=e=>e.reduce(async(i,n)=>{if(!await i||!y.isXmlBasedMimeType({mimeType:n.encodingFormat,uri:n.uri}))return!1;const t=await n.string();return t?Z(new u.XmlDocument(t)):!1},Promise.resolve(!0)),ee=({archive:e,baseUrl:i})=>async n=>{if(n.renditionLayout==="reflowable"&&n.spineItems.every(t=>t.renditionLayout==="reflowable")){const t=await C({archive:e});if(await E(t))return{...n,spineItems:n.spineItems.map(o=>({...o,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return n},T=(e,i)=>{var t;const n=e.split(/(\d+)/),a=i.split(/(\d+)/);for(let r=0,o=n.length;r<o;r++)if(n[r]!==a[r])return(t=n[r])!=null&&t.match(/\d/)?+(n[r]||"")-+(a[r]||""):(n[r]||"").localeCompare(a[r]||"");return 1},te=({archive:e,baseUrl:i})=>async n=>{if(n.nav)return n;const a=[...e.files].sort((r,o)=>T(r.uri,o.uri)),t=Object.values(a).reduce((r,o)=>{const s=o.uri.split("/");return!o.dir&&s.length>1&&s.forEach((p,m)=>{if(m===s.length-1)return;r.find(({title:$})=>$===p)||r.push({contents:[],href:y.urlJoin(i,encodeURI(o.uri)).replace(/\/$/,""),path:o.uri.replace(/\/$/,""),title:s[0]??""})}),r},[]);return t.length===0?n:{...n,nav:{toc:t}}},ne={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},re=async(e,{baseUrl:i=""}={})=>{const n=[Y({archive:e,baseUrl:i}),q({archive:e,baseUrl:i}),ee({archive:e,baseUrl:i}),Q({archive:e,baseUrl:i}),te({archive:e,baseUrl:i})];try{const a=await n.reduce(async(t,r)=>await r(await t),Promise.resolve(ne));return b.log("Generated manifest",a),a}catch(a){throw b.error(a),a}},w=e=>e.substring(e.lastIndexOf("/")+1)||e,ae=async(e,i)=>{const n=`
|
|
2
2
|
<?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
|
|
3
3
|
<metadata>
|
|
4
4
|
<meta property="rendition:layout">${i!=null&&i.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
|
|
5
5
|
${i!=null&&i.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
|
|
6
6
|
</metadata>
|
|
7
7
|
<manifest>
|
|
8
|
-
${e.map(
|
|
8
|
+
${e.map(r=>`<item id="${w(r)}" href="${r}" media-type="${y.detectMimeTypeFromName(r)}"/>`).join(`
|
|
9
9
|
`)}
|
|
10
10
|
</manifest>
|
|
11
11
|
<spine>
|
|
12
|
-
${e.map(
|
|
12
|
+
${e.map(r=>`<itemref idref="${w(r)}" />`).join(`
|
|
13
13
|
`)}
|
|
14
14
|
</spine>
|
|
15
15
|
</package>
|
|
16
|
-
`,
|
|
16
|
+
`,a=e.map(r=>({dir:!1,basename:w(r),encodingFormat:y.detectMimeTypeFromName(r),uri:r,size:100/e.length,base64:async()=>"",blob:async()=>new Blob,string:async()=>""}));return{filename:"",files:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,base64:async()=>n,blob:async()=>new Blob,string:async()=>n},...a]}},ie=async e=>new Promise(i=>{const n=new FileReader;n.readAsDataURL(e),n.onloadend=function(){const a=n.result;i(a)}}),oe=async(e,{mimeType:i,direction:n}={mimeType:"text/plain"})=>{const a=`
|
|
17
17
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
18
18
|
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
|
|
19
19
|
unique-identifier="ootuya-id">
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
<manifest>
|
|
25
25
|
<item id="p01" href="p01.txt" media-type="text/plain"/>
|
|
26
26
|
</manifest>
|
|
27
|
-
<spine page-progression-direction="${
|
|
27
|
+
<spine page-progression-direction="${n??"ltr"}">
|
|
28
28
|
<itemref idref="p01" />
|
|
29
29
|
</spine>
|
|
30
30
|
</package>
|
|
31
|
-
`;return{filename:"content.txt",files:[{dir:!1,basename:w("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([
|
|
31
|
+
`;return{filename:"content.txt",files:[{dir:!1,basename:w("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([a]),string:async()=>a,base64:async()=>btoa(a),size:0},{dir:!1,basename:w("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),base64:async()=>typeof e=="string"?btoa(e):ie(e),size:typeof e=="string"?e.length:e.size,encodingFormat:i}]}},se=async(e,{orderByAlpha:i,name:n}={})=>{let a=Object.values(e.files);i&&(a=a.sort((r,o)=>T(r.name,o.name)));const t={filename:n||"",files:a.map(r=>({dir:r.dir,basename:w(r.name),uri:r.name,blob:()=>r.async("blob"),string:()=>r.async("string"),base64:()=>r.async("base64"),...r.internalStream&&{stream:r.internalStream},size:r._data.uncompressedSize}))};return b.log("Generated archive",t),t},ce=async(e,{orderByAlpha:i,name:n}={})=>{let a=e;return i&&(a=a.sort((t,r)=>T(t.name,r.name))),{filename:n||"",files:a.map(t=>({dir:t.isDir,basename:w(t.name),uri:t.name,blob:async()=>new Blob([await t.data()]),string:async()=>{const r=await t.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(r)))},base64:async()=>"",size:t.size}))}},de=({enableReport:e}={})=>{b.enable(!!e)};f.configure=de,f.createArchiveFromArrayBufferList=ce,f.createArchiveFromJszip=se,f.createArchiveFromText=oe,f.createArchiveFromUrls=ae,f.generateManifestFromArchive=re,f.generateResourceFromArchive=_,f.getArchiveOpfInfo=F,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|
|
32
32
|
//# sourceMappingURL=prose-streamer.umd.cjs.map
|