{"version":3,"file":"navigation.mjs","sources":["../../../../../node_modules/epubjs/src/navigation.js"],"sourcesContent":["import {qs, qsa, querySelectorByType, filterChildren, getParentByTagName} from \"./utils/core\";\n\n/**\n * Navigation Parser\n * @param {document} xml navigation html / xhtml / ncx\n */\nclass Navigation {\n\tconstructor(xml) {\n\t\tthis.toc = [];\n\t\tthis.tocByHref = {};\n\t\tthis.tocById = {};\n\n\t\tthis.landmarks = [];\n\t\tthis.landmarksByType = {};\n\n\t\tthis.length = 0;\n\t\tif (xml) {\n\t\t\tthis.parse(xml);\n\t\t}\n\t}\n\n\t/**\n\t * Parse out the navigation items\n\t * @param {document} xml navigation html / xhtml / ncx\n\t */\n\tparse(xml) {\n\t\tlet isXml = xml.nodeType;\n\t\tlet html;\n\t\tlet ncx;\n\n\t\tif (isXml) {\n\t\t\thtml = qs(xml, \"html\");\n\t\t\tncx = qs(xml, \"ncx\");\n\t\t}\n\n\t\tif (!isXml) {\n\t\t\tthis.toc = this.load(xml);\n\t\t} else if(html) {\n\t\t\tthis.toc = this.parseNav(xml);\n\t\t\tthis.landmarks = this.parseLandmarks(xml);\n\t\t} else if(ncx){\n\t\t\tthis.toc = this.parseNcx(xml);\n\t\t}\n\n\t\tthis.length = 0;\n\n\t\tthis.unpack(this.toc);\n\t}\n\n\t/**\n\t * Unpack navigation items\n\t * @private\n\t * @param  {array} toc\n\t */\n\tunpack(toc) {\n\t\tvar item;\n\n\t\tfor (var i = 0; i < toc.length; i++) {\n\t\t\titem = toc[i];\n\n\t\t\tif (item.href) {\n\t\t\t\tthis.tocByHref[item.href] = i;\n\t\t\t}\n\n\t\t\tif (item.id) {\n\t\t\t\tthis.tocById[item.id] = i;\n\t\t\t}\n\n\t\t\tthis.length++;\n\n\t\t\tif (item.subitems.length) {\n\t\t\t\tthis.unpack(item.subitems);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Get an item from the navigation\n\t * @param  {string} target\n\t * @return {object} navItem\n\t */\n\tget(target) {\n\t\tvar index;\n\n\t\tif(!target) {\n\t\t\treturn this.toc;\n\t\t}\n\n\t\tif(target.indexOf(\"#\") === 0) {\n\t\t\tindex = this.tocById[target.substring(1)];\n\t\t} else if(target in this.tocByHref){\n\t\t\tindex = this.tocByHref[target];\n\t\t}\n\n\t\treturn this.getByIndex(target, index, this.toc);\n\t}\n\n\t/**\n\t * Get an item from navigation subitems recursively by index\n\t * @param  {string} target\n\t * @param  {number} index\n\t * @param  {array} navItems\n\t * @return {object} navItem\n\t */\n\tgetByIndex(target, index, navItems) {\n\t\tif (navItems.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst item = navItems[index];\n\t\tif (item && (target === item.id || target === item.href)) {\n\t\t\treturn item;\n\t\t} else {\n\t\t\tlet result;\n\t\t\tfor (let i = 0; i < navItems.length; ++i) {\n\t\t\t\tresult = this.getByIndex(target, index, navItems[i].subitems);\n\t\t\t\tif (result) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * Get a landmark by type\n\t * List of types: https://idpf.github.io/epub-vocabs/structure/\n\t * @param  {string} type\n\t * @return {object} landmarkItem\n\t */\n\tlandmark(type) {\n\t\tvar index;\n\n\t\tif(!type) {\n\t\t\treturn this.landmarks;\n\t\t}\n\n\t\tindex = this.landmarksByType[type];\n\n\t\treturn this.landmarks[index];\n\t}\n\n\t/**\n\t * Parse toc from a Epub > 3.0 Nav\n\t * @private\n\t * @param  {document} navHtml\n\t * @return {array} navigation list\n\t */\n\tparseNav(navHtml){\n\t\tvar navElement = querySelectorByType(navHtml, \"nav\", \"toc\");\n\t\tvar list = [];\n\n\t\tif (!navElement) return list;\n\n\t\tlet navList = filterChildren(navElement, \"ol\", true);\n\t\tif (!navList) return list;\n\n\t\tlist = this.parseNavList(navList);\n\t\treturn list;\n\t}\n\n\t/**\n\t * Parses lists in the toc\n\t * @param  {document} navListHtml\n\t * @param  {string} parent id\n\t * @return {array} navigation list\n\t */\n\tparseNavList(navListHtml, parent) {\n\t\tconst result = [];\n\n\t\tif (!navListHtml) return result;\n\t\tif (!navListHtml.children) return result;\n\t\t\n\t\tfor (let i = 0; i < navListHtml.children.length; i++) {\n\t\t\tconst item = this.navItem(navListHtml.children[i], parent);\n\n\t\t\tif (item) {\n\t\t\t\tresult.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create a navItem\n\t * @private\n\t * @param  {element} item\n\t * @return {object} navItem\n\t */\n\tnavItem(item, parent) {\n\t\tlet id = item.getAttribute(\"id\") || undefined;\n\t\tlet content = filterChildren(item, \"a\", true)\n\t\t\t|| filterChildren(item, \"span\", true);\n\n\t\tif (!content) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet src = content.getAttribute(\"href\") || \"\";\n\t\t\n\t\tif (!id) {\n\t\t\tid = src;\n\t\t}\n\t\tlet text = content.textContent || \"\";\n\n\t\tlet subitems = [];\n\t\tlet nested = filterChildren(item, \"ol\", true);\n\t\tif (nested) {\n\t\t\tsubitems = \tthis.parseNavList(nested, id);\n\t\t}\n\n\t\treturn {\n\t\t\t\"id\": id,\n\t\t\t\"href\": src,\n\t\t\t\"label\": text,\n\t\t\t\"subitems\" : subitems,\n\t\t\t\"parent\" : parent\n\t\t};\n\t}\n\n\t/**\n\t * Parse landmarks from a Epub > 3.0 Nav\n\t * @private\n\t * @param  {document} navHtml\n\t * @return {array} landmarks list\n\t */\n\tparseLandmarks(navHtml){\n\t\tvar navElement = querySelectorByType(navHtml, \"nav\", \"landmarks\");\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.landmarkItem(navItems[i]);\n\t\t\tif (item) {\n\t\t\t\tlist.push(item);\n\t\t\t\tthis.landmarksByType[item.type] = i;\n\t\t\t}\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t/**\n\t * Create a landmarkItem\n\t * @private\n\t * @param  {element} item\n\t * @return {object} landmarkItem\n\t */\n\tlandmarkItem(item){\n\t\tlet content = filterChildren(item, \"a\", true);\n\n\t\tif (!content) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet type = content.getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") || undefined;\n\t\tlet href = content.getAttribute(\"href\") || \"\";\n\t\tlet text = content.textContent || \"\";\n\n\t\treturn {\n\t\t\t\"href\": href,\n\t\t\t\"label\": text,\n\t\t\t\"type\" : type\n\t\t};\n\t}\n\n\t/**\n\t * Parse from a Epub > 3.0 NC\n\t * @private\n\t * @param  {document} navHtml\n\t * @return {array} navigation list\n\t */\n\tparseNcx(tocXml){\n\t\tvar navPoints = qsa(tocXml, \"navPoint\");\n\t\tvar length = navPoints.length;\n\t\tvar i;\n\t\tvar toc = {};\n\t\tvar list = [];\n\t\tvar item, parent;\n\n\t\tif(!navPoints || length === 0) return list;\n\n\t\tfor (i = 0; i < length; ++i) {\n\t\t\titem = this.ncxItem(navPoints[i]);\n\t\t\ttoc[item.id] = item;\n\t\t\tif(!item.parent) {\n\t\t\t\tlist.push(item);\n\t\t\t} else {\n\t\t\t\tparent = toc[item.parent];\n\t\t\t\tparent.subitems.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn list;\n\t}\n\n\t/**\n\t * Create a ncxItem\n\t * @private\n\t * @param  {element} item\n\t * @return {object} ncxItem\n\t */\n\tncxItem(item){\n\t\tvar id = item.getAttribute(\"id\") || false,\n\t\t\t\tcontent = qs(item, \"content\"),\n\t\t\t\tsrc = content.getAttribute(\"src\"),\n\t\t\t\tnavLabel = qs(item, \"navLabel\"),\n\t\t\t\ttext = navLabel.textContent ? navLabel.textContent : \"\",\n\t\t\t\tsubitems = [],\n\t\t\t\tparentNode = item.parentNode,\n\t\t\t\tparent;\n\n\t\tif(parentNode && (parentNode.nodeName === \"navPoint\" || parentNode.nodeName.split(':').slice(-1)[0] === \"navPoint\")) {\n\t\t\tparent = parentNode.getAttribute(\"id\");\n\t\t}\n\n\n\t\treturn {\n\t\t\t\"id\": id,\n\t\t\t\"href\": src,\n\t\t\t\"label\": text,\n\t\t\t\"subitems\" : subitems,\n\t\t\t\"parent\" : parent\n\t\t};\n\t}\n\n\t/**\n\t * Load Spine Items\n\t * @param  {object} json the items to be loaded\n\t * @return {Array} navItems\n\t */\n\tload(json) {\n\t\treturn json.map(item => {\n\t\t\titem.label = item.title;\n\t\t\titem.subitems = item.children ? this.load(item.children) : [];\n\t\t\treturn item;\n\t\t});\n\t}\n\n\t/**\n\t * forEach pass through\n\t * @param  {Function} fn function to run on each item\n\t * @return {method} forEach loop\n\t */\n\tforEach(fn) {\n\t\treturn this.toc.forEach(fn);\n\t}\n}\n\nexport default Navigation;\n"],"names":["Navigation","xml","isXml","html","ncx","qs","toc","item","i","target","index","navItems","result","type","navHtml","navElement","querySelectorByType","list","navList","filterChildren","navListHtml","parent","id","content","src","text","subitems","nested","qsa","length","href","tocXml","navPoints","navLabel","parentNode","json","fn"],"mappings":"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","x_google_ignoreList":[0]}