@papyrus-sdk/engine-epub 0.2.5 → 0.2.6

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/index.js CHANGED
@@ -27,11 +27,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
28
 
29
29
  // index.ts
30
- var index_exports = {};
31
- __export(index_exports, {
30
+ var engine_epub_exports = {};
31
+ __export(engine_epub_exports, {
32
32
  EPUBEngine: () => EPUBEngine
33
33
  });
34
- module.exports = __toCommonJS(index_exports);
34
+ module.exports = __toCommonJS(engine_epub_exports);
35
35
  var import_epubjs = __toESM(require("epubjs"));
36
36
  var import_core = require("@papyrus-sdk/core");
37
37
  var EPUBEngine = class extends import_core.BaseDocumentEngine {
@@ -101,8 +101,6 @@ var EPUBEngine = class extends import_core.BaseDocumentEngine {
101
101
  return { width: 0, height: 0 };
102
102
  }
103
103
  async selectText(pageIndex, rect) {
104
- void pageIndex;
105
- void rect;
106
104
  return null;
107
105
  }
108
106
  async renderPage(pageIndex, target, scale) {
@@ -148,8 +146,6 @@ var EPUBEngine = class extends import_core.BaseDocumentEngine {
148
146
  }
149
147
  }
150
148
  async renderTextLayer(pageIndex, container, scale) {
151
- void pageIndex;
152
- void scale;
153
149
  const element = container;
154
150
  if (element) element.innerHTML = "";
155
151
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import ePub from 'epubjs';\r\nimport { BaseDocumentEngine } from '@papyrus-sdk/core';\r\nimport { DocumentLoadInput, DocumentLoadRequest, DocumentSource, DocumentType, TextItem, OutlineItem, FileLike, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport class EPUBEngine extends BaseDocumentEngine {\r\n private book: any = null;\r\n private spineItems: any[] = [];\r\n private renditions = new Map<string, any>();\r\n private renditionTargets = new Map<string, HTMLElement>();\r\n private pageSizes = new Map<number, { width: number; height: number }>();\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n getRenderTargetType(): 'element' { return 'element'; }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n try {\r\n const { source, type } = this.normalizeLoadInput(input);\r\n if (type && type !== 'epub') {\r\n throw new Error(`[EPUBEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const data = await this.resolveSource(source);\r\n\r\n this.book = ePub(data);\r\n await this.book.ready;\r\n this.spineItems = this.book.spine?.items ?? [];\r\n this.currentPage = 1;\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n } catch (error) {\r\n console.error('[EPUBEngine] Erro ao carregar:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getPageCount(): number { return this.spineItems.length; }\r\n getCurrentPage(): number { return this.currentPage; }\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.getPageCount()) this.currentPage = page;\r\n }\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(3.0, zoom));\r\n this.renditions.forEach((rendition) => this.applyRenditionTheme(rendition));\r\n }\r\n getZoom(): number { return this.zoom; }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') this.rotation = (this.rotation + 90) % 360;\r\n else { this.rotation = (this.rotation - 90) % 360; if (this.rotation < 0) this.rotation += 360; }\r\n }\r\n\r\n getRotation(): number { return this.rotation; }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const size = this.pageSizes.get(pageIndex);\r\n if (size) return size;\r\n return { width: 0, height: 0 };\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n void pageIndex;\r\n void rect;\r\n return null;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const scaleKey = Math.round(scale * 1000);\r\n const element = target as HTMLElement;\r\n if (!this.book || !element) return;\r\n\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return;\r\n\r\n const width = element.clientWidth > 0 ? element.clientWidth : 640;\r\n const height = element.clientHeight > 0 ? element.clientHeight : 900;\r\n element.style.width = `${width}px`;\r\n element.style.height = `${height}px`;\r\n if (width >= 320 && height >= 480) this.pageSizes.set(pageIndex, { width, height });\r\n\r\n const renditionKey = `${pageIndex}:${scaleKey}`;\r\n let rendition = this.renditions.get(renditionKey);\r\n const currentTarget = this.renditionTargets.get(renditionKey);\r\n if (!rendition || currentTarget !== element) {\r\n if (rendition?.destroy) rendition.destroy();\r\n element.innerHTML = '';\r\n rendition = this.book.renderTo(element, {\r\n width,\r\n height,\r\n flow: 'paginated',\r\n spread: 'none',\r\n });\r\n this.renditions.set(renditionKey, rendition);\r\n this.renditionTargets.set(renditionKey, element);\r\n if (rendition?.hooks?.content?.register) {\r\n rendition.hooks.content.register((contents: any) => {\r\n const frame = contents?.document?.defaultView?.frameElement as HTMLIFrameElement | null;\r\n if (frame) {\r\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin');\r\n }\r\n });\r\n }\r\n } else if (typeof rendition.resize === 'function') {\r\n rendition.resize(width, height);\r\n }\r\n\r\n if (rendition) {\r\n this.applyRenditionTheme(rendition);\r\n const targetRef = spineItem.href || spineItem.idref || spineItem.cfiBase || pageIndex;\r\n await rendition.display(targetRef);\r\n }\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void scale;\r\n const element = container as HTMLElement;\r\n if (element) element.innerHTML = '';\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n if (!this.book) return [];\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return [];\r\n\r\n try {\r\n const section = this.book.spine.get(spineItem.idref || spineItem.href);\r\n const text = typeof section?.text === 'function' ? await section.text() : '';\r\n if (!text) return [];\r\n return [{\r\n str: text,\r\n dir: 'ltr',\r\n width: 0,\r\n height: 0,\r\n transform: [1, 0, 0, 1, 0, 0],\r\n fontName: 'default',\r\n }];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (!this.book) return [];\r\n const nav = await this.book.loaded?.navigation;\r\n const toc = nav?.toc ?? [];\r\n if (!toc.length) return [];\r\n\r\n const mapItem = (item: any): OutlineItem => {\r\n const title = item.label || item.title || '';\r\n const pageIndex = this.getSpineIndexByHref(item.href || '');\r\n const children = Array.isArray(item.subitems) ? item.subitems.map(mapItem) : [];\r\n const outlineItem: OutlineItem = { title, pageIndex };\r\n if (children.length > 0) outlineItem.children = children;\r\n return outlineItem;\r\n };\r\n\r\n return toc.map(mapItem);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') return this.getSpineIndexByHref(dest);\r\n if (dest.kind === 'href') return this.getSpineIndexByHref(dest.value);\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n return null;\r\n }\r\n\r\n destroy(): void {\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n if (this.book?.destroy) this.book.destroy();\r\n this.book = null;\r\n this.spineItems = [];\r\n }\r\n\r\n private applyRenditionTheme(rendition: any): void {\r\n if (!rendition) return;\r\n const fontSize = `${Math.round(this.zoom * 100)}%`;\r\n if (rendition.themes?.fontSize) {\r\n rendition.themes.fontSize(fontSize);\r\n } else if (rendition.themes?.override) {\r\n rendition.themes.override('font-size', fontSize);\r\n }\r\n }\r\n\r\n private getSpineIndexByHref(href: string): number {\r\n const normalized = this.normalizeHref(href);\r\n if (!normalized) return -1;\r\n const index = this.spineItems.findIndex((item) => this.normalizeHref(item.href) === normalized);\r\n return index;\r\n }\r\n\r\n private normalizeHref(href: string): string {\r\n return href.split('#')[0];\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private normalizeLoadInput(input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } {\r\n if (this.isLoadRequest(input)) {\r\n return { source: input.source, type: input.type };\r\n }\r\n return { source: input };\r\n }\r\n\r\n private isLoadRequest(input: DocumentLoadInput): input is DocumentLoadRequest {\r\n return typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n }\r\n\r\n private async resolveSource(source: DocumentSource): Promise<any> {\r\n if (typeof source === 'string') {\r\n const dataUri = this.parseDataUri(source);\r\n if (dataUri) {\r\n return dataUri.isBase64 ? this.decodeBase64(dataUri.data) : dataUri.data;\r\n }\r\n if (this.looksLikeUri(source)) {\r\n return source;\r\n }\r\n if (this.isLikelyBase64(source)) {\r\n return this.decodeBase64(source);\r\n }\r\n return source;\r\n }\r\n if (this.isUriSource(source)) return source.uri;\r\n if (this.isDataSource(source)) return source.data;\r\n if (this.isFileLike(source)) return await source.arrayBuffer();\r\n return source;\r\n }\r\n\r\n private parseDataUri(value: string): { isBase64: boolean; data: string } | null {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n const isBase64 = Boolean(match[2]);\r\n const data = match[3] ?? '';\r\n return { isBase64, data };\r\n }\r\n\r\n private decodeBase64(value: string): Uint8Array {\r\n const clean = value.replace(/\\s/g, '');\r\n if (typeof atob !== 'function') {\r\n throw new Error('[EPUBEngine] atob não está disponível para decodificar base64.');\r\n }\r\n const binary = atob(clean);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n\r\n private looksLikeUri(value: string): boolean {\r\n return (\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://')\r\n );\r\n }\r\n\r\n private isLikelyBase64(value: string): boolean {\r\n if (this.looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n }\r\n}\r\n"],"mappings":"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","names":["ePub"]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import ePub from 'epubjs';\r\nimport { BaseDocumentEngine } from '@papyrus-sdk/core';\r\nimport { DocumentLoadInput, DocumentLoadRequest, DocumentSource, DocumentType, TextItem, OutlineItem, FileLike, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport class EPUBEngine extends BaseDocumentEngine {\r\n private book: any = null;\r\n private spineItems: any[] = [];\r\n private renditions = new Map<string, any>();\r\n private renditionTargets = new Map<string, HTMLElement>();\r\n private pageSizes = new Map<number, { width: number; height: number }>();\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n getRenderTargetType(): 'element' { return 'element'; }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n try {\r\n const { source, type } = this.normalizeLoadInput(input);\r\n if (type && type !== 'epub') {\r\n throw new Error(`[EPUBEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const data = await this.resolveSource(source);\r\n\r\n this.book = ePub(data);\r\n await this.book.ready;\r\n this.spineItems = this.book.spine?.items ?? [];\r\n this.currentPage = 1;\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n } catch (error) {\r\n console.error('[EPUBEngine] Erro ao carregar:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getPageCount(): number { return this.spineItems.length; }\r\n getCurrentPage(): number { return this.currentPage; }\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.getPageCount()) this.currentPage = page;\r\n }\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(3.0, zoom));\r\n this.renditions.forEach((rendition) => this.applyRenditionTheme(rendition));\r\n }\r\n getZoom(): number { return this.zoom; }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') this.rotation = (this.rotation + 90) % 360;\r\n else { this.rotation = (this.rotation - 90) % 360; if (this.rotation < 0) this.rotation += 360; }\r\n }\r\n\r\n getRotation(): number { return this.rotation; }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const size = this.pageSizes.get(pageIndex);\r\n if (size) return size;\r\n return { width: 0, height: 0 };\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n void pageIndex;\r\n void rect;\r\n return null;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const scaleKey = Math.round(scale * 1000);\r\n const element = target as HTMLElement;\r\n if (!this.book || !element) return;\r\n\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return;\r\n\r\n const width = element.clientWidth > 0 ? element.clientWidth : 640;\r\n const height = element.clientHeight > 0 ? element.clientHeight : 900;\r\n element.style.width = `${width}px`;\r\n element.style.height = `${height}px`;\r\n if (width >= 320 && height >= 480) this.pageSizes.set(pageIndex, { width, height });\r\n\r\n const renditionKey = `${pageIndex}:${scaleKey}`;\r\n let rendition = this.renditions.get(renditionKey);\r\n const currentTarget = this.renditionTargets.get(renditionKey);\r\n if (!rendition || currentTarget !== element) {\r\n if (rendition?.destroy) rendition.destroy();\r\n element.innerHTML = '';\r\n rendition = this.book.renderTo(element, {\r\n width,\r\n height,\r\n flow: 'paginated',\r\n spread: 'none',\r\n });\r\n this.renditions.set(renditionKey, rendition);\r\n this.renditionTargets.set(renditionKey, element);\r\n if (rendition?.hooks?.content?.register) {\r\n rendition.hooks.content.register((contents: any) => {\r\n const frame = contents?.document?.defaultView?.frameElement as HTMLIFrameElement | null;\r\n if (frame) {\r\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin');\r\n }\r\n });\r\n }\r\n } else if (typeof rendition.resize === 'function') {\r\n rendition.resize(width, height);\r\n }\r\n\r\n if (rendition) {\r\n this.applyRenditionTheme(rendition);\r\n const targetRef = spineItem.href || spineItem.idref || spineItem.cfiBase || pageIndex;\r\n await rendition.display(targetRef);\r\n }\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void scale;\r\n const element = container as HTMLElement;\r\n if (element) element.innerHTML = '';\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n if (!this.book) return [];\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return [];\r\n\r\n try {\r\n const section = this.book.spine.get(spineItem.idref || spineItem.href);\r\n const text = typeof section?.text === 'function' ? await section.text() : '';\r\n if (!text) return [];\r\n return [{\r\n str: text,\r\n dir: 'ltr',\r\n width: 0,\r\n height: 0,\r\n transform: [1, 0, 0, 1, 0, 0],\r\n fontName: 'default',\r\n }];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (!this.book) return [];\r\n const nav = await this.book.loaded?.navigation;\r\n const toc = nav?.toc ?? [];\r\n if (!toc.length) return [];\r\n\r\n const mapItem = (item: any): OutlineItem => {\r\n const title = item.label || item.title || '';\r\n const pageIndex = this.getSpineIndexByHref(item.href || '');\r\n const children = Array.isArray(item.subitems) ? item.subitems.map(mapItem) : [];\r\n const outlineItem: OutlineItem = { title, pageIndex };\r\n if (children.length > 0) outlineItem.children = children;\r\n return outlineItem;\r\n };\r\n\r\n return toc.map(mapItem);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') return this.getSpineIndexByHref(dest);\r\n if (dest.kind === 'href') return this.getSpineIndexByHref(dest.value);\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n return null;\r\n }\r\n\r\n destroy(): void {\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n if (this.book?.destroy) this.book.destroy();\r\n this.book = null;\r\n this.spineItems = [];\r\n }\r\n\r\n private applyRenditionTheme(rendition: any): void {\r\n if (!rendition) return;\r\n const fontSize = `${Math.round(this.zoom * 100)}%`;\r\n if (rendition.themes?.fontSize) {\r\n rendition.themes.fontSize(fontSize);\r\n } else if (rendition.themes?.override) {\r\n rendition.themes.override('font-size', fontSize);\r\n }\r\n }\r\n\r\n private getSpineIndexByHref(href: string): number {\r\n const normalized = this.normalizeHref(href);\r\n if (!normalized) return -1;\r\n const index = this.spineItems.findIndex((item) => this.normalizeHref(item.href) === normalized);\r\n return index;\r\n }\r\n\r\n private normalizeHref(href: string): string {\r\n return href.split('#')[0];\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private normalizeLoadInput(input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } {\r\n if (this.isLoadRequest(input)) {\r\n return { source: input.source, type: input.type };\r\n }\r\n return { source: input };\r\n }\r\n\r\n private isLoadRequest(input: DocumentLoadInput): input is DocumentLoadRequest {\r\n return typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n }\r\n\r\n private async resolveSource(source: DocumentSource): Promise<any> {\r\n if (typeof source === 'string') {\r\n const dataUri = this.parseDataUri(source);\r\n if (dataUri) {\r\n return dataUri.isBase64 ? this.decodeBase64(dataUri.data) : dataUri.data;\r\n }\r\n if (this.looksLikeUri(source)) {\r\n return source;\r\n }\r\n if (this.isLikelyBase64(source)) {\r\n return this.decodeBase64(source);\r\n }\r\n return source;\r\n }\r\n if (this.isUriSource(source)) return source.uri;\r\n if (this.isDataSource(source)) return source.data;\r\n if (this.isFileLike(source)) return await source.arrayBuffer();\r\n return source;\r\n }\r\n\r\n private parseDataUri(value: string): { isBase64: boolean; data: string } | null {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n const isBase64 = Boolean(match[2]);\r\n const data = match[3] ?? '';\r\n return { isBase64, data };\r\n }\r\n\r\n private decodeBase64(value: string): Uint8Array {\r\n const clean = value.replace(/\\s/g, '');\r\n if (typeof atob !== 'function') {\r\n throw new Error('[EPUBEngine] atob não está disponível para decodificar base64.');\r\n }\r\n const binary = atob(clean);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n\r\n private looksLikeUri(value: string): boolean {\r\n return (\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://')\r\n );\r\n }\r\n\r\n private isLikelyBase64(value: string): boolean {\r\n if (this.looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n }\r\n}\r\n"],"mappings":"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","names":["ePub"]}
package/dist/index.mjs CHANGED
@@ -68,8 +68,6 @@ var EPUBEngine = class extends BaseDocumentEngine {
68
68
  return { width: 0, height: 0 };
69
69
  }
70
70
  async selectText(pageIndex, rect) {
71
- void pageIndex;
72
- void rect;
73
71
  return null;
74
72
  }
75
73
  async renderPage(pageIndex, target, scale) {
@@ -115,8 +113,6 @@ var EPUBEngine = class extends BaseDocumentEngine {
115
113
  }
116
114
  }
117
115
  async renderTextLayer(pageIndex, container, scale) {
118
- void pageIndex;
119
- void scale;
120
116
  const element = container;
121
117
  if (element) element.innerHTML = "";
122
118
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts"],"sourcesContent":["import ePub from 'epubjs';\r\nimport { BaseDocumentEngine } from '@papyrus-sdk/core';\r\nimport { DocumentLoadInput, DocumentLoadRequest, DocumentSource, DocumentType, TextItem, OutlineItem, FileLike, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport class EPUBEngine extends BaseDocumentEngine {\r\n private book: any = null;\r\n private spineItems: any[] = [];\r\n private renditions = new Map<string, any>();\r\n private renditionTargets = new Map<string, HTMLElement>();\r\n private pageSizes = new Map<number, { width: number; height: number }>();\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n getRenderTargetType(): 'element' { return 'element'; }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n try {\r\n const { source, type } = this.normalizeLoadInput(input);\r\n if (type && type !== 'epub') {\r\n throw new Error(`[EPUBEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const data = await this.resolveSource(source);\r\n\r\n this.book = ePub(data);\r\n await this.book.ready;\r\n this.spineItems = this.book.spine?.items ?? [];\r\n this.currentPage = 1;\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n } catch (error) {\r\n console.error('[EPUBEngine] Erro ao carregar:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getPageCount(): number { return this.spineItems.length; }\r\n getCurrentPage(): number { return this.currentPage; }\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.getPageCount()) this.currentPage = page;\r\n }\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(3.0, zoom));\r\n this.renditions.forEach((rendition) => this.applyRenditionTheme(rendition));\r\n }\r\n getZoom(): number { return this.zoom; }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') this.rotation = (this.rotation + 90) % 360;\r\n else { this.rotation = (this.rotation - 90) % 360; if (this.rotation < 0) this.rotation += 360; }\r\n }\r\n\r\n getRotation(): number { return this.rotation; }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const size = this.pageSizes.get(pageIndex);\r\n if (size) return size;\r\n return { width: 0, height: 0 };\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n void pageIndex;\r\n void rect;\r\n return null;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const scaleKey = Math.round(scale * 1000);\r\n const element = target as HTMLElement;\r\n if (!this.book || !element) return;\r\n\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return;\r\n\r\n const width = element.clientWidth > 0 ? element.clientWidth : 640;\r\n const height = element.clientHeight > 0 ? element.clientHeight : 900;\r\n element.style.width = `${width}px`;\r\n element.style.height = `${height}px`;\r\n if (width >= 320 && height >= 480) this.pageSizes.set(pageIndex, { width, height });\r\n\r\n const renditionKey = `${pageIndex}:${scaleKey}`;\r\n let rendition = this.renditions.get(renditionKey);\r\n const currentTarget = this.renditionTargets.get(renditionKey);\r\n if (!rendition || currentTarget !== element) {\r\n if (rendition?.destroy) rendition.destroy();\r\n element.innerHTML = '';\r\n rendition = this.book.renderTo(element, {\r\n width,\r\n height,\r\n flow: 'paginated',\r\n spread: 'none',\r\n });\r\n this.renditions.set(renditionKey, rendition);\r\n this.renditionTargets.set(renditionKey, element);\r\n if (rendition?.hooks?.content?.register) {\r\n rendition.hooks.content.register((contents: any) => {\r\n const frame = contents?.document?.defaultView?.frameElement as HTMLIFrameElement | null;\r\n if (frame) {\r\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin');\r\n }\r\n });\r\n }\r\n } else if (typeof rendition.resize === 'function') {\r\n rendition.resize(width, height);\r\n }\r\n\r\n if (rendition) {\r\n this.applyRenditionTheme(rendition);\r\n const targetRef = spineItem.href || spineItem.idref || spineItem.cfiBase || pageIndex;\r\n await rendition.display(targetRef);\r\n }\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void scale;\r\n const element = container as HTMLElement;\r\n if (element) element.innerHTML = '';\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n if (!this.book) return [];\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return [];\r\n\r\n try {\r\n const section = this.book.spine.get(spineItem.idref || spineItem.href);\r\n const text = typeof section?.text === 'function' ? await section.text() : '';\r\n if (!text) return [];\r\n return [{\r\n str: text,\r\n dir: 'ltr',\r\n width: 0,\r\n height: 0,\r\n transform: [1, 0, 0, 1, 0, 0],\r\n fontName: 'default',\r\n }];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (!this.book) return [];\r\n const nav = await this.book.loaded?.navigation;\r\n const toc = nav?.toc ?? [];\r\n if (!toc.length) return [];\r\n\r\n const mapItem = (item: any): OutlineItem => {\r\n const title = item.label || item.title || '';\r\n const pageIndex = this.getSpineIndexByHref(item.href || '');\r\n const children = Array.isArray(item.subitems) ? item.subitems.map(mapItem) : [];\r\n const outlineItem: OutlineItem = { title, pageIndex };\r\n if (children.length > 0) outlineItem.children = children;\r\n return outlineItem;\r\n };\r\n\r\n return toc.map(mapItem);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') return this.getSpineIndexByHref(dest);\r\n if (dest.kind === 'href') return this.getSpineIndexByHref(dest.value);\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n return null;\r\n }\r\n\r\n destroy(): void {\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n if (this.book?.destroy) this.book.destroy();\r\n this.book = null;\r\n this.spineItems = [];\r\n }\r\n\r\n private applyRenditionTheme(rendition: any): void {\r\n if (!rendition) return;\r\n const fontSize = `${Math.round(this.zoom * 100)}%`;\r\n if (rendition.themes?.fontSize) {\r\n rendition.themes.fontSize(fontSize);\r\n } else if (rendition.themes?.override) {\r\n rendition.themes.override('font-size', fontSize);\r\n }\r\n }\r\n\r\n private getSpineIndexByHref(href: string): number {\r\n const normalized = this.normalizeHref(href);\r\n if (!normalized) return -1;\r\n const index = this.spineItems.findIndex((item) => this.normalizeHref(item.href) === normalized);\r\n return index;\r\n }\r\n\r\n private normalizeHref(href: string): string {\r\n return href.split('#')[0];\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private normalizeLoadInput(input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } {\r\n if (this.isLoadRequest(input)) {\r\n return { source: input.source, type: input.type };\r\n }\r\n return { source: input };\r\n }\r\n\r\n private isLoadRequest(input: DocumentLoadInput): input is DocumentLoadRequest {\r\n return typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n }\r\n\r\n private async resolveSource(source: DocumentSource): Promise<any> {\r\n if (typeof source === 'string') {\r\n const dataUri = this.parseDataUri(source);\r\n if (dataUri) {\r\n return dataUri.isBase64 ? this.decodeBase64(dataUri.data) : dataUri.data;\r\n }\r\n if (this.looksLikeUri(source)) {\r\n return source;\r\n }\r\n if (this.isLikelyBase64(source)) {\r\n return this.decodeBase64(source);\r\n }\r\n return source;\r\n }\r\n if (this.isUriSource(source)) return source.uri;\r\n if (this.isDataSource(source)) return source.data;\r\n if (this.isFileLike(source)) return await source.arrayBuffer();\r\n return source;\r\n }\r\n\r\n private parseDataUri(value: string): { isBase64: boolean; data: string } | null {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n const isBase64 = Boolean(match[2]);\r\n const data = match[3] ?? '';\r\n return { isBase64, data };\r\n }\r\n\r\n private decodeBase64(value: string): Uint8Array {\r\n const clean = value.replace(/\\s/g, '');\r\n if (typeof atob !== 'function') {\r\n throw new Error('[EPUBEngine] atob não está disponível para decodificar base64.');\r\n }\r\n const binary = atob(clean);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n\r\n private looksLikeUri(value: string): boolean {\r\n return (\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://')\r\n );\r\n }\r\n\r\n private isLikelyBase64(value: string): boolean {\r\n if (this.looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../index.ts"],"sourcesContent":["import ePub from 'epubjs';\r\nimport { BaseDocumentEngine } from '@papyrus-sdk/core';\r\nimport { DocumentLoadInput, DocumentLoadRequest, DocumentSource, DocumentType, TextItem, OutlineItem, FileLike, TextSelection, PageDestination } from '@papyrus-sdk/types';\r\n\r\nexport class EPUBEngine extends BaseDocumentEngine {\r\n private book: any = null;\r\n private spineItems: any[] = [];\r\n private renditions = new Map<string, any>();\r\n private renditionTargets = new Map<string, HTMLElement>();\r\n private pageSizes = new Map<number, { width: number; height: number }>();\r\n private currentPage: number = 1;\r\n private zoom: number = 1.0;\r\n private rotation: number = 0;\r\n\r\n getRenderTargetType(): 'element' { return 'element'; }\r\n\r\n async load(input: DocumentLoadInput): Promise<void> {\r\n try {\r\n const { source, type } = this.normalizeLoadInput(input);\r\n if (type && type !== 'epub') {\r\n throw new Error(`[EPUBEngine] Tipo de documento não suportado: ${type}`);\r\n }\r\n\r\n const data = await this.resolveSource(source);\r\n\r\n this.book = ePub(data);\r\n await this.book.ready;\r\n this.spineItems = this.book.spine?.items ?? [];\r\n this.currentPage = 1;\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n } catch (error) {\r\n console.error('[EPUBEngine] Erro ao carregar:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n getPageCount(): number { return this.spineItems.length; }\r\n getCurrentPage(): number { return this.currentPage; }\r\n goToPage(page: number): void {\r\n if (page >= 1 && page <= this.getPageCount()) this.currentPage = page;\r\n }\r\n setZoom(zoom: number): void {\r\n this.zoom = Math.max(0.5, Math.min(3.0, zoom));\r\n this.renditions.forEach((rendition) => this.applyRenditionTheme(rendition));\r\n }\r\n getZoom(): number { return this.zoom; }\r\n\r\n rotate(direction: 'clockwise' | 'counterclockwise'): void {\r\n if (direction === 'clockwise') this.rotation = (this.rotation + 90) % 360;\r\n else { this.rotation = (this.rotation - 90) % 360; if (this.rotation < 0) this.rotation += 360; }\r\n }\r\n\r\n getRotation(): number { return this.rotation; }\r\n\r\n async getPageDimensions(pageIndex: number): Promise<{ width: number; height: number }> {\r\n const size = this.pageSizes.get(pageIndex);\r\n if (size) return size;\r\n return { width: 0, height: 0 };\r\n }\r\n\r\n async selectText(\r\n pageIndex: number,\r\n rect: { x: number; y: number; width: number; height: number }\r\n ): Promise<TextSelection | null> {\r\n void pageIndex;\r\n void rect;\r\n return null;\r\n }\r\n\r\n async renderPage(pageIndex: number, target: any, scale: number): Promise<void> {\r\n const scaleKey = Math.round(scale * 1000);\r\n const element = target as HTMLElement;\r\n if (!this.book || !element) return;\r\n\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return;\r\n\r\n const width = element.clientWidth > 0 ? element.clientWidth : 640;\r\n const height = element.clientHeight > 0 ? element.clientHeight : 900;\r\n element.style.width = `${width}px`;\r\n element.style.height = `${height}px`;\r\n if (width >= 320 && height >= 480) this.pageSizes.set(pageIndex, { width, height });\r\n\r\n const renditionKey = `${pageIndex}:${scaleKey}`;\r\n let rendition = this.renditions.get(renditionKey);\r\n const currentTarget = this.renditionTargets.get(renditionKey);\r\n if (!rendition || currentTarget !== element) {\r\n if (rendition?.destroy) rendition.destroy();\r\n element.innerHTML = '';\r\n rendition = this.book.renderTo(element, {\r\n width,\r\n height,\r\n flow: 'paginated',\r\n spread: 'none',\r\n });\r\n this.renditions.set(renditionKey, rendition);\r\n this.renditionTargets.set(renditionKey, element);\r\n if (rendition?.hooks?.content?.register) {\r\n rendition.hooks.content.register((contents: any) => {\r\n const frame = contents?.document?.defaultView?.frameElement as HTMLIFrameElement | null;\r\n if (frame) {\r\n frame.setAttribute('sandbox', 'allow-scripts allow-same-origin');\r\n }\r\n });\r\n }\r\n } else if (typeof rendition.resize === 'function') {\r\n rendition.resize(width, height);\r\n }\r\n\r\n if (rendition) {\r\n this.applyRenditionTheme(rendition);\r\n const targetRef = spineItem.href || spineItem.idref || spineItem.cfiBase || pageIndex;\r\n await rendition.display(targetRef);\r\n }\r\n }\r\n\r\n async renderTextLayer(pageIndex: number, container: any, scale: number): Promise<void> {\r\n void pageIndex;\r\n void scale;\r\n const element = container as HTMLElement;\r\n if (element) element.innerHTML = '';\r\n }\r\n\r\n async getTextContent(pageIndex: number): Promise<TextItem[]> {\r\n if (!this.book) return [];\r\n const spineItem = this.spineItems[pageIndex];\r\n if (!spineItem) return [];\r\n\r\n try {\r\n const section = this.book.spine.get(spineItem.idref || spineItem.href);\r\n const text = typeof section?.text === 'function' ? await section.text() : '';\r\n if (!text) return [];\r\n return [{\r\n str: text,\r\n dir: 'ltr',\r\n width: 0,\r\n height: 0,\r\n transform: [1, 0, 0, 1, 0, 0],\r\n fontName: 'default',\r\n }];\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async getOutline(): Promise<OutlineItem[]> {\r\n if (!this.book) return [];\r\n const nav = await this.book.loaded?.navigation;\r\n const toc = nav?.toc ?? [];\r\n if (!toc.length) return [];\r\n\r\n const mapItem = (item: any): OutlineItem => {\r\n const title = item.label || item.title || '';\r\n const pageIndex = this.getSpineIndexByHref(item.href || '');\r\n const children = Array.isArray(item.subitems) ? item.subitems.map(mapItem) : [];\r\n const outlineItem: OutlineItem = { title, pageIndex };\r\n if (children.length > 0) outlineItem.children = children;\r\n return outlineItem;\r\n };\r\n\r\n return toc.map(mapItem);\r\n }\r\n\r\n async getPageIndex(dest: PageDestination): Promise<number | null> {\r\n if (!dest) return null;\r\n if (typeof dest === 'string') return this.getSpineIndexByHref(dest);\r\n if (dest.kind === 'href') return this.getSpineIndexByHref(dest.value);\r\n if (dest.kind === 'pageIndex') return dest.value;\r\n if (dest.kind === 'pageNumber') return Math.max(0, dest.value - 1);\r\n return null;\r\n }\r\n\r\n destroy(): void {\r\n this.renditions.forEach((rendition) => rendition?.destroy?.());\r\n this.renditions.clear();\r\n this.renditionTargets.clear();\r\n this.pageSizes.clear();\r\n if (this.book?.destroy) this.book.destroy();\r\n this.book = null;\r\n this.spineItems = [];\r\n }\r\n\r\n private applyRenditionTheme(rendition: any): void {\r\n if (!rendition) return;\r\n const fontSize = `${Math.round(this.zoom * 100)}%`;\r\n if (rendition.themes?.fontSize) {\r\n rendition.themes.fontSize(fontSize);\r\n } else if (rendition.themes?.override) {\r\n rendition.themes.override('font-size', fontSize);\r\n }\r\n }\r\n\r\n private getSpineIndexByHref(href: string): number {\r\n const normalized = this.normalizeHref(href);\r\n if (!normalized) return -1;\r\n const index = this.spineItems.findIndex((item) => this.normalizeHref(item.href) === normalized);\r\n return index;\r\n }\r\n\r\n private normalizeHref(href: string): string {\r\n return href.split('#')[0];\r\n }\r\n\r\n private isUriSource(source: DocumentSource): source is { uri: string } {\r\n return typeof source === 'object' && source !== null && 'uri' in source;\r\n }\r\n\r\n private isDataSource(source: DocumentSource): source is { data: ArrayBuffer | Uint8Array } {\r\n return typeof source === 'object' && source !== null && 'data' in source;\r\n }\r\n\r\n private isFileLike(source: DocumentSource): source is FileLike {\r\n return typeof source === 'object' && source !== null && typeof (source as FileLike).arrayBuffer === 'function';\r\n }\r\n\r\n private normalizeLoadInput(input: DocumentLoadInput): { source: DocumentSource; type?: DocumentType } {\r\n if (this.isLoadRequest(input)) {\r\n return { source: input.source, type: input.type };\r\n }\r\n return { source: input };\r\n }\r\n\r\n private isLoadRequest(input: DocumentLoadInput): input is DocumentLoadRequest {\r\n return typeof input === 'object' && input !== null && 'source' in input && 'type' in input;\r\n }\r\n\r\n private async resolveSource(source: DocumentSource): Promise<any> {\r\n if (typeof source === 'string') {\r\n const dataUri = this.parseDataUri(source);\r\n if (dataUri) {\r\n return dataUri.isBase64 ? this.decodeBase64(dataUri.data) : dataUri.data;\r\n }\r\n if (this.looksLikeUri(source)) {\r\n return source;\r\n }\r\n if (this.isLikelyBase64(source)) {\r\n return this.decodeBase64(source);\r\n }\r\n return source;\r\n }\r\n if (this.isUriSource(source)) return source.uri;\r\n if (this.isDataSource(source)) return source.data;\r\n if (this.isFileLike(source)) return await source.arrayBuffer();\r\n return source;\r\n }\r\n\r\n private parseDataUri(value: string): { isBase64: boolean; data: string } | null {\r\n const match = /^data:([^;,]+)?(;base64)?,(.*)$/.exec(value);\r\n if (!match) return null;\r\n const isBase64 = Boolean(match[2]);\r\n const data = match[3] ?? '';\r\n return { isBase64, data };\r\n }\r\n\r\n private decodeBase64(value: string): Uint8Array {\r\n const clean = value.replace(/\\s/g, '');\r\n if (typeof atob !== 'function') {\r\n throw new Error('[EPUBEngine] atob não está disponível para decodificar base64.');\r\n }\r\n const binary = atob(clean);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i += 1) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n\r\n private looksLikeUri(value: string): boolean {\r\n return (\r\n value.startsWith('http://') ||\r\n value.startsWith('https://') ||\r\n value.startsWith('/') ||\r\n value.startsWith('./') ||\r\n value.startsWith('../') ||\r\n value.startsWith('file://')\r\n );\r\n }\r\n\r\n private isLikelyBase64(value: string): boolean {\r\n if (this.looksLikeUri(value)) return false;\r\n if (value.includes('.')) return false;\r\n if (value.length < 16) return false;\r\n return /^[A-Za-z0-9+/=]+$/.test(value);\r\n }\r\n}\r\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,SAAS,0BAA0B;AAG5B,IAAM,aAAN,cAAyB,mBAAmB;AAAA,EAA5C;AAAA;AACL,SAAQ,OAAY;AACpB,SAAQ,aAAoB,CAAC;AAC7B,SAAQ,aAAa,oBAAI,IAAiB;AAC1C,SAAQ,mBAAmB,oBAAI,IAAyB;AACxD,SAAQ,YAAY,oBAAI,IAA+C;AACvE,SAAQ,cAAsB;AAC9B,SAAQ,OAAe;AACvB,SAAQ,WAAmB;AAAA;AAAA,EAE3B,sBAAiC;AAAE,WAAO;AAAA,EAAW;AAAA,EAErD,MAAM,KAAK,OAAyC;AAClD,QAAI;AACF,YAAM,EAAE,QAAQ,KAAK,IAAI,KAAK,mBAAmB,KAAK;AACtD,UAAI,QAAQ,SAAS,QAAQ;AAC3B,cAAM,IAAI,MAAM,oDAAiD,IAAI,EAAE;AAAA,MACzE;AAEA,YAAM,OAAO,MAAM,KAAK,cAAc,MAAM;AAE5C,WAAK,OAAO,KAAK,IAAI;AACrB,YAAM,KAAK,KAAK;AAChB,WAAK,aAAa,KAAK,KAAK,OAAO,SAAS,CAAC;AAC7C,WAAK,cAAc;AACnB,WAAK,WAAW,QAAQ,CAAC,cAAc,WAAW,UAAU,CAAC;AAC7D,WAAK,WAAW,MAAM;AACtB,WAAK,iBAAiB,MAAM;AAC5B,WAAK,UAAU,MAAM;AAAA,IACvB,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,KAAK;AACrD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,eAAuB;AAAE,WAAO,KAAK,WAAW;AAAA,EAAQ;AAAA,EACxD,iBAAyB;AAAE,WAAO,KAAK;AAAA,EAAa;AAAA,EACpD,SAAS,MAAoB;AAC3B,QAAI,QAAQ,KAAK,QAAQ,KAAK,aAAa,EAAG,MAAK,cAAc;AAAA,EACnE;AAAA,EACA,QAAQ,MAAoB;AAC1B,SAAK,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAK,IAAI,CAAC;AAC7C,SAAK,WAAW,QAAQ,CAAC,cAAc,KAAK,oBAAoB,SAAS,CAAC;AAAA,EAC5E;AAAA,EACA,UAAkB;AAAE,WAAO,KAAK;AAAA,EAAM;AAAA,EAEtC,OAAO,WAAmD;AACxD,QAAI,cAAc,YAAa,MAAK,YAAY,KAAK,WAAW,MAAM;AAAA,SACjE;AAAE,WAAK,YAAY,KAAK,WAAW,MAAM;AAAK,UAAI,KAAK,WAAW,EAAG,MAAK,YAAY;AAAA,IAAK;AAAA,EAClG;AAAA,EAEA,cAAsB;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA,EAE9C,MAAM,kBAAkB,WAA+D;AACrF,UAAM,OAAO,KAAK,UAAU,IAAI,SAAS;AACzC,QAAI,KAAM,QAAO;AACjB,WAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,EAC/B;AAAA,EAEA,MAAM,WACJ,WACA,MAC+B;AAG/B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,WAAmB,QAAa,OAA8B;AAC7E,UAAM,WAAW,KAAK,MAAM,QAAQ,GAAI;AACxC,UAAM,UAAU;AAChB,QAAI,CAAC,KAAK,QAAQ,CAAC,QAAS;AAE5B,UAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,QAAI,CAAC,UAAW;AAEhB,UAAM,QAAQ,QAAQ,cAAc,IAAI,QAAQ,cAAc;AAC9D,UAAM,SAAS,QAAQ,eAAe,IAAI,QAAQ,eAAe;AACjE,YAAQ,MAAM,QAAQ,GAAG,KAAK;AAC9B,YAAQ,MAAM,SAAS,GAAG,MAAM;AAChC,QAAI,SAAS,OAAO,UAAU,IAAK,MAAK,UAAU,IAAI,WAAW,EAAE,OAAO,OAAO,CAAC;AAElF,UAAM,eAAe,GAAG,SAAS,IAAI,QAAQ;AAC7C,QAAI,YAAY,KAAK,WAAW,IAAI,YAAY;AAChD,UAAM,gBAAgB,KAAK,iBAAiB,IAAI,YAAY;AAC5D,QAAI,CAAC,aAAa,kBAAkB,SAAS;AAC3C,UAAI,WAAW,QAAS,WAAU,QAAQ;AAC1C,cAAQ,YAAY;AACpB,kBAAY,KAAK,KAAK,SAAS,SAAS;AAAA,QACtC;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AACD,WAAK,WAAW,IAAI,cAAc,SAAS;AAC3C,WAAK,iBAAiB,IAAI,cAAc,OAAO;AAC/C,UAAI,WAAW,OAAO,SAAS,UAAU;AACvC,kBAAU,MAAM,QAAQ,SAAS,CAAC,aAAkB;AAClD,gBAAM,QAAQ,UAAU,UAAU,aAAa;AAC/C,cAAI,OAAO;AACT,kBAAM,aAAa,WAAW,iCAAiC;AAAA,UACjE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,OAAO,UAAU,WAAW,YAAY;AACjD,gBAAU,OAAO,OAAO,MAAM;AAAA,IAChC;AAEA,QAAI,WAAW;AACb,WAAK,oBAAoB,SAAS;AAClC,YAAM,YAAY,UAAU,QAAQ,UAAU,SAAS,UAAU,WAAW;AAC5E,YAAM,UAAU,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,WAAmB,WAAgB,OAA8B;AAGrF,UAAM,UAAU;AAChB,QAAI,QAAS,SAAQ,YAAY;AAAA,EACnC;AAAA,EAEA,MAAM,eAAe,WAAwC;AAC3D,QAAI,CAAC,KAAK,KAAM,QAAO,CAAC;AACxB,UAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,QAAI,CAAC,UAAW,QAAO,CAAC;AAExB,QAAI;AACF,YAAM,UAAU,KAAK,KAAK,MAAM,IAAI,UAAU,SAAS,UAAU,IAAI;AACrE,YAAM,OAAO,OAAO,SAAS,SAAS,aAAa,MAAM,QAAQ,KAAK,IAAI;AAC1E,UAAI,CAAC,KAAM,QAAO,CAAC;AACnB,aAAO,CAAC;AAAA,QACN,KAAK;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,QAC5B,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,aAAqC;AACzC,QAAI,CAAC,KAAK,KAAM,QAAO,CAAC;AACxB,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ;AACpC,UAAM,MAAM,KAAK,OAAO,CAAC;AACzB,QAAI,CAAC,IAAI,OAAQ,QAAO,CAAC;AAEzB,UAAM,UAAU,CAAC,SAA2B;AAC1C,YAAM,QAAQ,KAAK,SAAS,KAAK,SAAS;AAC1C,YAAM,YAAY,KAAK,oBAAoB,KAAK,QAAQ,EAAE;AAC1D,YAAM,WAAW,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC;AAC9E,YAAM,cAA2B,EAAE,OAAO,UAAU;AACpD,UAAI,SAAS,SAAS,EAAG,aAAY,WAAW;AAChD,aAAO;AAAA,IACT;AAEA,WAAO,IAAI,IAAI,OAAO;AAAA,EACxB;AAAA,EAEA,MAAM,aAAa,MAA+C;AAChE,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,OAAO,SAAS,SAAU,QAAO,KAAK,oBAAoB,IAAI;AAClE,QAAI,KAAK,SAAS,OAAQ,QAAO,KAAK,oBAAoB,KAAK,KAAK;AACpE,QAAI,KAAK,SAAS,YAAa,QAAO,KAAK;AAC3C,QAAI,KAAK,SAAS,aAAc,QAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;AACjE,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AACd,SAAK,WAAW,QAAQ,CAAC,cAAc,WAAW,UAAU,CAAC;AAC7D,SAAK,WAAW,MAAM;AACtB,SAAK,iBAAiB,MAAM;AAC5B,SAAK,UAAU,MAAM;AACrB,QAAI,KAAK,MAAM,QAAS,MAAK,KAAK,QAAQ;AAC1C,SAAK,OAAO;AACZ,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA,EAEQ,oBAAoB,WAAsB;AAChD,QAAI,CAAC,UAAW;AAChB,UAAM,WAAW,GAAG,KAAK,MAAM,KAAK,OAAO,GAAG,CAAC;AAC/C,QAAI,UAAU,QAAQ,UAAU;AAC9B,gBAAU,OAAO,SAAS,QAAQ;AAAA,IACpC,WAAW,UAAU,QAAQ,UAAU;AACrC,gBAAU,OAAO,SAAS,aAAa,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,oBAAoB,MAAsB;AAChD,UAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,QAAI,CAAC,WAAY,QAAO;AACxB,UAAM,QAAQ,KAAK,WAAW,UAAU,CAAC,SAAS,KAAK,cAAc,KAAK,IAAI,MAAM,UAAU;AAC9F,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,MAAsB;AAC1C,WAAO,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EAC1B;AAAA,EAEQ,YAAY,QAAmD;AACrE,WAAO,OAAO,WAAW,YAAY,WAAW,QAAQ,SAAS;AAAA,EACnE;AAAA,EAEQ,aAAa,QAAsE;AACzF,WAAO,OAAO,WAAW,YAAY,WAAW,QAAQ,UAAU;AAAA,EACpE;AAAA,EAEQ,WAAW,QAA4C;AAC7D,WAAO,OAAO,WAAW,YAAY,WAAW,QAAQ,OAAQ,OAAoB,gBAAgB;AAAA,EACtG;AAAA,EAEQ,mBAAmB,OAA2E;AACpG,QAAI,KAAK,cAAc,KAAK,GAAG;AAC7B,aAAO,EAAE,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,IAClD;AACA,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AAAA,EAEQ,cAAc,OAAwD;AAC5E,WAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,SAAS,UAAU;AAAA,EACvF;AAAA,EAEA,MAAc,cAAc,QAAsC;AAChE,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,UAAU,KAAK,aAAa,MAAM;AACxC,UAAI,SAAS;AACX,eAAO,QAAQ,WAAW,KAAK,aAAa,QAAQ,IAAI,IAAI,QAAQ;AAAA,MACtE;AACA,UAAI,KAAK,aAAa,MAAM,GAAG;AAC7B,eAAO;AAAA,MACT;AACA,UAAI,KAAK,eAAe,MAAM,GAAG;AAC/B,eAAO,KAAK,aAAa,MAAM;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AACA,QAAI,KAAK,YAAY,MAAM,EAAG,QAAO,OAAO;AAC5C,QAAI,KAAK,aAAa,MAAM,EAAG,QAAO,OAAO;AAC7C,QAAI,KAAK,WAAW,MAAM,EAAG,QAAO,MAAM,OAAO,YAAY;AAC7D,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAA2D;AAC9E,UAAM,QAAQ,kCAAkC,KAAK,KAAK;AAC1D,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,WAAW,QAAQ,MAAM,CAAC,CAAC;AACjC,UAAM,OAAO,MAAM,CAAC,KAAK;AACzB,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAEQ,aAAa,OAA2B;AAC9C,UAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE;AACrC,QAAI,OAAO,SAAS,YAAY;AAC9B,YAAM,IAAI,MAAM,yEAAgE;AAAA,IAClF;AACA,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,MAAM,OAAO;AACnB,UAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,YAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAAwB;AAC3C,WACE,MAAM,WAAW,SAAS,KAC1B,MAAM,WAAW,UAAU,KAC3B,MAAM,WAAW,GAAG,KACpB,MAAM,WAAW,IAAI,KACrB,MAAM,WAAW,KAAK,KACtB,MAAM,WAAW,SAAS;AAAA,EAE9B;AAAA,EAEQ,eAAe,OAAwB;AAC7C,QAAI,KAAK,aAAa,KAAK,EAAG,QAAO;AACrC,QAAI,MAAM,SAAS,GAAG,EAAG,QAAO;AAChC,QAAI,MAAM,SAAS,GAAI,QAAO;AAC9B,WAAO,oBAAoB,KAAK,KAAK;AAAA,EACvC;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@papyrus-sdk/engine-epub",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "license": "MIT",
5
5
  "keywords": [
6
6
  "papyrus",