react-ebookjs 0.0.3 → 0.1.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/LICENSE +1 -1
- package/README.md +2 -0
- package/dist/index.d.mts +24 -90
- package/dist/index.d.ts +24 -90
- package/dist/index.js +3334 -3184
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3335 -3185
- package/dist/index.mjs.map +1 -1
- package/package.json +20 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/loader.ts","../src/vendor/foliate-js/epubcfi.js","../src/vendor/foliate-js/epub.js","../src/vendor/foliate-js/fb2.js","../src/vendor/foliate-js/comic-book.js","../src/components/reader.tsx","../src/lib/language.ts","../src/vendor/foliate-js/progress.js","../src/vendor/foliate-js/search.js","../src/vendor/foliate-js/text-walker.js","../src/lib/search.ts","../src/vendor/foliate-js/overlayer.js","../src/vendor/foliate-js/paginator.js","../src/vendor/foliate-js/fixed-layout.js"],"sourcesContent":["export type { Book } from './lib/book';\n\nexport { loadEPUB, loadFB2, loadComicBook } from './lib/loader';\n\nexport { \n Reader, \n ReaderContent, \n ReaderNext,\n ReaderPrevious,\n useBookNavigator,\n useSearch\n} from './components/reader';","import { configure, ZipReader, BlobReader, TextWriter, BlobWriter } from \"@zip.js/zip.js\"\nimport { EPUB } from \"../vendor/foliate-js/epub.js\"\nimport { makeFB2 } from \"../vendor/foliate-js/fb2.js\"\nimport { makeComicBook } from \"../vendor/foliate-js/comic-book.js\"\nimport { Book } from \"./book\"\n\n\nconst isZip = async (blob: Blob) => {\n const arr = new Uint8Array(await blob.slice(0, 4).arrayBuffer())\n return arr[0] === 0x50 && arr[1] === 0x4b && arr[2] === 0x03 && arr[3] === 0x04\n}\n\nconst makeZipLoader = async (blob: Blob) => {\n configure({ useWebWorkers: false })\n const reader = new ZipReader(new BlobReader(blob))\n const entries = await reader.getEntries()\n const map = new Map(entries.map(entry => [entry.filename, entry]))\n\n const load = (f: (entry: any, ...args: any[]) => any) => (name: string, ...args: any[]) =>\n map.has(name) ? f(map.get(name), ...args) : null\n \n const loadText = load(entry => entry.getData(new TextWriter()))\n const loadBlob = load((entry, type) => entry.getData(new BlobWriter(type)))\n const getSize = (name: string) => map.get(name)?.uncompressedSize ?? 0\n return { entries, loadText, loadBlob, getSize, sha1: undefined }\n}\n\nexport async function loadEPUB(blob: Blob): Promise<Book> {\n const loader = await makeZipLoader(blob)\n const epub = new EPUB(loader)\n return epub.init()\n}\n\nexport async function loadFB2(blob: Blob): Promise<Book> {\n if (await isZip(blob)) {\n const loader = await makeZipLoader(blob)\n const entry = loader.entries.find(entry => entry.filename.endsWith('.fb2'))\n const file = await loader.loadBlob((entry ?? loader.entries[0]).filename)\n return await makeFB2(file)\n } else {\n return await makeFB2(blob)\n }\n}\n\nexport async function loadComicBook(blob: Blob): Promise<Book> {\n const loader = await makeZipLoader(blob)\n return makeComicBook(loader, blob)\n}\n","const findIndices = (arr, f) => arr\n .map((x, i, a) => f(x, i, a) ? i : null).filter(x => x != null)\nconst splitAt = (arr, is) => [-1, ...is, arr.length].reduce(({ xs, a }, b) =>\n ({ xs: xs?.concat([arr.slice(a + 1, b)]) ?? [], a: b }), {}).xs\nconst concatArrays = (a, b) =>\n a.slice(0, -1).concat([a[a.length - 1].concat(b[0])]).concat(b.slice(1))\n\nconst isNumber = /\\d/\nexport const isCFI = /^epubcfi\\((.*)\\)$/\nconst escapeCFI = str => str.replace(/[\\^[\\](),;=]/g, '^$&')\n\nconst wrap = x => isCFI.test(x) ? x : `epubcfi(${x})`\nconst unwrap = x => x.match(isCFI)?.[1] ?? x\nconst lift = f => (...xs) =>\n `epubcfi(${f(...xs.map(x => x.match(isCFI)?.[1] ?? x))})`\nexport const joinIndir = lift((...xs) => xs.join('!'))\n\nconst tokenizer = str => {\n const tokens = []\n let state, escape, value = ''\n const push = x => (tokens.push(x), state = null, value = '')\n const cat = x => (value += x, escape = false)\n for (const char of Array.from(str.trim()).concat('')) {\n if (char === '^' && !escape) {\n escape = true\n continue\n }\n if (state === '!') push(['!'])\n else if (state === ',') push([','])\n else if (state === '/' || state === ':') {\n if (isNumber.test(char)) {\n cat(char)\n continue\n } else push([state, parseInt(value)])\n } else if (state === '~') {\n if (isNumber.test(char) || char === '.') {\n cat(char)\n continue\n } else push(['~', parseFloat(value)])\n } else if (state === '@') {\n if (char === ':') {\n push(['@', parseFloat(value)])\n state = '@'\n continue\n }\n if (isNumber.test(char) || char === '.') {\n cat(char)\n continue\n } else push(['@', parseFloat(value)])\n } else if (state === '[') {\n if (char === ';' && !escape) {\n push(['[', value])\n state = ';'\n } else if (char === ',' && !escape) {\n push(['[', value])\n state = '['\n } else if (char === ']' && !escape) push(['[', value])\n else cat(char)\n continue\n } else if (state?.startsWith(';')) {\n if (char === '=' && !escape) {\n state = `;${value}`\n value = ''\n } else if (char === ';' && !escape) {\n push([state, value])\n state = ';'\n } else if (char === ']' && !escape) push([state, value])\n else cat(char)\n continue\n }\n if (char === '/' || char === ':' || char === '~' || char === '@'\n || char === '[' || char === '!' || char === ',') state = char\n }\n return tokens\n}\n\nconst findTokens = (tokens, x) => findIndices(tokens, ([t]) => t === x)\n\nconst parser = tokens => {\n const parts = []\n let state\n for (const [type, val] of tokens) {\n if (type === '/') parts.push({ index: val })\n else {\n const last = parts[parts.length - 1]\n if (type === ':') last.offset = val\n else if (type === '~') last.temporal = val\n else if (type === '@') last.spatial = (last.spatial ?? []).concat(val)\n else if (type === ';s') last.side = val\n else if (type === '[') {\n if (state === '/' && val) last.id = val\n else {\n last.text = (last.text ?? []).concat(val)\n continue\n }\n }\n }\n state = type\n }\n return parts\n}\n\n// split at step indirections, then parse each part\nconst parserIndir = tokens =>\n splitAt(tokens, findTokens(tokens, '!')).map(parser)\n\nexport const parse = cfi => {\n const tokens = tokenizer(unwrap(cfi))\n const commas = findTokens(tokens, ',')\n if (!commas.length) return parserIndir(tokens)\n const [parent, start, end] = splitAt(tokens, commas).map(parserIndir)\n return { parent, start, end }\n}\n\nconst partToString = ({ index, id, offset, temporal, spatial, text, side }) => {\n const param = side ? `;s=${side}` : ''\n return `/${index}`\n + (id ? `[${escapeCFI(id)}${param}]` : '')\n // \"CFI expressions [..] SHOULD include an explicit character offset\"\n + (offset != null && index % 2 ? `:${offset}` : '')\n + (temporal ? `~${temporal}` : '')\n + (spatial ? `@${spatial.join(':')}` : '')\n + (text || (!id && side) ? '['\n + (text?.map(escapeCFI)?.join(',') ?? '')\n + param + ']' : '')\n}\n\nconst toInnerString = parsed => parsed.parent\n ? [parsed.parent, parsed.start, parsed.end].map(toInnerString).join(',')\n : parsed.map(parts => parts.map(partToString).join('')).join('!')\n\nconst toString = parsed => wrap(toInnerString(parsed))\n\nexport const collapse = (x, toEnd) => typeof x === 'string'\n ? toString(collapse(parse(x), toEnd))\n : x.parent ? concatArrays(x.parent, x[toEnd ? 'end' : 'start']) : x\n\n// create range CFI from two CFIs\nconst buildRange = (from, to) => {\n if (typeof from === 'string') from = parse(from)\n if (typeof to === 'string') to = parse(to)\n from = collapse(from)\n to = collapse(to, true)\n // ranges across multiple documents are not allowed; handle local paths only\n const localFrom = from[from.length - 1], localTo = to[to.length - 1]\n const localParent = [], localStart = [], localEnd = []\n let pushToParent = true\n const len = Math.max(localFrom.length, localTo.length)\n for (let i = 0; i < len; i++) {\n const a = localFrom[i], b = localTo[i]\n pushToParent &&= a?.index === b?.index && !a?.offset && !b?.offset\n if (pushToParent) localParent.push(a)\n else {\n if (a) localStart.push(a)\n if (b) localEnd.push(b)\n }\n }\n // copy non-local paths from `from`\n const parent = from.slice(0, -1).concat([localParent])\n return toString({ parent, start: [localStart], end: [localEnd] })\n}\n\nexport const compare = (a, b) => {\n if (typeof a === 'string') a = parse(a)\n if (typeof b === 'string') b = parse(b)\n if (a.start || b.start) return compare(collapse(a), collapse(b))\n || compare(collapse(a, true), collapse(b, true))\n\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const p = a[i] ?? [], q = b[i] ?? []\n const maxIndex = Math.max(p.length, q.length) - 1\n for (let i = 0; i <= maxIndex; i++) {\n const x = p[i], y = q[i]\n if (!x) return -1\n if (!y) return 1\n if (x.index > y.index) return 1\n if (x.index < y.index) return -1\n if (i === maxIndex) {\n // TODO: compare temporal & spatial offsets\n if (x.offset > y.offset) return 1\n if (x.offset < y.offset) return -1\n }\n }\n }\n return 0\n}\n\nconst isTextNode = ({ nodeType }) => nodeType === 3 || nodeType === 4\nconst isElementNode = ({ nodeType }) => nodeType === 1\n\nconst getChildNodes = (node, filter) => {\n const nodes = Array.from(node.childNodes)\n // \"content other than element and character data is ignored\"\n .filter(node => isTextNode(node) || isElementNode(node))\n return filter ? nodes.map(node => {\n const accept = filter(node)\n if (accept === NodeFilter.FILTER_REJECT) return null\n else if (accept === NodeFilter.FILTER_SKIP) return getChildNodes(node, filter)\n else return node\n }).flat().filter(x => x) : nodes\n}\n\n// child nodes are organized such that the result is always\n// [element, text, element, text, ..., element],\n// regardless of the actual structure in the document;\n// so multiple text nodes need to be combined, and nonexistent ones counted;\n// see \"Step Reference to Child Element or Character Data (/)\" in EPUB CFI spec\nconst indexChildNodes = (node, filter) => {\n const nodes = getChildNodes(node, filter)\n .reduce((arr, node) => {\n let last = arr[arr.length - 1]\n if (!last) arr.push(node)\n // \"there is one chunk between each pair of child elements\"\n else if (isTextNode(node)) {\n if (Array.isArray(last)) last.push(node)\n else if (isTextNode(last)) arr[arr.length - 1] = [last, node]\n else arr.push(node)\n } else {\n if (isElementNode(last)) arr.push(null, node)\n else arr.push(node)\n }\n return arr\n }, [])\n // \"the first chunk is located before the first child element\"\n if (isElementNode(nodes[0])) nodes.unshift('first')\n // \"the last chunk is located after the last child element\"\n if (isElementNode(nodes[nodes.length - 1])) nodes.push('last')\n // \"'virtual' elements\"\n nodes.unshift('before') // \"0 is a valid index\"\n nodes.push('after') // \"n+2 is a valid index\"\n return nodes\n}\n\nconst partsToNode = (node, parts, filter) => {\n const { id } = parts[parts.length - 1]\n if (id) {\n const el = node.ownerDocument.getElementById(id)\n if (el) return { node: el, offset: 0 }\n }\n for (const { index } of parts) {\n const newNode = node ? indexChildNodes(node, filter)[index] : null\n // handle non-existent nodes\n if (newNode === 'first') return { node: node.firstChild ?? node }\n if (newNode === 'last') return { node: node.lastChild ?? node }\n if (newNode === 'before') return { node, before: true }\n if (newNode === 'after') return { node, after: true }\n node = newNode\n }\n const { offset } = parts[parts.length - 1]\n if (!Array.isArray(node)) return { node, offset }\n // get underlying text node and offset from the chunk\n let sum = 0\n for (const n of node) {\n const { length } = n.nodeValue\n if (sum + length >= offset) return { node: n, offset: offset - sum }\n sum += length\n }\n}\n\nconst nodeToParts = (node, offset, filter) => {\n const { parentNode, id } = node\n const indexed = indexChildNodes(parentNode, filter)\n const index = indexed.findIndex(x =>\n Array.isArray(x) ? x.some(x => x === node) : x === node)\n // adjust offset as if merging the text nodes in the chunk\n const chunk = indexed[index]\n if (Array.isArray(chunk)) {\n let sum = 0\n for (const x of chunk) {\n if (x === node) {\n sum += offset\n break\n } else sum += x.nodeValue.length\n }\n offset = sum\n }\n const part = { id, index, offset }\n return (parentNode !== node.ownerDocument.documentElement\n ? nodeToParts(parentNode, null, filter).concat(part) : [part])\n // remove ignored nodes\n .filter(x => x.index !== -1)\n}\n\nexport const fromRange = (range, filter) => {\n const { startContainer, startOffset, endContainer, endOffset } = range\n const start = nodeToParts(startContainer, startOffset, filter)\n if (range.collapsed) return toString([start])\n const end = nodeToParts(endContainer, endOffset, filter)\n return buildRange([start], [end])\n}\n\nexport const toRange = (doc, parts, filter) => {\n const startParts = collapse(parts)\n const endParts = collapse(parts, true)\n\n const root = doc.documentElement\n const start = partsToNode(root, startParts[0], filter)\n const end = partsToNode(root, endParts[0], filter)\n\n const range = doc.createRange()\n\n if (start.before) range.setStartBefore(start.node)\n else if (start.after) range.setStartAfter(start.node)\n else range.setStart(start.node, start.offset)\n\n if (end.before) range.setEndBefore(end.node)\n else if (end.after) range.setEndAfter(end.node)\n else range.setEnd(end.node, end.offset)\n return range\n}\n\n// faster way of getting CFIs for sorted elements in a single parent\nexport const fromElements = elements => {\n const results = []\n const { parentNode } = elements[0]\n const parts = nodeToParts(parentNode)\n for (const [index, node] of indexChildNodes(parentNode).entries()) {\n const el = elements[results.length]\n if (node === el)\n results.push(toString([parts.concat({ id: el.id, index })]))\n }\n return results\n}\n\nexport const toElement = (doc, parts) =>\n partsToNode(doc.documentElement, collapse(parts)).node\n\n// turn indices into standard CFIs when you don't have an actual package document\nexport const fake = {\n fromIndex: index => wrap(`/6/${(index + 1) * 2}`),\n toIndex: parts => parts?.at(-1).index / 2 - 1,\n}\n\n// get CFI from Calibre bookmarks\n// see https://github.com/johnfactotum/foliate/issues/849\nexport const fromCalibrePos = pos => {\n const [parts] = parse(pos)\n const item = parts.shift()\n parts.shift()\n return toString([[{ index: 6 }, item], parts])\n}\nexport const fromCalibreHighlight = ({ spine_index, start_cfi, end_cfi }) => {\n const pre = fake.fromIndex(spine_index) + '!'\n return buildRange(pre + start_cfi.slice(2), pre + end_cfi.slice(2))\n}\n","import * as CFI from './epubcfi.js'\n\nconst NS = {\n CONTAINER: 'urn:oasis:names:tc:opendocument:xmlns:container',\n XHTML: 'http://www.w3.org/1999/xhtml',\n OPF: 'http://www.idpf.org/2007/opf',\n EPUB: 'http://www.idpf.org/2007/ops',\n DC: 'http://purl.org/dc/elements/1.1/',\n DCTERMS: 'http://purl.org/dc/terms/',\n ENC: 'http://www.w3.org/2001/04/xmlenc#',\n NCX: 'http://www.daisy.org/z3986/2005/ncx/',\n XLINK: 'http://www.w3.org/1999/xlink',\n SMIL: 'http://www.w3.org/ns/SMIL',\n}\n\nconst MIME = {\n XML: 'application/xml',\n NCX: 'application/x-dtbncx+xml',\n XHTML: 'application/xhtml+xml',\n HTML: 'text/html',\n CSS: 'text/css',\n SVG: 'image/svg+xml',\n JS: /\\/(x-)?(javascript|ecmascript)/,\n}\n\n// https://www.w3.org/TR/epub-33/#sec-reserved-prefixes\nconst PREFIX = {\n a11y: 'http://www.idpf.org/epub/vocab/package/a11y/#',\n dcterms: 'http://purl.org/dc/terms/',\n marc: 'http://id.loc.gov/vocabulary/',\n media: 'http://www.idpf.org/epub/vocab/overlays/#',\n onix: 'http://www.editeur.org/ONIX/book/codelists/current.html#',\n rendition: 'http://www.idpf.org/vocab/rendition/#',\n schema: 'http://schema.org/',\n xsd: 'http://www.w3.org/2001/XMLSchema#',\n msv: 'http://www.idpf.org/epub/vocab/structure/magazine/#',\n prism: 'http://www.prismstandard.org/specifications/3.0/PRISM_CV_Spec_3.0.htm#',\n}\n\nconst RELATORS = {\n art: 'artist',\n aut: 'author',\n clr: 'colorist',\n edt: 'editor',\n ill: 'illustrator',\n nrt: 'narrator',\n trl: 'translator',\n pbl: 'publisher',\n}\n\nconst ONIX5 = {\n '02': 'isbn',\n '06': 'doi',\n '15': 'isbn',\n '26': 'doi',\n '34': 'issn',\n}\n\n// convert to camel case\nconst camel = x => x.toLowerCase().replace(/[-:](.)/g, (_, g) => g.toUpperCase())\n\n// strip and collapse ASCII whitespace\n// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\nconst normalizeWhitespace = str => str ? str\n .replace(/[\\t\\n\\f\\r ]+/g, ' ')\n .replace(/^[\\t\\n\\f\\r ]+/, '')\n .replace(/[\\t\\n\\f\\r ]+$/, '') : ''\n\nconst filterAttribute = (attr, value, isList) => isList\n ? el => el.getAttribute(attr)?.split(/\\s/)?.includes(value)\n : typeof value === 'function'\n ? el => value(el.getAttribute(attr))\n : el => el.getAttribute(attr) === value\n\nconst getAttributes = (...xs) => el =>\n el ? Object.fromEntries(xs.map(x => [camel(x), el.getAttribute(x)])) : null\n\nconst getElementText = el => normalizeWhitespace(el?.textContent)\n\nconst childGetter = (doc, ns) => {\n // ignore the namespace if it doesn't appear in document at all\n const useNS = doc.lookupNamespaceURI(null) === ns || doc.lookupPrefix(ns)\n const f = useNS\n ? (el, name) => el => el.namespaceURI === ns && el.localName === name\n : (el, name) => el => el.localName === name\n return {\n $: (el, name) => [...el.children].find(f(el, name)),\n $$: (el, name) => [...el.children].filter(f(el, name)),\n $$$: useNS\n ? (el, name) => [...el.getElementsByTagNameNS(ns, name)]\n : (el, name) => [...el.getElementsByTagName(name)],\n }\n}\n\nconst resolveURL = (url, relativeTo) => {\n try {\n if (relativeTo.includes(':')) return new URL(url, relativeTo)\n // the base needs to be a valid URL, so set a base URL and then remove it\n const root = 'https://invalid.invalid/'\n const obj = new URL(url, root + relativeTo)\n obj.search = ''\n return decodeURI(obj.href.replace(root, ''))\n } catch(e) {\n console.warn(e)\n return url\n }\n}\n\nconst isExternal = uri => /^(?!blob)\\w+:/i.test(uri)\n\n// like `path.relative()` in Node.js\nconst pathRelative = (from, to) => {\n if (!from) return to\n const as = from.replace(/\\/$/, '').split('/')\n const bs = to.replace(/\\/$/, '').split('/')\n const i = (as.length > bs.length ? as : bs).findIndex((_, i) => as[i] !== bs[i])\n return i < 0 ? '' : Array(as.length - i).fill('..').concat(bs.slice(i)).join('/')\n}\n\nconst pathDirname = str => str.slice(0, str.lastIndexOf('/') + 1)\n\n// replace asynchronously and sequentially\n// same technique as https://stackoverflow.com/a/48032528\nconst replaceSeries = async (str, regex, f) => {\n const matches = []\n str.replace(regex, (...args) => (matches.push(args), null))\n const results = []\n for (const args of matches) results.push(await f(...args))\n return str.replace(regex, () => results.shift())\n}\n\nconst regexEscape = str => str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n\nconst tidy = obj => {\n for (const [key, val] of Object.entries(obj))\n if (val == null) delete obj[key]\n else if (Array.isArray(val)) {\n obj[key] = val.filter(x => x).map(x =>\n typeof x === 'object' && !Array.isArray(x) ? tidy(x) : x)\n if (!obj[key].length) delete obj[key]\n else if (obj[key].length === 1) obj[key] = obj[key][0]\n }\n else if (typeof val === 'object') {\n obj[key] = tidy(val)\n if (!Object.keys(val).length) delete obj[key]\n }\n const keys = Object.keys(obj)\n if (keys.length === 1 && keys[0] === 'name') return obj[keys[0]]\n return obj\n}\n\n// https://www.w3.org/TR/epub/#sec-prefix-attr\nconst getPrefixes = doc => {\n const map = new Map(Object.entries(PREFIX))\n const value = doc.documentElement.getAttributeNS(NS.EPUB, 'prefix')\n || doc.documentElement.getAttribute('prefix')\n if (value) for (const [, prefix, url] of value\n .matchAll(/(.+): +(.+)[ \\t\\r\\n]*/g)) map.set(prefix, url)\n return map\n}\n\n// https://www.w3.org/TR/epub-rs/#sec-property-values\n// but ignoring the case where the prefix is omitted\nconst getPropertyURL = (value, prefixes) => {\n if (!value) return null\n const [a, b] = value.split(':')\n const prefix = b ? a : null\n const reference = b ? b : a\n const baseURL = prefixes.get(prefix)\n return baseURL ? baseURL + reference : null\n}\n\nconst getMetadata = opf => {\n const { $ } = childGetter(opf, NS.OPF)\n const $metadata = $(opf.documentElement, 'metadata')\n\n // first pass: convert to JS objects\n const els = Object.groupBy($metadata.children, el =>\n el.namespaceURI === NS.DC ? 'dc'\n : el.namespaceURI === NS.OPF && el.localName === 'meta' ?\n (el.hasAttribute('name') ? 'legacyMeta' : 'meta') : '')\n const baseLang = $metadata.getAttribute('xml:lang')\n ?? opf.documentElement.getAttribute('xml:lang') ?? 'und'\n const prefixes = getPrefixes(opf)\n const parse = el => {\n const property = el.getAttribute('property')\n const scheme = el.getAttribute('scheme')\n return {\n property: getPropertyURL(property, prefixes) ?? property,\n scheme: getPropertyURL(scheme, prefixes) ?? scheme,\n lang: el.getAttribute('xml:lang'),\n value: getElementText(el),\n props: getProperties(el),\n // `opf:` attributes from EPUB 2 & EPUB 3.1 (removed in EPUB 3.2)\n attrs: Object.fromEntries(Array.from(el.attributes)\n .filter(attr => attr.namespaceURI === NS.OPF)\n .map(attr => [attr.localName, attr.value])),\n }\n }\n const refines = Map.groupBy(els.meta ?? [], el => el.getAttribute('refines'))\n const getProperties = el => {\n const els = refines.get(el ? '#' + el.getAttribute('id') : null)\n if (!els) return null\n return Object.groupBy(els.map(parse), x => x.property)\n }\n const dc = Object.fromEntries(Object.entries(Object.groupBy(els.dc, el => el.localName))\n .map(([name, els]) => [name, els.map(parse)]))\n const properties = getProperties() ?? {}\n const legacyMeta = Object.fromEntries(els.legacyMeta?.map(el =>\n [el.getAttribute('name'), el.getAttribute('content')]) ?? [])\n\n // second pass: map to webpub\n const one = x => x?.[0]?.value\n const prop = (x, p) => one(x?.props?.[p])\n const makeLanguageMap = x => {\n if (!x) return null\n const alts = x.props?.['alternate-script'] ?? []\n const altRep = x.attrs['alt-rep']\n if (!alts.length && (!x.lang || x.lang === baseLang) && !altRep) return x.value\n const map = { [x.lang ?? baseLang]: x.value }\n if (altRep) map[x.attrs['alt-rep-lang']] = altRep\n for (const y of alts) map[y.lang] ??= y.value\n return map\n }\n const makeContributor = x => x ? ({\n name: makeLanguageMap(x),\n sortAs: makeLanguageMap(x.props?.['file-as']?.[0]) ?? x.attrs['file-as'],\n role: x.props?.role?.filter(x => x.scheme === PREFIX.marc + 'relators')\n ?.map(x => x.value) ?? [x.attrs.role],\n code: prop(x, 'term') ?? x.attrs.term,\n scheme: prop(x, 'authority') ?? x.attrs.authority,\n }) : null\n const makeCollection = x => ({\n name: makeLanguageMap(x),\n // NOTE: webpub requires number but EPUB allows values like \"2.2.1\"\n position: one(x.props?.['group-position']),\n })\n const makeAltIdentifier = x => {\n const { value } = x\n if (/^urn:/i.test(value)) return value\n if (/^doi:/i.test(value)) return `urn:${value}`\n const type = x.props?.['identifier-type']\n if (!type) {\n const scheme = x.attrs.scheme\n if (!scheme) return value\n // https://idpf.github.io/epub-registries/identifiers/\n // but no \"jdcn\", which isn't a registered URN namespace\n if (/^(doi|isbn|uuid)$/i.test(scheme)) return `urn:${scheme}:${value}`\n // NOTE: webpub requires scheme to be a URI; EPUB allows anything\n return { scheme, value }\n }\n if (type.scheme === PREFIX.onix + 'codelist5') {\n const nid = ONIX5[type.value]\n if (nid) return `urn:${nid}:${value}`\n }\n return value\n }\n const belongsTo = Object.groupBy(properties['belongs-to-collection'] ?? [],\n x => prop(x, 'collection-type') === 'series' ? 'series' : 'collection')\n const mainTitle = dc.title?.find(x => prop(x, 'title-type') === 'main') ?? dc.title?.[0]\n const metadata = {\n identifier: getIdentifier(opf),\n title: makeLanguageMap(mainTitle),\n sortAs: makeLanguageMap(mainTitle?.props?.['file-as']?.[0])\n ?? mainTitle?.attrs?.['file-as']\n ?? legacyMeta?.['calibre:title_sort'],\n subtitle: dc.title?.find(x => prop(x, 'title-type') === 'subtitle')?.value,\n language: dc.language?.map(x => x.value),\n description: one(dc.description),\n publisher: makeContributor(dc.publisher?.[0]),\n published: dc.date?.find(x => x.attrs.event === 'publication')?.value\n ?? one(dc.date),\n modified: one(properties[PREFIX.dcterms + 'modified'])\n ?? dc.date?.find(x => x.attrs.event === 'modification')?.value,\n subject: dc.subject?.map(makeContributor),\n belongsTo: {\n collection: belongsTo.collection?.map(makeCollection),\n series: belongsTo.series?.map(makeCollection)\n ?? legacyMeta?.['calibre:series'] ? {\n name: legacyMeta?.['calibre:series'],\n position: parseFloat(legacyMeta?.['calibre:series_index']),\n } : null,\n },\n altIdentifier: dc.identifier?.map(makeAltIdentifier),\n source: dc.source?.map(makeAltIdentifier), // NOTE: not in webpub schema\n rights: one(dc.rights), // NOTE: not in webpub schema\n }\n const remapContributor = defaultKey => x => {\n const keys = new Set(x.role?.map(role => RELATORS[role] ?? defaultKey))\n return [keys.size ? keys : [defaultKey], x]\n }\n for (const [keys, val] of [].concat(\n dc.creator?.map(makeContributor)?.map(remapContributor('author')) ?? [],\n dc.contributor?.map(makeContributor)?.map(remapContributor('contributor')) ?? []))\n for (const key of keys)\n if (metadata[key]) metadata[key].push(val)\n else metadata[key] = [val]\n tidy(metadata)\n if (metadata.altIdentifier === metadata.identifier)\n delete metadata.altIdentifier\n\n const rendition = {}\n const media = {}\n for (const [key, val] of Object.entries(properties)) {\n if (key.startsWith(PREFIX.rendition))\n rendition[camel(key.replace(PREFIX.rendition, ''))] = one(val)\n else if (key.startsWith(PREFIX.media))\n media[camel(key.replace(PREFIX.media, ''))] = one(val)\n }\n if (media.duration) media.duration = parseClock(media.duration)\n return { metadata, rendition, media }\n}\n\nconst parseNav = (doc, resolve = f => f) => {\n const { $, $$, $$$ } = childGetter(doc, NS.XHTML)\n const resolveHref = href => href ? decodeURI(resolve(href)) : null\n const parseLI = getType => $li => {\n const $a = $($li, 'a') ?? $($li, 'span')\n const $ol = $($li, 'ol')\n const href = resolveHref($a?.getAttribute('href'))\n const label = getElementText($a) || $a?.getAttribute('title')\n // TODO: get and concat alt/title texts in content\n const result = { label, href, subitems: parseOL($ol) }\n if (getType) result.type = $a?.getAttributeNS(NS.EPUB, 'type')?.split(/\\s/)\n return result\n }\n const parseOL = ($ol, getType) => $ol ? $$($ol, 'li').map(parseLI(getType)) : null\n const parseNav = ($nav, getType) => parseOL($($nav, 'ol'), getType)\n\n const $$nav = $$$(doc, 'nav')\n let toc = null, pageList = null, landmarks = null, others = []\n for (const $nav of $$nav) {\n const type = $nav.getAttributeNS(NS.EPUB, 'type')?.split(/\\s/) ?? []\n if (type.includes('toc')) toc ??= parseNav($nav)\n else if (type.includes('page-list')) pageList ??= parseNav($nav)\n else if (type.includes('landmarks')) landmarks ??= parseNav($nav, true)\n else others.push({\n label: getElementText($nav.firstElementChild), type,\n list: parseNav($nav),\n })\n }\n return { toc, pageList, landmarks, others }\n}\n\nconst parseNCX = (doc, resolve = f => f) => {\n const { $, $$ } = childGetter(doc, NS.NCX)\n const resolveHref = href => href ? decodeURI(resolve(href)) : null\n const parseItem = el => {\n const $label = $(el, 'navLabel')\n const $content = $(el, 'content')\n const label = getElementText($label)\n const href = resolveHref($content.getAttribute('src'))\n if (el.localName === 'navPoint') {\n const els = $$(el, 'navPoint')\n return { label, href, subitems: els.length ? els.map(parseItem) : null }\n }\n return { label, href }\n }\n const parseList = (el, itemName) => $$(el, itemName).map(parseItem)\n const getSingle = (container, itemName) => {\n const $container = $(doc.documentElement, container)\n return $container ? parseList($container, itemName) : null\n }\n return {\n toc: getSingle('navMap', 'navPoint'),\n pageList: getSingle('pageList', 'pageTarget'),\n others: $$(doc.documentElement, 'navList').map(el => ({\n label: getElementText($(el, 'navLabel')),\n list: parseList(el, 'navTarget'),\n })),\n }\n}\n\nconst parseClock = str => {\n if (!str) return\n const parts = str.split(':').map(x => parseFloat(x))\n if (parts.length === 3) {\n const [h, m, s] = parts\n return h * 60 * 60 + m * 60 + s\n }\n if (parts.length === 2) {\n const [m, s] = parts\n return m * 60 + s\n }\n const [x, unit] = str.split(/(?=[^\\d.])/)\n const n = parseFloat(x)\n const f = unit === 'h' ? 60 * 60\n : unit === 'min' ? 60\n : unit === 'ms' ? .001\n : 1\n return n * f\n}\n\nclass MediaOverlay extends EventTarget {\n #entries\n #lastMediaOverlayItem\n #sectionIndex\n #audioIndex\n #itemIndex\n #audio\n #volume = 1\n #rate = 1\n #state\n constructor(book, loadXML) {\n super()\n this.book = book\n this.loadXML = loadXML\n }\n async #loadSMIL(item) {\n if (this.#lastMediaOverlayItem === item) return\n const doc = await this.loadXML(item.href)\n const resolve = href => href ? resolveURL(href, item.href) : null\n const { $, $$$ } = childGetter(doc, NS.SMIL)\n this.#audioIndex = -1\n this.#itemIndex = -1\n this.#entries = $$$(doc, 'par').reduce((arr, $par) => {\n const text = resolve($($par, 'text')?.getAttribute('src'))\n const $audio = $($par, 'audio')\n if (!text || !$audio) return arr\n const src = resolve($audio.getAttribute('src'))\n const begin = parseClock($audio.getAttribute('clipBegin'))\n const end = parseClock($audio.getAttribute('clipEnd'))\n const last = arr.at(-1)\n if (last?.src === src) last.items.push({ text, begin, end })\n else arr.push({ src, items: [{ text, begin, end }] })\n return arr\n }, [])\n this.#lastMediaOverlayItem = item\n }\n get #activeAudio() {\n return this.#entries[this.#audioIndex]\n }\n get #activeItem() {\n return this.#activeAudio?.items?.[this.#itemIndex]\n }\n #error(e) {\n console.error(e)\n this.dispatchEvent(new CustomEvent('error', { detail: e }))\n }\n #highlight() {\n this.dispatchEvent(new CustomEvent('highlight', { detail: this.#activeItem }))\n }\n #unhighlight() {\n this.dispatchEvent(new CustomEvent('unhighlight', { detail: this.#activeItem }))\n }\n async #play(audioIndex, itemIndex) {\n this.#stop()\n this.#audioIndex = audioIndex\n this.#itemIndex = itemIndex\n const src = this.#activeAudio?.src\n if (!src || !this.#activeItem) return this.start(this.#sectionIndex + 1)\n\n const url = URL.createObjectURL(await this.book.loadBlob(src))\n const audio = new Audio(url)\n this.#audio = audio\n audio.volume = this.#volume\n audio.playbackRate = this.#rate\n audio.addEventListener('timeupdate', () => {\n if (audio.paused) return\n const t = audio.currentTime\n const { items } = this.#activeAudio\n if (t > this.#activeItem?.end) {\n this.#unhighlight()\n if (this.#itemIndex === items.length - 1) {\n this.#play(this.#audioIndex + 1, 0).catch(e => this.#error(e))\n return\n }\n }\n const oldIndex = this.#itemIndex\n while (items[this.#itemIndex + 1]?.begin <= t) this.#itemIndex++\n if (this.#itemIndex !== oldIndex) this.#highlight()\n })\n audio.addEventListener('error', () =>\n this.#error(new Error(`Failed to load ${src}`)))\n audio.addEventListener('playing', () => this.#highlight())\n audio.addEventListener('ended', () => {\n this.#unhighlight()\n URL.revokeObjectURL(url)\n this.#audio = null\n this.#play(audioIndex + 1, 0).catch(e => this.#error(e))\n })\n if (this.#state === 'paused') {\n this.#highlight()\n audio.currentTime = this.#activeItem.begin ?? 0\n }\n else audio.addEventListener('canplaythrough', () => {\n // for some reason need to seek in `canplaythrough`\n // or it won't play when skipping in WebKit\n audio.currentTime = this.#activeItem.begin ?? 0\n this.#state = 'playing'\n audio.play().catch(e => this.#error(e))\n }, { once: true })\n }\n async start(sectionIndex, filter = () => true) {\n this.#audio?.pause()\n const section = this.book.sections[sectionIndex]\n const href = section?.id\n if (!href) return\n\n const { mediaOverlay } = section\n if (!mediaOverlay) return this.start(sectionIndex + 1)\n this.#sectionIndex = sectionIndex\n await this.#loadSMIL(mediaOverlay)\n\n for (let i = 0; i < this.#entries.length; i++) {\n const { items } = this.#entries[i]\n for (let j = 0; j < items.length; j++) {\n if (items[j].text.split('#')[0] === href && filter(items[j], j, items))\n return this.#play(i, j).catch(e => this.#error(e))\n }\n }\n }\n pause() {\n this.#state = 'paused'\n this.#audio?.pause()\n }\n resume() {\n this.#state = 'playing'\n this.#audio?.play().catch(e => this.#error(e))\n }\n #stop() {\n if (this.#audio) {\n this.#audio.pause()\n URL.revokeObjectURL(this.#audio.src)\n this.#audio = null\n this.#unhighlight()\n }\n }\n stop() {\n this.#state = 'stopped'\n this.#stop()\n }\n prev() {\n if (this.#itemIndex > 0) this.#play(this.#audioIndex, this.#itemIndex - 1)\n else if (this.#audioIndex > 0) this.#play(this.#audioIndex - 1,\n this.#entries[this.#audioIndex - 1].items.length - 1)\n else if (this.#sectionIndex > 0)\n this.start(this.#sectionIndex - 1, (_, i, items) => i === items.length - 1)\n }\n next() {\n this.#play(this.#audioIndex, this.#itemIndex + 1)\n }\n setVolume(volume) {\n this.#volume = volume\n if (this.#audio) this.#audio.volume = volume\n }\n setRate(rate) {\n this.#rate = rate\n if (this.#audio) this.#audio.playbackRate = rate\n }\n}\n\nconst isUUID = /([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/\n\nconst getUUID = opf => {\n for (const el of opf.getElementsByTagNameNS(NS.DC, 'identifier')) {\n const [id] = getElementText(el).split(':').slice(-1)\n if (isUUID.test(id)) return id\n }\n return ''\n}\n\nconst getIdentifier = opf => getElementText(\n opf.getElementById(opf.documentElement.getAttribute('unique-identifier'))\n ?? opf.getElementsByTagNameNS(NS.DC, 'identifier')[0])\n\n// https://www.w3.org/publishing/epub32/epub-ocf.html#sec-resource-obfuscation\nconst deobfuscate = async (key, length, blob) => {\n const array = new Uint8Array(await blob.slice(0, length).arrayBuffer())\n length = Math.min(length, array.length)\n for (var i = 0; i < length; i++) array[i] = array[i] ^ key[i % key.length]\n return new Blob([array, blob.slice(length)], { type: blob.type })\n}\n\nconst WebCryptoSHA1 = async str => {\n const data = new TextEncoder().encode(str)\n const buffer = await globalThis.crypto.subtle.digest('SHA-1', data)\n return new Uint8Array(buffer)\n}\n\nconst deobfuscators = (sha1 = WebCryptoSHA1) => ({\n 'http://www.idpf.org/2008/embedding': {\n key: opf => sha1(getIdentifier(opf)\n // eslint-disable-next-line no-control-regex\n .replaceAll(/[\\u0020\\u0009\\u000d\\u000a]/g, '')),\n decode: (key, blob) => deobfuscate(key, 1040, blob),\n },\n 'http://ns.adobe.com/pdf/enc#RC': {\n key: opf => {\n const uuid = getUUID(opf).replaceAll('-', '')\n return Uint8Array.from({ length: 16 }, (_, i) =>\n parseInt(uuid.slice(i * 2, i * 2 + 2), 16))\n },\n decode: (key, blob) => deobfuscate(key, 1024, blob),\n },\n})\n\nclass Encryption {\n #uris = new Map()\n #decoders = new Map()\n #algorithms\n constructor(algorithms) {\n this.#algorithms = algorithms\n }\n async init(encryption, opf) {\n if (!encryption) return\n const data = Array.from(\n encryption.getElementsByTagNameNS(NS.ENC, 'EncryptedData'), el => ({\n algorithm: el.getElementsByTagNameNS(NS.ENC, 'EncryptionMethod')[0]\n ?.getAttribute('Algorithm'),\n uri: el.getElementsByTagNameNS(NS.ENC, 'CipherReference')[0]\n ?.getAttribute('URI'),\n }))\n for (const { algorithm, uri } of data) {\n if (!this.#decoders.has(algorithm)) {\n const algo = this.#algorithms[algorithm]\n if (!algo) {\n console.warn('Unknown encryption algorithm')\n continue\n }\n const key = await algo.key(opf)\n this.#decoders.set(algorithm, blob => algo.decode(key, blob))\n }\n this.#uris.set(uri, algorithm)\n }\n }\n getDecoder(uri) {\n return this.#decoders.get(this.#uris.get(uri)) ?? (x => x)\n }\n}\n\nclass Resources {\n constructor({ opf, resolveHref }) {\n this.opf = opf\n const { $, $$, $$$ } = childGetter(opf, NS.OPF)\n\n const $manifest = $(opf.documentElement, 'manifest')\n const $spine = $(opf.documentElement, 'spine')\n const $$itemref = $$($spine, 'itemref')\n\n this.manifest = $$($manifest, 'item')\n .map(getAttributes('href', 'id', 'media-type', 'properties', 'media-overlay'))\n .map(item => {\n item.href = resolveHref(item.href)\n item.properties = item.properties?.split(/\\s/)\n return item\n })\n this.spine = $$itemref\n .map(getAttributes('idref', 'id', 'linear', 'properties'))\n .map(item => (item.properties = item.properties?.split(/\\s/), item))\n this.pageProgressionDirection = $spine\n .getAttribute('page-progression-direction')\n\n this.navPath = this.getItemByProperty('nav')?.href\n this.ncxPath = (this.getItemByID($spine.getAttribute('toc'))\n ?? this.manifest.find(item => item.mediaType === MIME.NCX))?.href\n\n const $guide = $(opf.documentElement, 'guide')\n if ($guide) this.guide = $$($guide, 'reference')\n .map(getAttributes('type', 'title', 'href'))\n .map(({ type, title, href }) => ({\n label: title,\n type: type.split(/\\s/),\n href: resolveHref(href),\n }))\n\n this.cover = this.getItemByProperty('cover-image')\n // EPUB 2 compat\n ?? this.getItemByID($$$(opf, 'meta')\n .find(filterAttribute('name', 'cover'))\n ?.getAttribute('content'))\n ?? this.getItemByHref(this.guide\n ?.find(ref => ref.type.includes('cover'))?.href)\n\n this.cfis = CFI.fromElements($$itemref)\n }\n getItemByID(id) {\n return this.manifest.find(item => item.id === id)\n }\n getItemByHref(href) {\n return this.manifest.find(item => item.href === href)\n }\n getItemByProperty(prop) {\n return this.manifest.find(item => item.properties?.includes(prop))\n }\n resolveCFI(cfi) {\n const parts = CFI.parse(cfi)\n const top = (parts.parent ?? parts).shift()\n let $itemref = CFI.toElement(this.opf, top)\n // make sure it's an idref; if not, try again without the ID assertion\n // mainly because Epub.js used to generate wrong ID assertions\n // https://github.com/futurepress/epub.js/issues/1236\n if ($itemref && $itemref.nodeName !== 'idref') {\n top.at(-1).id = null\n $itemref = CFI.toElement(this.opf, top)\n }\n const idref = $itemref?.getAttribute('idref')\n const index = this.spine.findIndex(item => item.idref === idref)\n const anchor = doc => CFI.toRange(doc, parts)\n return { index, anchor }\n }\n}\n\nclass Loader {\n #cache = new Map()\n #children = new Map()\n #refCount = new Map()\n allowScript = false\n constructor({ loadText, loadBlob, resources }) {\n this.loadText = loadText\n this.loadBlob = loadBlob\n this.manifest = resources.manifest\n this.assets = resources.manifest\n // needed only when replacing in (X)HTML w/o parsing (see below)\n //.filter(({ mediaType }) => ![MIME.XHTML, MIME.HTML].includes(mediaType))\n }\n createURL(href, data, type, parent) {\n if (!data) return ''\n const url = URL.createObjectURL(new Blob([data], { type }))\n this.#cache.set(href, url)\n this.#refCount.set(href, 1)\n if (parent) {\n const childList = this.#children.get(parent)\n if (childList) childList.push(href)\n else this.#children.set(parent, [href])\n }\n return url\n }\n ref(href, parent) {\n const childList = this.#children.get(parent)\n if (!childList?.includes(href)) {\n this.#refCount.set(href, this.#refCount.get(href) + 1)\n //console.log(`referencing ${href}, now ${this.#refCount.get(href)}`)\n if (childList) childList.push(href)\n else this.#children.set(parent, [href])\n }\n return this.#cache.get(href)\n }\n unref(href) {\n if (!this.#refCount.has(href)) return\n const count = this.#refCount.get(href) - 1\n //console.log(`unreferencing ${href}, now ${count}`)\n if (count < 1) {\n //console.log(`unloading ${href}`)\n URL.revokeObjectURL(this.#cache.get(href))\n this.#cache.delete(href)\n this.#refCount.delete(href)\n // unref children\n const childList = this.#children.get(href)\n if (childList) while (childList.length) this.unref(childList.pop())\n this.#children.delete(href)\n } else this.#refCount.set(href, count)\n }\n // load manifest item, recursively loading all resources as needed\n async loadItem(item, parents = []) {\n if (!item) return null\n const { href, mediaType } = item\n\n const isScript = MIME.JS.test(item.mediaType)\n if (isScript && !this.allowScript) return null\n\n const parent = parents.at(-1)\n if (this.#cache.has(href)) return this.ref(href, parent)\n\n const shouldReplace =\n (isScript || [MIME.XHTML, MIME.HTML, MIME.CSS, MIME.SVG].includes(mediaType))\n // prevent circular references\n && parents.every(p => p !== href)\n if (shouldReplace) return this.loadReplaced(item, parents)\n return this.createURL(href, await this.loadBlob(href), mediaType, parent)\n }\n async loadHref(href, base, parents = []) {\n if (isExternal(href)) return href\n const path = resolveURL(href, base)\n const item = this.manifest.find(item => item.href === path)\n if (!item) return href\n return this.loadItem(item, parents.concat(base))\n }\n async loadReplaced(item, parents = []) {\n const { href, mediaType } = item\n const parent = parents.at(-1)\n const str = await this.loadText(href)\n if (!str) return null\n\n // note that one can also just use `replaceString` for everything:\n // ```\n // const replaced = await this.replaceString(str, href, parents)\n // return this.createURL(href, replaced, mediaType, parent)\n // ```\n // which is basically what Epub.js does, which is simpler, but will\n // break things like iframes (because you don't want to replace links)\n // or text that just happen to be paths\n\n // parse and replace in HTML\n if ([MIME.XHTML, MIME.HTML, MIME.SVG].includes(mediaType)) {\n let doc = new DOMParser().parseFromString(str, mediaType)\n // change to HTML if it's not valid XHTML\n if (mediaType === MIME.XHTML && (doc.querySelector('parsererror')\n || !doc.documentElement?.namespaceURI)) {\n console.warn(doc.querySelector('parsererror')?.innerText ?? 'Invalid XHTML')\n item.mediaType = MIME.HTML\n doc = new DOMParser().parseFromString(str, item.mediaType)\n }\n // replace hrefs in XML processing instructions\n // this is mainly for SVGs that use xml-stylesheet\n if ([MIME.XHTML, MIME.SVG].includes(item.mediaType)) {\n let child = doc.firstChild\n while (child instanceof ProcessingInstruction) {\n if (child.data) {\n const replacedData = await replaceSeries(child.data,\n /(?:^|\\s*)(href\\s*=\\s*['\"])([^'\"]*)(['\"])/i,\n (_, p1, p2, p3) => this.loadHref(p2, href, parents)\n .then(p2 => `${p1}${p2}${p3}`))\n child.replaceWith(doc.createProcessingInstruction(\n child.target, replacedData))\n }\n child = child.nextSibling\n }\n }\n // replace hrefs (excluding anchors)\n // TODO: srcset?\n const replace = async (el, attr) => el.setAttribute(attr,\n await this.loadHref(el.getAttribute(attr), href, parents))\n for (const el of doc.querySelectorAll('link[href]')) await replace(el, 'href')\n for (const el of doc.querySelectorAll('[src]')) await replace(el, 'src')\n for (const el of doc.querySelectorAll('[poster]')) await replace(el, 'poster')\n for (const el of doc.querySelectorAll('object[data]')) await replace(el, 'data')\n for (const el of doc.querySelectorAll('[*|href]:not([href])'))\n el.setAttributeNS(NS.XLINK, 'href', await this.loadHref(\n el.getAttributeNS(NS.XLINK, 'href'), href, parents))\n // replace inline styles\n for (const el of doc.querySelectorAll('style'))\n if (el.textContent) el.textContent =\n await this.replaceCSS(el.textContent, href, parents)\n for (const el of doc.querySelectorAll('[style]'))\n el.setAttribute('style',\n await this.replaceCSS(el.getAttribute('style'), href, parents))\n // TODO: replace inline scripts? probably not worth the trouble\n const result = new XMLSerializer().serializeToString(doc)\n return this.createURL(href, result, item.mediaType, parent)\n }\n\n const result = mediaType === MIME.CSS\n ? await this.replaceCSS(str, href, parents)\n : await this.replaceString(str, href, parents)\n return this.createURL(href, result, mediaType, parent)\n }\n async replaceCSS(str, href, parents = []) {\n const replacedUrls = await replaceSeries(str,\n /url\\(\\s*[\"']?([^'\"\\n]*?)\\s*[\"']?\\s*\\)/gi,\n (_, url) => this.loadHref(url, href, parents)\n .then(url => `url(\"${url}\")`))\n // apart from `url()`, strings can be used for `@import` (but why?!)\n const replacedImports = await replaceSeries(replacedUrls,\n /@import\\s*[\"']([^\"'\\n]*?)[\"']/gi,\n (_, url) => this.loadHref(url, href, parents)\n .then(url => `@import \"${url}\"`))\n const w = window?.innerWidth ?? 800\n const h = window?.innerHeight ?? 600\n return replacedImports\n // unprefix as most of the props are (only) supported unprefixed\n .replace(/(?<=[{\\s;])-epub-/gi, '')\n // replace vw and vh as they cause problems with layout\n .replace(/(\\d*\\.?\\d+)vw/gi, (_, d) => parseFloat(d) * w / 100 + 'px')\n .replace(/(\\d*\\.?\\d+)vh/gi, (_, d) => parseFloat(d) * h / 100 + 'px')\n // `page-break-*` unsupported in columns; replace with `column-break-*`\n .replace(/page-break-(after|before|inside)\\s*:/gi, (_, x) =>\n `-webkit-column-break-${x}:`)\n .replace(/break-(after|before|inside)\\s*:\\s*(avoid-)?page/gi, (_, x, y) =>\n `break-${x}: ${y ?? ''}column`)\n }\n // find & replace all possible relative paths for all assets without parsing\n replaceString(str, href, parents = []) {\n const assetMap = new Map()\n const urls = this.assets.map(asset => {\n // do not replace references to the file itself\n if (asset.href === href) return\n // href was decoded and resolved when parsing the manifest\n const relative = pathRelative(pathDirname(href), asset.href)\n const relativeEnc = encodeURI(relative)\n const rootRelative = '/' + asset.href\n const rootRelativeEnc = encodeURI(rootRelative)\n const set = new Set([relative, relativeEnc, rootRelative, rootRelativeEnc])\n for (const url of set) assetMap.set(url, asset)\n return Array.from(set)\n }).flat().filter(x => x)\n if (!urls.length) return str\n const regex = new RegExp(urls.map(regexEscape).join('|'), 'g')\n return replaceSeries(str, regex, async match =>\n this.loadItem(assetMap.get(match.replace(/^\\//, '')),\n parents.concat(href)))\n }\n unloadItem(item) {\n this.unref(item?.href)\n }\n destroy() {\n for (const url of this.#cache.values()) URL.revokeObjectURL(url)\n }\n}\n\nconst getHTMLFragment = (doc, id) => doc.getElementById(id)\n ?? doc.querySelector(`[name=\"${CSS.escape(id)}\"]`)\n\nconst getPageSpread = properties => {\n for (const p of properties) {\n if (p === 'page-spread-left' || p === 'rendition:page-spread-left')\n return 'left'\n if (p === 'page-spread-right' || p === 'rendition:page-spread-right')\n return 'right'\n if (p === 'rendition:page-spread-center') return 'center'\n }\n}\n\nconst getDisplayOptions = doc => {\n if (!doc) return null\n return {\n fixedLayout: getElementText(doc.querySelector('option[name=\"fixed-layout\"]')),\n openToSpread: getElementText(doc.querySelector('option[name=\"open-to-spread\"]')),\n }\n}\n\nexport class EPUB {\n parser = new DOMParser()\n #loader\n #encryption\n constructor({ loadText, loadBlob, getSize, sha1 }) {\n this.loadText = loadText\n this.loadBlob = loadBlob\n this.getSize = getSize\n this.#encryption = new Encryption(deobfuscators(sha1))\n }\n async #loadXML(uri) {\n const str = await this.loadText(uri)\n if (!str) return null\n const doc = this.parser.parseFromString(str, MIME.XML)\n if (doc.querySelector('parsererror'))\n throw new Error(`XML parsing error: ${uri}\n${doc.querySelector('parsererror').innerText}`)\n return doc\n }\n async init() {\n const $container = await this.#loadXML('META-INF/container.xml')\n if (!$container) throw new Error('Failed to load container file')\n\n const opfs = Array.from(\n $container.getElementsByTagNameNS(NS.CONTAINER, 'rootfile'),\n getAttributes('full-path', 'media-type'))\n .filter(file => file.mediaType === 'application/oebps-package+xml')\n\n if (!opfs.length) throw new Error('No package document defined in container')\n const opfPath = opfs[0].fullPath\n const opf = await this.#loadXML(opfPath)\n if (!opf) throw new Error('Failed to load package document')\n\n const $encryption = await this.#loadXML('META-INF/encryption.xml')\n await this.#encryption.init($encryption, opf)\n\n this.resources = new Resources({\n opf,\n resolveHref: url => resolveURL(url, opfPath),\n })\n this.#loader = new Loader({\n loadText: this.loadText,\n loadBlob: uri => Promise.resolve(this.loadBlob(uri))\n .then(this.#encryption.getDecoder(uri)),\n resources: this.resources,\n })\n this.sections = this.resources.spine.map((spineItem, index) => {\n const { idref, linear, properties = [] } = spineItem\n const item = this.resources.getItemByID(idref)\n if (!item) {\n console.warn(`Could not find item with ID \"${idref}\" in manifest`)\n return null\n }\n return {\n id: item.href,\n load: () => this.#loader.loadItem(item),\n unload: () => this.#loader.unloadItem(item),\n createDocument: () => this.loadDocument(item),\n size: this.getSize(item.href),\n cfi: this.resources.cfis[index],\n linear,\n pageSpread: getPageSpread(properties),\n resolveHref: href => resolveURL(href, item.href),\n mediaOverlay: item.mediaOverlay\n ? this.resources.getItemByID(item.mediaOverlay) : null,\n }\n }).filter(s => s)\n\n const { navPath, ncxPath } = this.resources\n if (navPath) try {\n const resolve = url => resolveURL(url, navPath)\n const nav = parseNav(await this.#loadXML(navPath), resolve)\n this.toc = nav.toc\n this.pageList = nav.pageList\n this.landmarks = nav.landmarks\n } catch(e) {\n console.warn(e)\n }\n if (!this.toc && ncxPath) try {\n const resolve = url => resolveURL(url, ncxPath)\n const ncx = parseNCX(await this.#loadXML(ncxPath), resolve)\n this.toc = ncx.toc\n this.pageList = ncx.pageList\n } catch(e) {\n console.warn(e)\n }\n this.landmarks ??= this.resources.guide\n\n const { metadata, rendition, media } = getMetadata(opf)\n this.metadata = metadata\n this.rendition = rendition\n this.media = media\n this.dir = this.resources.pageProgressionDirection\n const displayOptions = getDisplayOptions(\n await this.#loadXML('META-INF/com.apple.ibooks.display-options.xml')\n ?? await this.#loadXML('META-INF/com.kobobooks.display-options.xml'))\n if (displayOptions) {\n if (displayOptions.fixedLayout === 'true')\n this.rendition.layout ??= 'pre-paginated'\n if (displayOptions.openToSpread === 'false') this.sections\n .find(section => section.linear !== 'no').pageSpread ??=\n this.dir === 'rtl' ? 'left' : 'right'\n }\n return this\n }\n async loadDocument(item) {\n const str = await this.loadText(item.href)\n return this.parser.parseFromString(str, item.mediaType)\n }\n getMediaOverlay() {\n return new MediaOverlay(this, this.#loadXML.bind(this))\n }\n resolveCFI(cfi) {\n return this.resources.resolveCFI(cfi)\n }\n resolveHref(href) {\n const [path, hash] = href.split('#')\n const item = this.resources.getItemByHref(decodeURI(path))\n if (!item) return null\n const index = this.resources.spine.findIndex(({ idref }) => idref === item.id)\n const anchor = hash ? doc => getHTMLFragment(doc, hash) : () => 0\n return { index, anchor }\n }\n splitTOCHref(href) {\n return href?.split('#') ?? []\n }\n getTOCFragment(doc, id) {\n return doc.getElementById(id)\n ?? doc.querySelector(`[name=\"${CSS.escape(id)}\"]`)\n }\n isExternal(uri) {\n return isExternal(uri)\n }\n async getCover() {\n const cover = this.resources?.cover\n return cover?.href\n ? new Blob([await this.loadBlob(cover.href)], { type: cover.mediaType })\n : null\n }\n async getCalibreBookmarks() {\n const txt = await this.loadText('META-INF/calibre_bookmarks.txt')\n const magic = 'encoding=json+base64:'\n if (txt?.startsWith(magic)) {\n const json = atob(txt.slice(magic.length))\n return JSON.parse(json)\n }\n }\n destroy() {\n this.#loader?.destroy()\n }\n}\n","const normalizeWhitespace = str => str ? str\n .replace(/[\\t\\n\\f\\r ]+/g, ' ')\n .replace(/^[\\t\\n\\f\\r ]+/, '')\n .replace(/[\\t\\n\\f\\r ]+$/, '') : ''\nconst getElementText = el => normalizeWhitespace(el?.textContent)\n\nconst NS = {\n XLINK: 'http://www.w3.org/1999/xlink',\n EPUB: 'http://www.idpf.org/2007/ops',\n}\n\nconst MIME = {\n XML: 'application/xml',\n XHTML: 'application/xhtml+xml',\n}\n\nconst STYLE = {\n 'strong': ['strong', 'self'],\n 'emphasis': ['em', 'self'],\n 'style': ['span', 'self'],\n 'a': 'anchor',\n 'strikethrough': ['s', 'self'],\n 'sub': ['sub', 'self'],\n 'sup': ['sup', 'self'],\n 'code': ['code', 'self'],\n 'image': 'image',\n}\n\nconst TABLE = {\n 'tr': ['tr', {\n 'th': ['th', STYLE, ['colspan', 'rowspan', 'align', 'valign']],\n 'td': ['td', STYLE, ['colspan', 'rowspan', 'align', 'valign']],\n }, ['align']],\n}\n\nconst POEM = {\n 'epigraph': ['blockquote'],\n 'subtitle': ['h2', STYLE],\n 'text-author': ['p', STYLE],\n 'date': ['p', STYLE],\n 'stanza': 'stanza',\n}\n\nconst SECTION = {\n 'title': ['header', {\n 'p': ['h1', STYLE],\n 'empty-line': ['br'],\n }],\n 'epigraph': ['blockquote', 'self'],\n 'image': 'image',\n 'annotation': ['aside'],\n 'section': ['section', 'self'],\n 'p': ['p', STYLE],\n 'poem': ['blockquote', POEM],\n 'subtitle': ['h2', STYLE],\n 'cite': ['blockquote', 'self'],\n 'empty-line': ['br'],\n 'table': ['table', TABLE],\n 'text-author': ['p', STYLE],\n}\nPOEM['epigraph'].push(SECTION)\n\nconst BODY = {\n 'image': 'image',\n 'title': ['section', {\n 'p': ['h1', STYLE],\n 'empty-line': ['br'],\n }],\n 'epigraph': ['section', SECTION],\n 'section': ['section', SECTION],\n}\n\nconst getImageSrc = el => {\n const href = el.getAttributeNS(NS.XLINK, 'href')\n if (!href) return 'data:,'\n const [, id] = href.split('#')\n if (!id) return href\n const bin = el.getRootNode().getElementById(id)\n return bin\n ? `data:${bin.getAttribute('content-type')};base64,${bin.textContent}`\n : href\n}\n\nclass FB2Converter {\n constructor(fb2) {\n this.fb2 = fb2\n this.doc = document.implementation.createDocument(NS.XHTML, 'html')\n }\n image(node) {\n const el = this.doc.createElement('img')\n el.alt = node.getAttribute('alt')\n el.title = node.getAttribute('title')\n el.setAttribute('src', getImageSrc(node))\n return el\n }\n anchor(node) {\n const el = this.convert(node, { 'a': ['a', STYLE] })\n el.setAttribute('href', node.getAttributeNS(NS.XLINK, 'href'))\n if (node.getAttribute('type') === 'note')\n el.setAttributeNS(NS.EPUB, 'epub:type', 'noteref')\n return el\n }\n stanza(node) {\n const el = this.convert(node, {\n 'stanza': ['p', {\n 'title': ['header', {\n 'p': ['strong', STYLE],\n 'empty-line': ['br'],\n }],\n 'subtitle': ['p', STYLE],\n }],\n })\n for (const child of node.children) if (child.nodeName === 'v') {\n el.append(this.doc.createTextNode(child.textContent))\n el.append(this.doc.createElement('br'))\n }\n return el\n }\n convert(node, def) {\n // not an element; return text content\n if (node.nodeType === 3) return this.doc.createTextNode(node.textContent)\n if (node.nodeType === 4) return this.doc.createCDATASection(node.textContent)\n if (node.nodeType === 8) return this.doc.createComment(node.textContent)\n\n const d = def?.[node.nodeName]\n if (!d) return null\n if (typeof d === 'string') return this[d](node)\n\n const [name, opts, attrs] = d\n const el = this.doc.createElement(name)\n\n // copy the ID, and set class name from original element name\n if (node.id) el.id = node.id\n el.classList.add(node.nodeName)\n\n // copy attributes\n if (Array.isArray(attrs)) for (const attr of attrs) {\n const value = node.getAttribute(attr)\n if (value) el.setAttribute(attr, value)\n }\n\n // process child elements recursively\n const childDef = opts === 'self' ? def : opts\n let child = node.firstChild\n while (child) {\n const childEl = this.convert(child, childDef)\n if (childEl) el.append(childEl)\n child = child.nextSibling\n }\n return el\n }\n}\n\nconst parseXML = async blob => {\n const buffer = await blob.arrayBuffer()\n const str = new TextDecoder('utf-8').decode(buffer)\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, MIME.XML)\n const encoding = doc.xmlEncoding\n // `Document.xmlEncoding` is deprecated, and already removed in Firefox\n // so parse the XML declaration manually\n || str.match(/^<\\?xml\\s+version\\s*=\\s*[\"']1.\\d+\"\\s+encoding\\s*=\\s*[\"']([A-Za-z0-9._-]*)[\"']/)?.[1]\n if (encoding && encoding.toLowerCase() !== 'utf-8') {\n const str = new TextDecoder(encoding).decode(buffer)\n return parser.parseFromString(str, MIME.XML)\n }\n return doc\n}\n\nconst style = URL.createObjectURL(new Blob([`\n@namespace epub \"http://www.idpf.org/2007/ops\";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title h1 {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title h1 {\n text-align: start;\n}\nbody.notesBodyType > section .title {\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: \"—\";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~=\"noteref\"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n`], { type: 'text/css' }))\n\nconst template = html => `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head><link href=\"${style}\" rel=\"stylesheet\" type=\"text/css\"/></head>\n <body>${html}</body>\n</html>`\n\n// name of custom ID attribute for TOC items\nconst dataID = 'data-foliate-id'\n\nexport const makeFB2 = async blob => {\n const book = {}\n const doc = await parseXML(blob)\n const converter = new FB2Converter(doc)\n\n const $ = x => doc.querySelector(x)\n const $$ = x => [...doc.querySelectorAll(x)]\n const getPerson = el => {\n const nick = getElementText(el.querySelector('nickname'))\n if (nick) return nick\n const first = getElementText(el.querySelector('first-name'))\n const middle = getElementText(el.querySelector('middle-name'))\n const last = getElementText(el.querySelector('last-name'))\n const name = [first, middle, last].filter(x => x).join(' ')\n const sortAs = last\n ? [last, [first, middle].filter(x => x).join(' ')].join(', ')\n : null\n return { name, sortAs }\n }\n const getDate = el => el?.getAttribute('value') ?? getElementText(el)\n const annotation = $('title-info annotation')\n book.metadata = {\n title: getElementText($('title-info book-title')),\n identifier: getElementText($('document-info id')),\n language: getElementText($('title-info lang')),\n author: $$('title-info author').map(getPerson),\n translator: $$('title-info translator').map(getPerson),\n contributor: $$('document-info author').map(getPerson)\n // techincially the program probably shouldn't get the `bkp` role\n // but it has been so used by calibre, so ¯\\_(ツ)_/¯\n .concat($$('document-info program-used').map(getElementText))\n .map(x => Object.assign(typeof x === 'string' ? { name: x } : x,\n { role: 'bkp' })),\n publisher: getElementText($('publish-info publisher')),\n published: getDate($('title-info date')),\n modified: getDate($('document-info date')),\n description: annotation ? converter.convert(annotation,\n { annotation: ['div', SECTION] }).innerHTML : null,\n subject: $$('title-info genre').map(getElementText),\n }\n if ($('coverpage image')) {\n const src = getImageSrc($('coverpage image'))\n book.getCover = () => fetch(src).then(res => res.blob())\n } else book.getCover = () => null\n\n // get convert each body\n const bodyData = Array.from(doc.querySelectorAll('body'), body => {\n const converted = converter.convert(body, { body: ['body', BODY] })\n return [Array.from(converted.children, el => {\n // get list of IDs in the section\n const ids = [el, ...el.querySelectorAll('[id]')].map(el => el.id)\n return { el, ids }\n }), converted]\n })\n\n const urls = []\n const sectionData = bodyData[0][0]\n // make a separate section for each section in the first body\n .map(({ el, ids }) => {\n // set up titles for TOC\n const titles = Array.from(\n el.querySelectorAll(':scope > section > .title'),\n (el, index) => {\n el.setAttribute(dataID, index)\n return { title: getElementText(el), index }\n })\n return { ids, titles, el }\n })\n // for additional bodies, only make one section for each body\n .concat(bodyData.slice(1).map(([sections, body]) => {\n const ids = sections.map(s => s.ids).flat()\n body.classList.add('notesBodyType')\n return { ids, el: body, linear: 'no' }\n }))\n .map(({ ids, titles, el, linear }) => {\n const str = template(el.outerHTML)\n const blob = new Blob([str], { type: MIME.XHTML })\n const url = URL.createObjectURL(blob)\n urls.push(url)\n const title = normalizeWhitespace(\n el.querySelector('.title, .subtitle, p')?.textContent\n ?? (el.classList.contains('title') ? el.textContent : ''))\n return {\n ids, title, titles, load: () => url,\n createDocument: () => new DOMParser().parseFromString(str, MIME.XHTML),\n // doo't count image data as it'd skew the size too much\n size: blob.size - Array.from(el.querySelectorAll('[src]'),\n el => el.getAttribute('src')?.length ?? 0)\n .reduce((a, b) => a + b, 0),\n linear,\n }\n })\n\n const idMap = new Map()\n book.sections = sectionData.map((section, index) => {\n const { ids, load, createDocument, size, linear } = section\n for (const id of ids) if (id) idMap.set(id, index)\n return { id: index, load, createDocument, size, linear }\n })\n\n book.toc = sectionData.map(({ title, titles }, index) => {\n const id = index.toString()\n return {\n label: title,\n href: id,\n subitems: titles?.length ? titles.map(({ title, index }) => ({\n label: title,\n href: `${id}#${index}`,\n })) : null,\n }\n }).filter(item => item)\n\n book.resolveHref = href => {\n const [a, b] = href.split('#')\n return a\n // the link is from the TOC\n ? { index: Number(a), anchor: doc => doc.querySelector(`[${dataID}=\"${b}\"]`) }\n // link from within the page\n : { index: idMap.get(b), anchor: doc => doc.getElementById(b) }\n }\n book.splitTOCHref = href => href?.split('#')?.map(x => Number(x)) ?? []\n book.getTOCFragment = (doc, id) => doc.querySelector(`[${dataID}=\"${id}\"]`)\n\n book.destroy = () => {\n for (const url of urls) URL.revokeObjectURL(url)\n }\n return book\n}\n","export const makeComicBook = ({ entries, loadBlob, getSize }, file) => {\n const cache = new Map()\n const urls = new Map()\n const load = async name => {\n if (cache.has(name)) return cache.get(name)\n const src = URL.createObjectURL(await loadBlob(name))\n const page = URL.createObjectURL(\n new Blob([`<body style=\"margin: 0\"><img src=\"${src}\">`], { type: 'text/html' }))\n urls.set(name, [src, page])\n cache.set(name, page)\n return page\n }\n const unload = name => {\n urls.get(name)?.forEach?.(url => URL.revokeObjectURL(url))\n urls.delete(name)\n cache.delete(name)\n }\n\n const exts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.jxl', '.avif']\n const files = entries\n .map(entry => entry.filename)\n .filter(name => exts.some(ext => name.endsWith(ext)))\n .sort()\n if (!files.length) throw new Error('No supported image files in archive')\n\n const book = {}\n book.getCover = () => loadBlob(files[0])\n book.metadata = { title: file.name }\n book.sections = files.map(name => ({\n id: name,\n load: () => load(name),\n unload: () => unload(name),\n size: getSize(name),\n }))\n book.toc = files.map(name => ({ label: name, href: name }))\n book.rendition = { layout: 'pre-paginated' }\n book.resolveHref = href => ({ index: book.sections.findIndex(s => s.id === href) })\n book.splitTOCHref = href => [href, null]\n book.getTOCFragment = doc => doc.documentElement\n book.destroy = () => {\n for (const arr of urls.values())\n for (const url of arr) URL.revokeObjectURL(url)\n }\n return book\n}\n","\"use client\"\n\nimport * as React from \"react\";\nimport * as CFI from '../vendor/foliate-js/epubcfi.js'\nimport { Book } from \"../lib/book.js\";\nimport { languageInfo } from \"../lib/language.js\";\nimport { SectionProgress, TOCProgress } from \"../vendor/foliate-js/progress.js\";\nimport { Search } from \"../lib/search.js\";\nimport { Overlayer } from \"../vendor/foliate-js/overlayer.js\";\nimport { Paginator } from \"../vendor/foliate-js/paginator.js\";\nimport { FixedLayout } from \"../vendor/foliate-js/fixed-layout.js\";\nimport \"../vendor/foliate-js/paginator.js\";\nimport \"../vendor/foliate-js/fixed-layout.js\";\n\n\ndeclare module \"react\" {\n namespace JSX {\n interface IntrinsicElements {\n 'foliate-paginator': React.DetailedHTMLProps<React.HTMLAttributes<Paginator>, Paginator>;\n 'foliate-fixed-layout': React.DetailedHTMLProps<React.HTMLAttributes<FixedLayout>, FixedLayout>;\n }\n }\n}\n\ninterface ReaderContextType {\n book: Book\n sectionProgress: SectionProgress\n tocProgress?: TOCProgress\n rendererRef: React.RefObject<Paginator | FixedLayout | null>;\n \n goTo: (target: number | string | { fraction: number }) => Promise<void>;\n resolveNavigation: (target: number | string | { fraction: number }) => { index: number, anchor?: number | ((doc: any) => any) } | undefined;\n next: (distance?: number) => Promise<void>;\n previous: (distance?: number) => Promise<void>;\n}\n \nconst ReaderContext = React.createContext<ReaderContextType | null>(null)\n\nfunction useReader() {\n const context = React.useContext(ReaderContext)\n if (!context) {\n throw new Error(\"useReader must be used within a <Reader />\")\n }\n return context\n }\n\ninterface ReaderProps {\n book: Book\n progress?: number\n onProgressChange?: (progress: number) => void\n children: React.ReactNode\n}\n\nfunction Reader({ book, progress, onProgressChange, children }: ReaderProps) {\n const rendererRef = React.useRef<Paginator | FixedLayout>(null)\n const sectionProgress = React.useMemo(() => new SectionProgress(book.sections, 1500, 1600), [book])\n const [tocProgress, setTocProgress] = React.useState<TOCProgress | undefined>()\n const [currentProgress, setCurrentProgress] = React.useState(0)\n\n const resolveNavigation = (target: number | string | { fraction: number }) => {\n if (typeof target === 'number') {\n return { index: target }\n } else if (typeof target === 'object') {\n const [index, anchor] = sectionProgress.getSection(target.fraction)\n return { index, anchor }\n } else if (CFI.isCFI.test(target)) {\n if (book.resolveCFI) {\n return book.resolveCFI(target)\n } else {\n const parts = CFI.parse(target)\n const index = CFI.fake.toIndex((parts.parent ?? parts).shift())\n const anchor = (doc: any) => CFI.toRange(doc, parts)\n return { index, anchor }\n }\n } else {\n const href = book.resolveHref?.(target)\n if (href === null) return\n return href\n }\n }\n\n async function goTo(target: number | string | { fraction: number }) {\n const resolved = resolveNavigation(target)\n if (resolved) {\n await rendererRef.current?.goTo(resolved)\n }\n }\n \n React.useEffect(() => {\n if (book.splitTOCHref && book.getTOCFragment) {\n const ids = book.sections?.map(s => s?.id)\n const splitHref = book.splitTOCHref.bind(book)\n const getFragment = book.getTOCFragment.bind(book)\n\n const tocProgress = new TOCProgress()\n tocProgress.init({ toc: book.toc, ids, splitHref, getFragment })\n setTocProgress(tocProgress)\n }\n }, [book])\n\n React.useEffect(() => {\n if (progress !== currentProgress && progress !== undefined) {\n goTo({ fraction: progress })\n }\n }, [progress, currentProgress, rendererRef])\n\n React.useEffect(() => {\n const handleRelocate = (event: any) => {\n const { index, fraction, size } = event.detail\n const { fraction: progress } = sectionProgress.getProgress(index, fraction, size)\n setCurrentProgress(progress)\n onProgressChange?.(progress)\n }\n\n rendererRef.current?.addEventListener('relocate', handleRelocate)\n\n return () => {\n rendererRef.current?.removeEventListener('relocate', handleRelocate)\n }\n }, [onProgressChange, rendererRef])\n\n async function next(distance?: number) {\n await rendererRef.current?.next(distance)\n }\n\n async function previous(distance?: number) {\n await rendererRef.current?.prev(distance)\n }\n\n return (\n <ReaderContext.Provider value={{ book, sectionProgress, tocProgress, rendererRef, goTo, resolveNavigation, next, previous }}>\n {children}\n </ReaderContext.Provider>\n )\n}\n\ninterface ReaderContentProps {\n fontSize?: number;\n lineSpacing?: number;\n justify?: boolean;\n hyphenate?: boolean;\n flow?: \"paginated\" | \"scrolled\";\n}\n\nfunction ReaderContent({ \n fontSize = 16, \n lineSpacing = 1.5, \n justify = true, \n hyphenate = true,\n flow = \"paginated\"\n}: ReaderContentProps) {\n const { book, rendererRef } = useReader()\n const info = languageInfo(book)\n\n React.useEffect(() => {\n const renderer = rendererRef.current\n if (renderer) {\n const createOverlayer = (e: any) => {\n const overlayer = new Overlayer()\n const { index, doc, attach } = e.detail\n\n doc.addEventListener('click', (e: MouseEvent) => {\n const [value, range] = overlayer.hitTest(e)\n if (value && range) {\n // TODO: Add annotation click handler\n console.log(value, range, index)\n }\n })\n attach(overlayer)\n }\n\n renderer.addEventListener('create-overlayer', createOverlayer)\n renderer.setAttribute('exportparts', 'head,foot,filter')\n renderer.open(book)\n renderer.next()\n\n return () => {\n renderer.removeEventListener('create-overlayer', createOverlayer)\n }\n }\n }, [book, rendererRef])\n\n \n React.useEffect(() => {\n if (!rendererRef.current) return;\n\n const css = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html {\n color-scheme: light dark;\n font-size: ${fontSize}px;\n }\n p, li, blockquote, dd {\n line-height: ${lineSpacing};\n text-align: ${justify ? 'justify' : 'start'};\n -webkit-hyphens: ${hyphenate ? 'auto' : 'manual'};\n hyphens: ${hyphenate ? 'auto' : 'manual'};\n -webkit-hyphenate-limit-before: 3;\n -webkit-hyphenate-limit-after: 2;\n -webkit-hyphenate-limit-lines: 2;\n hanging-punctuation: allow-end last;\n widows: 2;\n }\n [align=\"left\"] { text-align: left; }\n [align=\"right\"] { text-align: right; }\n [align=\"center\"] { text-align: center; }\n [align=\"justify\"] { text-align: justify; }\n `;\n\n rendererRef.current.setAttribute('flow', flow)\n if (rendererRef.current instanceof Paginator) {\n rendererRef.current.setStyles(css)\n }\n }, [fontSize, lineSpacing, justify, hyphenate, flow])\n\n const isFixedLayout = book.rendition?.layout === 'pre-paginated'\n const Renderer = isFixedLayout ? \"foliate-fixed-layout\" : \"foliate-paginator\"\n\n return <Renderer \n dir={info?.direction} \n lang={info?.canonical} \n ref={rendererRef as any} \n />\n}\n\nfunction ReaderNext({ children, ...props }: Omit<React.ComponentProps<\"button\">, \"onClick\">) {\n const { next } = useReader()\n\n return (\n <button onClick={() => next()} {...props}>{children}</button>\n )\n}\n\nfunction ReaderPrevious({ children, ...props }: Omit<React.ComponentProps<\"button\">, \"onClick\">) {\n const { previous } = useReader()\n\n return (\n <button onClick={() => previous()} {...props}>{children}</button>\n ) \n}\n\nfunction useBookNavigator() {\n const { goTo, next, previous } = useReader()\n return { goTo, next, previous }\n}\n\nfunction useSearch(query?: string) {\n const { book, tocProgress, rendererRef, resolveNavigation } = useReader()\n const [loading, setLoading] = React.useState(false)\n const [results, setResults] = React.useState<{ label: string, href: string }[]>()\n const [annotations, setAnnotations] = React.useState<string[]>([])\n\n React.useEffect(() => {\n if (!rendererRef.current) return\n \n for (const cfi of annotations) {\n const content = rendererRef.current?.getContents()\n for (const item of content) {\n if (\"overlayer\" in item) {\n const { overlayer } = item\n overlayer.remove(cfi)\n }\n }\n }\n\n setResults(undefined)\n setAnnotations([])\n\n if (query) {\n setLoading(true)\n \n const abortController = new AbortController()\n const searchResults: { label: string, href: string }[] = []\n const language = languageInfo(book)?.canonical ?? 'en'\n const search = new Search(book, language, tocProgress)\n const searchIterator = search.search({ query })\n \n function addAnnotation(cfi: string) {\n const resolved = resolveNavigation(cfi)\n if (resolved) {\n const content = rendererRef.current?.getContents()\n .find((x: any) => x.index === resolved.index && x.overlayer)\n\n if (content && \"overlayer\" in content) {\n const { overlayer, doc } = content\n const range = doc && typeof resolved.anchor === 'function' ? resolved.anchor(doc) : resolved.anchor\n overlayer.add(cfi, range, Overlayer.outline)\n setAnnotations((prev) => [...prev, cfi])\n }\n }\n }\n\n const processSearchResults = async () => {\n for await (const result of searchIterator) {\n if (abortController.signal.aborted) return\n if (result === 'done') {\n setLoading(false)\n break\n }\n \n if ('label' in result && typeof result.label === 'string') {\n searchResults.push({ label: result.label, href: result.subitems[0].cfi })\n setResults([...searchResults])\n\n for (const item of result.subitems) {\n addAnnotation(item.cfi)\n }\n } else if ('cfi' in result && typeof result.cfi === 'string') {\n addAnnotation(result.cfi)\n }\n }\n }\n \n processSearchResults()\n \n return () => {\n abortController.abort()\n setLoading(false)\n }\n } else {\n setLoading(false)\n }\n }, [query, rendererRef])\n\n return { loading, results }\n}\n\nexport {\n Reader,\n ReaderContent,\n ReaderNext,\n ReaderPrevious,\n useSearch,\n useBookNavigator\n};\n","import { Book } from \"./book\"\n\nexport interface LanguageInfo {\n canonical: string\n locale: Intl.Locale\n isCJK: boolean\n direction: \"ltr\" | \"rtl\"\n}\n \nexport const languageInfo = (book: Book): LanguageInfo | undefined => {\n const lang = book.metadata?.language\n if (!lang) return\n \n const canonical = Intl.getCanonicalLocales(lang)[0]\n const locale = new Intl.Locale(canonical)\n const isCJK = ['zh', 'ja', 'kr'].includes(locale.language)\n \n if (\"getTextInfo\" in locale) {\n // @ts-ignore\n const direction = locale.getTextInfo().direction\n return { canonical, locale, isCJK, direction }\n } else {\n const direction= locale.language === 'ar' || locale.language === 'he' ? 'rtl' : 'ltr'\n return { canonical, locale, isCJK, direction }\n }\n}","// assign a unique ID for each TOC item\nconst assignIDs = toc => {\n let id = 0\n const assignID = item => {\n item.id = id++\n if (item.subitems) for (const subitem of item.subitems) assignID(subitem)\n }\n for (const item of toc) assignID(item)\n return toc\n}\n\nconst flatten = items => items\n .map(item => item.subitems?.length\n ? [item, flatten(item.subitems)].flat()\n : item)\n .flat()\n\nexport class TOCProgress {\n async init({ toc, ids, splitHref, getFragment }) {\n assignIDs(toc)\n const items = flatten(toc)\n const grouped = new Map()\n for (const [i, item] of items.entries()) {\n const [id, fragment] = await splitHref(item?.href) ?? []\n const value = { fragment, item }\n if (grouped.has(id)) grouped.get(id).items.push(value)\n else grouped.set(id, { prev: items[i - 1], items: [value] })\n }\n const map = new Map()\n for (const [i, id] of ids.entries()) {\n if (grouped.has(id)) map.set(id, grouped.get(id))\n else map.set(id, map.get(ids[i - 1]))\n }\n this.ids = ids\n this.map = map\n this.getFragment = getFragment\n }\n getProgress(index, range) {\n if (!this.ids) return\n const id = this.ids[index]\n const obj = this.map.get(id)\n if (!obj) return null\n const { prev, items } = obj\n if (!items) return prev\n if (!range || items.length === 1 && !items[0].fragment) return items[0].item\n\n const doc = range.startContainer.getRootNode()\n for (const [i, { fragment }] of items.entries()) {\n const el = this.getFragment(doc, fragment)\n if (!el) continue\n if (range.comparePoint(el, 0) > 0)\n return (items[i - 1]?.item ?? prev)\n }\n return items[items.length - 1].item\n }\n}\n\nexport class SectionProgress {\n constructor(sections, sizePerLoc, sizePerTimeUnit) {\n this.sizes = sections.map(s => s.linear != 'no' && s.size > 0 ? s.size : 0)\n this.sizePerLoc = sizePerLoc\n this.sizePerTimeUnit = sizePerTimeUnit\n this.sizeTotal = this.sizes.reduce((a, b) => a + b, 0)\n this.sectionFractions = this.#getSectionFractions()\n }\n #getSectionFractions() {\n const { sizeTotal } = this\n const results = [0]\n let sum = 0\n for (const size of this.sizes) results.push((sum += size) / sizeTotal)\n return results\n }\n // get progress given index of and fractions within a section\n getProgress(index, fractionInSection, pageFraction = 0) {\n const { sizes, sizePerLoc, sizePerTimeUnit, sizeTotal } = this\n const sizeInSection = sizes[index] ?? 0\n const sizeBefore = sizes.slice(0, index).reduce((a, b) => a + b, 0)\n const size = sizeBefore + fractionInSection * sizeInSection\n const nextSize = size + pageFraction * sizeInSection\n const remainingTotal = sizeTotal - size\n const remainingSection = (1 - fractionInSection) * sizeInSection\n return {\n fraction: nextSize / sizeTotal,\n section: {\n current: index,\n total: sizes.length,\n },\n location: {\n current: Math.floor(size / sizePerLoc),\n next: Math.floor(nextSize / sizePerLoc),\n total: Math.ceil(sizeTotal / sizePerLoc),\n },\n time: {\n section: remainingSection / sizePerTimeUnit,\n total: remainingTotal / sizePerTimeUnit,\n },\n }\n }\n // the inverse of `getProgress`\n // get index of and fraction in section based on total fraction\n getSection(fraction) {\n if (fraction <= 0) return [0, 0]\n if (fraction >= 1) return [this.sizes.length - 1, 1]\n fraction = fraction + Number.EPSILON\n const { sizeTotal } = this\n let index = this.sectionFractions.findIndex(x => x > fraction) - 1\n if (index < 0) return [0, 0]\n while (!this.sizes[index]) index++\n const fractionInSection = (fraction - this.sectionFractions[index])\n / (this.sizes[index] / sizeTotal)\n return [index, fractionInSection]\n }\n}\n","// length for context in excerpts\nconst CONTEXT_LENGTH = 50\n\nconst normalizeWhitespace = str => str.replace(/\\s+/g, ' ')\n\nconst makeExcerpt = (strs, { startIndex, startOffset, endIndex, endOffset }) => {\n const start = strs[startIndex]\n const end = strs[endIndex]\n const match = start === end\n ? start.slice(startOffset, endOffset)\n : start.slice(startOffset)\n + strs.slice(start + 1, end).join('')\n + end.slice(0, endOffset)\n const trimmedStart = normalizeWhitespace(start.slice(0, startOffset)).trimStart()\n const trimmedEnd = normalizeWhitespace(end.slice(endOffset)).trimEnd()\n const ellipsisPre = trimmedStart.length < CONTEXT_LENGTH ? '' : '…'\n const ellipsisPost = trimmedEnd.length < CONTEXT_LENGTH ? '' : '…'\n const pre = `${ellipsisPre}${trimmedStart.slice(-CONTEXT_LENGTH)}`\n const post = `${trimmedEnd.slice(0, CONTEXT_LENGTH)}${ellipsisPost}`\n return { pre, match, post }\n}\n\nconst simpleSearch = function* (strs, query, options = {}) {\n const { locales = 'en', sensitivity } = options\n const matchCase = sensitivity === 'variant'\n const haystack = strs.join('')\n const lowerHaystack = matchCase ? haystack : haystack.toLocaleLowerCase(locales)\n const needle = matchCase ? query : query.toLocaleLowerCase(locales)\n const needleLength = needle.length\n let index = -1\n let strIndex = -1\n let sum = 0\n do {\n index = lowerHaystack.indexOf(needle, index + 1)\n if (index > -1) {\n while (sum <= index) sum += strs[++strIndex].length\n const startIndex = strIndex\n const startOffset = index - (sum - strs[strIndex].length)\n const end = index + needleLength\n while (sum <= end) sum += strs[++strIndex].length\n const endIndex = strIndex\n const endOffset = end - (sum - strs[strIndex].length)\n const range = { startIndex, startOffset, endIndex, endOffset }\n yield { range, excerpt: makeExcerpt(strs, range) }\n }\n } while (index > -1)\n}\n\nconst segmenterSearch = function* (strs, query, options = {}) {\n const { locales = 'en', granularity = 'word', sensitivity = 'base' } = options\n let segmenter, collator\n try {\n segmenter = new Intl.Segmenter(locales, { usage: 'search', granularity })\n collator = new Intl.Collator(locales, { sensitivity })\n } catch (e) {\n console.warn(e)\n segmenter = new Intl.Segmenter('en', { usage: 'search', granularity })\n collator = new Intl.Collator('en', { sensitivity })\n }\n const queryLength = Array.from(segmenter.segment(query)).length\n\n const substrArr = []\n let strIndex = 0\n let segments = segmenter.segment(strs[strIndex])[Symbol.iterator]()\n main: while (strIndex < strs.length) {\n while (substrArr.length < queryLength) {\n const { done, value } = segments.next()\n if (done) {\n // the current string is exhausted\n // move on to the next string\n strIndex++\n if (strIndex < strs.length) {\n segments = segmenter.segment(strs[strIndex])[Symbol.iterator]()\n continue\n } else break main\n }\n const { index, segment } = value\n // ignore formatting characters\n if (!/[^\\p{Format}]/u.test(segment)) continue\n // normalize whitespace\n if (/\\s/u.test(segment)) {\n if (!/\\s/u.test(substrArr[substrArr.length - 1]?.segment))\n substrArr.push({ strIndex, index, segment: ' ' })\n continue\n }\n value.strIndex = strIndex\n substrArr.push(value)\n }\n const substr = substrArr.map(x => x.segment).join('')\n if (collator.compare(query, substr) === 0) {\n const endIndex = strIndex\n const lastSeg = substrArr[substrArr.length - 1]\n const endOffset = lastSeg.index + lastSeg.segment.length\n const startIndex = substrArr[0].strIndex\n const startOffset = substrArr[0].index\n const range = { startIndex, startOffset, endIndex, endOffset }\n yield { range, excerpt: makeExcerpt(strs, range) }\n }\n substrArr.shift()\n }\n}\n\nexport const search = (strs, query, options) => {\n const { granularity = 'grapheme', sensitivity = 'base' } = options\n if (!Intl?.Segmenter || granularity === 'grapheme'\n && (sensitivity === 'variant' || sensitivity === 'accent'))\n return simpleSearch(strs, query, options)\n return segmenterSearch(strs, query, options)\n}\n\nexport const searchMatcher = (textWalker, opts) => {\n const { defaultLocale, matchCase, matchDiacritics, matchWholeWords } = opts\n return function* (doc, query) {\n const iter = textWalker(doc, function* (strs, makeRange) {\n for (const result of search(strs, query, {\n locales: doc.body.lang || doc.documentElement.lang || defaultLocale || 'en',\n granularity: matchWholeWords ? 'word' : 'grapheme',\n sensitivity: matchDiacritics && matchCase ? 'variant'\n : matchDiacritics && !matchCase ? 'accent'\n : !matchDiacritics && matchCase ? 'case'\n : 'base',\n })) {\n const { startIndex, startOffset, endIndex, endOffset } = result.range\n result.range = makeRange(startIndex, startOffset, endIndex, endOffset)\n yield result\n }\n })\n for (const result of iter) yield result\n }\n}\n","const walkRange = (range, walker) => {\n const nodes = []\n for (let node = walker.currentNode; node; node = walker.nextNode()) {\n const compare = range.comparePoint(node, 0)\n if (compare === 0) nodes.push(node)\n else if (compare > 0) break\n }\n return nodes\n}\n\nconst walkDocument = (_, walker) => {\n const nodes = []\n for (let node = walker.nextNode(); node; node = walker.nextNode())\n nodes.push(node)\n return nodes\n}\n\nconst filter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT\n | NodeFilter.SHOW_CDATA_SECTION\n\nconst acceptNode = node => {\n if (node.nodeType === 1) {\n const name = node.tagName.toLowerCase()\n if (name === 'script' || name === 'style') return NodeFilter.FILTER_REJECT\n return NodeFilter.FILTER_SKIP\n }\n return NodeFilter.FILTER_ACCEPT\n}\n\nexport const textWalker = function* (x, func) {\n const root = x.commonAncestorContainer ?? x.body ?? x\n const walker = document.createTreeWalker(root, filter, { acceptNode })\n const walk = x.commonAncestorContainer ? walkRange : walkDocument\n const nodes = walk(x, walker)\n const strs = nodes.map(node => node.nodeValue)\n const makeRange = (startIndex, startOffset, endIndex, endOffset) => {\n const range = document.createRange()\n range.setStart(nodes[startIndex], startOffset)\n range.setEnd(nodes[endIndex], endOffset)\n return range\n }\n for (const match of func(strs, makeRange)) yield match\n}\n","import { searchMatcher } from \"../vendor/foliate-js/search.js\"\nimport { textWalker } from \"../vendor/foliate-js/text-walker.js\"\nimport { TOCProgress } from \"../vendor/foliate-js/progress.js\"\nimport * as CFI from '../vendor/foliate-js/epubcfi.js'\nimport { Book } from \"./book.js\"\n\nexport class Search {\n private book: Book\n private language: string\n private tocProgress?: TOCProgress\n\n constructor(book: Book, language: string, tocProgress?: TOCProgress) {\n this.book = book\n this.language = language\n this.tocProgress = tocProgress\n }\n\n private getCFI(index: number, range?: any): string {\n const baseCFI = this.book.sections?.[index]?.cfi ?? CFI.fake.fromIndex(index)\n if (!range) return baseCFI\n return CFI.joinIndir(baseCFI, CFI.fromRange(range))\n }\n\n private async * searchSection(matcher: any, query: string, index: number) {\n const doc = await this.book.sections?.[index]?.createDocument()\n for (const { range, excerpt } of matcher(doc, query))\n yield { cfi: this.getCFI(index, range), excerpt }\n }\n\n private async * searchBook(matcher: any, query: string) {\n const { sections } = this.book\n if (!sections) return\n\n for (const [index, section] of sections.entries()) {\n if (!section?.createDocument) continue\n \n const doc = await section.createDocument()\n const subitems = Array.from(matcher(doc, query), ({ range, excerpt }) =>\n ({ cfi: this.getCFI(index, range), excerpt }))\n \n if (subitems.length) yield { index, subitems }\n }\n }\n async * search({ query, index }: { query: string, index?: number }) {\n const matcher = searchMatcher(textWalker, { defaultLocale: this.language, query, index })\n const iter = index != null\n ? this.searchSection(matcher, query, index)\n : this.searchBook(matcher, query)\n \n for await (const result of iter) {\n if (\"subitems\" in result && result.subitems) {\n yield {\n label: this.tocProgress?.getProgress(result.index)?.label ?? '',\n subitems: result.subitems,\n }\n }\n else {\n yield result\n }\n }\n yield 'done'\n }\n}\n","const createSVGElement = tag =>\n document.createElementNS('http://www.w3.org/2000/svg', tag)\n\nexport class Overlayer {\n #svg = createSVGElement('svg')\n #map = new Map()\n constructor() {\n Object.assign(this.#svg.style, {\n position: 'absolute', top: '0', left: '0',\n width: '100%', height: '100%',\n pointerEvents: 'none',\n })\n }\n get element() {\n return this.#svg\n }\n add(key, range, draw, options) {\n if (this.#map.has(key)) this.remove(key)\n if (typeof range === 'function') range = range(this.#svg.getRootNode())\n const rects = range.getClientRects()\n const element = draw(rects, options)\n this.#svg.append(element)\n this.#map.set(key, { range, draw, options, element, rects })\n }\n remove(key) {\n if (!this.#map.has(key)) return\n this.#svg.removeChild(this.#map.get(key).element)\n this.#map.delete(key)\n }\n redraw() {\n for (const obj of this.#map.values()) {\n const { range, draw, options, element } = obj\n this.#svg.removeChild(element)\n const rects = range.getClientRects()\n const el = draw(rects, options)\n this.#svg.append(el)\n obj.element = el\n obj.rects = rects\n }\n }\n hitTest({ x, y }) {\n const arr = Array.from(this.#map.entries())\n // loop in reverse to hit more recently added items first\n for (let i = arr.length - 1; i >= 0; i--) {\n const [key, obj] = arr[i]\n for (const { left, top, right, bottom } of obj.rects)\n if (top <= y && left <= x && bottom > y && right > x)\n return [key, obj.range]\n }\n return []\n }\n static underline(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, top, height } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', right - strokeWidth)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', strokeWidth)\n g.append(el)\n }\n else for (const { left, bottom, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', bottom - strokeWidth)\n el.setAttribute('height', strokeWidth)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static strikethrough(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, left, top, height } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', (right + left) / 2)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', strokeWidth)\n g.append(el)\n }\n else for (const { left, top, bottom, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', (top + bottom) / 2)\n el.setAttribute('height', strokeWidth)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static squiggly(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', 'none')\n g.setAttribute('stroke', color)\n g.setAttribute('stroke-width', strokeWidth)\n const block = strokeWidth * 1.5\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, top, height } of rects) {\n const el = createSVGElement('path')\n const n = Math.round(height / block / 1.5)\n const inline = height / n\n const ls = Array.from({ length: n },\n (_, i) => `l${i % 2 ? -block : block} ${inline}`).join('')\n el.setAttribute('d', `M${right} ${top}${ls}`)\n g.append(el)\n }\n else for (const { left, bottom, width } of rects) {\n const el = createSVGElement('path')\n const n = Math.round(width / block / 1.5)\n const inline = width / n\n const ls = Array.from({ length: n },\n (_, i) => `l${inline} ${i % 2 ? block : -block}`).join('')\n el.setAttribute('d', `M${left} ${bottom}${ls}`)\n g.append(el)\n }\n return g\n }\n static highlight(rects, options = {}) {\n const { color = 'red' } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n g.style.opacity = 'var(--overlayer-highlight-opacity, .3)'\n g.style.mixBlendMode = 'var(--overlayer-highlight-blend-mode, normal)'\n for (const { left, top, height, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static outline(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 3, radius = 3 } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', 'none')\n g.setAttribute('stroke', color)\n g.setAttribute('stroke-width', strokeWidth)\n for (const { left, top, height, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', width)\n el.setAttribute('rx', radius)\n g.append(el)\n }\n return g\n }\n // make an exact copy of an image in the overlay\n // one can then apply filters to the entire element, without affecting them;\n // it's a bit silly and probably better to just invert images twice\n // (though the color will be off in that case if you do heu-rotate)\n static copyImage([rect], options = {}) {\n const { src } = options\n const image = createSVGElement('image')\n const { left, top, height, width } = rect\n image.setAttribute('href', src)\n image.setAttribute('x', left)\n image.setAttribute('y', top)\n image.setAttribute('height', height)\n image.setAttribute('width', width)\n return image\n }\n}\n\n","const wait = ms => new Promise(resolve => setTimeout(resolve, ms))\n\nconst debounce = (f, wait, immediate) => {\n let timeout\n return (...args) => {\n const later = () => {\n timeout = null\n if (!immediate) f(...args)\n }\n const callNow = immediate && !timeout\n if (timeout) clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n if (callNow) f(...args)\n }\n}\n\nconst lerp = (min, max, x) => x * (max - min) + min\nconst easeOutQuad = x => 1 - (1 - x) * (1 - x)\nconst animate = (a, b, duration, ease, render) => new Promise(resolve => {\n let start\n const step = now => {\n start ??= now\n const fraction = Math.min(1, (now - start) / duration)\n render(lerp(a, b, ease(fraction)))\n if (fraction < 1) requestAnimationFrame(step)\n else resolve()\n }\n requestAnimationFrame(step)\n})\n\n// collapsed range doesn't return client rects sometimes (or always?)\n// try make get a non-collapsed range or element\nconst uncollapse = range => {\n if (!range?.collapsed) return range\n const { endOffset, endContainer } = range\n if (endContainer.nodeType === 1) {\n const node = endContainer.childNodes[endOffset]\n if (node?.nodeType === 1) return node\n return endContainer\n }\n if (endOffset + 1 < endContainer.length) range.setEnd(endContainer, endOffset + 1)\n else if (endOffset > 1) range.setStart(endContainer, endOffset - 1)\n else return endContainer.parentNode\n return range\n}\n\nconst makeRange = (doc, node, start, end = start) => {\n const range = doc.createRange()\n range.setStart(node, start)\n range.setEnd(node, end)\n return range\n}\n\n// use binary search to find an offset value in a text node\nconst bisectNode = (doc, node, cb, start = 0, end = node.nodeValue.length) => {\n if (end - start === 1) {\n const result = cb(makeRange(doc, node, start), makeRange(doc, node, end))\n return result < 0 ? start : end\n }\n const mid = Math.floor(start + (end - start) / 2)\n const result = cb(makeRange(doc, node, start, mid), makeRange(doc, node, mid, end))\n return result < 0 ? bisectNode(doc, node, cb, start, mid)\n : result > 0 ? bisectNode(doc, node, cb, mid, end) : mid\n}\n\nconst { SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION,\n FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP } = NodeFilter\n\nconst filter = SHOW_ELEMENT | SHOW_TEXT | SHOW_CDATA_SECTION\n\n// needed cause there seems to be a bug in `getBoundingClientRect()` in Firefox\n// where it fails to include rects that have zero width and non-zero height\n// (CSSOM spec says \"rectangles [...] of which the height or width is not zero\")\n// which makes the visible range include an extra space at column boundaries\nconst getBoundingClientRect = target => {\n let top = Infinity, right = -Infinity, left = Infinity, bottom = -Infinity\n for (const rect of target.getClientRects()) {\n left = Math.min(left, rect.left)\n top = Math.min(top, rect.top)\n right = Math.max(right, rect.right)\n bottom = Math.max(bottom, rect.bottom)\n }\n return new DOMRect(left, top, right - left, bottom - top)\n}\n\nconst getVisibleRange = (doc, start, end, mapRect) => {\n // first get all visible nodes\n const acceptNode = node => {\n const name = node.localName?.toLowerCase()\n // ignore all scripts, styles, and their children\n if (name === 'script' || name === 'style') return FILTER_REJECT\n if (node.nodeType === 1) {\n const { left, right } = mapRect(node.getBoundingClientRect())\n // no need to check child nodes if it's completely out of view\n if (right < start || left > end) return FILTER_REJECT\n // elements must be completely in view to be considered visible\n // because you can't specify offsets for elements\n if (left >= start && right <= end) return FILTER_ACCEPT\n // TODO: it should probably allow elements that do not contain text\n // because they can exceed the whole viewport in both directions\n // especially in scrolled mode\n } else {\n // ignore empty text nodes\n if (!node.nodeValue?.trim()) return FILTER_SKIP\n // create range to get rect\n const range = doc.createRange()\n range.selectNodeContents(node)\n const { left, right } = mapRect(range.getBoundingClientRect())\n // it's visible if any part of it is in view\n if (right >= start && left <= end) return FILTER_ACCEPT\n }\n return FILTER_SKIP\n }\n const walker = doc.createTreeWalker(doc.body, filter, { acceptNode })\n const nodes = []\n for (let node = walker.nextNode(); node; node = walker.nextNode())\n nodes.push(node)\n\n // we're only interested in the first and last visible nodes\n const from = nodes[0] ?? doc.body\n const to = nodes[nodes.length - 1] ?? from\n\n // find the offset at which visibility changes\n const startOffset = from.nodeType === 1 ? 0\n : bisectNode(doc, from, (a, b) => {\n const p = mapRect(getBoundingClientRect(a))\n const q = mapRect(getBoundingClientRect(b))\n if (p.right < start && q.left > start) return 0\n return q.left > start ? -1 : 1\n })\n const endOffset = to.nodeType === 1 ? 0\n : bisectNode(doc, to, (a, b) => {\n const p = mapRect(getBoundingClientRect(a))\n const q = mapRect(getBoundingClientRect(b))\n if (p.right < end && q.left > end) return 0\n return q.left > end ? -1 : 1\n })\n\n const range = doc.createRange()\n range.setStart(from, startOffset)\n range.setEnd(to, endOffset)\n return range\n}\n\nconst selectionIsBackward = sel => {\n const range = document.createRange()\n range.setStart(sel.anchorNode, sel.anchorOffset)\n range.setEnd(sel.focusNode, sel.focusOffset)\n return range.collapsed\n}\n\nconst setSelectionTo = (target, collapse) => {\n let range\n if (target.startContainer) range = target.cloneRange()\n else if (target.nodeType) {\n range = document.createRange()\n range.selectNode(target)\n }\n if (range) {\n const sel = range.startContainer.ownerDocument.defaultView.getSelection()\n sel.removeAllRanges()\n if (collapse === -1) range.collapse(true)\n else if (collapse === 1) range.collapse()\n sel.addRange(range)\n }\n}\n\nconst getDirection = doc => {\n const { defaultView } = doc\n const { writingMode, direction } = defaultView.getComputedStyle(doc.body)\n const vertical = writingMode === 'vertical-rl'\n || writingMode === 'vertical-lr'\n const rtl = doc.body.dir === 'rtl'\n || direction === 'rtl'\n || doc.documentElement.dir === 'rtl'\n return { vertical, rtl }\n}\n\nconst getBackground = doc => {\n const bodyStyle = doc.defaultView.getComputedStyle(doc.body)\n return bodyStyle.backgroundColor === 'rgba(0, 0, 0, 0)'\n && bodyStyle.backgroundImage === 'none'\n ? doc.defaultView.getComputedStyle(doc.documentElement).background\n : bodyStyle.background\n}\n\nconst makeMarginals = (length, part) => Array.from({ length }, () => {\n const div = document.createElement('div')\n const child = document.createElement('div')\n div.append(child)\n child.setAttribute('part', part)\n return div\n})\n\nconst setStylesImportant = (el, styles) => {\n const { style } = el\n for (const [k, v] of Object.entries(styles)) style.setProperty(k, v, 'important')\n}\n\nclass View {\n #observer = new ResizeObserver(() => this.expand())\n #element = document.createElement('div')\n #iframe = document.createElement('iframe')\n #contentRange = document.createRange()\n #overlayer\n #vertical = false\n #rtl = false\n #column = true\n #size\n #layout = {}\n constructor({ container, onExpand }) {\n this.container = container\n this.onExpand = onExpand\n this.#iframe.setAttribute('part', 'filter')\n this.#element.append(this.#iframe)\n Object.assign(this.#element.style, {\n boxSizing: 'content-box',\n position: 'relative',\n overflow: 'hidden',\n flex: '0 0 auto',\n width: '100%', height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n })\n Object.assign(this.#iframe.style, {\n overflow: 'hidden',\n border: '0',\n display: 'none',\n width: '100%', height: '100%',\n })\n // `allow-scripts` is needed for events because of WebKit bug\n // https://bugs.webkit.org/show_bug.cgi?id=218086\n this.#iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts')\n this.#iframe.setAttribute('scrolling', 'no')\n }\n get element() {\n return this.#element\n }\n get document() {\n return this.#iframe.contentDocument\n }\n async load(src, afterLoad, beforeRender) {\n if (typeof src !== 'string') throw new Error(`${src} is not string`)\n return new Promise(resolve => {\n this.#iframe.addEventListener('load', () => {\n const doc = this.document\n afterLoad?.(doc)\n\n // it needs to be visible for Firefox to get computed style\n this.#iframe.style.display = 'block'\n const { vertical, rtl } = getDirection(doc)\n const background = getBackground(doc)\n this.#iframe.style.display = 'none'\n\n this.#vertical = vertical\n this.#rtl = rtl\n\n this.#contentRange.selectNodeContents(doc.body)\n const layout = beforeRender?.({ vertical, rtl, background })\n this.#iframe.style.display = 'block'\n this.render(layout)\n this.#observer.observe(doc.body)\n\n // the resize observer above doesn't work in Firefox\n // (see https://bugzilla.mozilla.org/show_bug.cgi?id=1832939)\n // until the bug is fixed we can at least account for font load\n doc.fonts.ready.then(() => this.expand())\n\n resolve()\n }, { once: true })\n this.#iframe.src = src\n })\n }\n render(layout) {\n if (!layout) return\n this.#column = layout.flow !== 'scrolled'\n this.#layout = layout\n if (this.#column) this.columnize(layout)\n else this.scrolled(layout)\n }\n scrolled({ gap, columnWidth }) {\n const vertical = this.#vertical\n const doc = this.document\n setStylesImportant(doc.documentElement, {\n 'box-sizing': 'border-box',\n 'padding': vertical ? `${gap}px 0` : `0 ${gap}px`,\n 'column-width': 'auto',\n 'height': 'auto',\n 'width': 'auto',\n })\n setStylesImportant(doc.body, {\n [vertical ? 'max-height' : 'max-width']: `${columnWidth}px`,\n 'margin': 'auto',\n })\n this.setImageSize()\n this.expand()\n }\n columnize({ width, height, gap, columnWidth }) {\n const vertical = this.#vertical\n this.#size = vertical ? height : width\n\n const doc = this.document\n setStylesImportant(doc.documentElement, {\n 'box-sizing': 'border-box',\n 'column-width': `${Math.trunc(columnWidth)}px`,\n 'column-gap': `${gap}px`,\n 'column-fill': 'auto',\n ...(vertical\n ? { 'width': `${width}px` }\n : { 'height': `${height}px` }),\n 'padding': vertical ? `${gap / 2}px 0` : `0 ${gap / 2}px`,\n 'overflow': 'hidden',\n // force wrap long words\n 'overflow-wrap': 'break-word',\n // reset some potentially problematic props\n 'position': 'static', 'border': '0', 'margin': '0',\n 'max-height': 'none', 'max-width': 'none',\n 'min-height': 'none', 'min-width': 'none',\n // fix glyph clipping in WebKit\n '-webkit-line-box-contain': 'block glyphs replaced',\n })\n setStylesImportant(doc.body, {\n 'max-height': 'none',\n 'max-width': 'none',\n 'margin': '0',\n })\n this.setImageSize()\n this.expand()\n }\n setImageSize() {\n const { width, height, margin } = this.#layout\n const vertical = this.#vertical\n const doc = this.document\n for (const el of doc.body.querySelectorAll('img, svg, video')) {\n // preserve max size if they are already set\n const { maxHeight, maxWidth } = doc.defaultView.getComputedStyle(el)\n setStylesImportant(el, {\n 'max-height': vertical\n ? (maxHeight !== 'none' && maxHeight !== '0px' ? maxHeight : '100%')\n : `${height - margin * 2}px`,\n 'max-width': vertical\n ? `${width - margin * 2}px`\n : (maxWidth !== 'none' && maxWidth !== '0px' ? maxWidth : '100%'),\n 'object-fit': 'contain',\n 'page-break-inside': 'avoid',\n 'break-inside': 'avoid',\n 'box-sizing': 'border-box',\n })\n }\n }\n expand() {\n const { documentElement } = this.document\n if (this.#column) {\n const side = this.#vertical ? 'height' : 'width'\n const otherSide = this.#vertical ? 'width' : 'height'\n const contentRect = this.#contentRange.getBoundingClientRect()\n const rootRect = documentElement.getBoundingClientRect()\n // offset caused by column break at the start of the page\n // which seem to be supported only by WebKit and only for horizontal writing\n const contentStart = this.#vertical ? 0\n : this.#rtl ? rootRect.right - contentRect.right : contentRect.left - rootRect.left\n const contentSize = contentStart + contentRect[side]\n const pageCount = Math.ceil(contentSize / this.#size)\n const expandedSize = pageCount * this.#size\n this.#element.style.padding = '0'\n this.#iframe.style[side] = `${expandedSize}px`\n this.#element.style[side] = `${expandedSize + this.#size * 2}px`\n this.#iframe.style[otherSide] = '100%'\n this.#element.style[otherSide] = '100%'\n documentElement.style[side] = `${this.#size}px`\n if (this.#overlayer) {\n this.#overlayer.element.style.margin = '0'\n this.#overlayer.element.style.left = this.#vertical ? '0' : `${this.#size}px`\n this.#overlayer.element.style.top = this.#vertical ? `${this.#size}px` : '0'\n this.#overlayer.element.style[side] = `${expandedSize}px`\n this.#overlayer.redraw()\n }\n } else {\n const side = this.#vertical ? 'width' : 'height'\n const otherSide = this.#vertical ? 'height' : 'width'\n const contentSize = documentElement.getBoundingClientRect()[side]\n const expandedSize = contentSize\n const { margin } = this.#layout\n const padding = this.#vertical ? `0 ${margin}px` : `${margin}px 0`\n this.#element.style.padding = padding\n this.#iframe.style[side] = `${expandedSize}px`\n this.#element.style[side] = `${expandedSize}px`\n this.#iframe.style[otherSide] = '100%'\n this.#element.style[otherSide] = '100%'\n if (this.#overlayer) {\n this.#overlayer.element.style.margin = padding\n this.#overlayer.element.style.left = '0'\n this.#overlayer.element.style.top = '0'\n this.#overlayer.element.style[side] = `${expandedSize}px`\n this.#overlayer.redraw()\n }\n }\n this.onExpand()\n }\n set overlayer(overlayer) {\n this.#overlayer = overlayer\n this.#element.append(overlayer.element)\n }\n get overlayer() {\n return this.#overlayer\n }\n destroy() {\n if (this.document) this.#observer.unobserve(this.document.body)\n }\n}\n\n// NOTE: everything here assumes the so-called \"negative scroll type\" for RTL\nexport class Paginator extends HTMLElement {\n static observedAttributes = [\n 'flow', 'gap', 'margin',\n 'max-inline-size', 'max-block-size', 'max-column-count',\n ]\n #root = this.attachShadow({ mode: 'closed' })\n #observer = new ResizeObserver(() => this.render())\n #top\n #background\n #container\n #header\n #footer\n #view\n #vertical = false\n #rtl = false\n #margin = 0\n #index = -1\n #anchor = 0 // anchor view to a fraction (0-1), Range, or Element\n #justAnchored = false\n #locked = false // while true, prevent any further navigation\n #styles\n #styleMap = new WeakMap()\n #mediaQuery = matchMedia('(prefers-color-scheme: dark)')\n #mediaQueryListener\n #scrollBounds\n #touchState\n #touchScrolled\n #lastVisibleRange\n constructor() {\n super()\n this.#root.innerHTML = `<style>\n :host {\n display: block;\n container-type: size;\n }\n :host, #top {\n box-sizing: border-box;\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n }\n #top {\n --_gap: 7%;\n --_margin: 48px;\n --_max-inline-size: 720px;\n --_max-block-size: 1440px;\n --_max-column-count: 2;\n --_max-column-count-portrait: 1;\n --_max-column-count-spread: var(--_max-column-count);\n --_half-gap: calc(var(--_gap) / 2);\n --_max-width: calc(var(--_max-inline-size) * var(--_max-column-count-spread));\n --_max-height: var(--_max-block-size);\n display: grid;\n grid-template-columns:\n minmax(var(--_half-gap), 1fr)\n var(--_half-gap)\n minmax(0, calc(var(--_max-width) - var(--_gap)))\n var(--_half-gap)\n minmax(var(--_half-gap), 1fr);\n grid-template-rows:\n minmax(var(--_margin), 1fr)\n minmax(0, var(--_max-height))\n minmax(var(--_margin), 1fr);\n &.vertical {\n --_max-column-count-spread: var(--_max-column-count-portrait);\n --_max-width: var(--_max-block-size);\n --_max-height: calc(var(--_max-inline-size) * var(--_max-column-count-spread));\n }\n @container (orientation: portrait) {\n & {\n --_max-column-count-spread: var(--_max-column-count-portrait);\n }\n &.vertical {\n --_max-column-count-spread: var(--_max-column-count);\n }\n }\n }\n #background {\n grid-column: 1 / -1;\n grid-row: 1 / -1;\n }\n #container {\n grid-column: 2 / 5;\n grid-row: 2;\n overflow: hidden;\n }\n :host([flow=\"scrolled\"]) #container {\n grid-column: 1 / -1;\n grid-row: 1 / -1;\n overflow: auto;\n }\n #header {\n grid-column: 3 / 4;\n grid-row: 1;\n }\n #footer {\n grid-column: 3 / 4;\n grid-row: 3;\n align-self: end;\n }\n #header, #footer {\n display: grid;\n height: var(--_margin);\n }\n :is(#header, #footer) > * {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n :is(#header, #footer) > * > * {\n width: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: center;\n font-size: .75em;\n opacity: .6;\n }\n </style>\n <div id=\"top\">\n <div id=\"background\" part=\"filter\"></div>\n <div id=\"header\"></div>\n <div id=\"container\"></div>\n <div id=\"footer\"></div>\n </div>\n `\n\n this.#top = this.#root.getElementById('top')\n this.#background = this.#root.getElementById('background')\n this.#container = this.#root.getElementById('container')\n this.#header = this.#root.getElementById('header')\n this.#footer = this.#root.getElementById('footer')\n\n this.#observer.observe(this.#container)\n this.#container.addEventListener('scroll', () => this.dispatchEvent(new Event('scroll')))\n this.#container.addEventListener('scroll', debounce(() => {\n if (this.scrolled) {\n if (this.#justAnchored) this.#justAnchored = false\n else this.#afterScroll('scroll')\n }\n }, 250))\n\n const opts = { passive: false }\n this.addEventListener('touchstart', this.#onTouchStart.bind(this), opts)\n this.addEventListener('touchmove', this.#onTouchMove.bind(this), opts)\n this.addEventListener('touchend', this.#onTouchEnd.bind(this))\n this.addEventListener('load', ({ detail: { doc } }) => {\n doc.addEventListener('touchstart', this.#onTouchStart.bind(this), opts)\n doc.addEventListener('touchmove', this.#onTouchMove.bind(this), opts)\n doc.addEventListener('touchend', this.#onTouchEnd.bind(this))\n })\n\n this.addEventListener('relocate', ({ detail }) => {\n if (detail.reason === 'selection') setSelectionTo(this.#anchor, 0)\n else if (detail.reason === 'navigation') {\n if (this.#anchor === 1) setSelectionTo(detail.range, 1)\n else if (typeof this.#anchor === 'number')\n setSelectionTo(detail.range, -1)\n else setSelectionTo(this.#anchor, -1)\n }\n })\n const checkPointerSelection = debounce((range, sel) => {\n if (!sel.rangeCount) return\n const selRange = sel.getRangeAt(0)\n const backward = selectionIsBackward(sel)\n if (backward && selRange.compareBoundaryPoints(Range.START_TO_START, range) < 0)\n this.prev()\n else if (!backward && selRange.compareBoundaryPoints(Range.END_TO_END, range) > 0)\n this.next()\n }, 700)\n this.addEventListener('load', ({ detail: { doc } }) => {\n let isPointerSelecting = false\n doc.addEventListener('pointerdown', () => isPointerSelecting = true)\n doc.addEventListener('pointerup', () => isPointerSelecting = false)\n let isKeyboardSelecting = false\n doc.addEventListener('keydown', () => isKeyboardSelecting = true)\n doc.addEventListener('keyup', () => isKeyboardSelecting = false)\n doc.addEventListener('selectionchange', () => {\n if (this.scrolled) return\n const range = this.#lastVisibleRange\n if (!range) return\n const sel = doc.getSelection()\n if (!sel.rangeCount) return\n if (isPointerSelecting && sel.type === 'Range')\n checkPointerSelection(range, sel)\n else if (isKeyboardSelecting) {\n const selRange = sel.getRangeAt(0).cloneRange()\n const backward = selectionIsBackward(sel)\n if (!backward) selRange.collapse()\n this.#scrollToAnchor(selRange)\n }\n })\n doc.addEventListener('focusin', e => this.scrolled ? null :\n // NOTE: `requestAnimationFrame` is needed in WebKit\n requestAnimationFrame(() => this.#scrollToAnchor(e.target)))\n })\n\n this.#mediaQueryListener = () => {\n if (!this.#view) return\n this.#background.style.background = getBackground(this.#view.document)\n }\n this.#mediaQuery.addEventListener('change', this.#mediaQueryListener)\n }\n attributeChangedCallback(name, _, value) {\n switch (name) {\n case 'flow':\n this.render()\n break\n case 'gap':\n case 'margin':\n case 'max-block-size':\n case 'max-column-count':\n this.#top.style.setProperty('--_' + name, value)\n break\n case 'max-inline-size':\n // needs explicit `render()` as it doesn't necessarily resize\n this.#top.style.setProperty('--_' + name, value)\n this.render()\n break\n }\n }\n open(book) {\n this.bookDir = book.dir\n this.sections = book.sections\n }\n #createView() {\n if (this.#view) {\n this.#view.destroy()\n this.#container.removeChild(this.#view.element)\n }\n this.#view = new View({\n container: this,\n onExpand: () => this.#scrollToAnchor(this.#anchor),\n })\n this.#container.append(this.#view.element)\n return this.#view\n }\n #beforeRender({ vertical, rtl, background }) {\n this.#vertical = vertical\n this.#rtl = rtl\n this.#top.classList.toggle('vertical', vertical)\n\n // set background to `doc` background\n // this is needed because the iframe does not fill the whole element\n this.#background.style.background = background\n\n const { width, height } = this.#container.getBoundingClientRect()\n const size = vertical ? height : width\n\n const style = getComputedStyle(this.#top)\n const maxInlineSize = parseFloat(style.getPropertyValue('--_max-inline-size'))\n const maxColumnCount = parseInt(style.getPropertyValue('--_max-column-count-spread'))\n const margin = parseFloat(style.getPropertyValue('--_margin'))\n this.#margin = margin\n\n const g = parseFloat(style.getPropertyValue('--_gap')) / 100\n // The gap will be a percentage of the #container, not the whole view.\n // This means the outer padding will be bigger than the column gap. Let\n // `a` be the gap percentage. The actual percentage for the column gap\n // will be (1 - a) * a. Let us call this `b`.\n //\n // To make them the same, we start by shrinking the outer padding\n // setting to `b`, but keep the column gap setting the same at `a`. Then\n // the actual size for the column gap will be (1 - b) * a. Repeating the\n // process again and again, we get the sequence\n // x₁ = (1 - b) * a\n // x₂ = (1 - x₁) * a\n // ...\n // which converges to x = (1 - x) * a. Solving for x, x = a / (1 + a).\n // So to make the spacing even, we must shrink the outer padding with\n // f(x) = x / (1 + x).\n // But we want to keep the outer padding, and make the inner gap bigger.\n // So we apply the inverse, f⁻¹ = -x / (x - 1) to the column gap.\n const gap = -g / (g - 1) * size\n\n const flow = this.getAttribute('flow')\n if (flow === 'scrolled') {\n // FIXME: vertical-rl only, not -lr\n this.setAttribute('dir', vertical ? 'rtl' : 'ltr')\n this.#top.style.padding = '0'\n const columnWidth = maxInlineSize\n\n this.heads = null\n this.feet = null\n this.#header.replaceChildren()\n this.#footer.replaceChildren()\n\n return { flow, margin, gap, columnWidth }\n }\n\n const divisor = Math.min(maxColumnCount, Math.ceil(size / maxInlineSize))\n const columnWidth = (size / divisor) - gap\n this.setAttribute('dir', rtl ? 'rtl' : 'ltr')\n\n const marginalDivisor = vertical\n ? Math.min(2, Math.ceil(width / maxInlineSize))\n : divisor\n const marginalStyle = {\n gridTemplateColumns: `repeat(${marginalDivisor}, 1fr)`,\n gap: `${gap}px`,\n direction: this.bookDir === 'rtl' ? 'rtl' : 'ltr',\n }\n Object.assign(this.#header.style, marginalStyle)\n Object.assign(this.#footer.style, marginalStyle)\n const heads = makeMarginals(marginalDivisor, 'head')\n const feet = makeMarginals(marginalDivisor, 'foot')\n this.heads = heads.map(el => el.children[0])\n this.feet = feet.map(el => el.children[0])\n this.#header.replaceChildren(...heads)\n this.#footer.replaceChildren(...feet)\n\n return { height, width, margin, gap, columnWidth }\n }\n render() {\n if (!this.#view) return\n this.#view.render(this.#beforeRender({\n vertical: this.#vertical,\n rtl: this.#rtl,\n }))\n this.#scrollToAnchor(this.#anchor)\n }\n get scrolled() {\n return this.getAttribute('flow') === 'scrolled'\n }\n get scrollProp() {\n const { scrolled } = this\n return this.#vertical ? (scrolled ? 'scrollLeft' : 'scrollTop')\n : scrolled ? 'scrollTop' : 'scrollLeft'\n }\n get sideProp() {\n const { scrolled } = this\n return this.#vertical ? (scrolled ? 'width' : 'height')\n : scrolled ? 'height' : 'width'\n }\n get size() {\n return this.#container.getBoundingClientRect()[this.sideProp]\n }\n get viewSize() {\n return this.#view.element.getBoundingClientRect()[this.sideProp]\n }\n get start() {\n return Math.abs(this.#container[this.scrollProp])\n }\n get end() {\n return this.start + this.size\n }\n get page() {\n return Math.floor(((this.start + this.end) / 2) / this.size)\n }\n get pages() {\n return Math.round(this.viewSize / this.size)\n }\n scrollBy(dx, dy) {\n const delta = this.#vertical ? dy : dx\n const element = this.#container\n const { scrollProp } = this\n const [offset, a, b] = this.#scrollBounds\n const rtl = this.#rtl\n const min = rtl ? offset - b : offset - a\n const max = rtl ? offset + a : offset + b\n element[scrollProp] = Math.max(min, Math.min(max,\n element[scrollProp] + delta))\n }\n snap(vx, vy) {\n const velocity = this.#vertical ? vy : vx\n const [offset, a, b] = this.#scrollBounds\n const { start, end, pages, size } = this\n const min = Math.abs(offset) - a\n const max = Math.abs(offset) + b\n const d = velocity * (this.#rtl ? -size : size)\n const page = Math.floor(\n Math.max(min, Math.min(max, (start + end) / 2\n + (isNaN(d) ? 0 : d))) / size)\n\n this.#scrollToPage(page, 'snap').then(() => {\n const dir = page <= 0 ? -1 : page >= pages - 1 ? 1 : null\n if (dir) return this.#goTo({\n index: this.#adjacentIndex(dir),\n anchor: dir < 0 ? () => 1 : () => 0,\n })\n })\n }\n #onTouchStart(e) {\n const touch = e.changedTouches[0]\n this.#touchState = {\n x: touch?.screenX, y: touch?.screenY,\n t: e.timeStamp,\n vx: 0, xy: 0,\n }\n }\n #onTouchMove(e) {\n const state = this.#touchState\n if (state.pinched) return\n state.pinched = globalThis.visualViewport.scale > 1\n if (this.scrolled || state.pinched) return\n if (e.touches.length > 1) {\n if (this.#touchScrolled) e.preventDefault()\n return\n }\n e.preventDefault()\n const touch = e.changedTouches[0]\n const x = touch.screenX, y = touch.screenY\n const dx = state.x - x, dy = state.y - y\n const dt = e.timeStamp - state.t\n state.x = x\n state.y = y\n state.t = e.timeStamp\n state.vx = dx / dt\n state.vy = dy / dt\n this.#touchScrolled = true\n this.scrollBy(dx, dy)\n }\n #onTouchEnd() {\n this.#touchScrolled = false\n if (this.scrolled) return\n\n // XXX: Firefox seems to report scale as 1... sometimes...?\n // at this point I'm basically throwing `requestAnimationFrame` at\n // anything that doesn't work\n requestAnimationFrame(() => {\n if (globalThis.visualViewport.scale === 1)\n this.snap(this.#touchState.vx, this.#touchState.vy)\n })\n }\n // allows one to process rects as if they were LTR and horizontal\n #getRectMapper() {\n if (this.scrolled) {\n const size = this.viewSize\n const margin = this.#margin\n return this.#vertical\n ? ({ left, right }) =>\n ({ left: size - right - margin, right: size - left - margin })\n : ({ top, bottom }) => ({ left: top + margin, right: bottom + margin })\n }\n const pxSize = this.pages * this.size\n return this.#rtl\n ? ({ left, right }) =>\n ({ left: pxSize - right, right: pxSize - left })\n : this.#vertical\n ? ({ top, bottom }) => ({ left: top, right: bottom })\n : f => f\n }\n async #scrollToRect(rect, reason) {\n if (this.scrolled) {\n const offset = this.#getRectMapper()(rect).left - this.#margin\n return this.#scrollTo(offset, reason)\n }\n const offset = this.#getRectMapper()(rect).left\n return this.#scrollToPage(Math.floor(offset / this.size) + (this.#rtl ? -1 : 1), reason)\n }\n async #scrollTo(offset, reason, smooth) {\n const element = this.#container\n const { scrollProp, size } = this\n if (element[scrollProp] === offset) {\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n return\n }\n // FIXME: vertical-rl only, not -lr\n if (this.scrolled && this.#vertical) offset = -offset\n if ((reason === 'snap' || smooth) && this.hasAttribute('animated')) return animate(\n element[scrollProp], offset, 300, easeOutQuad,\n x => element[scrollProp] = x,\n ).then(() => {\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n })\n else {\n element[scrollProp] = offset\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n }\n }\n async #scrollToPage(page, reason, smooth) {\n const offset = this.size * (this.#rtl ? -page : page)\n return this.#scrollTo(offset, reason, smooth)\n }\n async scrollToAnchor(anchor, select) {\n return this.#scrollToAnchor(anchor, select ? 'selection' : 'navigation')\n }\n async #scrollToAnchor(anchor, reason = 'anchor') {\n this.#anchor = anchor\n const rects = uncollapse(anchor)?.getClientRects?.()\n // if anchor is an element or a range\n if (rects) {\n // when the start of the range is immediately after a hyphen in the\n // previous column, there is an extra zero width rect in that column\n const rect = Array.from(rects)\n .find(r => r.width > 0 && r.height > 0) || rects[0]\n if (!rect) return\n await this.#scrollToRect(rect, reason)\n return\n }\n // if anchor is a fraction\n if (this.scrolled) {\n await this.#scrollTo(anchor * this.viewSize, reason)\n return\n }\n const { pages } = this\n if (!pages) return\n const textPages = pages - 2\n const newPage = Math.round(anchor * (textPages - 1))\n await this.#scrollToPage(newPage + 1, reason)\n }\n #getVisibleRange() {\n if (this.scrolled) return getVisibleRange(this.#view.document,\n this.start + this.#margin, this.end - this.#margin, this.#getRectMapper())\n const size = this.#rtl ? -this.size : this.size\n return getVisibleRange(this.#view.document,\n this.start - size, this.end - size, this.#getRectMapper())\n }\n #afterScroll(reason) {\n const range = this.#getVisibleRange()\n this.#lastVisibleRange = range\n // don't set new anchor if relocation was to scroll to anchor\n if (reason !== 'selection' && reason !== 'navigation' && reason !== 'anchor')\n this.#anchor = range\n else this.#justAnchored = true\n\n const index = this.#index\n const detail = { reason, range, index }\n if (this.scrolled) detail.fraction = this.start / this.viewSize\n else if (this.pages > 0) {\n const { page, pages } = this\n this.#header.style.visibility = page > 1 ? 'visible' : 'hidden'\n detail.fraction = (page - 1) / (pages - 2)\n detail.size = 1 / (pages - 2)\n }\n this.dispatchEvent(new CustomEvent('relocate', { detail }))\n }\n async #display(promise) {\n const { index, src, anchor, onLoad, select } = await promise\n this.#index = index\n const hasFocus = this.#view?.document?.hasFocus()\n if (src) {\n const view = this.#createView()\n const afterLoad = doc => {\n if (doc.head) {\n const $styleBefore = doc.createElement('style')\n doc.head.prepend($styleBefore)\n const $style = doc.createElement('style')\n doc.head.append($style)\n this.#styleMap.set(doc, [$styleBefore, $style])\n }\n onLoad?.({ doc, index })\n }\n const beforeRender = this.#beforeRender.bind(this)\n await view.load(src, afterLoad, beforeRender)\n this.dispatchEvent(new CustomEvent('create-overlayer', {\n detail: {\n doc: view.document, index,\n attach: overlayer => view.overlayer = overlayer,\n },\n }))\n this.#view = view\n }\n await this.scrollToAnchor((typeof anchor === 'function'\n ? anchor(this.#view.document) : anchor) ?? 0, select)\n if (hasFocus) this.focusView()\n }\n #canGoToIndex(index) {\n return index >= 0 && index <= this.sections.length - 1\n }\n async #goTo({ index, anchor, select}) {\n if (index === this.#index) await this.#display({ index, anchor, select })\n else {\n const oldIndex = this.#index\n const onLoad = detail => {\n this.sections[oldIndex]?.unload?.()\n this.setStyles(this.#styles)\n this.dispatchEvent(new CustomEvent('load', { detail }))\n }\n await this.#display(Promise.resolve(this.sections[index].load())\n .then(src => ({ index, src, anchor, onLoad, select }))\n .catch(e => {\n console.warn(e)\n console.warn(new Error(`Failed to load section ${index}`))\n return {}\n }))\n }\n }\n async goTo(target) {\n if (this.#locked) return\n const resolved = await target\n if (this.#canGoToIndex(resolved.index)) return this.#goTo(resolved)\n }\n #scrollPrev(distance) {\n if (!this.#view) return true\n if (this.scrolled) {\n if (this.start > 0) return this.#scrollTo(\n Math.max(0, this.start - (distance ?? this.size)), null, true)\n return true\n }\n if (this.atStart) return\n const page = this.page - 1\n return this.#scrollToPage(page, 'page', true).then(() => page <= 0)\n }\n #scrollNext(distance) {\n if (!this.#view) return true\n if (this.scrolled) {\n if (this.viewSize - this.end > 2) return this.#scrollTo(\n Math.min(this.viewSize, distance ? this.start + distance : this.end), null, true)\n return true\n }\n if (this.atEnd) return\n const page = this.page + 1\n const pages = this.pages\n return this.#scrollToPage(page, 'page', true).then(() => page >= pages - 1)\n }\n get atStart() {\n return this.#adjacentIndex(-1) == null && this.page <= 1\n }\n get atEnd() {\n return this.#adjacentIndex(1) == null && this.page >= this.pages - 2\n }\n #adjacentIndex(dir) {\n for (let index = this.#index + dir; this.#canGoToIndex(index); index += dir)\n if (this.sections[index]?.linear !== 'no') return index\n }\n async #turnPage(dir, distance) {\n if (this.#locked) return\n this.#locked = true\n const prev = dir === -1\n const shouldGo = await (prev ? this.#scrollPrev(distance) : this.#scrollNext(distance))\n if (shouldGo) await this.#goTo({\n index: this.#adjacentIndex(dir),\n anchor: prev ? () => 1 : () => 0,\n })\n if (shouldGo || !this.hasAttribute('animated')) await wait(100)\n this.#locked = false\n }\n prev(distance) {\n return this.#turnPage(-1, distance)\n }\n next(distance) {\n return this.#turnPage(1, distance)\n }\n prevSection() {\n return this.goTo({ index: this.#adjacentIndex(-1) })\n }\n nextSection() {\n return this.goTo({ index: this.#adjacentIndex(1) })\n }\n firstSection() {\n const index = this.sections.findIndex(section => section.linear !== 'no')\n return this.goTo({ index })\n }\n lastSection() {\n const index = this.sections.findLastIndex(section => section.linear !== 'no')\n return this.goTo({ index })\n }\n getContents() {\n if (this.#view) return [{\n index: this.#index,\n overlayer: this.#view.overlayer,\n doc: this.#view.document,\n }]\n return []\n }\n setStyles(styles) {\n this.#styles = styles\n const $$styles = this.#styleMap.get(this.#view?.document)\n if (!$$styles) return\n const [$beforeStyle, $style] = $$styles\n if (Array.isArray(styles)) {\n const [beforeStyle, style] = styles\n $beforeStyle.textContent = beforeStyle\n $style.textContent = style\n } else $style.textContent = styles\n\n // NOTE: needs `requestAnimationFrame` in Chromium\n requestAnimationFrame(() =>\n this.#background.style.background = getBackground(this.#view.document))\n\n // needed because the resize observer doesn't work in Firefox\n this.#view?.document?.fonts?.ready?.then(() => this.#view.expand())\n }\n focusView() {\n this.#view.document.defaultView.focus()\n }\n destroy() {\n this.#observer.unobserve(this)\n this.#view.destroy()\n this.#view = null\n this.sections[this.#index]?.unload?.()\n this.#mediaQuery.removeEventListener('change', this.#mediaQueryListener)\n }\n}\n\ncustomElements.define('foliate-paginator', Paginator)\n","const parseViewport = str => str\n ?.split(/[,;\\s]/) // NOTE: technically, only the comma is valid\n ?.filter(x => x)\n ?.map(x => x.split('=').map(x => x.trim()))\n\nconst getViewport = (doc, viewport) => {\n // use `viewBox` for SVG\n if (doc.documentElement.localName === 'svg') {\n const [, , width, height] = doc.documentElement\n .getAttribute('viewBox')?.split(/\\s/) ?? []\n return { width, height }\n }\n\n // get `viewport` `meta` element\n const meta = parseViewport(doc.querySelector('meta[name=\"viewport\"]')\n ?.getAttribute('content'))\n if (meta) return Object.fromEntries(meta)\n\n // fallback to book's viewport\n if (typeof viewport === 'string') return parseViewport(viewport)\n if (viewport) return viewport\n\n // if no viewport (possibly with image directly in spine), get image size\n const img = doc.querySelector('img')\n if (img) return { width: img.naturalWidth, height: img.naturalHeight }\n\n // just show *something*, i guess...\n console.warn(new Error('Missing viewport properties'))\n return { width: 1000, height: 2000 }\n}\n\nexport class FixedLayout extends HTMLElement {\n static observedAttributes = ['zoom']\n #root = this.attachShadow({ mode: 'closed' })\n #observer = new ResizeObserver(() => this.#render())\n #spreads\n #index = -1\n defaultViewport\n spread\n #portrait = false\n #left\n #right\n #center\n #side\n #zoom\n constructor() {\n super()\n\n const sheet = new CSSStyleSheet()\n this.#root.adoptedStyleSheets = [sheet]\n sheet.replaceSync(`:host {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: auto;\n }`)\n\n this.#observer.observe(this)\n }\n attributeChangedCallback(name, _, value) {\n switch (name) {\n case 'zoom':\n this.#zoom = value !== 'fit-width' && value !== 'fit-page'\n ? parseFloat(value) : value\n this.#render()\n break\n }\n }\n async #createFrame({ index, src: srcOption }) {\n const srcOptionIsString = typeof srcOption === 'string'\n const src = srcOptionIsString ? srcOption : srcOption?.src\n const onZoom = srcOptionIsString ? null : srcOption?.onZoom\n const element = document.createElement('div')\n const iframe = document.createElement('iframe')\n element.append(iframe)\n Object.assign(iframe.style, {\n border: '0',\n display: 'none',\n overflow: 'hidden',\n })\n // `allow-scripts` is needed for events because of WebKit bug\n // https://bugs.webkit.org/show_bug.cgi?id=218086\n iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts')\n iframe.setAttribute('scrolling', 'no')\n iframe.setAttribute('part', 'filter')\n this.#root.append(element)\n if (!src) return { blank: true, element, iframe }\n return new Promise(resolve => {\n iframe.addEventListener('load', () => {\n const doc = iframe.contentDocument\n this.dispatchEvent(new CustomEvent('load', { detail: { doc, index } }))\n const { width, height } = getViewport(doc, this.defaultViewport)\n resolve({\n element, iframe,\n width: parseFloat(width),\n height: parseFloat(height),\n onZoom,\n })\n }, { once: true })\n iframe.src = src\n })\n }\n #render(side = this.#side) {\n if (!side) return\n const left = this.#left ?? {}\n const right = this.#center ?? this.#right\n const target = side === 'left' ? left : right\n const { width, height } = this.getBoundingClientRect()\n const portrait = this.spread !== 'both' && this.spread !== 'portrait'\n && height > width\n this.#portrait = portrait\n const blankWidth = left.width ?? right.width\n const blankHeight = left.height ?? right.height\n\n const scale = typeof this.#zoom === 'number' && !isNaN(this.#zoom)\n ? this.#zoom\n : this.#zoom === 'fit-width' ? (portrait || this.#center\n ? width / (target.width ?? blankWidth)\n : width / ((left.width ?? blankWidth) + (right.width ?? blankWidth)))\n : (portrait || this.#center\n ? Math.min(\n width / (target.width ?? blankWidth),\n height / (target.height ?? blankHeight))\n : Math.min(\n width / ((left.width ?? blankWidth) + (right.width ?? blankWidth)),\n height / Math.max(\n left.height ?? blankHeight,\n right.height ?? blankHeight)))\n\n const transform = frame => {\n let { element, iframe, width, height, blank, onZoom } = frame\n if (onZoom) onZoom({ doc: frame.iframe.contentDocument, scale })\n const iframeScale = onZoom ? scale : 1\n Object.assign(iframe.style, {\n width: `${width * iframeScale}px`,\n height: `${height * iframeScale}px`,\n transform: onZoom ? 'none' : `scale(${scale})`,\n transformOrigin: 'top left',\n display: blank ? 'none' : 'block',\n })\n Object.assign(element.style, {\n width: `${(width ?? blankWidth) * scale}px`,\n height: `${(height ?? blankHeight) * scale}px`,\n overflow: 'hidden',\n display: 'block',\n flexShrink: '0',\n marginBlock: 'auto',\n })\n if (portrait && frame !== target) {\n element.style.display = 'none'\n }\n }\n if (this.#center) {\n transform(this.#center)\n } else {\n transform(left)\n transform(right)\n }\n }\n async #showSpread({ left, right, center, side }) {\n this.#root.replaceChildren()\n this.#left = null\n this.#right = null\n this.#center = null\n if (center) {\n this.#center = await this.#createFrame(center)\n this.#side = 'center'\n this.#render()\n } else {\n this.#left = await this.#createFrame(left)\n this.#right = await this.#createFrame(right)\n this.#side = this.#left.blank ? 'right'\n : this.#right.blank ? 'left' : side\n this.#render()\n }\n }\n #goLeft() {\n if (this.#center || this.#left?.blank) return\n if (this.#portrait && this.#left?.element?.style?.display === 'none') {\n this.#right.element.style.display = 'none'\n this.#left.element.style.display = 'block'\n this.#side = 'left'\n return true\n }\n }\n #goRight() {\n if (this.#center || this.#right?.blank) return\n if (this.#portrait && this.#right?.element?.style?.display === 'none') {\n this.#left.element.style.display = 'none'\n this.#right.element.style.display = 'block'\n this.#side = 'right'\n return true\n }\n }\n open(book) {\n this.book = book\n const { rendition } = book\n this.spread = rendition?.spread\n this.defaultViewport = rendition?.viewport\n\n const rtl = book.dir === 'rtl'\n const ltr = !rtl\n this.rtl = rtl\n\n if (rendition?.spread === 'none')\n this.#spreads = book.sections.map(section => ({ center: section }))\n else this.#spreads = book.sections.reduce((arr, section, i) => {\n const last = arr[arr.length - 1]\n const { pageSpread } = section\n const newSpread = () => {\n const spread = {}\n arr.push(spread)\n return spread\n }\n if (pageSpread === 'center') {\n const spread = last.left || last.right ? newSpread() : last\n spread.center = section\n }\n else if (pageSpread === 'left') {\n const spread = last.center || last.left || ltr && i ? newSpread() : last\n spread.left = section\n }\n else if (pageSpread === 'right') {\n const spread = last.center || last.right || rtl && i ? newSpread() : last\n spread.right = section\n }\n else if (ltr) {\n if (last.center || last.right) newSpread().left = section\n else if (last.left || !i) last.right = section\n else last.left = section\n }\n else {\n if (last.center || last.left) newSpread().right = section\n else if (last.right || !i) last.left = section\n else last .right = section\n }\n return arr\n }, [{}])\n }\n get index() {\n const spread = this.#spreads[this.#index]\n const section = spread?.center ?? (this.side === 'left'\n ? spread.left ?? spread.right : spread.right ?? spread.left)\n return this.book.sections.indexOf(section)\n }\n #reportLocation(reason) {\n this.dispatchEvent(new CustomEvent('relocate', { detail:\n { reason, range: null, index: this.index, fraction: 0, size: 1 } }))\n }\n getSpreadOf(section) {\n const spreads = this.#spreads\n for (let index = 0; index < spreads.length; index++) {\n const { left, right, center } = spreads[index]\n if (left === section) return { index, side: 'left' }\n if (right === section) return { index, side: 'right' }\n if (center === section) return { index, side: 'center' }\n }\n }\n async goToSpread(index, side, reason) {\n if (index < 0 || index > this.#spreads.length - 1) return\n if (index === this.#index) {\n this.#render(side)\n return\n }\n this.#index = index\n const spread = this.#spreads[index]\n if (spread.center) {\n const index = this.book.sections.indexOf(spread.center)\n const src = await spread.center?.load?.()\n await this.#showSpread({ center: { index, src } })\n } else {\n const indexL = this.book.sections.indexOf(spread.left)\n const indexR = this.book.sections.indexOf(spread.right)\n const srcL = await spread.left?.load?.()\n const srcR = await spread.right?.load?.()\n const left = { index: indexL, src: srcL }\n const right = { index: indexR, src: srcR }\n await this.#showSpread({ left, right, side })\n }\n this.#reportLocation(reason)\n }\n async select(target) {\n await this.goTo(target)\n // TODO\n }\n async goTo(target) {\n const { book } = this\n const resolved = await target\n const section = book.sections[resolved.index]\n if (!section) return\n const { index, side } = this.getSpreadOf(section)\n await this.goToSpread(index, side)\n }\n async next() {\n const s = this.rtl ? this.#goLeft() : this.#goRight()\n if (s) this.#reportLocation('page')\n else return this.goToSpread(this.#index + 1, this.rtl ? 'right' : 'left', 'page')\n }\n async prev() {\n const s = this.rtl ? this.#goRight() : this.#goLeft()\n if (s) this.#reportLocation('page')\n else return this.goToSpread(this.#index - 1, this.rtl ? 'left' : 'right', 'page')\n }\n getContents() {\n return Array.from(this.#root.querySelectorAll('iframe'), frame => ({\n doc: frame.contentDocument,\n // TODO: index, overlayer\n }))\n }\n destroy() {\n this.#observer.unobserve(this)\n }\n}\n\ncustomElements.define('foliate-fxl', FixedLayout)\n"],"mappings":"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","names":["filter","node","x","el","i","parse","els","x","parseNav","filter","item","p2","result","url","normalizeWhitespace","getElementText","NS","MIME","parser","str","el","blob","title","index","doc","entry","normalizeWhitespace","textWalker","makeRange","makeRange","wait","result","filter","acceptNode","range","collapse","style","_observer","_vertical","_rtl","columnWidth","offset","x","_root","_observer","_index","index","width","height","tocProgress","progress","e","addAnnotation","search"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/node.ts","../src/components/reader.tsx","../src/lib/language.ts","../src/vendor/foliate-js/epubcfi.js","../src/vendor/foliate-js/overlayer.js","../src/vendor/foliate-js/paginator.js","../src/vendor/foliate-js/progress.js","../src/vendor/foliate-js/fixed-layout.js","../src/hooks/useBookNavigation.ts","../src/hooks/useSearch.ts","../src/vendor/foliate-js/search.js","../src/vendor/foliate-js/text-walker.js","../src/lib/search.ts","../src/lib/loader.ts","../src/vendor/foliate-js/comic-book.js","../src/vendor/foliate-js/epub.js","../src/vendor/foliate-js/fb2.js"],"sourcesContent":["\"use client\"\n\nimport \"./lib/node\"\n\nexport {\n Reader,\n ReaderContent,\n ReaderNext,\n ReaderPrevious,\n} from \"./components/reader\"\nexport { useBookNavigator } from \"./hooks/useBookNavigation\"\nexport { useSearch } from \"./hooks/useSearch\"\nexport type { Book, Contributor, LocalizedString } from \"./lib/book\"\nexport { loadComicBook, loadEPUB, loadFB2 } from \"./lib/loader\"\n","const g = globalThis as Record<string, unknown>\n\n// foliate-js reads these at import time; stub them for pre-rendering.\ng.NodeFilter ??= {\n FILTER_ACCEPT: 1,\n FILTER_REJECT: 2,\n FILTER_SKIP: 3,\n SHOW_ELEMENT: 1,\n SHOW_TEXT: 4,\n SHOW_CDATA_SECTION: 8,\n}\ng.HTMLElement ??= class HTMLElement {}\ng.customElements ??= { define() {} }\n","\"use client\"\n\nimport * as React from \"react\"\nimport type { Book } from \"../lib/book.js\"\nimport { languageInfo } from \"../lib/language.js\"\nimport * as CFI from \"../vendor/foliate-js/epubcfi.js\"\nimport type { FixedLayout } from \"../vendor/foliate-js/fixed-layout.js\"\nimport { Overlayer } from \"../vendor/foliate-js/overlayer.js\"\nimport { Paginator } from \"../vendor/foliate-js/paginator.js\"\nimport { SectionProgress, TOCProgress } from \"../vendor/foliate-js/progress.js\"\nimport \"../vendor/foliate-js/paginator.js\"\nimport \"../vendor/foliate-js/fixed-layout.js\"\n\ntype Renderer = Paginator | FixedLayout\n\nfunction FoliateElement({\n name,\n hostRef,\n ...props\n}: React.HTMLAttributes<HTMLElement> & {\n name: \"foliate-paginator\" | \"foliate-fxl\"\n hostRef: React.Ref<Renderer | null>\n}): React.ReactNode {\n return React.createElement(name, { ...props, ref: hostRef })\n}\n\ninterface ReaderContextType {\n book: Book\n sectionProgress: SectionProgress\n annotations: string[]\n tocProgress?: TOCProgress\n rendererRef: React.RefObject<Renderer | null>\n\n goTo: (target: number | string | { fraction: number }) => Promise<void>\n next: (distance?: number) => Promise<void>\n previous: (distance?: number) => Promise<void>\n\n addAnnotation: (cfi: string) => void\n removeAnnotation: (cfi: string) => void\n clearAnnotations: () => void\n}\n\nconst ReaderContext = React.createContext<ReaderContextType | null>(null)\n\nfunction useReader() {\n const context = React.useContext(ReaderContext)\n if (!context) {\n throw new Error(\"useReader must be used within a <Reader />\")\n }\n return context\n}\n\nconst resolveNavigation = (\n book: Book,\n target: number | string | { fraction: number },\n sectionProgress: SectionProgress,\n) => {\n if (typeof target === \"number\") {\n return { index: target }\n }\n if (typeof target === \"object\") {\n const [index, anchor] = sectionProgress.getSection(target.fraction)\n return { index, anchor }\n }\n if (CFI.isCFI.test(target)) {\n if (book.resolveCFI) {\n return book.resolveCFI(target)\n }\n const parts = CFI.parse(target)\n const index = CFI.fake.toIndex((parts.parent ?? parts).shift())\n const anchor = (doc: Document) => CFI.toRange(doc, parts)\n return { index, anchor }\n }\n const href = book.resolveHref?.(target)\n if (href === null) return\n return href\n}\n\ninterface ReaderProps {\n book: Book\n progress?: number\n onProgressChange?: (progress: number) => void\n children: React.ReactNode\n}\n\nfunction Reader({ book, progress, onProgressChange, children }: ReaderProps) {\n const rendererRef = React.useRef<Renderer>(null)\n const sectionProgress = React.useMemo(() => new SectionProgress(book.sections, 1500, 1600), [book])\n const [tocProgress, setTocProgress] = React.useState<TOCProgress | undefined>()\n const [currentProgress, setCurrentProgress] = React.useState(0)\n const [annotations, setAnnotations] = React.useState<string[]>([])\n\n const addAnnotation = React.useCallback(\n (cfi: string) => {\n const resolved = resolveNavigation(book, cfi, sectionProgress)\n if (resolved) {\n const content = rendererRef.current\n ?.getContents()\n .find((item) => \"overlayer\" in item && item.index === resolved.index && item.overlayer)\n\n if (content && \"overlayer\" in content) {\n const { overlayer, doc } = content\n const range = doc && typeof resolved.anchor === \"function\" ? resolved.anchor(doc) : resolved.anchor\n overlayer.add(cfi, range, Overlayer.outline)\n }\n\n setAnnotations((prev) => [...prev, cfi])\n }\n },\n [book, sectionProgress],\n )\n\n const removeAnnotation = React.useCallback((cfi: string) => {\n const content = rendererRef.current?.getContents()\n if (!content) return\n\n for (const item of content) {\n if (\"overlayer\" in item) {\n const { overlayer } = item\n overlayer.remove(cfi)\n }\n }\n setAnnotations((prev) => prev.filter((x) => x !== cfi))\n }, [])\n\n const clearAnnotations = React.useCallback(() => {\n const content = rendererRef.current?.getContents()\n setAnnotations((prev) => {\n if (content) {\n for (const cfi of prev) {\n for (const item of content) {\n if (\"overlayer\" in item) item.overlayer.remove(cfi)\n }\n }\n }\n return []\n })\n }, [])\n\n const goTo = React.useCallback(\n async (target: number | string | { fraction: number }) => {\n const resolved = resolveNavigation(book, target, sectionProgress)\n if (resolved) {\n await rendererRef.current?.goTo(resolved)\n }\n },\n [book, sectionProgress],\n )\n\n React.useEffect(() => {\n if (book.splitTOCHref && book.getTOCFragment) {\n const ids = book.sections?.map((s) => s?.id)\n const splitHref = book.splitTOCHref.bind(book)\n const getFragment = book.getTOCFragment.bind(book)\n\n const nextTocProgress = new TOCProgress()\n nextTocProgress.init({ toc: book.toc, ids, splitHref, getFragment })\n setTocProgress(nextTocProgress)\n }\n }, [book])\n\n React.useEffect(() => {\n if (progress !== currentProgress && progress !== undefined) {\n goTo({ fraction: progress })\n }\n }, [progress, currentProgress, goTo])\n\n React.useEffect(() => {\n const renderer = rendererRef.current\n if (!renderer) return\n\n const handleRelocate = (event: Event) => {\n const { index, fraction, size } = (event as CustomEvent<{ index: number; fraction: number; size: number }>).detail\n const { fraction: nextProgress } = sectionProgress.getProgress(index, fraction, size)\n setCurrentProgress(nextProgress)\n onProgressChange?.(nextProgress)\n }\n\n renderer.addEventListener(\"relocate\", handleRelocate)\n\n return () => {\n renderer.removeEventListener(\"relocate\", handleRelocate)\n }\n }, [book, onProgressChange, sectionProgress])\n\n async function next(distance?: number) {\n await rendererRef.current?.next(distance)\n }\n\n async function previous(distance?: number) {\n await rendererRef.current?.prev(distance)\n }\n\n return (\n <ReaderContext.Provider\n value={{\n book,\n sectionProgress,\n annotations,\n tocProgress,\n rendererRef,\n goTo,\n next,\n previous,\n addAnnotation,\n removeAnnotation,\n clearAnnotations,\n }}\n >\n {children}\n </ReaderContext.Provider>\n )\n}\n\ninterface ReaderContentProps {\n fontSize?: number\n lineSpacing?: number\n justify?: boolean\n hyphenate?: boolean\n flow?: \"paginated\" | \"scrolled\"\n}\n\nfunction ReaderContent({\n fontSize = 16,\n lineSpacing = 1.5,\n justify = true,\n hyphenate = true,\n flow = \"paginated\",\n}: ReaderContentProps) {\n const { book, rendererRef, annotations, sectionProgress, goTo } = useReader()\n const info = languageInfo(book)\n\n React.useEffect(() => {\n const renderer = rendererRef.current\n if (renderer) {\n const createOverlayer = (event: Event) => {\n const overlayer = new Overlayer()\n const { index, doc, attach } = (\n event as CustomEvent<{ index: number; doc: Document; attach: (layer: Overlayer) => void }>\n ).detail\n\n doc.addEventListener(\"click\", (clickEvent: MouseEvent) => {\n const [value, range] = overlayer.hitTest(clickEvent)\n if (value && range) {\n // TODO: Add annotation click handler\n console.log(value, range, index)\n }\n })\n\n for (const cfi of annotations) {\n const resolved = resolveNavigation(book, cfi, sectionProgress)\n if (resolved) {\n if (index === resolved.index) {\n const range = doc && typeof resolved.anchor === \"function\" ? resolved.anchor(doc) : resolved.anchor\n overlayer.add(cfi, range, Overlayer.outline)\n }\n }\n }\n\n attach(overlayer)\n }\n\n const onLoad = (event: Event) => {\n if (!(\"detail\" in event)) return\n\n const { doc, index } = event.detail as { doc: Document; index: number }\n const section = book.sections?.[index]\n\n doc.addEventListener(\"click\", (clickEvent: MouseEvent) => {\n const target = clickEvent.target\n if (!(target instanceof Element)) return\n const a = target.closest(\"a[href]\")\n if (!a) return\n\n clickEvent.preventDefault()\n const hrefAttr = a.getAttribute(\"href\")\n const href = section?.resolveHref?.(hrefAttr ?? \"\") ?? hrefAttr\n if (href && book?.isExternal?.(href)) {\n globalThis.open(href, \"_blank\")\n } else if (href) {\n goTo(href)\n }\n })\n }\n\n renderer.addEventListener(\"create-overlayer\", createOverlayer)\n renderer.addEventListener(\"load\", onLoad)\n renderer.setAttribute(\"exportparts\", \"head,foot,filter\")\n renderer.open(book)\n renderer.next()\n\n return () => {\n renderer.removeEventListener(\"create-overlayer\", createOverlayer)\n renderer.removeEventListener(\"load\", onLoad)\n }\n }\n }, [book, rendererRef, annotations, goTo, sectionProgress])\n\n React.useEffect(() => {\n const renderer = rendererRef.current\n if (!renderer) return\n\n const css = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html {\n color-scheme: light dark;\n font-size: ${fontSize}px;\n }\n p, li, blockquote, dd {\n line-height: ${lineSpacing};\n text-align: ${justify ? \"justify\" : \"start\"};\n -webkit-hyphens: ${hyphenate ? \"auto\" : \"manual\"};\n hyphens: ${hyphenate ? \"auto\" : \"manual\"};\n -webkit-hyphenate-limit-before: 3;\n -webkit-hyphenate-limit-after: 2;\n -webkit-hyphenate-limit-lines: 2;\n hanging-punctuation: allow-end last;\n widows: 2;\n }\n [align=\"left\"] { text-align: left; }\n [align=\"right\"] { text-align: right; }\n [align=\"center\"] { text-align: center; }\n [align=\"justify\"] { text-align: justify; }\n `\n\n renderer.setAttribute(\"flow\", flow)\n if (renderer instanceof Paginator) {\n renderer.setStyles(css)\n }\n }, [fontSize, lineSpacing, justify, hyphenate, flow, rendererRef.current])\n\n const isFixedLayout = book.rendition?.layout === \"pre-paginated\"\n\n return (\n <FoliateElement\n name={isFixedLayout ? \"foliate-fxl\" : \"foliate-paginator\"}\n hostRef={rendererRef}\n dir={info?.direction}\n lang={info?.canonical}\n />\n )\n}\n\nfunction ReaderNext({ children, ...props }: Omit<React.ComponentProps<\"button\">, \"onClick\">) {\n const { next } = useReader()\n\n return (\n <button type=\"button\" onClick={() => next()} {...props}>\n {children}\n </button>\n )\n}\n\nfunction ReaderPrevious({ children, ...props }: Omit<React.ComponentProps<\"button\">, \"onClick\">) {\n const { previous } = useReader()\n\n return (\n <button type=\"button\" onClick={() => previous()} {...props}>\n {children}\n </button>\n )\n}\n\nexport { Reader, ReaderContent, ReaderNext, ReaderPrevious, useReader }\n","import type { Book } from \"./book\"\n\nexport interface LanguageInfo {\n canonical: string\n locale: Intl.Locale\n isCJK: boolean\n direction: \"ltr\" | \"rtl\"\n}\n\nexport const languageInfo = (book: Book): LanguageInfo | undefined => {\n const lang = book.metadata?.language\n if (!lang) return\n\n const canonical = Intl.getCanonicalLocales(lang)[0]\n const locale = new Intl.Locale(canonical)\n const isCJK = [\"zh\", \"ja\", \"kr\"].includes(locale.language)\n\n if (\"getTextInfo\" in locale) {\n // @ts-expect-error\n const direction = locale.getTextInfo().direction\n return { canonical, locale, isCJK, direction }\n } else {\n const direction = locale.language === \"ar\" || locale.language === \"he\" ? \"rtl\" : \"ltr\"\n return { canonical, locale, isCJK, direction }\n }\n}\n","const findIndices = (arr, f) => arr\n .map((x, i, a) => f(x, i, a) ? i : null).filter(x => x != null)\nconst splitAt = (arr, is) => [-1, ...is, arr.length].reduce(({ xs, a }, b) =>\n ({ xs: xs?.concat([arr.slice(a + 1, b)]) ?? [], a: b }), {}).xs\nconst concatArrays = (a, b) =>\n a.slice(0, -1).concat([a[a.length - 1].concat(b[0])]).concat(b.slice(1))\n\nconst isNumber = /\\d/\nexport const isCFI = /^epubcfi\\((.*)\\)$/\nconst escapeCFI = str => str.replace(/[\\^[\\](),;=]/g, '^$&')\n\nconst wrap = x => isCFI.test(x) ? x : `epubcfi(${x})`\nconst unwrap = x => x.match(isCFI)?.[1] ?? x\nconst lift = f => (...xs) =>\n `epubcfi(${f(...xs.map(x => x.match(isCFI)?.[1] ?? x))})`\nexport const joinIndir = lift((...xs) => xs.join('!'))\n\nconst tokenizer = str => {\n const tokens = []\n let state, escape, value = ''\n const push = x => (tokens.push(x), state = null, value = '')\n const cat = x => (value += x, escape = false)\n for (const char of Array.from(str.trim()).concat('')) {\n if (char === '^' && !escape) {\n escape = true\n continue\n }\n if (state === '!') push(['!'])\n else if (state === ',') push([','])\n else if (state === '/' || state === ':') {\n if (isNumber.test(char)) {\n cat(char)\n continue\n } else push([state, parseInt(value)])\n } else if (state === '~') {\n if (isNumber.test(char) || char === '.') {\n cat(char)\n continue\n } else push(['~', parseFloat(value)])\n } else if (state === '@') {\n if (char === ':') {\n push(['@', parseFloat(value)])\n state = '@'\n continue\n }\n if (isNumber.test(char) || char === '.') {\n cat(char)\n continue\n } else push(['@', parseFloat(value)])\n } else if (state === '[') {\n if (char === ';' && !escape) {\n push(['[', value])\n state = ';'\n } else if (char === ',' && !escape) {\n push(['[', value])\n state = '['\n } else if (char === ']' && !escape) push(['[', value])\n else cat(char)\n continue\n } else if (state?.startsWith(';')) {\n if (char === '=' && !escape) {\n state = `;${value}`\n value = ''\n } else if (char === ';' && !escape) {\n push([state, value])\n state = ';'\n } else if (char === ']' && !escape) push([state, value])\n else cat(char)\n continue\n }\n if (char === '/' || char === ':' || char === '~' || char === '@'\n || char === '[' || char === '!' || char === ',') state = char\n }\n return tokens\n}\n\nconst findTokens = (tokens, x) => findIndices(tokens, ([t]) => t === x)\n\nconst parser = tokens => {\n const parts = []\n let state\n for (const [type, val] of tokens) {\n if (type === '/') parts.push({ index: val })\n else {\n const last = parts[parts.length - 1]\n if (type === ':') last.offset = val\n else if (type === '~') last.temporal = val\n else if (type === '@') last.spatial = (last.spatial ?? []).concat(val)\n else if (type === ';s') last.side = val\n else if (type === '[') {\n if (state === '/' && val) last.id = val\n else {\n last.text = (last.text ?? []).concat(val)\n continue\n }\n }\n }\n state = type\n }\n return parts\n}\n\n// split at step indirections, then parse each part\nconst parserIndir = tokens =>\n splitAt(tokens, findTokens(tokens, '!')).map(parser)\n\nexport const parse = cfi => {\n const tokens = tokenizer(unwrap(cfi))\n const commas = findTokens(tokens, ',')\n if (!commas.length) return parserIndir(tokens)\n const [parent, start, end] = splitAt(tokens, commas).map(parserIndir)\n return { parent, start, end }\n}\n\nconst partToString = ({ index, id, offset, temporal, spatial, text, side }) => {\n const param = side ? `;s=${side}` : ''\n return `/${index}`\n + (id ? `[${escapeCFI(id)}${param}]` : '')\n // \"CFI expressions [..] SHOULD include an explicit character offset\"\n + (offset != null && index % 2 ? `:${offset}` : '')\n + (temporal ? `~${temporal}` : '')\n + (spatial ? `@${spatial.join(':')}` : '')\n + (text || (!id && side) ? '['\n + (text?.map(escapeCFI)?.join(',') ?? '')\n + param + ']' : '')\n}\n\nconst toInnerString = parsed => parsed.parent\n ? [parsed.parent, parsed.start, parsed.end].map(toInnerString).join(',')\n : parsed.map(parts => parts.map(partToString).join('')).join('!')\n\nconst toString = parsed => wrap(toInnerString(parsed))\n\nexport const collapse = (x, toEnd) => typeof x === 'string'\n ? toString(collapse(parse(x), toEnd))\n : x.parent ? concatArrays(x.parent, x[toEnd ? 'end' : 'start']) : x\n\n// create range CFI from two CFIs\nconst buildRange = (from, to) => {\n if (typeof from === 'string') from = parse(from)\n if (typeof to === 'string') to = parse(to)\n from = collapse(from)\n to = collapse(to, true)\n // ranges across multiple documents are not allowed; handle local paths only\n const localFrom = from[from.length - 1], localTo = to[to.length - 1]\n const localParent = [], localStart = [], localEnd = []\n let pushToParent = true\n const len = Math.max(localFrom.length, localTo.length)\n for (let i = 0; i < len; i++) {\n const a = localFrom[i], b = localTo[i]\n pushToParent &&= a?.index === b?.index && !a?.offset && !b?.offset\n if (pushToParent) localParent.push(a)\n else {\n if (a) localStart.push(a)\n if (b) localEnd.push(b)\n }\n }\n // copy non-local paths from `from`\n const parent = from.slice(0, -1).concat([localParent])\n return toString({ parent, start: [localStart], end: [localEnd] })\n}\n\nexport const compare = (a, b) => {\n if (typeof a === 'string') a = parse(a)\n if (typeof b === 'string') b = parse(b)\n if (a.start || b.start) return compare(collapse(a), collapse(b))\n || compare(collapse(a, true), collapse(b, true))\n\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const p = a[i] ?? [], q = b[i] ?? []\n const maxIndex = Math.max(p.length, q.length) - 1\n for (let i = 0; i <= maxIndex; i++) {\n const x = p[i], y = q[i]\n if (!x) return -1\n if (!y) return 1\n if (x.index > y.index) return 1\n if (x.index < y.index) return -1\n if (i === maxIndex) {\n // TODO: compare temporal & spatial offsets\n if (x.offset > y.offset) return 1\n if (x.offset < y.offset) return -1\n }\n }\n }\n return 0\n}\n\nconst isTextNode = ({ nodeType }) => nodeType === 3 || nodeType === 4\nconst isElementNode = ({ nodeType }) => nodeType === 1\n\nconst getChildNodes = (node, filter) => {\n const nodes = Array.from(node.childNodes)\n // \"content other than element and character data is ignored\"\n .filter(node => isTextNode(node) || isElementNode(node))\n return filter ? nodes.map(node => {\n const accept = filter(node)\n if (accept === NodeFilter.FILTER_REJECT) return null\n else if (accept === NodeFilter.FILTER_SKIP) return getChildNodes(node, filter)\n else return node\n }).flat().filter(x => x) : nodes\n}\n\n// child nodes are organized such that the result is always\n// [element, text, element, text, ..., element],\n// regardless of the actual structure in the document;\n// so multiple text nodes need to be combined, and nonexistent ones counted;\n// see \"Step Reference to Child Element or Character Data (/)\" in EPUB CFI spec\nconst indexChildNodes = (node, filter) => {\n const nodes = getChildNodes(node, filter)\n .reduce((arr, node) => {\n let last = arr[arr.length - 1]\n if (!last) arr.push(node)\n // \"there is one chunk between each pair of child elements\"\n else if (isTextNode(node)) {\n if (Array.isArray(last)) last.push(node)\n else if (isTextNode(last)) arr[arr.length - 1] = [last, node]\n else arr.push(node)\n } else {\n if (isElementNode(last)) arr.push(null, node)\n else arr.push(node)\n }\n return arr\n }, [])\n // \"the first chunk is located before the first child element\"\n if (isElementNode(nodes[0])) nodes.unshift('first')\n // \"the last chunk is located after the last child element\"\n if (isElementNode(nodes[nodes.length - 1])) nodes.push('last')\n // \"'virtual' elements\"\n nodes.unshift('before') // \"0 is a valid index\"\n nodes.push('after') // \"n+2 is a valid index\"\n return nodes\n}\n\nconst partsToNode = (node, parts, filter) => {\n const { id } = parts[parts.length - 1]\n if (id) {\n const el = node.ownerDocument.getElementById(id)\n if (el) return { node: el, offset: 0 }\n }\n for (const { index } of parts) {\n const newNode = node ? indexChildNodes(node, filter)[index] : null\n // handle non-existent nodes\n if (newNode === 'first') return { node: node.firstChild ?? node }\n if (newNode === 'last') return { node: node.lastChild ?? node }\n if (newNode === 'before') return { node, before: true }\n if (newNode === 'after') return { node, after: true }\n node = newNode\n }\n const { offset } = parts[parts.length - 1]\n if (!Array.isArray(node)) return { node, offset }\n // get underlying text node and offset from the chunk\n let sum = 0\n for (const n of node) {\n const { length } = n.nodeValue\n if (sum + length >= offset) return { node: n, offset: offset - sum }\n sum += length\n }\n}\n\nconst nodeToParts = (node, offset, filter) => {\n let { id, parentNode } = node\n while (filter && parentNode\n && parentNode !== node.ownerDocument.documentElement\n && filter(parentNode) === NodeFilter.FILTER_SKIP)\n parentNode = parentNode.parentNode\n const indexed = indexChildNodes(parentNode, filter)\n const index = indexed.findIndex(x =>\n Array.isArray(x) ? x.some(x => x === node) : x === node)\n // adjust offset as if merging the text nodes in the chunk\n const chunk = indexed[index]\n if (Array.isArray(chunk)) {\n let sum = 0\n for (const x of chunk) {\n if (x === node) {\n sum += offset\n break\n } else sum += x.nodeValue.length\n }\n offset = sum\n }\n const part = { id, index, offset }\n return (parentNode !== node.ownerDocument.documentElement\n ? nodeToParts(parentNode, null, filter).concat(part) : [part])\n // remove ignored nodes\n .filter(x => x.index !== -1)\n}\n\nexport const fromRange = (range, filter) => {\n const { startContainer, startOffset, endContainer, endOffset } = range\n const start = nodeToParts(startContainer, startOffset, filter)\n if (range.collapsed) return toString([start])\n const end = nodeToParts(endContainer, endOffset, filter)\n return buildRange([start], [end])\n}\n\nexport const toRange = (doc, parts, filter) => {\n const startParts = collapse(parts)\n const endParts = collapse(parts, true)\n\n const root = doc.documentElement\n const start = partsToNode(root, startParts[0], filter)\n const end = partsToNode(root, endParts[0], filter)\n\n const range = doc.createRange()\n\n if (start.before) range.setStartBefore(start.node)\n else if (start.after) range.setStartAfter(start.node)\n else range.setStart(start.node, start.offset)\n\n if (end.before) range.setEndBefore(end.node)\n else if (end.after) range.setEndAfter(end.node)\n else range.setEnd(end.node, end.offset)\n return range\n}\n\n// faster way of getting CFIs for sorted elements in a single parent\nexport const fromElements = elements => {\n const results = []\n const { parentNode } = elements[0]\n const parts = nodeToParts(parentNode)\n for (const [index, node] of indexChildNodes(parentNode).entries()) {\n const el = elements[results.length]\n if (node === el)\n results.push(toString([parts.concat({ id: el.id, index })]))\n }\n return results\n}\n\nexport const toElement = (doc, parts) =>\n partsToNode(doc.documentElement, collapse(parts)).node\n\n// turn indices into standard CFIs when you don't have an actual package document\nexport const fake = {\n fromIndex: index => wrap(`/6/${(index + 1) * 2}`),\n toIndex: parts => parts?.at(-1).index / 2 - 1,\n}\n\n// get CFI from Calibre bookmarks\n// see https://github.com/johnfactotum/foliate/issues/849\nexport const fromCalibrePos = pos => {\n const [parts] = parse(pos)\n const item = parts.shift()\n parts.shift()\n return toString([[{ index: 6 }, item], parts])\n}\nexport const fromCalibreHighlight = ({ spine_index, start_cfi, end_cfi }) => {\n const pre = fake.fromIndex(spine_index) + '!'\n return buildRange(pre + start_cfi.slice(2), pre + end_cfi.slice(2))\n}\n","const createSVGElement = tag =>\n document.createElementNS('http://www.w3.org/2000/svg', tag)\n\nexport class Overlayer {\n #svg = createSVGElement('svg')\n #map = new Map()\n constructor() {\n Object.assign(this.#svg.style, {\n position: 'absolute', top: '0', left: '0',\n width: '100%', height: '100%',\n pointerEvents: 'none',\n })\n }\n get element() {\n return this.#svg\n }\n add(key, range, draw, options) {\n if (this.#map.has(key)) this.remove(key)\n if (typeof range === 'function') range = range(this.#svg.getRootNode())\n const rects = range.getClientRects()\n const element = draw(rects, options)\n this.#svg.append(element)\n this.#map.set(key, { range, draw, options, element, rects })\n }\n remove(key) {\n if (!this.#map.has(key)) return\n this.#svg.removeChild(this.#map.get(key).element)\n this.#map.delete(key)\n }\n redraw() {\n for (const obj of this.#map.values()) {\n const { range, draw, options, element } = obj\n this.#svg.removeChild(element)\n const rects = range.getClientRects()\n const el = draw(rects, options)\n this.#svg.append(el)\n obj.element = el\n obj.rects = rects\n }\n }\n hitTest({ x, y }) {\n const arr = Array.from(this.#map.entries())\n // loop in reverse to hit more recently added items first\n for (let i = arr.length - 1; i >= 0; i--) {\n const [key, obj] = arr[i]\n for (const { left, top, right, bottom } of obj.rects)\n if (top <= y && left <= x && bottom > y && right > x)\n return [key, obj.range]\n }\n return []\n }\n static underline(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, top, height } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', right - strokeWidth)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', strokeWidth)\n g.append(el)\n }\n else for (const { left, bottom, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', bottom - strokeWidth)\n el.setAttribute('height', strokeWidth)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static strikethrough(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, left, top, height } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', (right + left) / 2)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', strokeWidth)\n g.append(el)\n }\n else for (const { left, top, bottom, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', (top + bottom) / 2)\n el.setAttribute('height', strokeWidth)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static squiggly(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 2, writingMode } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', 'none')\n g.setAttribute('stroke', color)\n g.setAttribute('stroke-width', strokeWidth)\n const block = strokeWidth * 1.5\n if (writingMode === 'vertical-rl' || writingMode === 'vertical-lr')\n for (const { right, top, height } of rects) {\n const el = createSVGElement('path')\n const n = Math.round(height / block / 1.5)\n const inline = height / n\n const ls = Array.from({ length: n },\n (_, i) => `l${i % 2 ? -block : block} ${inline}`).join('')\n el.setAttribute('d', `M${right} ${top}${ls}`)\n g.append(el)\n }\n else for (const { left, bottom, width } of rects) {\n const el = createSVGElement('path')\n const n = Math.round(width / block / 1.5)\n const inline = width / n\n const ls = Array.from({ length: n },\n (_, i) => `l${inline} ${i % 2 ? block : -block}`).join('')\n el.setAttribute('d', `M${left} ${bottom}${ls}`)\n g.append(el)\n }\n return g\n }\n static highlight(rects, options = {}) {\n const { color = 'red' } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', color)\n g.style.opacity = 'var(--overlayer-highlight-opacity, .3)'\n g.style.mixBlendMode = 'var(--overlayer-highlight-blend-mode, normal)'\n for (const { left, top, height, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', width)\n g.append(el)\n }\n return g\n }\n static outline(rects, options = {}) {\n const { color = 'red', width: strokeWidth = 3, radius = 3 } = options\n const g = createSVGElement('g')\n g.setAttribute('fill', 'none')\n g.setAttribute('stroke', color)\n g.setAttribute('stroke-width', strokeWidth)\n for (const { left, top, height, width } of rects) {\n const el = createSVGElement('rect')\n el.setAttribute('x', left)\n el.setAttribute('y', top)\n el.setAttribute('height', height)\n el.setAttribute('width', width)\n el.setAttribute('rx', radius)\n g.append(el)\n }\n return g\n }\n // make an exact copy of an image in the overlay\n // one can then apply filters to the entire element, without affecting them;\n // it's a bit silly and probably better to just invert images twice\n // (though the color will be off in that case if you do heu-rotate)\n static copyImage([rect], options = {}) {\n const { src } = options\n const image = createSVGElement('image')\n const { left, top, height, width } = rect\n image.setAttribute('href', src)\n image.setAttribute('x', left)\n image.setAttribute('y', top)\n image.setAttribute('height', height)\n image.setAttribute('width', width)\n return image\n }\n}\n\n","const wait = ms => new Promise(resolve => setTimeout(resolve, ms))\n\nconst debounce = (f, wait, immediate) => {\n let timeout\n return (...args) => {\n const later = () => {\n timeout = null\n if (!immediate) f(...args)\n }\n const callNow = immediate && !timeout\n if (timeout) clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n if (callNow) f(...args)\n }\n}\n\nconst lerp = (min, max, x) => x * (max - min) + min\nconst easeOutQuad = x => 1 - (1 - x) * (1 - x)\nconst animate = (a, b, duration, ease, render) => new Promise(resolve => {\n let start\n const step = now => {\n if (document.hidden) {\n render(lerp(a, b, 1))\n return resolve()\n }\n start ??= now\n const fraction = Math.min(1, (now - start) / duration)\n render(lerp(a, b, ease(fraction)))\n if (fraction < 1) requestAnimationFrame(step)\n else resolve()\n }\n if (document.hidden) {\n render(lerp(a, b, 1))\n return resolve()\n }\n requestAnimationFrame(step)\n})\n\n// collapsed range doesn't return client rects sometimes (or always?)\n// try make get a non-collapsed range or element\nconst uncollapse = range => {\n if (!range?.collapsed) return range\n const { endOffset, endContainer } = range\n if (endContainer.nodeType === 1) {\n const node = endContainer.childNodes[endOffset]\n if (node?.nodeType === 1) return node\n return endContainer\n }\n if (endOffset + 1 < endContainer.length) range.setEnd(endContainer, endOffset + 1)\n else if (endOffset > 1) range.setStart(endContainer, endOffset - 1)\n else return endContainer.parentNode\n return range\n}\n\nconst makeRange = (doc, node, start, end = start) => {\n const range = doc.createRange()\n range.setStart(node, start)\n range.setEnd(node, end)\n return range\n}\n\n// use binary search to find an offset value in a text node\nconst bisectNode = (doc, node, cb, start = 0, end = node.nodeValue.length) => {\n if (end - start === 1) {\n const result = cb(makeRange(doc, node, start), makeRange(doc, node, end))\n return result < 0 ? start : end\n }\n const mid = Math.floor(start + (end - start) / 2)\n const result = cb(makeRange(doc, node, start, mid), makeRange(doc, node, mid, end))\n return result < 0 ? bisectNode(doc, node, cb, start, mid)\n : result > 0 ? bisectNode(doc, node, cb, mid, end) : mid\n}\n\nconst { SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION,\n FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP } = NodeFilter\n\nconst filter = SHOW_ELEMENT | SHOW_TEXT | SHOW_CDATA_SECTION\n\n// needed cause there seems to be a bug in `getBoundingClientRect()` in Firefox\n// where it fails to include rects that have zero width and non-zero height\n// (CSSOM spec says \"rectangles [...] of which the height or width is not zero\")\n// which makes the visible range include an extra space at column boundaries\nconst getBoundingClientRect = target => {\n let top = Infinity, right = -Infinity, left = Infinity, bottom = -Infinity\n for (const rect of target.getClientRects()) {\n left = Math.min(left, rect.left)\n top = Math.min(top, rect.top)\n right = Math.max(right, rect.right)\n bottom = Math.max(bottom, rect.bottom)\n }\n return new DOMRect(left, top, right - left, bottom - top)\n}\n\nconst getVisibleRange = (doc, start, end, mapRect) => {\n // first get all visible nodes\n const acceptNode = node => {\n const name = node.localName?.toLowerCase()\n // ignore all scripts, styles, and their children\n if (name === 'script' || name === 'style') return FILTER_REJECT\n if (node.nodeType === 1) {\n const { left, right } = mapRect(node.getBoundingClientRect())\n // no need to check child nodes if it's completely out of view\n if (right < start || left > end) return FILTER_REJECT\n // elements must be completely in view to be considered visible\n // because you can't specify offsets for elements\n if (left >= start && right <= end) return FILTER_ACCEPT\n // TODO: it should probably allow elements that do not contain text\n // because they can exceed the whole viewport in both directions\n // especially in scrolled mode\n } else {\n // ignore empty text nodes\n if (!node.nodeValue?.trim()) return FILTER_SKIP\n // create range to get rect\n const range = doc.createRange()\n range.selectNodeContents(node)\n const { left, right } = mapRect(range.getBoundingClientRect())\n // it's visible if any part of it is in view\n if (right >= start && left <= end) return FILTER_ACCEPT\n }\n return FILTER_SKIP\n }\n const walker = doc.createTreeWalker(doc.body, filter, { acceptNode })\n const nodes = []\n for (let node = walker.nextNode(); node; node = walker.nextNode())\n nodes.push(node)\n\n // we're only interested in the first and last visible nodes\n const from = nodes[0] ?? doc.body\n const to = nodes[nodes.length - 1] ?? from\n\n // find the offset at which visibility changes\n const startOffset = from.nodeType === 1 ? 0\n : bisectNode(doc, from, (a, b) => {\n const p = mapRect(getBoundingClientRect(a))\n const q = mapRect(getBoundingClientRect(b))\n if (p.right < start && q.left > start) return 0\n return q.left > start ? -1 : 1\n })\n const endOffset = to.nodeType === 1 ? 0\n : bisectNode(doc, to, (a, b) => {\n const p = mapRect(getBoundingClientRect(a))\n const q = mapRect(getBoundingClientRect(b))\n if (p.right < end && q.left > end) return 0\n return q.left > end ? -1 : 1\n })\n\n const range = doc.createRange()\n range.setStart(from, startOffset)\n range.setEnd(to, endOffset)\n return range\n}\n\nconst selectionIsBackward = sel => {\n const range = document.createRange()\n range.setStart(sel.anchorNode, sel.anchorOffset)\n range.setEnd(sel.focusNode, sel.focusOffset)\n return range.collapsed\n}\n\nconst setSelectionTo = (target, collapse) => {\n let range\n if (target.startContainer) range = target.cloneRange()\n else if (target.nodeType) {\n range = document.createRange()\n range.selectNode(target)\n }\n if (range) {\n const sel = range.startContainer.ownerDocument.defaultView.getSelection()\n if (sel) {\n sel.removeAllRanges()\n if (collapse === -1) range.collapse(true)\n else if (collapse === 1) range.collapse()\n sel.addRange(range)\n }\n }\n}\n\nconst getDirection = doc => {\n const { defaultView } = doc\n const { writingMode, direction } = defaultView.getComputedStyle(doc.body)\n const vertical = writingMode === 'vertical-rl'\n || writingMode === 'vertical-lr'\n const rtl = doc.body.dir === 'rtl'\n || direction === 'rtl'\n || doc.documentElement.dir === 'rtl'\n return { vertical, rtl }\n}\n\nconst getBackground = doc => {\n const bodyStyle = doc.defaultView.getComputedStyle(doc.body)\n return bodyStyle.backgroundColor === 'rgba(0, 0, 0, 0)'\n && bodyStyle.backgroundImage === 'none'\n ? doc.defaultView.getComputedStyle(doc.documentElement).background\n : bodyStyle.background\n}\n\nconst makeMarginals = (length, part) => Array.from({ length }, () => {\n const div = document.createElement('div')\n const child = document.createElement('div')\n div.append(child)\n child.setAttribute('part', part)\n return div\n})\n\nconst setStylesImportant = (el, styles) => {\n const { style } = el\n for (const [k, v] of Object.entries(styles)) style.setProperty(k, v, 'important')\n}\n\nclass View {\n #observer = new ResizeObserver(() => this.expand())\n #element = document.createElement('div')\n #iframe = document.createElement('iframe')\n #contentRange = document.createRange()\n #overlayer\n #vertical = false\n #rtl = false\n #column = true\n #size\n #layout = {}\n constructor({ container, onExpand }) {\n this.container = container\n this.onExpand = onExpand\n this.#iframe.setAttribute('part', 'filter')\n this.#element.append(this.#iframe)\n Object.assign(this.#element.style, {\n boxSizing: 'content-box',\n position: 'relative',\n overflow: 'hidden',\n flex: '0 0 auto',\n width: '100%', height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n })\n Object.assign(this.#iframe.style, {\n overflow: 'hidden',\n border: '0',\n display: 'none',\n width: '100%', height: '100%',\n })\n // `allow-scripts` is needed for events because of WebKit bug\n // https://bugs.webkit.org/show_bug.cgi?id=218086\n this.#iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts')\n this.#iframe.setAttribute('scrolling', 'no')\n }\n get element() {\n return this.#element\n }\n get document() {\n return this.#iframe.contentDocument\n }\n async load(src, afterLoad, beforeRender) {\n if (typeof src !== 'string') throw new Error(`${src} is not string`)\n return new Promise(resolve => {\n this.#iframe.addEventListener('load', () => {\n const doc = this.document\n afterLoad?.(doc)\n\n // it needs to be visible for Firefox to get computed style\n this.#iframe.style.display = 'block'\n const { vertical, rtl } = getDirection(doc)\n const background = getBackground(doc)\n this.#iframe.style.display = 'none'\n\n this.#vertical = vertical\n this.#rtl = rtl\n\n this.#contentRange.selectNodeContents(doc.body)\n const layout = beforeRender?.({ vertical, rtl, background })\n this.#iframe.style.display = 'block'\n this.render(layout)\n this.#observer.observe(doc.body)\n\n // the resize observer above doesn't work in Firefox\n // (see https://bugzilla.mozilla.org/show_bug.cgi?id=1832939)\n // until the bug is fixed we can at least account for font load\n doc.fonts.ready.then(() => this.expand())\n\n resolve()\n }, { once: true })\n this.#iframe.src = src\n })\n }\n render(layout) {\n if (!layout) return\n this.#column = layout.flow !== 'scrolled'\n this.#layout = layout\n if (this.#column) this.columnize(layout)\n else this.scrolled(layout)\n }\n scrolled({ gap, columnWidth }) {\n const vertical = this.#vertical\n const doc = this.document\n setStylesImportant(doc.documentElement, {\n 'box-sizing': 'border-box',\n 'padding': vertical ? `${gap}px 0` : `0 ${gap}px`,\n 'column-width': 'auto',\n 'height': 'auto',\n 'width': 'auto',\n })\n setStylesImportant(doc.body, {\n [vertical ? 'max-height' : 'max-width']: `${columnWidth}px`,\n 'margin': 'auto',\n })\n this.setImageSize()\n this.expand()\n }\n columnize({ width, height, gap, columnWidth }) {\n const vertical = this.#vertical\n this.#size = vertical ? height : width\n\n const doc = this.document\n setStylesImportant(doc.documentElement, {\n 'box-sizing': 'border-box',\n 'column-width': `${Math.trunc(columnWidth)}px`,\n 'column-gap': `${gap}px`,\n 'column-fill': 'auto',\n ...(vertical\n ? { 'width': `${width}px` }\n : { 'height': `${height}px` }),\n 'padding': vertical ? `${gap / 2}px 0` : `0 ${gap / 2}px`,\n 'overflow': 'hidden',\n // force wrap long words\n 'overflow-wrap': 'break-word',\n // reset some potentially problematic props\n 'position': 'static', 'border': '0', 'margin': '0',\n 'max-height': 'none', 'max-width': 'none',\n 'min-height': 'none', 'min-width': 'none',\n // fix glyph clipping in WebKit\n '-webkit-line-box-contain': 'block glyphs replaced',\n })\n setStylesImportant(doc.body, {\n 'max-height': 'none',\n 'max-width': 'none',\n 'margin': '0',\n })\n this.setImageSize()\n this.expand()\n }\n setImageSize() {\n const { width, height, margin } = this.#layout\n const vertical = this.#vertical\n const doc = this.document\n for (const el of doc.body.querySelectorAll('img, svg, video')) {\n // preserve max size if they are already set\n const { maxHeight, maxWidth } = doc.defaultView.getComputedStyle(el)\n setStylesImportant(el, {\n 'max-height': vertical\n ? (maxHeight !== 'none' && maxHeight !== '0px' ? maxHeight : '100%')\n : `${height - margin * 2}px`,\n 'max-width': vertical\n ? `${width - margin * 2}px`\n : (maxWidth !== 'none' && maxWidth !== '0px' ? maxWidth : '100%'),\n 'object-fit': 'contain',\n 'page-break-inside': 'avoid',\n 'break-inside': 'avoid',\n 'box-sizing': 'border-box',\n })\n }\n }\n expand() {\n const { documentElement } = this.document\n if (this.#column) {\n const side = this.#vertical ? 'height' : 'width'\n const otherSide = this.#vertical ? 'width' : 'height'\n const contentRect = this.#contentRange.getBoundingClientRect()\n const rootRect = documentElement.getBoundingClientRect()\n // offset caused by column break at the start of the page\n // which seem to be supported only by WebKit and only for horizontal writing\n const contentStart = this.#vertical ? 0\n : this.#rtl ? rootRect.right - contentRect.right : contentRect.left - rootRect.left\n const contentSize = contentStart + contentRect[side]\n const pageCount = Math.ceil(contentSize / this.#size)\n const expandedSize = pageCount * this.#size\n this.#element.style.padding = '0'\n this.#iframe.style[side] = `${expandedSize}px`\n this.#element.style[side] = `${expandedSize + this.#size * 2}px`\n this.#iframe.style[otherSide] = '100%'\n this.#element.style[otherSide] = '100%'\n documentElement.style[side] = `${this.#size}px`\n if (this.#overlayer) {\n this.#overlayer.element.style.margin = '0'\n this.#overlayer.element.style.left = this.#vertical ? '0' : `${this.#size}px`\n this.#overlayer.element.style.top = this.#vertical ? `${this.#size}px` : '0'\n this.#overlayer.element.style[side] = `${expandedSize}px`\n this.#overlayer.redraw()\n }\n } else {\n const side = this.#vertical ? 'width' : 'height'\n const otherSide = this.#vertical ? 'height' : 'width'\n const contentSize = documentElement.getBoundingClientRect()[side]\n const expandedSize = contentSize\n const { margin } = this.#layout\n const padding = this.#vertical ? `0 ${margin}px` : `${margin}px 0`\n this.#element.style.padding = padding\n this.#iframe.style[side] = `${expandedSize}px`\n this.#element.style[side] = `${expandedSize}px`\n this.#iframe.style[otherSide] = '100%'\n this.#element.style[otherSide] = '100%'\n if (this.#overlayer) {\n this.#overlayer.element.style.margin = padding\n this.#overlayer.element.style.left = '0'\n this.#overlayer.element.style.top = '0'\n this.#overlayer.element.style[side] = `${expandedSize}px`\n this.#overlayer.redraw()\n }\n }\n this.onExpand()\n }\n set overlayer(overlayer) {\n this.#overlayer = overlayer\n this.#element.append(overlayer.element)\n }\n get overlayer() {\n return this.#overlayer\n }\n destroy() {\n if (this.document) this.#observer.unobserve(this.document.body)\n }\n}\n\n// NOTE: everything here assumes the so-called \"negative scroll type\" for RTL\nexport class Paginator extends HTMLElement {\n static observedAttributes = [\n 'flow', 'gap', 'margin',\n 'max-inline-size', 'max-block-size', 'max-column-count',\n ]\n #root = this.attachShadow({ mode: 'closed' })\n #observer = new ResizeObserver(() => this.render())\n #top\n #background\n #container\n #header\n #footer\n #view\n #vertical = false\n #rtl = false\n #margin = 0\n #index = -1\n #anchor = 0 // anchor view to a fraction (0-1), Range, or Element\n #justAnchored = false\n #locked = false // while true, prevent any further navigation\n #styles\n #styleMap = new WeakMap()\n #mediaQuery = matchMedia('(prefers-color-scheme: dark)')\n #mediaQueryListener\n #scrollBounds\n #touchState\n #touchScrolled\n #lastVisibleRange\n constructor() {\n super()\n this.#root.innerHTML = `<style>\n :host {\n display: block;\n container-type: size;\n }\n :host, #top {\n box-sizing: border-box;\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n }\n #top {\n --_gap: 7%;\n --_margin: 48px;\n --_max-inline-size: 720px;\n --_max-block-size: 1440px;\n --_max-column-count: 2;\n --_max-column-count-portrait: 1;\n --_max-column-count-spread: var(--_max-column-count);\n --_half-gap: calc(var(--_gap) / 2);\n --_max-width: calc(var(--_max-inline-size) * var(--_max-column-count-spread));\n --_max-height: var(--_max-block-size);\n display: grid;\n grid-template-columns:\n minmax(var(--_half-gap), 1fr)\n var(--_half-gap)\n minmax(0, calc(var(--_max-width) - var(--_gap)))\n var(--_half-gap)\n minmax(var(--_half-gap), 1fr);\n grid-template-rows:\n minmax(var(--_margin), 1fr)\n minmax(0, var(--_max-height))\n minmax(var(--_margin), 1fr);\n &.vertical {\n --_max-column-count-spread: var(--_max-column-count-portrait);\n --_max-width: var(--_max-block-size);\n --_max-height: calc(var(--_max-inline-size) * var(--_max-column-count-spread));\n }\n @container (orientation: portrait) {\n & {\n --_max-column-count-spread: var(--_max-column-count-portrait);\n }\n &.vertical {\n --_max-column-count-spread: var(--_max-column-count);\n }\n }\n }\n #background {\n grid-column: 1 / -1;\n grid-row: 1 / -1;\n }\n #container {\n grid-column: 2 / 5;\n grid-row: 2;\n overflow: hidden;\n }\n :host([flow=\"scrolled\"]) #container {\n grid-column: 1 / -1;\n grid-row: 1 / -1;\n overflow: auto;\n }\n #header {\n grid-column: 3 / 4;\n grid-row: 1;\n }\n #footer {\n grid-column: 3 / 4;\n grid-row: 3;\n align-self: end;\n }\n #header, #footer {\n display: grid;\n height: var(--_margin);\n }\n :is(#header, #footer) > * {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n :is(#header, #footer) > * > * {\n width: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: center;\n font-size: .75em;\n opacity: .6;\n }\n </style>\n <div id=\"top\">\n <div id=\"background\" part=\"filter\"></div>\n <div id=\"header\"></div>\n <div id=\"container\"></div>\n <div id=\"footer\"></div>\n </div>\n `\n\n this.#top = this.#root.getElementById('top')\n this.#background = this.#root.getElementById('background')\n this.#container = this.#root.getElementById('container')\n this.#header = this.#root.getElementById('header')\n this.#footer = this.#root.getElementById('footer')\n\n this.#observer.observe(this.#container)\n this.#container.addEventListener('scroll', () => this.dispatchEvent(new Event('scroll')))\n this.#container.addEventListener('scroll', debounce(() => {\n if (this.scrolled) {\n if (this.#justAnchored) this.#justAnchored = false\n else this.#afterScroll('scroll')\n }\n }, 250))\n\n const opts = { passive: false }\n this.addEventListener('touchstart', this.#onTouchStart.bind(this), opts)\n this.addEventListener('touchmove', this.#onTouchMove.bind(this), opts)\n this.addEventListener('touchend', this.#onTouchEnd.bind(this))\n this.addEventListener('load', ({ detail: { doc } }) => {\n doc.addEventListener('touchstart', this.#onTouchStart.bind(this), opts)\n doc.addEventListener('touchmove', this.#onTouchMove.bind(this), opts)\n doc.addEventListener('touchend', this.#onTouchEnd.bind(this))\n })\n\n this.addEventListener('relocate', ({ detail }) => {\n if (detail.reason === 'selection') setSelectionTo(this.#anchor, 0)\n else if (detail.reason === 'navigation') {\n if (this.#anchor === 1) setSelectionTo(detail.range, 1)\n else if (typeof this.#anchor === 'number')\n setSelectionTo(detail.range, -1)\n else setSelectionTo(this.#anchor, -1)\n }\n })\n const checkPointerSelection = debounce((range, sel) => {\n if (!sel.rangeCount) return\n const selRange = sel.getRangeAt(0)\n const backward = selectionIsBackward(sel)\n if (backward && selRange.compareBoundaryPoints(Range.START_TO_START, range) < 0)\n this.prev()\n else if (!backward && selRange.compareBoundaryPoints(Range.END_TO_END, range) > 0)\n this.next()\n }, 700)\n this.addEventListener('load', ({ detail: { doc } }) => {\n let isPointerSelecting = false\n doc.addEventListener('pointerdown', () => isPointerSelecting = true)\n doc.addEventListener('pointerup', () => isPointerSelecting = false)\n let isKeyboardSelecting = false\n doc.addEventListener('keydown', () => isKeyboardSelecting = true)\n doc.addEventListener('keyup', () => isKeyboardSelecting = false)\n doc.addEventListener('selectionchange', () => {\n if (this.scrolled) return\n const range = this.#lastVisibleRange\n if (!range) return\n const sel = doc.getSelection()\n if (!sel.rangeCount) return\n if (isPointerSelecting && sel.type === 'Range')\n checkPointerSelection(range, sel)\n else if (isKeyboardSelecting) {\n const selRange = sel.getRangeAt(0).cloneRange()\n const backward = selectionIsBackward(sel)\n if (!backward) selRange.collapse()\n this.#scrollToAnchor(selRange)\n }\n })\n doc.addEventListener('focusin', e => this.scrolled ? null :\n // NOTE: `requestAnimationFrame` is needed in WebKit\n requestAnimationFrame(() => this.#scrollToAnchor(e.target)))\n })\n\n this.#mediaQueryListener = () => {\n if (!this.#view) return\n this.#background.style.background = getBackground(this.#view.document)\n }\n this.#mediaQuery.addEventListener('change', this.#mediaQueryListener)\n }\n attributeChangedCallback(name, _, value) {\n switch (name) {\n case 'flow':\n this.render()\n break\n case 'gap':\n case 'margin':\n case 'max-block-size':\n case 'max-column-count':\n this.#top.style.setProperty('--_' + name, value)\n break\n case 'max-inline-size':\n // needs explicit `render()` as it doesn't necessarily resize\n this.#top.style.setProperty('--_' + name, value)\n this.render()\n break\n }\n }\n open(book) {\n this.bookDir = book.dir\n this.sections = book.sections\n book.transformTarget?.addEventListener('data', ({ detail }) => {\n if (detail.type !== 'text/css') return\n const w = innerWidth\n const h = innerHeight\n detail.data = Promise.resolve(detail.data).then(data => data\n // unprefix as most of the props are (only) supported unprefixed\n .replace(/(?<=[{\\s;])-epub-/gi, '')\n // replace vw and vh as they cause problems with layout\n .replace(/(\\d*\\.?\\d+)vw/gi, (_, d) => parseFloat(d) * w / 100 + 'px')\n .replace(/(\\d*\\.?\\d+)vh/gi, (_, d) => parseFloat(d) * h / 100 + 'px')\n // `page-break-*` unsupported in columns; replace with `column-break-*`\n .replace(/page-break-(after|before|inside)\\s*:/gi, (_, x) =>\n `-webkit-column-break-${x}:`)\n .replace(/break-(after|before|inside)\\s*:\\s*(avoid-)?page/gi, (_, x, y) =>\n `break-${x}: ${y ?? ''}column`))\n })\n }\n #createView() {\n if (this.#view) {\n this.#view.destroy()\n this.#container.removeChild(this.#view.element)\n }\n this.#view = new View({\n container: this,\n onExpand: () => this.#scrollToAnchor(this.#anchor),\n })\n this.#container.append(this.#view.element)\n return this.#view\n }\n #beforeRender({ vertical, rtl, background }) {\n this.#vertical = vertical\n this.#rtl = rtl\n this.#top.classList.toggle('vertical', vertical)\n\n // set background to `doc` background\n // this is needed because the iframe does not fill the whole element\n this.#background.style.background = background\n\n const { width, height } = this.#container.getBoundingClientRect()\n const size = vertical ? height : width\n\n const style = getComputedStyle(this.#top)\n const maxInlineSize = parseFloat(style.getPropertyValue('--_max-inline-size'))\n const maxColumnCount = parseInt(style.getPropertyValue('--_max-column-count-spread'))\n const margin = parseFloat(style.getPropertyValue('--_margin'))\n this.#margin = margin\n\n const g = parseFloat(style.getPropertyValue('--_gap')) / 100\n // The gap will be a percentage of the #container, not the whole view.\n // This means the outer padding will be bigger than the column gap. Let\n // `a` be the gap percentage. The actual percentage for the column gap\n // will be (1 - a) * a. Let us call this `b`.\n //\n // To make them the same, we start by shrinking the outer padding\n // setting to `b`, but keep the column gap setting the same at `a`. Then\n // the actual size for the column gap will be (1 - b) * a. Repeating the\n // process again and again, we get the sequence\n // x₁ = (1 - b) * a\n // x₂ = (1 - x₁) * a\n // ...\n // which converges to x = (1 - x) * a. Solving for x, x = a / (1 + a).\n // So to make the spacing even, we must shrink the outer padding with\n // f(x) = x / (1 + x).\n // But we want to keep the outer padding, and make the inner gap bigger.\n // So we apply the inverse, f⁻¹ = -x / (x - 1) to the column gap.\n const gap = -g / (g - 1) * size\n\n const flow = this.getAttribute('flow')\n if (flow === 'scrolled') {\n // FIXME: vertical-rl only, not -lr\n this.setAttribute('dir', vertical ? 'rtl' : 'ltr')\n this.#top.style.padding = '0'\n const columnWidth = maxInlineSize\n\n this.heads = null\n this.feet = null\n this.#header.replaceChildren()\n this.#footer.replaceChildren()\n\n return { flow, margin, gap, columnWidth }\n }\n\n const divisor = Math.min(maxColumnCount, Math.ceil(size / maxInlineSize))\n const columnWidth = (size / divisor) - gap\n this.setAttribute('dir', rtl ? 'rtl' : 'ltr')\n\n const marginalDivisor = vertical\n ? Math.min(2, Math.ceil(width / maxInlineSize))\n : divisor\n const marginalStyle = {\n gridTemplateColumns: `repeat(${marginalDivisor}, 1fr)`,\n gap: `${gap}px`,\n direction: this.bookDir === 'rtl' ? 'rtl' : 'ltr',\n }\n Object.assign(this.#header.style, marginalStyle)\n Object.assign(this.#footer.style, marginalStyle)\n const heads = makeMarginals(marginalDivisor, 'head')\n const feet = makeMarginals(marginalDivisor, 'foot')\n this.heads = heads.map(el => el.children[0])\n this.feet = feet.map(el => el.children[0])\n this.#header.replaceChildren(...heads)\n this.#footer.replaceChildren(...feet)\n\n return { height, width, margin, gap, columnWidth }\n }\n render() {\n if (!this.#view) return\n this.#view.render(this.#beforeRender({\n vertical: this.#vertical,\n rtl: this.#rtl,\n }))\n this.#scrollToAnchor(this.#anchor)\n }\n get scrolled() {\n return this.getAttribute('flow') === 'scrolled'\n }\n get scrollProp() {\n const { scrolled } = this\n return this.#vertical ? (scrolled ? 'scrollLeft' : 'scrollTop')\n : scrolled ? 'scrollTop' : 'scrollLeft'\n }\n get sideProp() {\n const { scrolled } = this\n return this.#vertical ? (scrolled ? 'width' : 'height')\n : scrolled ? 'height' : 'width'\n }\n get size() {\n return this.#container.getBoundingClientRect()[this.sideProp]\n }\n get viewSize() {\n return this.#view.element.getBoundingClientRect()[this.sideProp]\n }\n get start() {\n return Math.abs(this.#container[this.scrollProp])\n }\n get end() {\n return this.start + this.size\n }\n get page() {\n return Math.floor(((this.start + this.end) / 2) / this.size)\n }\n get pages() {\n return Math.round(this.viewSize / this.size)\n }\n scrollBy(dx, dy) {\n const delta = this.#vertical ? dy : dx\n const element = this.#container\n const { scrollProp } = this\n const [offset, a, b] = this.#scrollBounds\n const rtl = this.#rtl\n const min = rtl ? offset - b : offset - a\n const max = rtl ? offset + a : offset + b\n element[scrollProp] = Math.max(min, Math.min(max,\n element[scrollProp] + delta))\n }\n snap(vx, vy) {\n const velocity = this.#vertical ? vy : vx\n const [offset, a, b] = this.#scrollBounds\n const { start, end, pages, size } = this\n const min = Math.abs(offset) - a\n const max = Math.abs(offset) + b\n const d = velocity * (this.#rtl ? -size : size)\n const page = Math.floor(\n Math.max(min, Math.min(max, (start + end) / 2\n + (isNaN(d) ? 0 : d))) / size)\n\n this.#scrollToPage(page, 'snap').then(() => {\n const dir = page <= 0 ? -1 : page >= pages - 1 ? 1 : null\n if (dir) return this.#goTo({\n index: this.#adjacentIndex(dir),\n anchor: dir < 0 ? () => 1 : () => 0,\n })\n })\n }\n #onTouchStart(e) {\n const touch = e.changedTouches[0]\n this.#touchState = {\n x: touch?.screenX, y: touch?.screenY,\n t: e.timeStamp,\n vx: 0, xy: 0,\n }\n }\n #onTouchMove(e) {\n const state = this.#touchState\n if (state.pinched) return\n state.pinched = globalThis.visualViewport.scale > 1\n if (this.scrolled || state.pinched) return\n if (e.touches.length > 1) {\n if (this.#touchScrolled) e.preventDefault()\n return\n }\n e.preventDefault()\n const touch = e.changedTouches[0]\n const x = touch.screenX, y = touch.screenY\n const dx = state.x - x, dy = state.y - y\n const dt = e.timeStamp - state.t\n state.x = x\n state.y = y\n state.t = e.timeStamp\n state.vx = dx / dt\n state.vy = dy / dt\n this.#touchScrolled = true\n this.scrollBy(dx, dy)\n }\n #onTouchEnd() {\n this.#touchScrolled = false\n if (this.scrolled) return\n\n // XXX: Firefox seems to report scale as 1... sometimes...?\n // at this point I'm basically throwing `requestAnimationFrame` at\n // anything that doesn't work\n requestAnimationFrame(() => {\n if (globalThis.visualViewport.scale === 1)\n this.snap(this.#touchState.vx, this.#touchState.vy)\n })\n }\n // allows one to process rects as if they were LTR and horizontal\n #getRectMapper() {\n if (this.scrolled) {\n const size = this.viewSize\n const margin = this.#margin\n return this.#vertical\n ? ({ left, right }) =>\n ({ left: size - right - margin, right: size - left - margin })\n : ({ top, bottom }) => ({ left: top + margin, right: bottom + margin })\n }\n const pxSize = this.pages * this.size\n return this.#rtl\n ? ({ left, right }) =>\n ({ left: pxSize - right, right: pxSize - left })\n : this.#vertical\n ? ({ top, bottom }) => ({ left: top, right: bottom })\n : f => f\n }\n async #scrollToRect(rect, reason) {\n if (this.scrolled) {\n const offset = this.#getRectMapper()(rect).left - this.#margin\n return this.#scrollTo(offset, reason)\n }\n const offset = this.#getRectMapper()(rect).left\n return this.#scrollToPage(Math.floor(offset / this.size) + (this.#rtl ? -1 : 1), reason)\n }\n async #scrollTo(offset, reason, smooth) {\n const element = this.#container\n const { scrollProp, size } = this\n if (element[scrollProp] === offset) {\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n return\n }\n // FIXME: vertical-rl only, not -lr\n if (this.scrolled && this.#vertical) offset = -offset\n if ((reason === 'snap' || smooth) && this.hasAttribute('animated')) return animate(\n element[scrollProp], offset, 300, easeOutQuad,\n x => element[scrollProp] = x,\n ).then(() => {\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n })\n else {\n element[scrollProp] = offset\n this.#scrollBounds = [offset, this.atStart ? 0 : size, this.atEnd ? 0 : size]\n this.#afterScroll(reason)\n }\n }\n async #scrollToPage(page, reason, smooth) {\n const offset = this.size * (this.#rtl ? -page : page)\n return this.#scrollTo(offset, reason, smooth)\n }\n async scrollToAnchor(anchor, select) {\n return this.#scrollToAnchor(anchor, select ? 'selection' : 'navigation')\n }\n async #scrollToAnchor(anchor, reason = 'anchor') {\n this.#anchor = anchor\n const rects = uncollapse(anchor)?.getClientRects?.()\n // if anchor is an element or a range\n if (rects) {\n // when the start of the range is immediately after a hyphen in the\n // previous column, there is an extra zero width rect in that column\n const rect = Array.from(rects)\n .find(r => r.width > 0 && r.height > 0) || rects[0]\n if (!rect) return\n await this.#scrollToRect(rect, reason)\n return\n }\n // if anchor is a fraction\n if (this.scrolled) {\n await this.#scrollTo(anchor * this.viewSize, reason)\n return\n }\n const { pages } = this\n if (!pages) return\n const textPages = pages - 2\n const newPage = Math.round(anchor * (textPages - 1))\n await this.#scrollToPage(newPage + 1, reason)\n }\n #getVisibleRange() {\n if (this.scrolled) return getVisibleRange(this.#view.document,\n this.start + this.#margin, this.end - this.#margin, this.#getRectMapper())\n const size = this.#rtl ? -this.size : this.size\n return getVisibleRange(this.#view.document,\n this.start - size, this.end - size, this.#getRectMapper())\n }\n #afterScroll(reason) {\n const range = this.#getVisibleRange()\n this.#lastVisibleRange = range\n // don't set new anchor if relocation was to scroll to anchor\n if (reason !== 'selection' && reason !== 'navigation' && reason !== 'anchor')\n this.#anchor = range\n else this.#justAnchored = true\n\n const index = this.#index\n const detail = { reason, range, index }\n if (this.scrolled) detail.fraction = this.start / this.viewSize\n else if (this.pages > 0) {\n const { page, pages } = this\n this.#header.style.visibility = page > 1 ? 'visible' : 'hidden'\n detail.fraction = (page - 1) / (pages - 2)\n detail.size = 1 / (pages - 2)\n }\n this.dispatchEvent(new CustomEvent('relocate', { detail }))\n }\n async #display(promise) {\n const { index, src, anchor, onLoad, select } = await promise\n this.#index = index\n const hasFocus = this.#view?.document?.hasFocus()\n if (src) {\n const view = this.#createView()\n const afterLoad = doc => {\n if (doc.head) {\n const $styleBefore = doc.createElement('style')\n doc.head.prepend($styleBefore)\n const $style = doc.createElement('style')\n doc.head.append($style)\n this.#styleMap.set(doc, [$styleBefore, $style])\n }\n onLoad?.({ doc, index })\n }\n const beforeRender = this.#beforeRender.bind(this)\n await view.load(src, afterLoad, beforeRender)\n this.dispatchEvent(new CustomEvent('create-overlayer', {\n detail: {\n doc: view.document, index,\n attach: overlayer => view.overlayer = overlayer,\n },\n }))\n this.#view = view\n }\n await this.scrollToAnchor((typeof anchor === 'function'\n ? anchor(this.#view.document) : anchor) ?? 0, select)\n if (hasFocus) this.focusView()\n }\n #canGoToIndex(index) {\n return index >= 0 && index <= this.sections.length - 1\n }\n async #goTo({ index, anchor, select}) {\n if (index === this.#index) await this.#display({ index, anchor, select })\n else {\n const oldIndex = this.#index\n const onLoad = detail => {\n this.sections[oldIndex]?.unload?.()\n this.setStyles(this.#styles)\n this.dispatchEvent(new CustomEvent('load', { detail }))\n }\n await this.#display(Promise.resolve(this.sections[index].load())\n .then(src => ({ index, src, anchor, onLoad, select }))\n .catch(e => {\n console.warn(e)\n console.warn(new Error(`Failed to load section ${index}`))\n return {}\n }))\n }\n }\n async goTo(target) {\n if (this.#locked) return\n const resolved = await target\n if (this.#canGoToIndex(resolved.index)) return this.#goTo(resolved)\n }\n #scrollPrev(distance) {\n if (!this.#view) return true\n if (this.scrolled) {\n if (this.start > 0) return this.#scrollTo(\n Math.max(0, this.start - (distance ?? this.size)), null, true)\n return true\n }\n if (this.atStart) return\n const page = this.page - 1\n return this.#scrollToPage(page, 'page', true).then(() => page <= 0)\n }\n #scrollNext(distance) {\n if (!this.#view) return true\n if (this.scrolled) {\n if (this.viewSize - this.end > 2) return this.#scrollTo(\n Math.min(this.viewSize, distance ? this.start + distance : this.end), null, true)\n return true\n }\n if (this.atEnd) return\n const page = this.page + 1\n const pages = this.pages\n return this.#scrollToPage(page, 'page', true).then(() => page >= pages - 1)\n }\n get atStart() {\n return this.#adjacentIndex(-1) == null && this.page <= 1\n }\n get atEnd() {\n return this.#adjacentIndex(1) == null && this.page >= this.pages - 2\n }\n #adjacentIndex(dir) {\n for (let index = this.#index + dir; this.#canGoToIndex(index); index += dir)\n if (this.sections[index]?.linear !== 'no') return index\n }\n async #turnPage(dir, distance) {\n if (this.#locked) return\n this.#locked = true\n const prev = dir === -1\n const shouldGo = await (prev ? this.#scrollPrev(distance) : this.#scrollNext(distance))\n if (shouldGo) await this.#goTo({\n index: this.#adjacentIndex(dir),\n anchor: prev ? () => 1 : () => 0,\n })\n if (shouldGo || !this.hasAttribute('animated')) await wait(100)\n this.#locked = false\n }\n prev(distance) {\n return this.#turnPage(-1, distance)\n }\n next(distance) {\n return this.#turnPage(1, distance)\n }\n prevSection() {\n return this.goTo({ index: this.#adjacentIndex(-1) })\n }\n nextSection() {\n return this.goTo({ index: this.#adjacentIndex(1) })\n }\n firstSection() {\n const index = this.sections.findIndex(section => section.linear !== 'no')\n return this.goTo({ index })\n }\n lastSection() {\n const index = this.sections.findLastIndex(section => section.linear !== 'no')\n return this.goTo({ index })\n }\n getContents() {\n if (this.#view) return [{\n index: this.#index,\n overlayer: this.#view.overlayer,\n doc: this.#view.document,\n }]\n return []\n }\n setStyles(styles) {\n this.#styles = styles\n const $$styles = this.#styleMap.get(this.#view?.document)\n if (!$$styles) return\n const [$beforeStyle, $style] = $$styles\n if (Array.isArray(styles)) {\n const [beforeStyle, style] = styles\n $beforeStyle.textContent = beforeStyle\n $style.textContent = style\n } else $style.textContent = styles\n\n // NOTE: needs `requestAnimationFrame` in Chromium\n requestAnimationFrame(() =>\n this.#background.style.background = getBackground(this.#view.document))\n\n // needed because the resize observer doesn't work in Firefox\n this.#view?.document?.fonts?.ready?.then(() => this.#view.expand())\n }\n focusView() {\n this.#view.document.defaultView.focus()\n }\n destroy() {\n this.#observer.unobserve(this)\n this.#view.destroy()\n this.#view = null\n this.sections[this.#index]?.unload?.()\n this.#mediaQuery.removeEventListener('change', this.#mediaQueryListener)\n }\n}\n\ncustomElements.define('foliate-paginator', Paginator)\n","// assign a unique ID for each TOC item\nconst assignIDs = toc => {\n let id = 0\n const assignID = item => {\n item.id = id++\n if (item.subitems) for (const subitem of item.subitems) assignID(subitem)\n }\n for (const item of toc) assignID(item)\n return toc\n}\n\nconst flatten = items => items\n .map(item => item.subitems?.length\n ? [item, flatten(item.subitems)].flat()\n : item)\n .flat()\n\nexport class TOCProgress {\n async init({ toc, ids, splitHref, getFragment }) {\n assignIDs(toc)\n const items = flatten(toc)\n const grouped = new Map()\n for (const [i, item] of items.entries()) {\n const [id, fragment] = await splitHref(item?.href) ?? []\n const value = { fragment, item }\n if (grouped.has(id)) grouped.get(id).items.push(value)\n else grouped.set(id, { prev: items[i - 1], items: [value] })\n }\n const map = new Map()\n for (const [i, id] of ids.entries()) {\n if (grouped.has(id)) map.set(id, grouped.get(id))\n else map.set(id, map.get(ids[i - 1]))\n }\n this.ids = ids\n this.map = map\n this.getFragment = getFragment\n }\n getProgress(index, range) {\n if (!this.ids) return\n const id = this.ids[index]\n const obj = this.map.get(id)\n if (!obj) return null\n const { prev, items } = obj\n if (!items) return prev\n if (!range || items.length === 1 && !items[0].fragment) return items[0].item\n\n const doc = range.startContainer.getRootNode()\n for (const [i, { fragment }] of items.entries()) {\n const el = this.getFragment(doc, fragment)\n if (!el) continue\n if (range.comparePoint(el, 0) > 0)\n return (items[i - 1]?.item ?? prev)\n }\n return items[items.length - 1].item\n }\n}\n\nexport class SectionProgress {\n constructor(sections, sizePerLoc, sizePerTimeUnit) {\n this.sizes = sections.map(s => s.linear != 'no' && s.size > 0 ? s.size : 0)\n this.sizePerLoc = sizePerLoc\n this.sizePerTimeUnit = sizePerTimeUnit\n this.sizeTotal = this.sizes.reduce((a, b) => a + b, 0)\n this.sectionFractions = this.#getSectionFractions()\n }\n #getSectionFractions() {\n const { sizeTotal } = this\n const results = [0]\n let sum = 0\n for (const size of this.sizes) results.push((sum += size) / sizeTotal)\n return results\n }\n // get progress given index of and fractions within a section\n getProgress(index, fractionInSection, pageFraction = 0) {\n const { sizes, sizePerLoc, sizePerTimeUnit, sizeTotal } = this\n const sizeInSection = sizes[index] ?? 0\n const sizeBefore = sizes.slice(0, index).reduce((a, b) => a + b, 0)\n const size = sizeBefore + fractionInSection * sizeInSection\n const nextSize = size + pageFraction * sizeInSection\n const remainingTotal = sizeTotal - size\n const remainingSection = (1 - fractionInSection) * sizeInSection\n return {\n fraction: nextSize / sizeTotal,\n section: {\n current: index,\n total: sizes.length,\n },\n location: {\n current: Math.floor(size / sizePerLoc),\n next: Math.floor(nextSize / sizePerLoc),\n total: Math.ceil(sizeTotal / sizePerLoc),\n },\n time: {\n section: remainingSection / sizePerTimeUnit,\n total: remainingTotal / sizePerTimeUnit,\n },\n }\n }\n // the inverse of `getProgress`\n // get index of and fraction in section based on total fraction\n getSection(fraction) {\n if (fraction <= 0) return [0, 0]\n if (fraction >= 1) return [this.sizes.length - 1, 1]\n fraction = fraction + Number.EPSILON\n const { sizeTotal } = this\n let index = this.sectionFractions.findIndex(x => x > fraction) - 1\n if (index < 0) return [0, 0]\n while (!this.sizes[index]) index++\n const fractionInSection = (fraction - this.sectionFractions[index])\n / (this.sizes[index] / sizeTotal)\n return [index, fractionInSection]\n }\n}\n","const parseViewport = str => str\n ?.split(/[,;\\s]/) // NOTE: technically, only the comma is valid\n ?.filter(x => x)\n ?.map(x => x.split('=').map(x => x.trim()))\n\nconst getViewport = (doc, viewport) => {\n // use `viewBox` for SVG\n if (doc.documentElement.localName === 'svg') {\n const [, , width, height] = doc.documentElement\n .getAttribute('viewBox')?.split(/\\s/) ?? []\n return { width, height }\n }\n\n // get `viewport` `meta` element\n const meta = parseViewport(doc.querySelector('meta[name=\"viewport\"]')\n ?.getAttribute('content'))\n if (meta) return Object.fromEntries(meta)\n\n // fallback to book's viewport\n if (typeof viewport === 'string') return parseViewport(viewport)\n if (viewport?.width && viewport.height) return viewport\n\n // if no viewport (possibly with image directly in spine), get image size\n const img = doc.querySelector('img')\n if (img) return { width: img.naturalWidth, height: img.naturalHeight }\n\n // just show *something*, i guess...\n console.warn(new Error('Missing viewport properties'))\n return { width: 1000, height: 2000 }\n}\n\nexport class FixedLayout extends HTMLElement {\n static observedAttributes = ['zoom']\n #root = this.attachShadow({ mode: 'closed' })\n #observer = new ResizeObserver(() => this.#render())\n #spreads\n #index = -1\n defaultViewport\n spread\n #portrait = false\n #left\n #right\n #center\n #side\n #zoom\n constructor() {\n super()\n\n const sheet = new CSSStyleSheet()\n this.#root.adoptedStyleSheets = [sheet]\n sheet.replaceSync(`:host {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: auto;\n }`)\n\n this.#observer.observe(this)\n }\n attributeChangedCallback(name, _, value) {\n switch (name) {\n case 'zoom':\n this.#zoom = value !== 'fit-width' && value !== 'fit-page'\n ? parseFloat(value) : value\n this.#render()\n break\n }\n }\n async #createFrame({ index, src: srcOption }) {\n const srcOptionIsString = typeof srcOption === 'string'\n const src = srcOptionIsString ? srcOption : srcOption?.src\n const onZoom = srcOptionIsString ? null : srcOption?.onZoom\n const element = document.createElement('div')\n element.setAttribute('dir', 'ltr')\n const iframe = document.createElement('iframe')\n element.append(iframe)\n Object.assign(iframe.style, {\n border: '0',\n display: 'none',\n overflow: 'hidden',\n })\n // `allow-scripts` is needed for events because of WebKit bug\n // https://bugs.webkit.org/show_bug.cgi?id=218086\n iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts')\n iframe.setAttribute('scrolling', 'no')\n iframe.setAttribute('part', 'filter')\n this.#root.append(element)\n if (!src) return { blank: true, element, iframe }\n return new Promise(resolve => {\n iframe.addEventListener('load', () => {\n const doc = iframe.contentDocument\n this.dispatchEvent(new CustomEvent('load', { detail: { doc, index } }))\n const { width, height } = getViewport(doc, this.defaultViewport)\n resolve({\n element, iframe,\n width: parseFloat(width),\n height: parseFloat(height),\n onZoom,\n })\n }, { once: true })\n iframe.src = src\n })\n }\n #render(side = this.#side) {\n if (!side) return\n const left = this.#left ?? {}\n const right = this.#center ?? this.#right ?? {}\n const target = side === 'left' ? left : right\n const { width, height } = this.getBoundingClientRect()\n const portrait = this.spread !== 'both' && this.spread !== 'portrait'\n && height > width\n this.#portrait = portrait\n const blankWidth = left.width ?? right.width ?? 0\n const blankHeight = left.height ?? right.height ?? 0\n\n const scale = typeof this.#zoom === 'number' && !isNaN(this.#zoom)\n ? this.#zoom\n : (this.#zoom === 'fit-width'\n ? (portrait || this.#center\n ? width / (target.width ?? blankWidth)\n : width / ((left.width ?? blankWidth) + (right.width ?? blankWidth)))\n : (portrait || this.#center\n ? Math.min(\n width / (target.width ?? blankWidth),\n height / (target.height ?? blankHeight))\n : Math.min(\n width / ((left.width ?? blankWidth) + (right.width ?? blankWidth)),\n height / Math.max(\n left.height ?? blankHeight,\n right.height ?? blankHeight)))\n ) || 1\n\n const transform = frame => {\n let { element, iframe, width, height, blank, onZoom } = frame\n if (!iframe) return\n if (onZoom) onZoom({ doc: frame.iframe.contentDocument, scale })\n const iframeScale = onZoom ? scale : 1\n Object.assign(iframe.style, {\n width: `${width * iframeScale}px`,\n height: `${height * iframeScale}px`,\n transform: onZoom ? 'none' : `scale(${scale})`,\n transformOrigin: 'top left',\n display: blank ? 'none' : 'block',\n })\n Object.assign(element.style, {\n width: `${(width ?? blankWidth) * scale}px`,\n height: `${(height ?? blankHeight) * scale}px`,\n overflow: 'hidden',\n display: 'block',\n flexShrink: '0',\n marginBlock: 'auto',\n })\n if (portrait && frame !== target) {\n element.style.display = 'none'\n }\n }\n if (this.#center) {\n transform(this.#center)\n } else {\n transform(left)\n transform(right)\n }\n }\n async #showSpread({ left, right, center, side }) {\n this.#root.replaceChildren()\n this.#left = null\n this.#right = null\n this.#center = null\n if (center) {\n this.#center = await this.#createFrame(center)\n this.#side = 'center'\n this.#render()\n } else {\n this.#left = await this.#createFrame(left)\n this.#right = await this.#createFrame(right)\n this.#side = this.#left.blank ? 'right'\n : this.#right.blank ? 'left' : side\n this.#render()\n }\n }\n #goLeft() {\n if (this.#center || this.#left?.blank) return\n if (this.#portrait && this.#left?.element?.style?.display === 'none') {\n this.#side = 'left'\n this.#render()\n this.#reportLocation('page')\n return true\n }\n }\n #goRight() {\n if (this.#center || this.#right?.blank) return\n if (this.#portrait && this.#right?.element?.style?.display === 'none') {\n this.#side = 'right'\n this.#render()\n this.#reportLocation('page')\n return true\n }\n }\n open(book) {\n this.book = book\n const { rendition } = book\n this.spread = rendition?.spread\n this.defaultViewport = rendition?.viewport\n\n const rtl = book.dir === 'rtl'\n const ltr = !rtl\n this.rtl = rtl\n\n if (rendition?.spread === 'none')\n this.#spreads = book.sections.map(section => ({ center: section }))\n else this.#spreads = book.sections.reduce((arr, section, i) => {\n const last = arr[arr.length - 1]\n const { pageSpread } = section\n const newSpread = () => {\n const spread = {}\n arr.push(spread)\n return spread\n }\n if (pageSpread === 'center') {\n const spread = last.left || last.right ? newSpread() : last\n spread.center = section\n }\n else if (pageSpread === 'left') {\n const spread = last.center || last.left || ltr && i ? newSpread() : last\n spread.left = section\n }\n else if (pageSpread === 'right') {\n const spread = last.center || last.right || rtl && i ? newSpread() : last\n spread.right = section\n }\n else if (ltr) {\n if (last.center || last.right) newSpread().left = section\n else if (last.left || !i) last.right = section\n else last.left = section\n }\n else {\n if (last.center || last.left) newSpread().right = section\n else if (last.right || !i) last.left = section\n else last.right = section\n }\n return arr\n }, [{}])\n }\n get index() {\n const spread = this.#spreads[this.#index]\n const section = spread?.center ?? (this.#side === 'left'\n ? spread.left ?? spread.right : spread.right ?? spread.left)\n return this.book.sections.indexOf(section)\n }\n #reportLocation(reason) {\n this.dispatchEvent(new CustomEvent('relocate', { detail:\n { reason, range: null, index: this.index, fraction: 0, size: 1 } }))\n }\n getSpreadOf(section) {\n const spreads = this.#spreads\n for (let index = 0; index < spreads.length; index++) {\n const { left, right, center } = spreads[index]\n if (left === section) return { index, side: 'left' }\n if (right === section) return { index, side: 'right' }\n if (center === section) return { index, side: 'center' }\n }\n }\n async goToSpread(index, side, reason) {\n if (index < 0 || index > this.#spreads.length - 1) return\n if (index === this.#index) {\n this.#render(side)\n return\n }\n this.#index = index\n const spread = this.#spreads[index]\n if (spread.center) {\n const index = this.book.sections.indexOf(spread.center)\n const src = await spread.center?.load?.()\n await this.#showSpread({ center: { index, src } })\n } else {\n const indexL = this.book.sections.indexOf(spread.left)\n const indexR = this.book.sections.indexOf(spread.right)\n const srcL = await spread.left?.load?.()\n const srcR = await spread.right?.load?.()\n const left = { index: indexL, src: srcL }\n const right = { index: indexR, src: srcR }\n await this.#showSpread({ left, right, side })\n }\n this.#reportLocation(reason)\n }\n async select(target) {\n await this.goTo(target)\n // TODO\n }\n async goTo(target) {\n const { book } = this\n const resolved = await target\n const section = book.sections[resolved.index]\n if (!section) return\n const { index, side } = this.getSpreadOf(section)\n await this.goToSpread(index, side)\n }\n async next() {\n const s = this.rtl ? this.#goLeft() : this.#goRight()\n if (!s) return this.goToSpread(this.#index + 1, this.rtl ? 'right' : 'left', 'page')\n }\n async prev() {\n const s = this.rtl ? this.#goRight() : this.#goLeft()\n if (!s) return this.goToSpread(this.#index - 1, this.rtl ? 'left' : 'right', 'page')\n }\n getContents() {\n return Array.from(this.#root.querySelectorAll('iframe'), frame => ({\n doc: frame.contentDocument,\n // TODO: index, overlayer\n }))\n }\n destroy() {\n this.#observer.unobserve(this)\n }\n}\n\ncustomElements.define('foliate-fxl', FixedLayout)\n","import { useReader } from \"../components/reader\"\n\nexport function useBookNavigator() {\n const { goTo, next, previous } = useReader()\n return { goTo, next, previous }\n}\n","import * as React from \"react\"\nimport { useReader } from \"../components/reader\"\nimport { languageInfo } from \"../lib/language\"\nimport { createSearcher } from \"../lib/search\"\n\nexport function useSearch(query?: string) {\n const { book, tocProgress, rendererRef, addAnnotation, clearAnnotations } = useReader()\n const [loading, setLoading] = React.useState(false)\n const [results, setResults] = React.useState<{ label: string; href: string }[]>()\n\n React.useEffect(() => {\n if (!rendererRef.current) return\n\n setResults(undefined)\n clearAnnotations()\n\n if (query) {\n setLoading(true)\n\n const abortController = new AbortController()\n const language = languageInfo(book)?.canonical ?? \"en\"\n const search = createSearcher(book, language, tocProgress)\n const searchIterator = search({ query })\n\n const processSearchResults = async () => {\n for await (const result of searchIterator) {\n if (abortController.signal.aborted) return\n if (result === \"done\") {\n setLoading(false)\n break\n }\n\n if (\"label\" in result && typeof result.label === \"string\") {\n setResults((prev) => [...(prev ?? []), { label: result.label, href: result.subitems[0].cfi }])\n\n for (const item of result.subitems) {\n addAnnotation(item.cfi)\n }\n } else if (\"cfi\" in result && typeof result.cfi === \"string\") {\n addAnnotation(result.cfi)\n }\n }\n }\n\n processSearchResults()\n\n return () => {\n abortController.abort()\n setLoading(false)\n }\n }\n\n setLoading(false)\n }, [query, book, tocProgress, addAnnotation, clearAnnotations, rendererRef])\n\n return { loading, results }\n}\n","// length for context in excerpts\nconst CONTEXT_LENGTH = 50\n\nconst normalizeWhitespace = str => str.replace(/\\s+/g, ' ')\n\nconst makeExcerpt = (strs, { startIndex, startOffset, endIndex, endOffset }) => {\n const start = strs[startIndex]\n const end = strs[endIndex]\n const match = start === end\n ? start.slice(startOffset, endOffset)\n : start.slice(startOffset)\n + strs.slice(start + 1, end).join('')\n + end.slice(0, endOffset)\n const trimmedStart = normalizeWhitespace(start.slice(0, startOffset)).trimStart()\n const trimmedEnd = normalizeWhitespace(end.slice(endOffset)).trimEnd()\n const ellipsisPre = trimmedStart.length < CONTEXT_LENGTH ? '' : '…'\n const ellipsisPost = trimmedEnd.length < CONTEXT_LENGTH ? '' : '…'\n const pre = `${ellipsisPre}${trimmedStart.slice(-CONTEXT_LENGTH)}`\n const post = `${trimmedEnd.slice(0, CONTEXT_LENGTH)}${ellipsisPost}`\n return { pre, match, post }\n}\n\nconst simpleSearch = function* (strs, query, options = {}) {\n const { locales = 'en', sensitivity } = options\n const matchCase = sensitivity === 'variant'\n const haystack = strs.join('')\n const lowerHaystack = matchCase ? haystack : haystack.toLocaleLowerCase(locales)\n const needle = matchCase ? query : query.toLocaleLowerCase(locales)\n const needleLength = needle.length\n let index = -1\n let strIndex = -1\n let sum = 0\n do {\n index = lowerHaystack.indexOf(needle, index + 1)\n if (index > -1) {\n while (sum <= index) sum += strs[++strIndex].length\n const startIndex = strIndex\n const startOffset = index - (sum - strs[strIndex].length)\n const end = index + needleLength\n while (sum <= end) sum += strs[++strIndex].length\n const endIndex = strIndex\n const endOffset = end - (sum - strs[strIndex].length)\n const range = { startIndex, startOffset, endIndex, endOffset }\n yield { range, excerpt: makeExcerpt(strs, range) }\n }\n } while (index > -1)\n}\n\nconst segmenterSearch = function* (strs, query, options = {}) {\n const { locales = 'en', granularity = 'word', sensitivity = 'base' } = options\n let segmenter, collator\n try {\n segmenter = new Intl.Segmenter(locales, { usage: 'search', granularity })\n collator = new Intl.Collator(locales, { sensitivity })\n } catch (e) {\n console.warn(e)\n segmenter = new Intl.Segmenter('en', { usage: 'search', granularity })\n collator = new Intl.Collator('en', { sensitivity })\n }\n const queryLength = Array.from(segmenter.segment(query)).length\n\n const substrArr = []\n let strIndex = 0\n let segments = segmenter.segment(strs[strIndex])[Symbol.iterator]()\n main: while (strIndex < strs.length) {\n while (substrArr.length < queryLength) {\n const { done, value } = segments.next()\n if (done) {\n // the current string is exhausted\n // move on to the next string\n strIndex++\n if (strIndex < strs.length) {\n segments = segmenter.segment(strs[strIndex])[Symbol.iterator]()\n continue\n } else break main\n }\n const { index, segment } = value\n // ignore formatting characters\n if (!/[^\\p{Format}]/u.test(segment)) continue\n // normalize whitespace\n if (/\\s/u.test(segment)) {\n if (!/\\s/u.test(substrArr[substrArr.length - 1]?.segment))\n substrArr.push({ strIndex, index, segment: ' ' })\n continue\n }\n value.strIndex = strIndex\n substrArr.push(value)\n }\n const substr = substrArr.map(x => x.segment).join('')\n if (collator.compare(query, substr) === 0) {\n const endIndex = strIndex\n const lastSeg = substrArr[substrArr.length - 1]\n const endOffset = lastSeg.index + lastSeg.segment.length\n const startIndex = substrArr[0].strIndex\n const startOffset = substrArr[0].index\n const range = { startIndex, startOffset, endIndex, endOffset }\n yield { range, excerpt: makeExcerpt(strs, range) }\n }\n substrArr.shift()\n }\n}\n\nexport const search = (strs, query, options) => {\n const { granularity = 'grapheme', sensitivity = 'base' } = options\n if (!Intl?.Segmenter || granularity === 'grapheme'\n && (sensitivity === 'variant' || sensitivity === 'accent'))\n return simpleSearch(strs, query, options)\n return segmenterSearch(strs, query, options)\n}\n\nexport const searchMatcher = (textWalker, opts) => {\n const { defaultLocale, matchCase, matchDiacritics, matchWholeWords, acceptNode } = opts\n return function* (doc, query) {\n const iter = textWalker(doc, function* (strs, makeRange) {\n for (const result of search(strs, query, {\n locales: doc.body.lang || doc.documentElement.lang || defaultLocale || 'en',\n granularity: matchWholeWords ? 'word' : 'grapheme',\n sensitivity: matchDiacritics && matchCase ? 'variant'\n : matchDiacritics && !matchCase ? 'accent'\n : !matchDiacritics && matchCase ? 'case'\n : 'base',\n })) {\n const { startIndex, startOffset, endIndex, endOffset } = result.range\n result.range = makeRange(startIndex, startOffset, endIndex, endOffset)\n yield result\n }\n }, acceptNode)\n for (const result of iter) yield result\n }\n}\n","const walkRange = (range, walker) => {\n const nodes = []\n for (let node = walker.currentNode; node; node = walker.nextNode()) {\n const compare = range.comparePoint(node, 0)\n if (compare === 0) nodes.push(node)\n else if (compare > 0) break\n }\n return nodes\n}\n\nconst walkDocument = (_, walker) => {\n const nodes = []\n for (let node = walker.nextNode(); node; node = walker.nextNode())\n nodes.push(node)\n return nodes\n}\n\nconst filter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT\n | NodeFilter.SHOW_CDATA_SECTION\n\nconst acceptNode = node => {\n if (node.nodeType === 1) {\n const name = node.tagName.toLowerCase()\n if (name === 'script' || name === 'style') return NodeFilter.FILTER_REJECT\n return NodeFilter.FILTER_SKIP\n }\n return NodeFilter.FILTER_ACCEPT\n}\n\nexport const textWalker = function* (x, func, filterFunc) {\n const root = x.commonAncestorContainer ?? x.body ?? x\n const walker = document.createTreeWalker(root, filter, { acceptNode: filterFunc || acceptNode })\n const walk = x.commonAncestorContainer ? walkRange : walkDocument\n const nodes = walk(x, walker)\n const strs = nodes.map(node => node.nodeValue ?? '')\n const makeRange = (startIndex, startOffset, endIndex, endOffset) => {\n const range = document.createRange()\n range.setStart(nodes[startIndex], startOffset)\n range.setEnd(nodes[endIndex], endOffset)\n return range\n }\n for (const match of func(strs, makeRange)) yield match\n}\n","import * as CFI from \"../vendor/foliate-js/epubcfi.js\"\nimport type { TOCProgress } from \"../vendor/foliate-js/progress.js\"\nimport { searchMatcher } from \"../vendor/foliate-js/search.js\"\nimport { textWalker } from \"../vendor/foliate-js/text-walker.js\"\nimport type { Book } from \"./book.js\"\n\ntype SearchExcerpt = { pre: string; match: string; post: string }\ntype SearchHit = { range: Range; excerpt: SearchExcerpt }\ntype SearchMatcher = (doc: Document, query: string) => Iterable<SearchHit>\n\nfunction getCFI(book: Book, index: number, range?: Range): string {\n const baseCFI = book.sections?.[index]?.cfi ?? CFI.fake.fromIndex(index)\n if (!range) return baseCFI\n return CFI.joinIndir(baseCFI, CFI.fromRange(range))\n}\n\nexport function createSearcher(book: Book, language: string, tocProgress?: TOCProgress) {\n async function* searchSection(matcher: SearchMatcher, query: string, index: number) {\n const doc = await book.sections?.[index]?.createDocument()\n if (!doc) return\n for (const { range, excerpt } of matcher(doc, query)) yield { cfi: getCFI(book, index, range), excerpt }\n }\n\n async function* searchBook(matcher: SearchMatcher, query: string) {\n const { sections } = book\n if (!sections) return\n\n for (const [index, section] of sections.entries()) {\n if (!section?.createDocument) continue\n\n const doc = await section.createDocument()\n const subitems = Array.from(matcher(doc, query), ({ range, excerpt }) => ({\n cfi: getCFI(book, index, range),\n excerpt,\n }))\n\n if (subitems.length) yield { index, subitems }\n }\n }\n\n async function* search({ query, index }: { query: string; index?: number }) {\n const matcher: SearchMatcher = searchMatcher(textWalker, { defaultLocale: language, query, index })\n const iter = index !== undefined ? searchSection(matcher, query, index) : searchBook(matcher, query)\n\n for await (const result of iter) {\n if (\"subitems\" in result && result.subitems) {\n yield {\n label: tocProgress?.getProgress(result.index)?.label ?? \"\",\n subitems: result.subitems,\n }\n } else {\n yield result\n }\n }\n yield \"done\"\n }\n\n return search\n}\n","import { BlobReader, BlobWriter, configure, TextWriter, ZipReader } from \"@zip.js/zip.js\"\nimport { makeComicBook } from \"../vendor/foliate-js/comic-book.js\"\nimport { EPUB } from \"../vendor/foliate-js/epub.js\"\nimport { makeFB2 } from \"../vendor/foliate-js/fb2.js\"\nimport type { Book } from \"./book\"\n\nconst isZip = async (blob: Blob) => {\n const arr = new Uint8Array(await blob.slice(0, 4).arrayBuffer())\n return arr[0] === 0x50 && arr[1] === 0x4b && arr[2] === 0x03 && arr[3] === 0x04\n}\n\nconst makeZipLoader = async (blob: Blob) => {\n configure({ useWebWorkers: false })\n const reader = new ZipReader(new BlobReader(blob))\n const entries = await reader.getEntries()\n const map = new Map(entries.map((entry) => [entry.filename, entry]))\n\n const loadText = (name: string) => {\n const entry = map.get(name)\n return entry?.getData ? entry.getData(new TextWriter()) : null\n }\n const loadBlob = (name: string, type?: string) => {\n const entry = map.get(name)\n return entry?.getData ? entry.getData(new BlobWriter(type)) : null\n }\n const getSize = (name: string) => map.get(name)?.uncompressedSize ?? 0\n return { entries, loadText, loadBlob, getSize, sha1: undefined }\n}\n\nexport async function loadEPUB(blob: Blob): Promise<Book> {\n const loader = await makeZipLoader(blob)\n const epub = new EPUB(loader)\n return epub.init()\n}\n\nexport async function loadFB2(blob: Blob): Promise<Book> {\n if (await isZip(blob)) {\n const loader = await makeZipLoader(blob)\n const entry = loader.entries.find((zipEntry) => zipEntry.filename.endsWith(\".fb2\"))\n const file = await loader.loadBlob((entry ?? loader.entries[0]).filename)\n return await makeFB2(file)\n } else {\n return await makeFB2(blob)\n }\n}\n\nexport async function loadComicBook(blob: Blob): Promise<Book> {\n const loader = await makeZipLoader(blob)\n return makeComicBook(loader, blob)\n}\n","export const makeComicBook = ({ entries, loadBlob, getSize }, file) => {\n const cache = new Map()\n const urls = new Map()\n const load = async name => {\n if (cache.has(name)) return cache.get(name)\n const src = URL.createObjectURL(await loadBlob(name))\n const page = URL.createObjectURL(\n new Blob([`<!DOCTYPE html><html><head><meta charset=\"utf-8\"></head><body style=\"margin: 0\"><img src=\"${src}\"></body></html>`], { type: 'text/html' }))\n urls.set(name, [src, page])\n cache.set(name, page)\n return page\n }\n const unload = name => {\n urls.get(name)?.forEach?.(url => URL.revokeObjectURL(url))\n urls.delete(name)\n cache.delete(name)\n }\n\n const exts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.jxl', '.avif']\n const files = entries\n .map(entry => entry.filename)\n .filter(name => exts.some(ext => name.endsWith(ext)))\n .sort(new Intl.Collator([], { numeric: true }).compare)\n if (!files.length) throw new Error('No supported image files in archive')\n\n const book = {}\n book.getCover = () => loadBlob(files[0])\n book.metadata = { title: file.name }\n book.sections = files.map(name => ({\n id: name,\n load: () => load(name),\n unload: () => unload(name),\n size: getSize(name),\n }))\n book.toc = files.map(name => ({ label: name, href: name }))\n book.rendition = { layout: 'pre-paginated' }\n book.resolveHref = href => ({ index: book.sections.findIndex(s => s.id === href) })\n book.splitTOCHref = href => [href, null]\n book.getTOCFragment = doc => doc.documentElement\n book.destroy = () => {\n for (const arr of urls.values())\n for (const url of arr) URL.revokeObjectURL(url)\n }\n return book\n}\n","import * as CFI from './epubcfi.js'\n\nconst NS = {\n CONTAINER: 'urn:oasis:names:tc:opendocument:xmlns:container',\n XHTML: 'http://www.w3.org/1999/xhtml',\n OPF: 'http://www.idpf.org/2007/opf',\n EPUB: 'http://www.idpf.org/2007/ops',\n DC: 'http://purl.org/dc/elements/1.1/',\n DCTERMS: 'http://purl.org/dc/terms/',\n ENC: 'http://www.w3.org/2001/04/xmlenc#',\n NCX: 'http://www.daisy.org/z3986/2005/ncx/',\n XLINK: 'http://www.w3.org/1999/xlink',\n SMIL: 'http://www.w3.org/ns/SMIL',\n}\n\nconst MIME = {\n XML: 'application/xml',\n NCX: 'application/x-dtbncx+xml',\n XHTML: 'application/xhtml+xml',\n HTML: 'text/html',\n CSS: 'text/css',\n SVG: 'image/svg+xml',\n JS: /\\/(x-)?(javascript|ecmascript)/,\n}\n\n// https://www.w3.org/TR/epub-33/#sec-reserved-prefixes\nconst PREFIX = {\n a11y: 'http://www.idpf.org/epub/vocab/package/a11y/#',\n dcterms: 'http://purl.org/dc/terms/',\n marc: 'http://id.loc.gov/vocabulary/',\n media: 'http://www.idpf.org/epub/vocab/overlays/#',\n onix: 'http://www.editeur.org/ONIX/book/codelists/current.html#',\n rendition: 'http://www.idpf.org/vocab/rendition/#',\n schema: 'http://schema.org/',\n xsd: 'http://www.w3.org/2001/XMLSchema#',\n msv: 'http://www.idpf.org/epub/vocab/structure/magazine/#',\n prism: 'http://www.prismstandard.org/specifications/3.0/PRISM_CV_Spec_3.0.htm#',\n}\n\nconst RELATORS = {\n art: 'artist',\n aut: 'author',\n clr: 'colorist',\n edt: 'editor',\n ill: 'illustrator',\n nrt: 'narrator',\n trl: 'translator',\n pbl: 'publisher',\n}\n\nconst ONIX5 = {\n '02': 'isbn',\n '06': 'doi',\n '15': 'isbn',\n '26': 'doi',\n '34': 'issn',\n}\n\n// convert to camel case\nconst camel = x => x.toLowerCase().replace(/[-:](.)/g, (_, g) => g.toUpperCase())\n\n// strip and collapse ASCII whitespace\n// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\nconst normalizeWhitespace = str => str ? str\n .replace(/[\\t\\n\\f\\r ]+/g, ' ')\n .replace(/^[\\t\\n\\f\\r ]+/, '')\n .replace(/[\\t\\n\\f\\r ]+$/, '') : ''\n\nconst filterAttribute = (attr, value, isList) => isList\n ? el => el.getAttribute(attr)?.split(/\\s/)?.includes(value)\n : typeof value === 'function'\n ? el => value(el.getAttribute(attr))\n : el => el.getAttribute(attr) === value\n\nconst getAttributes = (...xs) => el =>\n el ? Object.fromEntries(xs.map(x => [camel(x), el.getAttribute(x)])) : null\n\nconst getElementText = el => normalizeWhitespace(el?.textContent)\n\nconst childGetter = (doc, ns) => {\n // ignore the namespace if it doesn't appear in document at all\n const useNS = doc.lookupNamespaceURI(null) === ns || doc.lookupPrefix(ns)\n const f = useNS\n ? (el, name) => el => el.namespaceURI === ns && el.localName === name\n : (el, name) => el => el.localName === name\n return {\n $: (el, name) => [...el.children].find(f(el, name)),\n $$: (el, name) => [...el.children].filter(f(el, name)),\n $$$: useNS\n ? (el, name) => [...el.getElementsByTagNameNS(ns, name)]\n : (el, name) => [...el.getElementsByTagName(name)],\n }\n}\n\nconst resolveURL = (url, relativeTo) => {\n try {\n if (relativeTo.includes(':')) return new URL(url, relativeTo)\n // the base needs to be a valid URL, so set a base URL and then remove it\n const root = 'https://invalid.invalid/'\n const obj = new URL(url, root + relativeTo)\n obj.search = ''\n return decodeURI(obj.href.replace(root, ''))\n } catch(e) {\n console.warn(e)\n return url\n }\n}\n\nconst isExternal = uri => /^(?!blob)\\w+:/i.test(uri)\n\n// like `path.relative()` in Node.js\nconst pathRelative = (from, to) => {\n if (!from) return to\n const as = from.replace(/\\/$/, '').split('/')\n const bs = to.replace(/\\/$/, '').split('/')\n const i = (as.length > bs.length ? as : bs).findIndex((_, i) => as[i] !== bs[i])\n return i < 0 ? '' : Array(as.length - i).fill('..').concat(bs.slice(i)).join('/')\n}\n\nconst pathDirname = str => str.slice(0, str.lastIndexOf('/') + 1)\n\n// replace asynchronously and sequentially\n// same technique as https://stackoverflow.com/a/48032528\nconst replaceSeries = async (str, regex, f) => {\n const matches = []\n str.replace(regex, (...args) => (matches.push(args), null))\n const results = []\n for (const args of matches) results.push(await f(...args))\n return str.replace(regex, () => results.shift())\n}\n\nconst regexEscape = str => str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n\nconst tidy = obj => {\n for (const [key, val] of Object.entries(obj))\n if (val == null) delete obj[key]\n else if (Array.isArray(val)) {\n obj[key] = val.filter(x => x).map(x =>\n typeof x === 'object' && !Array.isArray(x) ? tidy(x) : x)\n if (!obj[key].length) delete obj[key]\n else if (obj[key].length === 1) obj[key] = obj[key][0]\n }\n else if (typeof val === 'object') {\n obj[key] = tidy(val)\n if (!Object.keys(val).length) delete obj[key]\n }\n const keys = Object.keys(obj)\n if (keys.length === 1 && keys[0] === 'name') return obj[keys[0]]\n return obj\n}\n\n// https://www.w3.org/TR/epub/#sec-prefix-attr\nconst getPrefixes = doc => {\n const map = new Map(Object.entries(PREFIX))\n const value = doc.documentElement.getAttributeNS(NS.EPUB, 'prefix')\n || doc.documentElement.getAttribute('prefix')\n if (value) for (const [, prefix, url] of value\n .matchAll(/(.+): +(.+)[ \\t\\r\\n]*/g)) map.set(prefix, url)\n return map\n}\n\n// https://www.w3.org/TR/epub-rs/#sec-property-values\n// but ignoring the case where the prefix is omitted\nconst getPropertyURL = (value, prefixes) => {\n if (!value) return null\n const [a, b] = value.split(':')\n const prefix = b ? a : null\n const reference = b ? b : a\n const baseURL = prefixes.get(prefix)\n return baseURL ? baseURL + reference : null\n}\n\nconst getMetadata = opf => {\n const { $ } = childGetter(opf, NS.OPF)\n const $metadata = $(opf.documentElement, 'metadata')\n\n // first pass: convert to JS objects\n const els = Object.groupBy($metadata.children, el =>\n el.namespaceURI === NS.DC ? 'dc'\n : el.namespaceURI === NS.OPF && el.localName === 'meta' ?\n (el.hasAttribute('name') ? 'legacyMeta' : 'meta') : '')\n const baseLang = $metadata.getAttribute('xml:lang')\n ?? opf.documentElement.getAttribute('xml:lang') ?? 'und'\n const prefixes = getPrefixes(opf)\n const parse = el => {\n const property = el.getAttribute('property')\n const scheme = el.getAttribute('scheme')\n return {\n property: getPropertyURL(property, prefixes) ?? property,\n scheme: getPropertyURL(scheme, prefixes) ?? scheme,\n lang: el.getAttribute('xml:lang'),\n value: getElementText(el),\n props: getProperties(el),\n // `opf:` attributes from EPUB 2 & EPUB 3.1 (removed in EPUB 3.2)\n attrs: Object.fromEntries(Array.from(el.attributes)\n .filter(attr => attr.namespaceURI === NS.OPF)\n .map(attr => [attr.localName, attr.value])),\n }\n }\n const refines = Map.groupBy(els.meta ?? [], el => el.getAttribute('refines'))\n const getProperties = el => {\n const els = refines.get(el ? '#' + el.getAttribute('id') : null)\n if (!els) return null\n return Object.groupBy(els.map(parse), x => x.property)\n }\n const dc = Object.fromEntries(Object.entries(Object.groupBy(els.dc, el => el.localName))\n .map(([name, els]) => [name, els.map(parse)]))\n const properties = getProperties() ?? {}\n const legacyMeta = Object.fromEntries(els.legacyMeta?.map(el =>\n [el.getAttribute('name'), el.getAttribute('content')]) ?? [])\n\n // second pass: map to webpub\n const one = x => x?.[0]?.value\n const prop = (x, p) => one(x?.props?.[p])\n const makeLanguageMap = x => {\n if (!x) return null\n const alts = x.props?.['alternate-script'] ?? []\n const altRep = x.attrs['alt-rep']\n if (!alts.length && (!x.lang || x.lang === baseLang) && !altRep) return x.value\n const map = { [x.lang ?? baseLang]: x.value }\n if (altRep) map[x.attrs['alt-rep-lang']] = altRep\n for (const y of alts) map[y.lang] ??= y.value\n return map\n }\n const makeContributor = x => x ? ({\n name: makeLanguageMap(x),\n sortAs: makeLanguageMap(x.props?.['file-as']?.[0]) ?? x.attrs['file-as'],\n role: x.props?.role?.filter(x => x.scheme === PREFIX.marc + 'relators')\n ?.map(x => x.value) ?? [x.attrs.role],\n code: prop(x, 'term') ?? x.attrs.term,\n scheme: prop(x, 'authority') ?? x.attrs.authority,\n }) : null\n const makeCollection = x => ({\n name: makeLanguageMap(x),\n // NOTE: webpub requires number but EPUB allows values like \"2.2.1\"\n position: one(x.props?.['group-position']),\n })\n const makeAltIdentifier = x => {\n const { value } = x\n if (/^urn:/i.test(value)) return value\n if (/^doi:/i.test(value)) return `urn:${value}`\n const type = x.props?.['identifier-type']\n if (!type) {\n const scheme = x.attrs.scheme\n if (!scheme) return value\n // https://idpf.github.io/epub-registries/identifiers/\n // but no \"jdcn\", which isn't a registered URN namespace\n if (/^(doi|isbn|uuid)$/i.test(scheme)) return `urn:${scheme}:${value}`\n // NOTE: webpub requires scheme to be a URI; EPUB allows anything\n return { scheme, value }\n }\n if (type.scheme === PREFIX.onix + 'codelist5') {\n const nid = ONIX5[type.value]\n if (nid) return `urn:${nid}:${value}`\n }\n return value\n }\n const belongsTo = Object.groupBy(properties['belongs-to-collection'] ?? [],\n x => prop(x, 'collection-type') === 'series' ? 'series' : 'collection')\n const mainTitle = dc.title?.find(x => prop(x, 'title-type') === 'main') ?? dc.title?.[0]\n const metadata = {\n identifier: getIdentifier(opf),\n title: makeLanguageMap(mainTitle),\n sortAs: makeLanguageMap(mainTitle?.props?.['file-as']?.[0])\n ?? mainTitle?.attrs?.['file-as']\n ?? legacyMeta?.['calibre:title_sort'],\n subtitle: dc.title?.find(x => prop(x, 'title-type') === 'subtitle')?.value,\n language: dc.language?.map(x => x.value),\n description: one(dc.description),\n publisher: dc.publisher?.map(makeContributor),\n published: dc.date?.find(x => x.attrs.event === 'publication')?.value\n ?? one(dc.date),\n modified: one(properties[PREFIX.dcterms + 'modified'])\n ?? dc.date?.find(x => x.attrs.event === 'modification')?.value,\n subject: dc.subject?.map(makeContributor),\n belongsTo: {\n collection: belongsTo.collection?.map(makeCollection),\n series: belongsTo.series?.map(makeCollection)\n ?? legacyMeta?.['calibre:series'] ? {\n name: legacyMeta?.['calibre:series'],\n position: parseFloat(legacyMeta?.['calibre:series_index']),\n } : null,\n },\n altIdentifier: dc.identifier?.map(makeAltIdentifier),\n source: dc.source?.map(makeAltIdentifier), // NOTE: not in webpub schema\n rights: one(dc.rights), // NOTE: not in webpub schema\n pageBreakSource: one(properties['pageBreakSource']), // NOTE: not in webpub schema\n }\n const remapContributor = defaultKey => x => {\n const keys = new Set(x.role?.map(role => RELATORS[role] ?? defaultKey))\n return [keys.size ? keys : [defaultKey], x]\n }\n for (const [keys, val] of [].concat(\n dc.creator?.map(makeContributor)?.map(remapContributor('author')) ?? [],\n dc.contributor?.map(makeContributor)?.map(remapContributor('contributor')) ?? []))\n for (const key of keys)\n if (metadata[key]) metadata[key].push(val)\n else metadata[key] = [val]\n tidy(metadata)\n if (metadata.altIdentifier === metadata.identifier)\n delete metadata.altIdentifier\n\n const rendition = {}\n const media = {}\n for (const [key, val] of Object.entries(properties)) {\n if (key.startsWith(PREFIX.rendition))\n rendition[camel(key.replace(PREFIX.rendition, ''))] = one(val)\n else if (key.startsWith(PREFIX.media))\n media[camel(key.replace(PREFIX.media, ''))] = one(val)\n }\n if (media.duration) media.duration = parseClock(media.duration)\n return { metadata, rendition, media }\n}\n\nconst parseNav = (doc, resolve = f => f) => {\n const { $, $$, $$$ } = childGetter(doc, NS.XHTML)\n const resolveHref = href => href ? decodeURI(resolve(href)) : null\n const parseLI = getType => $li => {\n const $a = $($li, 'a') ?? $($li, 'span')\n const $ol = $($li, 'ol')\n const href = resolveHref($a?.getAttribute('href'))\n const label = getElementText($a) || $a?.getAttribute('title')\n // TODO: get and concat alt/title texts in content\n const result = { label, href, subitems: parseOL($ol) }\n if (getType) result.type = $a?.getAttributeNS(NS.EPUB, 'type')?.split(/\\s/)\n return result\n }\n const parseOL = ($ol, getType) => $ol ? $$($ol, 'li').map(parseLI(getType)) : null\n const parseNav = ($nav, getType) => parseOL($($nav, 'ol'), getType)\n\n const $$nav = $$$(doc, 'nav')\n let toc = null, pageList = null, landmarks = null, others = []\n for (const $nav of $$nav) {\n const type = $nav.getAttributeNS(NS.EPUB, 'type')?.split(/\\s/) ?? []\n if (type.includes('toc')) toc ??= parseNav($nav)\n else if (type.includes('page-list')) pageList ??= parseNav($nav)\n else if (type.includes('landmarks')) landmarks ??= parseNav($nav, true)\n else others.push({\n label: getElementText($nav.firstElementChild), type,\n list: parseNav($nav),\n })\n }\n return { toc, pageList, landmarks, others }\n}\n\nconst parseNCX = (doc, resolve = f => f) => {\n const { $, $$ } = childGetter(doc, NS.NCX)\n const resolveHref = href => href ? decodeURI(resolve(href)) : null\n const parseItem = el => {\n const $label = $(el, 'navLabel')\n const $content = $(el, 'content')\n const label = getElementText($label)\n const href = resolveHref($content.getAttribute('src'))\n if (el.localName === 'navPoint') {\n const els = $$(el, 'navPoint')\n return { label, href, subitems: els.length ? els.map(parseItem) : null }\n }\n return { label, href }\n }\n const parseList = (el, itemName) => $$(el, itemName).map(parseItem)\n const getSingle = (container, itemName) => {\n const $container = $(doc.documentElement, container)\n return $container ? parseList($container, itemName) : null\n }\n return {\n toc: getSingle('navMap', 'navPoint'),\n pageList: getSingle('pageList', 'pageTarget'),\n others: $$(doc.documentElement, 'navList').map(el => ({\n label: getElementText($(el, 'navLabel')),\n list: parseList(el, 'navTarget'),\n })),\n }\n}\n\nconst parseClock = str => {\n if (!str) return\n const parts = str.split(':').map(x => parseFloat(x))\n if (parts.length === 3) {\n const [h, m, s] = parts\n return h * 60 * 60 + m * 60 + s\n }\n if (parts.length === 2) {\n const [m, s] = parts\n return m * 60 + s\n }\n const [x, unit] = str.split(/(?=[^\\d.])/)\n const n = parseFloat(x)\n const f = unit === 'h' ? 60 * 60\n : unit === 'min' ? 60\n : unit === 'ms' ? .001\n : 1\n return n * f\n}\n\nclass MediaOverlay extends EventTarget {\n #entries\n #lastMediaOverlayItem\n #sectionIndex\n #audioIndex\n #itemIndex\n #audio\n #volume = 1\n #rate = 1\n #state\n constructor(book, loadXML) {\n super()\n this.book = book\n this.loadXML = loadXML\n }\n async #loadSMIL(item) {\n if (this.#lastMediaOverlayItem === item) return\n const doc = await this.loadXML(item.href)\n const resolve = href => href ? resolveURL(href, item.href) : null\n const { $, $$$ } = childGetter(doc, NS.SMIL)\n this.#audioIndex = -1\n this.#itemIndex = -1\n this.#entries = $$$(doc, 'par').reduce((arr, $par) => {\n const text = resolve($($par, 'text')?.getAttribute('src'))\n const $audio = $($par, 'audio')\n if (!text || !$audio) return arr\n const src = resolve($audio.getAttribute('src'))\n const begin = parseClock($audio.getAttribute('clipBegin'))\n const end = parseClock($audio.getAttribute('clipEnd'))\n const last = arr.at(-1)\n if (last?.src === src) last.items.push({ text, begin, end })\n else arr.push({ src, items: [{ text, begin, end }] })\n return arr\n }, [])\n this.#lastMediaOverlayItem = item\n }\n get #activeAudio() {\n return this.#entries[this.#audioIndex]\n }\n get #activeItem() {\n return this.#activeAudio?.items?.[this.#itemIndex]\n }\n #error(e) {\n console.error(e)\n this.dispatchEvent(new CustomEvent('error', { detail: e }))\n }\n #highlight() {\n this.dispatchEvent(new CustomEvent('highlight', { detail: this.#activeItem }))\n }\n #unhighlight() {\n this.dispatchEvent(new CustomEvent('unhighlight', { detail: this.#activeItem }))\n }\n async #play(audioIndex, itemIndex) {\n this.#stop()\n this.#audioIndex = audioIndex\n this.#itemIndex = itemIndex\n const src = this.#activeAudio?.src\n if (!src || !this.#activeItem) return this.start(this.#sectionIndex + 1)\n\n const url = URL.createObjectURL(await this.book.loadBlob(src))\n const audio = new Audio(url)\n this.#audio = audio\n audio.volume = this.#volume\n audio.playbackRate = this.#rate\n audio.addEventListener('timeupdate', () => {\n if (audio.paused) return\n const t = audio.currentTime\n const { items } = this.#activeAudio\n if (t > this.#activeItem?.end) {\n this.#unhighlight()\n if (this.#itemIndex === items.length - 1) {\n this.#play(this.#audioIndex + 1, 0).catch(e => this.#error(e))\n return\n }\n }\n const oldIndex = this.#itemIndex\n while (items[this.#itemIndex + 1]?.begin <= t) this.#itemIndex++\n if (this.#itemIndex !== oldIndex) this.#highlight()\n })\n audio.addEventListener('error', () =>\n this.#error(new Error(`Failed to load ${src}`)))\n audio.addEventListener('playing', () => this.#highlight())\n audio.addEventListener('ended', () => {\n this.#unhighlight()\n URL.revokeObjectURL(url)\n this.#audio = null\n this.#play(audioIndex + 1, 0).catch(e => this.#error(e))\n })\n if (this.#state === 'paused') {\n this.#highlight()\n audio.currentTime = this.#activeItem.begin ?? 0\n }\n else audio.addEventListener('canplaythrough', () => {\n // for some reason need to seek in `canplaythrough`\n // or it won't play when skipping in WebKit\n audio.currentTime = this.#activeItem.begin ?? 0\n this.#state = 'playing'\n audio.play().catch(e => this.#error(e))\n }, { once: true })\n }\n async start(sectionIndex, filter = () => true) {\n this.#audio?.pause()\n const section = this.book.sections[sectionIndex]\n const href = section?.id\n if (!href) return\n\n const { mediaOverlay } = section\n if (!mediaOverlay) return this.start(sectionIndex + 1)\n this.#sectionIndex = sectionIndex\n await this.#loadSMIL(mediaOverlay)\n\n for (let i = 0; i < this.#entries.length; i++) {\n const { items } = this.#entries[i]\n for (let j = 0; j < items.length; j++) {\n if (items[j].text.split('#')[0] === href && filter(items[j], j, items))\n return this.#play(i, j).catch(e => this.#error(e))\n }\n }\n }\n pause() {\n this.#state = 'paused'\n this.#audio?.pause()\n }\n resume() {\n this.#state = 'playing'\n this.#audio?.play().catch(e => this.#error(e))\n }\n #stop() {\n if (this.#audio) {\n this.#audio.pause()\n URL.revokeObjectURL(this.#audio.src)\n this.#audio = null\n this.#unhighlight()\n }\n }\n stop() {\n this.#state = 'stopped'\n this.#stop()\n }\n prev() {\n if (this.#itemIndex > 0) this.#play(this.#audioIndex, this.#itemIndex - 1)\n else if (this.#audioIndex > 0) this.#play(this.#audioIndex - 1,\n this.#entries[this.#audioIndex - 1].items.length - 1)\n else if (this.#sectionIndex > 0)\n this.start(this.#sectionIndex - 1, (_, i, items) => i === items.length - 1)\n }\n next() {\n this.#play(this.#audioIndex, this.#itemIndex + 1)\n }\n setVolume(volume) {\n this.#volume = volume\n if (this.#audio) this.#audio.volume = volume\n }\n setRate(rate) {\n this.#rate = rate\n if (this.#audio) this.#audio.playbackRate = rate\n }\n}\n\nconst isUUID = /([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/\n\nconst getUUID = opf => {\n for (const el of opf.getElementsByTagNameNS(NS.DC, 'identifier')) {\n const [id] = getElementText(el).split(':').slice(-1)\n if (isUUID.test(id)) return id\n }\n return ''\n}\n\nconst getIdentifier = opf => getElementText(\n opf.getElementById(opf.documentElement.getAttribute('unique-identifier'))\n ?? opf.getElementsByTagNameNS(NS.DC, 'identifier')[0])\n\n// https://www.w3.org/publishing/epub32/epub-ocf.html#sec-resource-obfuscation\nconst deobfuscate = async (key, length, blob) => {\n const array = new Uint8Array(await blob.slice(0, length).arrayBuffer())\n length = Math.min(length, array.length)\n for (var i = 0; i < length; i++) array[i] = array[i] ^ key[i % key.length]\n return new Blob([array, blob.slice(length)], { type: blob.type })\n}\n\nconst WebCryptoSHA1 = async str => {\n const data = new TextEncoder().encode(str)\n const buffer = await globalThis.crypto.subtle.digest('SHA-1', data)\n return new Uint8Array(buffer)\n}\n\nconst deobfuscators = (sha1 = WebCryptoSHA1) => ({\n 'http://www.idpf.org/2008/embedding': {\n key: opf => sha1(getIdentifier(opf)\n // eslint-disable-next-line no-control-regex\n .replaceAll(/[\\u0020\\u0009\\u000d\\u000a]/g, '')),\n decode: (key, blob) => deobfuscate(key, 1040, blob),\n },\n 'http://ns.adobe.com/pdf/enc#RC': {\n key: opf => {\n const uuid = getUUID(opf).replaceAll('-', '')\n return Uint8Array.from({ length: 16 }, (_, i) =>\n parseInt(uuid.slice(i * 2, i * 2 + 2), 16))\n },\n decode: (key, blob) => deobfuscate(key, 1024, blob),\n },\n})\n\nclass Encryption {\n #uris = new Map()\n #decoders = new Map()\n #algorithms\n constructor(algorithms) {\n this.#algorithms = algorithms\n }\n async init(encryption, opf) {\n if (!encryption) return\n const data = Array.from(\n encryption.getElementsByTagNameNS(NS.ENC, 'EncryptedData'), el => ({\n algorithm: el.getElementsByTagNameNS(NS.ENC, 'EncryptionMethod')[0]\n ?.getAttribute('Algorithm'),\n uri: el.getElementsByTagNameNS(NS.ENC, 'CipherReference')[0]\n ?.getAttribute('URI'),\n }))\n for (const { algorithm, uri } of data) {\n if (!this.#decoders.has(algorithm)) {\n const algo = this.#algorithms[algorithm]\n if (!algo) {\n console.warn('Unknown encryption algorithm')\n continue\n }\n const key = await algo.key(opf)\n this.#decoders.set(algorithm, blob => algo.decode(key, blob))\n }\n this.#uris.set(uri, algorithm)\n }\n }\n getDecoder(uri) {\n return this.#decoders.get(this.#uris.get(uri)) ?? (x => x)\n }\n}\n\nclass Resources {\n constructor({ opf, resolveHref }) {\n this.opf = opf\n const { $, $$, $$$ } = childGetter(opf, NS.OPF)\n\n const $manifest = $(opf.documentElement, 'manifest')\n const $spine = $(opf.documentElement, 'spine')\n const $$itemref = $$($spine, 'itemref')\n\n this.manifest = $$($manifest, 'item')\n .map(getAttributes('href', 'id', 'media-type', 'properties', 'media-overlay'))\n .map(item => {\n item.href = resolveHref(item.href)\n item.properties = item.properties?.split(/\\s/)\n return item\n })\n this.manifestById = new Map(this.manifest.map(item => [item.id, item]))\n this.spine = $$itemref\n .map(getAttributes('idref', 'id', 'linear', 'properties'))\n .map(item => (item.properties = item.properties?.split(/\\s/), item))\n this.pageProgressionDirection = $spine\n .getAttribute('page-progression-direction')\n\n this.navPath = this.getItemByProperty('nav')?.href\n this.ncxPath = (this.getItemByID($spine.getAttribute('toc'))\n ?? this.manifest.find(item => item.mediaType === MIME.NCX))?.href\n\n const $guide = $(opf.documentElement, 'guide')\n if ($guide) this.guide = $$($guide, 'reference')\n .map(getAttributes('type', 'title', 'href'))\n .map(({ type, title, href }) => ({\n label: title,\n type: type.split(/\\s/),\n href: resolveHref(href),\n }))\n\n this.cover = this.getItemByProperty('cover-image')\n // EPUB 2 compat\n ?? this.getItemByID($$$(opf, 'meta')\n .find(filterAttribute('name', 'cover'))\n ?.getAttribute('content'))\n ?? this.getItemByHref(this.guide\n ?.find(ref => ref.type.includes('cover'))?.href)\n\n this.cfis = CFI.fromElements($$itemref)\n }\n getItemByID(id) {\n return this.manifestById.get(id)\n }\n getItemByHref(href) {\n return this.manifest.find(item => item.href === href)\n }\n getItemByProperty(prop) {\n return this.manifest.find(item => item.properties?.includes(prop))\n }\n resolveCFI(cfi) {\n const parts = CFI.parse(cfi)\n const top = (parts.parent ?? parts).shift()\n let $itemref = CFI.toElement(this.opf, top)\n // make sure it's an idref; if not, try again without the ID assertion\n // mainly because Epub.js used to generate wrong ID assertions\n // https://github.com/futurepress/epub.js/issues/1236\n if ($itemref && $itemref.nodeName !== 'idref') {\n top.at(-1).id = null\n $itemref = CFI.toElement(this.opf, top)\n }\n const idref = $itemref?.getAttribute('idref')\n const index = this.spine.findIndex(item => item.idref === idref)\n const anchor = doc => CFI.toRange(doc, parts)\n return { index, anchor }\n }\n}\n\nclass Loader {\n #cache = new Map()\n #children = new Map()\n #refCount = new Map()\n eventTarget = new EventTarget()\n constructor({ loadText, loadBlob, resources }) {\n this.loadText = loadText\n this.loadBlob = loadBlob\n this.manifest = resources.manifest\n this.assets = resources.manifest\n // needed only when replacing in (X)HTML w/o parsing (see below)\n //.filter(({ mediaType }) => ![MIME.XHTML, MIME.HTML].includes(mediaType))\n }\n async createURL(href, data, type, parent) {\n if (!data) return ''\n const detail = { data, type }\n Object.defineProperty(detail, 'name', { value: href }) // readonly\n const event = new CustomEvent('data', { detail })\n this.eventTarget.dispatchEvent(event)\n const newData = await event.detail.data\n const newType = await event.detail.type\n const url = URL.createObjectURL(new Blob([newData], { type: newType }))\n this.#cache.set(href, url)\n this.#refCount.set(href, 1)\n if (parent) {\n const childList = this.#children.get(parent)\n if (childList) childList.push(href)\n else this.#children.set(parent, [href])\n }\n return url\n }\n ref(href, parent) {\n const childList = this.#children.get(parent)\n if (!childList?.includes(href)) {\n this.#refCount.set(href, this.#refCount.get(href) + 1)\n //console.log(`referencing ${href}, now ${this.#refCount.get(href)}`)\n if (childList) childList.push(href)\n else this.#children.set(parent, [href])\n }\n return this.#cache.get(href)\n }\n unref(href) {\n if (!this.#refCount.has(href)) return\n const count = this.#refCount.get(href) - 1\n //console.log(`unreferencing ${href}, now ${count}`)\n if (count < 1) {\n //console.log(`unloading ${href}`)\n URL.revokeObjectURL(this.#cache.get(href))\n this.#cache.delete(href)\n this.#refCount.delete(href)\n // unref children\n const childList = this.#children.get(href)\n if (childList) while (childList.length) this.unref(childList.pop())\n this.#children.delete(href)\n } else this.#refCount.set(href, count)\n }\n // load manifest item, recursively loading all resources as needed\n async loadItem(item, parents = []) {\n if (!item) return null\n const { href, mediaType } = item\n\n const isScript = MIME.JS.test(item.mediaType)\n const detail = { type: mediaType, isScript, allow: true}\n const event = new CustomEvent('load', { detail })\n this.eventTarget.dispatchEvent(event)\n const allow = await event.detail.allow\n if (!allow) return null\n\n const parent = parents.at(-1)\n if (this.#cache.has(href)) return this.ref(href, parent)\n\n const shouldReplace =\n (isScript || [MIME.XHTML, MIME.HTML, MIME.CSS, MIME.SVG].includes(mediaType))\n // prevent circular references\n && parents.every(p => p !== href)\n if (shouldReplace) return this.loadReplaced(item, parents)\n // NOTE: this can be replaced with `Promise.try()`\n const tryLoadBlob = Promise.resolve().then(() => this.loadBlob(href))\n return this.createURL(href, tryLoadBlob, mediaType, parent)\n }\n async loadHref(href, base, parents = []) {\n if (isExternal(href)) return href\n const path = resolveURL(href, base)\n const item = this.manifest.find(item => item.href === path)\n if (!item) return href\n return this.loadItem(item, parents.concat(base))\n }\n async loadReplaced(item, parents = []) {\n const { href, mediaType } = item\n const parent = parents.at(-1)\n let str = ''\n try {\n str = await this.loadText(href)\n } catch (e) {\n return this.createURL(href, Promise.reject(e), mediaType, parent)\n }\n if (!str) return null\n\n // note that one can also just use `replaceString` for everything:\n // ```\n // const replaced = await this.replaceString(str, href, parents)\n // return this.createURL(href, replaced, mediaType, parent)\n // ```\n // which is basically what Epub.js does, which is simpler, but will\n // break things like iframes (because you don't want to replace links)\n // or text that just happen to be paths\n\n // parse and replace in HTML\n if ([MIME.XHTML, MIME.HTML, MIME.SVG].includes(mediaType)) {\n let doc = new DOMParser().parseFromString(str, mediaType)\n // change to HTML if it's not valid XHTML\n if (mediaType === MIME.XHTML && (doc.querySelector('parsererror')\n || !doc.documentElement?.namespaceURI)) {\n console.warn(doc.querySelector('parsererror')?.innerText ?? 'Invalid XHTML')\n item.mediaType = MIME.HTML\n doc = new DOMParser().parseFromString(str, item.mediaType)\n }\n // replace hrefs in XML processing instructions\n // this is mainly for SVGs that use xml-stylesheet\n if ([MIME.XHTML, MIME.SVG].includes(item.mediaType)) {\n let child = doc.firstChild\n while (child instanceof ProcessingInstruction) {\n if (child.data) {\n const replacedData = await replaceSeries(child.data,\n /(?:^|\\s*)(href\\s*=\\s*['\"])([^'\"]*)(['\"])/i,\n (_, p1, p2, p3) => this.loadHref(p2, href, parents)\n .then(p2 => `${p1}${p2}${p3}`))\n child.replaceWith(doc.createProcessingInstruction(\n child.target, replacedData))\n }\n child = child.nextSibling\n }\n }\n // replace hrefs (excluding anchors)\n const replace = async (el, attr) => el.setAttribute(attr,\n await this.loadHref(el.getAttribute(attr), href, parents))\n for (const el of doc.querySelectorAll('link[href]')) await replace(el, 'href')\n for (const el of doc.querySelectorAll('[src]')) await replace(el, 'src')\n for (const el of doc.querySelectorAll('[poster]')) await replace(el, 'poster')\n for (const el of doc.querySelectorAll('object[data]')) await replace(el, 'data')\n for (const el of doc.querySelectorAll('[*|href]:not([href])'))\n el.setAttributeNS(NS.XLINK, 'href', await this.loadHref(\n el.getAttributeNS(NS.XLINK, 'href'), href, parents))\n for (const el of doc.querySelectorAll('[srcset]'))\n el.setAttribute('srcset', await replaceSeries(el.getAttribute('srcset'),\n /(\\s*)(.+?)\\s*((?:\\s[\\d.]+[wx])+\\s*(?:,|$)|,\\s+|$)/g,\n (_, p1, p2, p3) => this.loadHref(p2, href, parents)\n .then(p2 => `${p1}${p2}${p3}`)))\n // replace inline styles\n for (const el of doc.querySelectorAll('style'))\n if (el.textContent) el.textContent =\n await this.replaceCSS(el.textContent, href, parents)\n for (const el of doc.querySelectorAll('[style]'))\n el.setAttribute('style',\n await this.replaceCSS(el.getAttribute('style'), href, parents))\n // TODO: replace inline scripts? probably not worth the trouble\n const result = new XMLSerializer().serializeToString(doc)\n return this.createURL(href, result, item.mediaType, parent)\n }\n\n const result = mediaType === MIME.CSS\n ? await this.replaceCSS(str, href, parents)\n : await this.replaceString(str, href, parents)\n return this.createURL(href, result, mediaType, parent)\n }\n async replaceCSS(str, href, parents = []) {\n const replacedUrls = await replaceSeries(str,\n /url\\(\\s*[\"']?([^'\"\\n]*?)\\s*[\"']?\\s*\\)/gi,\n (_, url) => this.loadHref(url, href, parents)\n .then(url => `url(\"${url}\")`))\n // apart from `url()`, strings can be used for `@import` (but why?!)\n return replaceSeries(replacedUrls,\n /@import\\s*[\"']([^\"'\\n]*?)[\"']/gi,\n (_, url) => this.loadHref(url, href, parents)\n .then(url => `@import \"${url}\"`))\n }\n // find & replace all possible relative paths for all assets without parsing\n replaceString(str, href, parents = []) {\n const assetMap = new Map()\n const urls = this.assets.map(asset => {\n // do not replace references to the file itself\n if (asset.href === href) return\n // href was decoded and resolved when parsing the manifest\n const relative = pathRelative(pathDirname(href), asset.href)\n const relativeEnc = encodeURI(relative)\n const rootRelative = '/' + asset.href\n const rootRelativeEnc = encodeURI(rootRelative)\n const set = new Set([relative, relativeEnc, rootRelative, rootRelativeEnc])\n for (const url of set) assetMap.set(url, asset)\n return Array.from(set)\n }).flat().filter(x => x)\n if (!urls.length) return str\n const regex = new RegExp(urls.map(regexEscape).join('|'), 'g')\n return replaceSeries(str, regex, async match =>\n this.loadItem(assetMap.get(match.replace(/^\\//, '')),\n parents.concat(href)))\n }\n unloadItem(item) {\n this.unref(item?.href)\n }\n destroy() {\n for (const url of this.#cache.values()) URL.revokeObjectURL(url)\n }\n}\n\nconst getHTMLFragment = (doc, id) => doc.getElementById(id)\n ?? doc.querySelector(`[name=\"${CSS.escape(id)}\"]`)\n\nconst getPageSpread = properties => {\n for (const p of properties) {\n if (p === 'page-spread-left' || p === 'rendition:page-spread-left')\n return 'left'\n if (p === 'page-spread-right' || p === 'rendition:page-spread-right')\n return 'right'\n if (p === 'rendition:page-spread-center') return 'center'\n }\n}\n\nconst getDisplayOptions = doc => {\n if (!doc) return null\n return {\n fixedLayout: getElementText(doc.querySelector('option[name=\"fixed-layout\"]')),\n openToSpread: getElementText(doc.querySelector('option[name=\"open-to-spread\"]')),\n }\n}\n\nexport class EPUB {\n parser = new DOMParser()\n #loader\n #encryption\n constructor({ loadText, loadBlob, getSize, sha1 }) {\n this.loadText = loadText\n this.loadBlob = loadBlob\n this.getSize = getSize\n this.#encryption = new Encryption(deobfuscators(sha1))\n }\n async #loadXML(uri) {\n const str = await this.loadText(uri)\n if (!str) return null\n const doc = this.parser.parseFromString(str, MIME.XML)\n if (doc.querySelector('parsererror'))\n throw new Error(`XML parsing error: ${uri}\n${doc.querySelector('parsererror').innerText}`)\n return doc\n }\n async init() {\n const $container = await this.#loadXML('META-INF/container.xml')\n if (!$container) throw new Error('Failed to load container file')\n\n const opfs = Array.from(\n $container.getElementsByTagNameNS(NS.CONTAINER, 'rootfile'),\n getAttributes('full-path', 'media-type'))\n .filter(file => file.mediaType === 'application/oebps-package+xml')\n\n if (!opfs.length) throw new Error('No package document defined in container')\n const opfPath = opfs[0].fullPath\n const opf = await this.#loadXML(opfPath)\n if (!opf) throw new Error('Failed to load package document')\n\n const $encryption = await this.#loadXML('META-INF/encryption.xml')\n await this.#encryption.init($encryption, opf)\n\n this.resources = new Resources({\n opf,\n resolveHref: url => resolveURL(url, opfPath),\n })\n this.#loader = new Loader({\n loadText: this.loadText,\n loadBlob: uri => Promise.resolve(this.loadBlob(uri))\n .then(this.#encryption.getDecoder(uri)),\n resources: this.resources,\n })\n this.transformTarget = this.#loader.eventTarget\n this.sections = this.resources.spine.map((spineItem, index) => {\n const { idref, linear, properties = [] } = spineItem\n const item = this.resources.getItemByID(idref)\n if (!item) {\n console.warn(`Could not find item with ID \"${idref}\" in manifest`)\n return null\n }\n return {\n id: item.href,\n load: () => this.#loader.loadItem(item),\n unload: () => this.#loader.unloadItem(item),\n createDocument: () => this.loadDocument(item),\n size: this.getSize(item.href),\n cfi: this.resources.cfis[index],\n linear,\n pageSpread: getPageSpread(properties),\n resolveHref: href => resolveURL(href, item.href),\n mediaOverlay: item.mediaOverlay\n ? this.resources.getItemByID(item.mediaOverlay) : null,\n }\n }).filter(s => s)\n\n const { navPath, ncxPath } = this.resources\n if (navPath) try {\n const resolve = url => resolveURL(url, navPath)\n const nav = parseNav(await this.#loadXML(navPath), resolve)\n this.toc = nav.toc\n this.pageList = nav.pageList\n this.landmarks = nav.landmarks\n } catch(e) {\n console.warn(e)\n }\n if (!this.toc && ncxPath) try {\n const resolve = url => resolveURL(url, ncxPath)\n const ncx = parseNCX(await this.#loadXML(ncxPath), resolve)\n this.toc = ncx.toc\n this.pageList = ncx.pageList\n } catch(e) {\n console.warn(e)\n }\n this.landmarks ??= this.resources.guide\n\n const { metadata, rendition, media } = getMetadata(opf)\n this.metadata = metadata\n this.rendition = rendition\n this.media = media\n this.dir = this.resources.pageProgressionDirection\n const displayOptions = getDisplayOptions(\n await this.#loadXML('META-INF/com.apple.ibooks.display-options.xml')\n ?? await this.#loadXML('META-INF/com.kobobooks.display-options.xml'))\n if (displayOptions) {\n if (displayOptions.fixedLayout === 'true')\n this.rendition.layout ??= 'pre-paginated'\n if (displayOptions.openToSpread === 'false') this.sections\n .find(section => section.linear !== 'no').pageSpread ??=\n this.dir === 'rtl' ? 'left' : 'right'\n }\n return this\n }\n async loadDocument(item) {\n const str = await this.loadText(item.href)\n return this.parser.parseFromString(str, item.mediaType)\n }\n getMediaOverlay() {\n return new MediaOverlay(this, this.#loadXML.bind(this))\n }\n resolveCFI(cfi) {\n return this.resources.resolveCFI(cfi)\n }\n resolveHref(href) {\n const [path, hash] = href.split('#')\n const item = this.resources.getItemByHref(decodeURI(path))\n if (!item) return null\n const index = this.resources.spine.findIndex(({ idref }) => idref === item.id)\n const anchor = hash ? doc => getHTMLFragment(doc, hash) : () => 0\n return { index, anchor }\n }\n splitTOCHref(href) {\n return href?.split('#') ?? []\n }\n getTOCFragment(doc, id) {\n return doc.getElementById(id)\n ?? doc.querySelector(`[name=\"${CSS.escape(id)}\"]`)\n }\n isExternal(uri) {\n return isExternal(uri)\n }\n async getCover() {\n const cover = this.resources?.cover\n return cover?.href\n ? new Blob([await this.loadBlob(cover.href)], { type: cover.mediaType })\n : null\n }\n async getCalibreBookmarks() {\n const txt = await this.loadText('META-INF/calibre_bookmarks.txt')\n const magic = 'encoding=json+base64:'\n if (txt?.startsWith(magic)) {\n const json = atob(txt.slice(magic.length))\n return JSON.parse(json)\n }\n }\n destroy() {\n this.#loader?.destroy()\n }\n}\n","const normalizeWhitespace = str => str ? str\n .replace(/[\\t\\n\\f\\r ]+/g, ' ')\n .replace(/^[\\t\\n\\f\\r ]+/, '')\n .replace(/[\\t\\n\\f\\r ]+$/, '') : ''\nconst getElementText = el => normalizeWhitespace(el?.textContent)\n\nconst NS = {\n XLINK: 'http://www.w3.org/1999/xlink',\n EPUB: 'http://www.idpf.org/2007/ops',\n}\n\nconst MIME = {\n XML: 'application/xml',\n XHTML: 'application/xhtml+xml',\n}\n\nconst STYLE = {\n 'strong': ['strong', 'self'],\n 'emphasis': ['em', 'self'],\n 'style': ['span', 'self'],\n 'a': 'anchor',\n 'strikethrough': ['s', 'self'],\n 'sub': ['sub', 'self'],\n 'sup': ['sup', 'self'],\n 'code': ['code', 'self'],\n 'image': 'image',\n}\n\nconst TABLE = {\n 'tr': ['tr', {\n 'th': ['th', STYLE, ['colspan', 'rowspan', 'align', 'valign']],\n 'td': ['td', STYLE, ['colspan', 'rowspan', 'align', 'valign']],\n }, ['align']],\n}\n\nconst POEM = {\n 'epigraph': ['blockquote'],\n 'subtitle': ['h2', STYLE],\n 'text-author': ['p', STYLE],\n 'date': ['p', STYLE],\n 'stanza': 'stanza',\n}\n\nconst SECTION = {\n 'title': ['header', {\n 'p': ['h1', STYLE],\n 'empty-line': ['br'],\n }],\n 'epigraph': ['blockquote', 'self'],\n 'image': 'image',\n 'annotation': ['aside'],\n 'section': ['section', 'self'],\n 'p': ['p', STYLE],\n 'poem': ['blockquote', POEM],\n 'subtitle': ['h2', STYLE],\n 'cite': ['blockquote', 'self'],\n 'empty-line': ['br'],\n 'table': ['table', TABLE],\n 'text-author': ['p', STYLE],\n}\nPOEM['epigraph'].push(SECTION)\n\nconst BODY = {\n 'image': 'image',\n 'title': ['section', {\n 'p': ['h1', STYLE],\n 'empty-line': ['br'],\n }],\n 'epigraph': ['section', SECTION],\n 'section': ['section', SECTION],\n}\n\nclass FB2Converter {\n constructor(fb2) {\n this.fb2 = fb2\n this.doc = document.implementation.createDocument(NS.XHTML, 'html')\n // use this instead of `getElementById` to allow images like\n // `<image l:href=\"#img1.jpg\" id=\"img1.jpg\" />`\n this.bins = new Map(Array.from(this.fb2.getElementsByTagName('binary'),\n el => [el.id, el]))\n }\n getImageSrc(el) {\n const href = el.getAttributeNS(NS.XLINK, 'href')\n if (!href) return 'data:,'\n const [, id] = href.split('#')\n if (!id) return href\n const bin = this.bins.get(id)\n return bin\n ? `data:${bin.getAttribute('content-type')};base64,${bin.textContent}`\n : href\n }\n image(node) {\n const el = this.doc.createElement('img')\n el.alt = node.getAttribute('alt')\n el.title = node.getAttribute('title')\n el.setAttribute('src', this.getImageSrc(node))\n return el\n }\n anchor(node) {\n const el = this.convert(node, { 'a': ['a', STYLE] })\n el.setAttribute('href', node.getAttributeNS(NS.XLINK, 'href'))\n if (node.getAttribute('type') === 'note')\n el.setAttributeNS(NS.EPUB, 'epub:type', 'noteref')\n return el\n }\n stanza(node) {\n const el = this.convert(node, {\n 'stanza': ['p', {\n 'title': ['header', {\n 'p': ['strong', STYLE],\n 'empty-line': ['br'],\n }],\n 'subtitle': ['p', STYLE],\n }],\n })\n for (const child of node.children) if (child.nodeName === 'v') {\n el.append(this.doc.createTextNode(child.textContent))\n el.append(this.doc.createElement('br'))\n }\n return el\n }\n convert(node, def) {\n // not an element; return text content\n if (node.nodeType === 3) return this.doc.createTextNode(node.textContent)\n if (node.nodeType === 4) return this.doc.createCDATASection(node.textContent)\n if (node.nodeType === 8) return this.doc.createComment(node.textContent)\n\n const d = def?.[node.nodeName]\n if (!d) return null\n if (typeof d === 'string') return this[d](node)\n\n const [name, opts, attrs] = d\n const el = this.doc.createElement(name)\n\n // copy the ID, and set class name from original element name\n if (node.id) el.id = node.id\n el.classList.add(node.nodeName)\n\n // copy attributes\n if (Array.isArray(attrs)) for (const attr of attrs) {\n const value = node.getAttribute(attr)\n if (value) el.setAttribute(attr, value)\n }\n\n // process child elements recursively\n const childDef = opts === 'self' ? def : opts\n let child = node.firstChild\n while (child) {\n const childEl = this.convert(child, childDef)\n if (childEl) el.append(childEl)\n child = child.nextSibling\n }\n return el\n }\n}\n\nconst parseXML = async blob => {\n const buffer = await blob.arrayBuffer()\n const str = new TextDecoder('utf-8').decode(buffer)\n const parser = new DOMParser()\n const doc = parser.parseFromString(str, MIME.XML)\n const encoding = doc.xmlEncoding\n // `Document.xmlEncoding` is deprecated, and already removed in Firefox\n // so parse the XML declaration manually\n || str.match(/^<\\?xml\\s+version\\s*=\\s*[\"']1.\\d+\"\\s+encoding\\s*=\\s*[\"']([A-Za-z0-9._-]*)[\"']/)?.[1]\n if (encoding && encoding.toLowerCase() !== 'utf-8') {\n const str = new TextDecoder(encoding).decode(buffer)\n return parser.parseFromString(str, MIME.XML)\n }\n return doc\n}\n\nconst style = URL.createObjectURL(new Blob([`\n@namespace epub \"http://www.idpf.org/2007/ops\";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title h1 {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title h1 {\n text-align: start;\n}\nbody.notesBodyType > section .title {\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: \"—\";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~=\"noteref\"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n`], { type: 'text/css' }))\n\nconst template = html => `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head><link href=\"${style}\" rel=\"stylesheet\" type=\"text/css\"/></head>\n <body>${html}</body>\n</html>`\n\n// name of custom ID attribute for TOC items\nconst dataID = 'data-foliate-id'\n\nexport const makeFB2 = async blob => {\n const book = {}\n const doc = await parseXML(blob)\n const converter = new FB2Converter(doc)\n\n const $ = x => doc.querySelector(x)\n const $$ = x => [...doc.querySelectorAll(x)]\n const getPerson = el => {\n const nick = getElementText(el.querySelector('nickname'))\n if (nick) return nick\n const first = getElementText(el.querySelector('first-name'))\n const middle = getElementText(el.querySelector('middle-name'))\n const last = getElementText(el.querySelector('last-name'))\n const name = [first, middle, last].filter(x => x).join(' ')\n const sortAs = last\n ? [last, [first, middle].filter(x => x).join(' ')].join(', ')\n : null\n return { name, sortAs }\n }\n const getDate = el => el?.getAttribute('value') ?? getElementText(el)\n const annotation = $('title-info annotation')\n book.metadata = {\n title: getElementText($('title-info book-title')),\n identifier: getElementText($('document-info id')),\n language: getElementText($('title-info lang')),\n author: $$('title-info author').map(getPerson),\n translator: $$('title-info translator').map(getPerson),\n contributor: $$('document-info author').map(getPerson)\n // techincially the program probably shouldn't get the `bkp` role\n // but it has been so used by calibre, so ¯\\_(ツ)_/¯\n .concat($$('document-info program-used').map(getElementText))\n .map(x => Object.assign(typeof x === 'string' ? { name: x } : x,\n { role: 'bkp' })),\n publisher: getElementText($('publish-info publisher')),\n published: getDate($('title-info date')),\n modified: getDate($('document-info date')),\n description: annotation ? converter.convert(annotation,\n { annotation: ['div', SECTION] }).innerHTML : null,\n subject: $$('title-info genre').map(getElementText),\n }\n if ($('coverpage image')) {\n const src = converter.getImageSrc($('coverpage image'))\n book.getCover = () => fetch(src).then(res => res.blob())\n } else book.getCover = () => null\n\n // get convert each body\n const bodyData = Array.from(doc.querySelectorAll('body'), body => {\n const converted = converter.convert(body, { body: ['body', BODY] })\n return [Array.from(converted.children, el => {\n // get list of IDs in the section\n const ids = [el, ...el.querySelectorAll('[id]')].map(el => el.id)\n return { el, ids }\n }), converted]\n })\n\n const urls = []\n const sectionData = bodyData[0][0]\n // make a separate section for each section in the first body\n .map(({ el, ids }) => {\n // set up titles for TOC\n const titles = Array.from(\n el.querySelectorAll(':scope > section > .title'),\n (el, index) => {\n el.setAttribute(dataID, index)\n return { title: getElementText(el), index }\n })\n return { ids, titles, el }\n })\n // for additional bodies, only make one section for each body\n .concat(bodyData.slice(1).map(([sections, body]) => {\n const ids = sections.map(s => s.ids).flat()\n body.classList.add('notesBodyType')\n return { ids, el: body, linear: 'no' }\n }))\n .map(({ ids, titles, el, linear }) => {\n const str = template(el.outerHTML)\n const blob = new Blob([str], { type: MIME.XHTML })\n const url = URL.createObjectURL(blob)\n urls.push(url)\n const title = normalizeWhitespace(\n el.querySelector('.title, .subtitle, p')?.textContent\n ?? (el.classList.contains('title') ? el.textContent : ''))\n return {\n ids, title, titles, load: () => url,\n createDocument: () => new DOMParser().parseFromString(str, MIME.XHTML),\n // doo't count image data as it'd skew the size too much\n size: blob.size - Array.from(el.querySelectorAll('[src]'),\n el => el.getAttribute('src')?.length ?? 0)\n .reduce((a, b) => a + b, 0),\n linear,\n }\n })\n\n const idMap = new Map()\n book.sections = sectionData.map((section, index) => {\n const { ids, load, createDocument, size, linear } = section\n for (const id of ids) if (id) idMap.set(id, index)\n return { id: index, load, createDocument, size, linear }\n })\n\n book.toc = sectionData.map(({ title, titles }, index) => {\n const id = index.toString()\n return {\n label: title,\n href: id,\n subitems: titles?.length ? titles.map(({ title, index }) => ({\n label: title,\n href: `${id}#${index}`,\n })) : null,\n }\n }).filter(item => item)\n\n book.resolveHref = href => {\n const [a, b] = href.split('#')\n return a\n // the link is from the TOC\n ? { index: Number(a), anchor: doc => doc.querySelector(`[${dataID}=\"${b}\"]`) }\n // link from within the page\n : { index: idMap.get(b), anchor: doc => doc.getElementById(b) }\n }\n book.splitTOCHref = href => href?.split('#')?.map(x => Number(x)) ?? []\n book.getTOCFragment = (doc, id) => doc.querySelector(`[${dataID}=\"${id}\"]`)\n book.isExternal = uri => /^\\w+:/i.test(uri)\n\n book.destroy = () => {\n for (const url of urls) URL.revokeObjectURL(url)\n }\n return book\n}\n"],"mappings":"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","names":["HTMLElement","filter","node","x","g","wait","result","acceptNode","range","collapse","style","_observer","_vertical","_rtl","g","columnWidth","offset","x","_root","_observer","_index","index","width","height","React","textWalker","acceptNode","makeRange","filter","makeRange","search","search","g","normalizeWhitespace","el","i","parse","els","x","parseNav","filter","item","p2","result","url","normalizeWhitespace","getElementText","NS","MIME","parser","str","el","blob","title","index","doc"]}
|