{"version":3,"file":"pagelist.mjs","sources":["../../../../../node_modules/epubjs/src/pagelist.js"],"sourcesContent":["import EpubCFI from \"./epubcfi\";\nimport {\n\tqs,\n\tqsa,\n\tquerySelectorByType,\n\tindexOfSorted,\n\tlocationOf\n} from \"./utils/core\";\n\n/**\n * Page List Parser\n * @param {document} [xml]\n */\nclass PageList {\n\tconstructor(xml) {\n\t\tthis.pages = [];\n\t\tthis.locations = [];\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.firstPage = 0;\n\t\tthis.lastPage = 0;\n\t\tthis.totalPages = 0;\n\n\t\tthis.toc = undefined;\n\t\tthis.ncx = undefined;\n\n\t\tif (xml) {\n\t\t\tthis.pageList = this.parse(xml);\n\t\t}\n\n\t\tif(this.pageList && this.pageList.length) {\n\t\t\tthis.process(this.pageList);\n\t\t}\n\t}\n\n\t/**\n\t * Parse PageList Xml\n\t * @param  {document} xml\n\t */\n\tparse(xml) {\n\t\tvar html = qs(xml, \"html\");\n\t\tvar ncx = qs(xml, \"ncx\");\n\n\t\tif(html) {\n\t\t\treturn this.parseNav(xml);\n\t\t} else if(ncx){\n\t\t\treturn this.parseNcx(xml);\n\t\t}\n\n\t}\n\n\t/**\n\t * Parse a Nav PageList\n\t * @private\n\t * @param  {node} navHtml\n\t * @return {PageList.item[]} list\n\t */\n\tparseNav(navHtml){\n\t\tvar navElement = querySelectorByType(navHtml, \"nav\", \"page-list\");\n\t\tvar navItems = navElement ? qsa(navElement, \"li\") : [];\n\t\tvar length = navItems.length;\n\t\tvar i;\n\t\tvar list = [];\n\t\tvar item;\n\n\t\tif(!navItems || length === 0) return list;\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.item(navItems[i]);\n\t\t\tlist.push(item);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tparseNcx(navXml) {\n\t\tvar list = [];\n\t\tvar i = 0;\n\t\tvar item;\n\t\tvar pageList;\n\t\tvar pageTargets;\n\t\tvar length = 0;\n\n\t\tpageList = qs(navXml, \"pageList\");\n\t\tif (!pageList) return list;\n\n\t\tpageTargets = qsa(pageList, \"pageTarget\");\n\t\tlength = pageTargets.length;\n\n\t\tif (!pageTargets || pageTargets.length === 0) {\n\t\t\treturn list;\n\t\t}\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.ncxItem(pageTargets[i]);\n\t\t\tlist.push(item);\n\t\t}\n\n\t\treturn list;\n\t}\n\n\tncxItem(item) {\n\t\tvar navLabel = qs(item, \"navLabel\");\n\t\tvar navLabelText = qs(navLabel, \"text\");\n\t\tvar pageText = navLabelText.textContent;\n\t\tvar content = qs(item, \"content\");\n\n\t\tvar href = content.getAttribute(\"src\");\n\t\tvar page = parseInt(pageText, 10);\n\n\t\treturn {\n\t\t\t\"href\": href,\n\t\t\t\"page\": page,\n\t\t};\n\t}\n\n\t/**\n\t * Page List Item\n\t * @private\n\t * @param  {node} item\n\t * @return {object} pageListItem\n\t */\n\titem(item){\n\t\tvar content = qs(item, \"a\"),\n\t\t\t\thref = content.getAttribute(\"href\") || \"\",\n\t\t\t\ttext = content.textContent || \"\",\n\t\t\t\tpage = parseInt(text),\n\t\t\t\tisCfi = href.indexOf(\"epubcfi\"),\n\t\t\t\tsplit,\n\t\t\t\tpackageUrl,\n\t\t\t\tcfi;\n\n\t\tif(isCfi != -1) {\n\t\t\tsplit = href.split(\"#\");\n\t\t\tpackageUrl = split[0];\n\t\t\tcfi = split.length > 1 ? split[1] : false;\n\t\t\treturn {\n\t\t\t\t\"cfi\" : cfi,\n\t\t\t\t\"href\" : href,\n\t\t\t\t\"packageUrl\" : packageUrl,\n\t\t\t\t\"page\" : page\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\t\"href\" : href,\n\t\t\t\t\"page\" : page\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Process pageList items\n\t * @private\n\t * @param  {array} pageList\n\t */\n\tprocess(pageList){\n\t\tpageList.forEach(function(item){\n\t\t\tthis.pages.push(item.page);\n\t\t\tif (item.cfi) {\n\t\t\t\tthis.locations.push(item.cfi);\n\t\t\t}\n\t\t}, this);\n\t\tthis.firstPage = parseInt(this.pages[0]);\n\t\tthis.lastPage = parseInt(this.pages[this.pages.length-1]);\n\t\tthis.totalPages = this.lastPage - this.firstPage;\n\t}\n\n\t/**\n\t * Get a PageList result from a EpubCFI\n\t * @param  {string} cfi EpubCFI String\n\t * @return {number} page\n\t */\n\tpageFromCfi(cfi){\n\t\tvar pg = -1;\n\n\t\t// Check if the pageList has not been set yet\n\t\tif(this.locations.length === 0) {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// TODO: check if CFI is valid?\n\n\t\t// check if the cfi is in the location list\n\t\t// var index = this.locations.indexOf(cfi);\n\t\tvar index = indexOfSorted(cfi, this.locations, this.epubcfi.compare);\n\t\tif(index != -1) {\n\t\t\tpg = this.pages[index];\n\t\t} else {\n\t\t\t// Otherwise add it to the list of locations\n\t\t\t// Insert it in the correct position in the locations page\n\t\t\t//index = EPUBJS.core.insert(cfi, this.locations, this.epubcfi.compare);\n\t\t\tindex = locationOf(cfi, this.locations, this.epubcfi.compare);\n\t\t\t// Get the page at the location just before the new one, or return the first\n\t\t\tpg = index-1 >= 0 ? this.pages[index-1] : this.pages[0];\n\t\t\tif(pg !== undefined) {\n\t\t\t\t// Add the new page in so that the locations and page array match up\n\t\t\t\t//this.pages.splice(index, 0, pg);\n\t\t\t} else {\n\t\t\t\tpg = -1;\n\t\t\t}\n\n\t\t}\n\t\treturn pg;\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Page List Item\n\t * @param  {string | number} pg\n\t * @return {string} cfi\n\t */\n\tcfiFromPage(pg){\n\t\tvar cfi = -1;\n\t\t// check that pg is an int\n\t\tif(typeof pg != \"number\"){\n\t\t\tpg = parseInt(pg);\n\t\t}\n\n\t\t// check if the cfi is in the page list\n\t\t// Pages could be unsorted.\n\t\tvar index = this.pages.indexOf(pg);\n\t\tif(index != -1) {\n\t\t\tcfi = this.locations[index];\n\t\t}\n\t\t// TODO: handle pages not in the list\n\t\treturn cfi;\n\t}\n\n\t/**\n\t * Get a Page from Book percentage\n\t * @param  {number} percent\n\t * @return {number} page\n\t */\n\tpageFromPercentage(percent){\n\t\tvar pg = Math.round(this.totalPages * percent);\n\t\treturn pg;\n\t}\n\n\t/**\n\t * Returns a value between 0 - 1 corresponding to the location of a page\n\t * @param  {number} pg the page\n\t * @return {number} percentage\n\t */\n\tpercentageFromPage(pg){\n\t\tvar percentage = (pg - this.firstPage) / this.totalPages;\n\t\treturn Math.round(percentage * 1000) / 1000;\n\t}\n\n\t/**\n\t * Returns a value between 0 - 1 corresponding to the location of a cfi\n\t * @param  {string} cfi EpubCFI String\n\t * @return {number} percentage\n\t */\n\tpercentageFromCfi(cfi){\n\t\tvar pg = this.pageFromCfi(cfi);\n\t\tvar percentage = this.percentageFromPage(pg);\n\t\treturn percentage;\n\t}\n\n\t/**\n\t * Destroy\n\t */\n\tdestroy() {\n\t\tthis.pages = undefined;\n\t\tthis.locations = undefined;\n\t\tthis.epubcfi = undefined;\n\n\t\tthis.pageList = undefined;\n\n\t\tthis.toc = undefined;\n\t\tthis.ncx = undefined;\n\t}\n}\n\nexport default PageList;\n"],"names":["PageList","xml","EpubCFI","html","qs","ncx","navHtml","navElement","querySelectorByType","navItems","qsa","length","list","item","navXml","i","pageList","pageTargets","navLabel","navLabelText","pageText","content","href","page","text","isCfi","split","packageUrl","cfi","pg","index","indexOfSorted","locationOf","percent","percentage"],"mappings":"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","x_google_ignoreList":[0]}