vue-files-preview-inno
Version:
A tool for previewing files such as doc, excel, pdf, image, markdown, txt, audio, and video and so on.
135 lines (134 loc) • 3.99 kB
JavaScript
import o from "./epubcfi.mjs";
import { qs as h, querySelectorByType as c, qsa as f, indexOfSorted as u, locationOf as l } from "./utils/core.mjs";
class x {
constructor(t) {
this.pages = [], this.locations = [], this.epubcfi = new o(), this.firstPage = 0, this.lastPage = 0, this.totalPages = 0, this.toc = void 0, this.ncx = void 0, t && (this.pageList = this.parse(t)), this.pageList && this.pageList.length && this.process(this.pageList);
}
/**
* Parse PageList Xml
* @param {document} xml
*/
parse(t) {
var e = h(t, "html"), a = h(t, "ncx");
if (e)
return this.parseNav(t);
if (a)
return this.parseNcx(t);
}
/**
* Parse a Nav PageList
* @private
* @param {node} navHtml
* @return {PageList.item[]} list
*/
parseNav(t) {
var e = c(t, "nav", "page-list"), a = e ? f(e, "li") : [], n = a.length, i, s = [], r;
if (!a || n === 0) return s;
for (i = 0; i < n; ++i)
r = this.item(a[i]), s.push(r);
return s;
}
parseNcx(t) {
var e = [], a = 0, n, i, s, r = 0;
if (i = h(t, "pageList"), !i || (s = f(i, "pageTarget"), r = s.length, !s || s.length === 0))
return e;
for (a = 0; a < r; ++a)
n = this.ncxItem(s[a]), e.push(n);
return e;
}
ncxItem(t) {
var e = h(t, "navLabel"), a = h(e, "text"), n = a.textContent, i = h(t, "content"), s = i.getAttribute("src"), r = parseInt(n, 10);
return {
href: s,
page: r
};
}
/**
* Page List Item
* @private
* @param {node} item
* @return {object} pageListItem
*/
item(t) {
var e = h(t, "a"), a = e.getAttribute("href") || "", n = e.textContent || "", i = parseInt(n), s = a.indexOf("epubcfi"), r, p, g;
return s != -1 ? (r = a.split("#"), p = r[0], g = r.length > 1 ? r[1] : !1, {
cfi: g,
href: a,
packageUrl: p,
page: i
}) : {
href: a,
page: i
};
}
/**
* Process pageList items
* @private
* @param {array} pageList
*/
process(t) {
t.forEach(function(e) {
this.pages.push(e.page), e.cfi && this.locations.push(e.cfi);
}, this), this.firstPage = parseInt(this.pages[0]), this.lastPage = parseInt(this.pages[this.pages.length - 1]), this.totalPages = this.lastPage - this.firstPage;
}
/**
* Get a PageList result from a EpubCFI
* @param {string} cfi EpubCFI String
* @return {number} page
*/
pageFromCfi(t) {
var e = -1;
if (this.locations.length === 0)
return -1;
var a = u(t, this.locations, this.epubcfi.compare);
return a != -1 ? e = this.pages[a] : (a = l(t, this.locations, this.epubcfi.compare), e = a - 1 >= 0 ? this.pages[a - 1] : this.pages[0], e !== void 0 || (e = -1)), e;
}
/**
* Get an EpubCFI from a Page List Item
* @param {string | number} pg
* @return {string} cfi
*/
cfiFromPage(t) {
var e = -1;
typeof t != "number" && (t = parseInt(t));
var a = this.pages.indexOf(t);
return a != -1 && (e = this.locations[a]), e;
}
/**
* Get a Page from Book percentage
* @param {number} percent
* @return {number} page
*/
pageFromPercentage(t) {
var e = Math.round(this.totalPages * t);
return e;
}
/**
* Returns a value between 0 - 1 corresponding to the location of a page
* @param {number} pg the page
* @return {number} percentage
*/
percentageFromPage(t) {
var e = (t - this.firstPage) / this.totalPages;
return Math.round(e * 1e3) / 1e3;
}
/**
* Returns a value between 0 - 1 corresponding to the location of a cfi
* @param {string} cfi EpubCFI String
* @return {number} percentage
*/
percentageFromCfi(t) {
var e = this.pageFromCfi(t), a = this.percentageFromPage(e);
return a;
}
/**
* Destroy
*/
destroy() {
this.pages = void 0, this.locations = void 0, this.epubcfi = void 0, this.pageList = void 0, this.toc = void 0, this.ncx = void 0;
}
}
export {
x as default
};
//# sourceMappingURL=pagelist.mjs.map