1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-03 14:59:18 +02:00

Added type declarations

This commit is contained in:
Fred Chasen 2018-08-20 22:21:26 -07:00
parent 0da286b0a2
commit 6bfcd1e4eb
50 changed files with 1837 additions and 54 deletions

View file

@ -37,6 +37,7 @@ module.exports = {
"error", "error",
{ "vars": "all", "args": "none" } { "vars": "all", "args": "none" }
], ],
"no-mixed-spaces-and-tabs": ["error", "smart-tabs"] "no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
"valid-jsdoc": ["warn"]
} }
}; };

1
.gitignore vendored
View file

@ -8,3 +8,4 @@ books
lib lib
dist dist
documentation/html documentation/html
types/*.js

View file

@ -148,6 +148,9 @@
}); });
</script> </script>
</body> </body>

136
package-lock.json generated
View file

@ -1,6 +1,6 @@
{ {
"name": "epubjs", "name": "epubjs",
"version": "0.3.64", "version": "0.3.66",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -2519,6 +2519,15 @@
"integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
"dev": true "dev": true
}, },
"catharsis": {
"version": "0.8.9",
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz",
"integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=",
"dev": true,
"requires": {
"underscore-contrib": "~0.3.0"
}
},
"ccount": { "ccount": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz",
@ -5114,6 +5123,12 @@
"domelementtype": "1" "domelementtype": "1"
} }
}, },
"dts-dom": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/dts-dom/-/dts-dom-3.1.0.tgz",
"integrity": "sha512-DXi4f32CeSbgXZ/iPUHOCj+Sq7D5jVWPk7Sn/O+TDAn7/A0qntq9AcmQPuV8JwfGFAAfssegJhOVs6mV020AxQ==",
"dev": true
},
"duplexer": { "duplexer": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
@ -5749,7 +5764,7 @@
}, },
"event-stream": { "event-stream": {
"version": "3.3.4", "version": "3.3.4",
"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -9897,7 +9912,7 @@
"is-plain-object": { "is-plain-object": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=",
"dev": true, "dev": true,
"requires": { "requires": {
"isobject": "^3.0.1" "isobject": "^3.0.1"
@ -10110,6 +10125,15 @@
"esprima": "^4.0.0" "esprima": "^4.0.0"
} }
}, },
"js2xmlparser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz",
"integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=",
"dev": true,
"requires": {
"xmlcreate": "^1.0.1"
}
},
"jsbn": { "jsbn": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@ -10117,6 +10141,49 @@
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"jsdoc": {
"version": "3.5.5",
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz",
"integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==",
"dev": true,
"requires": {
"babylon": "7.0.0-beta.19",
"bluebird": "~3.5.0",
"catharsis": "~0.8.9",
"escape-string-regexp": "~1.0.5",
"js2xmlparser": "~3.0.0",
"klaw": "~2.0.0",
"marked": "~0.3.6",
"mkdirp": "~0.5.1",
"requizzle": "~0.2.1",
"strip-json-comments": "~2.0.1",
"taffydb": "2.6.2",
"underscore": "~1.8.3"
},
"dependencies": {
"babylon": {
"version": "7.0.0-beta.19",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz",
"integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==",
"dev": true
},
"klaw": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz",
"integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.9"
}
},
"underscore": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
"dev": true
}
}
},
"jsesc": { "jsesc": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
@ -10462,7 +10529,7 @@
"karma-chrome-launcher": { "karma-chrome-launcher": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
"integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=",
"dev": true, "dev": true,
"requires": { "requires": {
"fs-access": "^1.0.0", "fs-access": "^1.0.0",
@ -11151,6 +11218,12 @@
"integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==",
"dev": true "dev": true
}, },
"marked": {
"version": "0.3.19",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
"integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
"dev": true
},
"marks-pane": { "marks-pane": {
"version": "1.0.9", "version": "1.0.9",
"resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.9.tgz", "resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.9.tgz",
@ -14092,6 +14165,23 @@
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
"dev": true "dev": true
}, },
"requizzle": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz",
"integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=",
"dev": true,
"requires": {
"underscore": "~1.6.0"
},
"dependencies": {
"underscore": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
"integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
"dev": true
}
}
},
"resolve": { "resolve": {
"version": "1.3.3", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz",
@ -15548,6 +15638,12 @@
} }
} }
}, },
"taffydb": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
"integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
"dev": true
},
"tapable": { "tapable": {
"version": "0.2.8", "version": "0.2.8",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
@ -15892,6 +15988,15 @@
"integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==", "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==",
"dev": true "dev": true
}, },
"tsd-jsdoc": {
"version": "2.0.0-beta.6",
"resolved": "https://registry.npmjs.org/tsd-jsdoc/-/tsd-jsdoc-2.0.0-beta.6.tgz",
"integrity": "sha512-qEhk//Sn2iPiz+ZDWF+r9IiatxshVz/MyOMx9Ph1cFOr7jGj0F1xAaPWC6z+3Tg2bqCuh6h89FV2JsFax0znNw==",
"dev": true,
"requires": {
"dts-dom": "^3.1.0"
}
},
"tsscmp": { "tsscmp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz",
@ -16068,6 +16173,23 @@
"integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
"dev": true "dev": true
}, },
"underscore-contrib": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz",
"integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=",
"dev": true,
"requires": {
"underscore": "1.6.0"
},
"dependencies": {
"underscore": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
"integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
"dev": true
}
}
},
"underscore.string": { "underscore.string": {
"version": "2.3.3", "version": "2.3.3",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
@ -19101,6 +19223,12 @@
"integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
"dev": true "dev": true
}, },
"xmlcreate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz",
"integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=",
"dev": true
},
"xmldom": { "xmldom": {
"version": "0.1.27", "version": "0.1.27",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",

View file

@ -4,6 +4,7 @@
"description": "Parse and Render Epubs", "description": "Parse and Render Epubs",
"main": "lib/index.js", "main": "lib/index.js",
"module": "src/index.js", "module": "src/index.js",
"types": "types/index.d.ts",
"repository": "https://github.com/futurepress/epub.js", "repository": "https://github.com/futurepress/epub.js",
"directories": { "directories": {
"test": "test" "test": "test"
@ -49,6 +50,7 @@
"gulp-sourcemaps": "^2.6.4", "gulp-sourcemaps": "^2.6.4",
"gulp-uglify": "^3.0.0", "gulp-uglify": "^3.0.0",
"gulp-util": "^3.0.8", "gulp-util": "^3.0.8",
"jsdoc": "^3.5.5",
"jshint": "^2.9.5", "jshint": "^2.9.5",
"karma": "^1.7.1", "karma": "^1.7.1",
"karma-chrome-launcher": "^2.2.0", "karma-chrome-launcher": "^2.2.0",
@ -64,6 +66,7 @@
"portfinder": "^1.0.13", "portfinder": "^1.0.13",
"raw-loader": "^0.5.1", "raw-loader": "^0.5.1",
"serve-static": "^1.13.2", "serve-static": "^1.13.2",
"tsd-jsdoc": "^2.0.0-beta.6",
"uglify": "^0.1.5", "uglify": "^0.1.5",
"vinyl-buffer": "^1.0.1", "vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^1.1.2", "vinyl-source-stream": "^1.1.2",

View file

@ -511,7 +511,11 @@ class Contents {
this.observer.observe(this.document, config); this.observer.observe(this.document, config);
} }
imageLoadListeners(target) { /**
* Test if images are loaded or add listener for when they load
* @private
*/
imageLoadListeners() {
var images = this.document.querySelectorAll("img"); var images = this.document.querySelectorAll("img");
var img; var img;
for (var i = 0; i < images.length; i++) { for (var i = 0; i < images.length; i++) {
@ -528,7 +532,7 @@ class Contents {
* Listen for font load and check for resize when loaded * Listen for font load and check for resize when loaded
* @private * @private
*/ */
fontLoadListeners(target) { fontLoadListeners() {
if (!this.document || !this.document.fonts) { if (!this.document || !this.document.fonts) {
return; return;
} }

View file

@ -8,6 +8,7 @@ import EventEmitter from "event-emitter";
* Find Locations for a Book * Find Locations for a Book
* @param {Spine} spine * @param {Spine} spine
* @param {request} request * @param {request} request
* @param {number} [pause=100]
*/ */
class Locations { class Locations {
constructor(spine, request, pause) { constructor(spine, request, pause) {

View file

@ -1,8 +1,13 @@
import EpubCFI from "./epubcfi"; import EpubCFI from "./epubcfi";
import { nodeBounds } from "./utils/core";
/** /**
* Map text locations to CFI ranges * Map text locations to CFI ranges
* @class * @class
* @param {Layout} layout Layout to apply
* @param {string} [direction="ltr"] Text direction
* @param {string} [axis="horizontal"] vertical or horizontal axis
* @param {boolean} [dev] toggle developer highlighting
*/ */
class Mapping { class Mapping {
constructor(layout, direction, axis, dev) { constructor(layout, direction, axis, dev) {
@ -24,6 +29,10 @@ class Mapping {
/** /**
* Find CFI pairs for a page * Find CFI pairs for a page
* @param {Contents} contents Contents from view
* @param {string} cfiBase string of the base for a cfi
* @param {number} start position to start at
* @param {number} end position to end at
*/ */
page(contents, cfiBase, start, end) { page(contents, cfiBase, start, end) {
var root = contents && contents.document ? contents.document.body : false; var root = contents && contents.document ? contents.document.body : false;
@ -54,6 +63,13 @@ class Mapping {
return result; return result;
} }
/**
* Walk a node, preforming a function on each node it finds
* @private
* @param {Node} root Node to walkToNode
* @param {function} func walk function
* @return {*} returns the result of the walk function
*/
walk(root, func) { walk(root, func) {
// IE11 has strange issue, if root is text node IE throws exception on // IE11 has strange issue, if root is text node IE throws exception on
// calling treeWalker.nextNode(), saying // calling treeWalker.nextNode(), saying
@ -107,6 +123,14 @@ class Mapping {
return columns; return columns;
} }
/**
* Find Start Range
* @private
* @param {Node} root root node
* @param {number} start position to start at
* @param {number} end position to end at
* @return {Range}
*/
findStart(root, start, end){ findStart(root, start, end){
var stack = [root]; var stack = [root];
var $el; var $el;
@ -123,7 +147,7 @@ class Mapping {
var elRange; var elRange;
elPos = this.getBounds(node); elPos = nodeBounds(node);
if (this.horizontal && this.direction === "ltr") { if (this.horizontal && this.direction === "ltr") {
@ -182,6 +206,14 @@ class Mapping {
return this.findTextStartRange($prev, start, end); return this.findTextStartRange($prev, start, end);
} }
/**
* Find End Range
* @private
* @param {Node} root root node
* @param {number} start position to start at
* @param {number} end position to end at
* @return {Range}
*/
findEnd(root, start, end){ findEnd(root, start, end){
var stack = [root]; var stack = [root];
var $el; var $el;
@ -198,7 +230,7 @@ class Mapping {
var elPos; var elPos;
var elRange; var elRange;
elPos = this.getBounds(node); elPos = nodeBounds(node);
if (this.horizontal && this.direction === "ltr") { if (this.horizontal && this.direction === "ltr") {
@ -257,7 +289,14 @@ class Mapping {
return this.findTextEndRange($prev, start, end); return this.findTextEndRange($prev, start, end);
} }
/**
* Find Text Start Range
* @private
* @param {Node} root root node
* @param {number} start position to start at
* @param {number} end position to end at
* @return {Range}
*/
findTextStartRange(node, start, end){ findTextStartRange(node, start, end){
var ranges = this.splitTextNodeIntoRanges(node); var ranges = this.splitTextNodeIntoRanges(node);
var range; var range;
@ -299,6 +338,14 @@ class Mapping {
return ranges[0]; return ranges[0];
} }
/**
* Find Text End Range
* @private
* @param {Node} root root node
* @param {number} start position to start at
* @param {number} end position to end at
* @return {Range}
*/
findTextEndRange(node, start, end){ findTextEndRange(node, start, end){
var ranges = this.splitTextNodeIntoRanges(node); var ranges = this.splitTextNodeIntoRanges(node);
var prev; var prev;
@ -356,6 +403,13 @@ class Mapping {
} }
/**
* Split up a text node into ranges for each word
* @private
* @param {Node} root root node
* @param {string} [_splitter] what to split on
* @return {Range[]}
*/
splitTextNodeIntoRanges(node, _splitter){ splitTextNodeIntoRanges(node, _splitter){
var ranges = []; var ranges = [];
var textContent = node.textContent || ""; var textContent = node.textContent || "";
@ -402,7 +456,13 @@ class Mapping {
} }
/**
* Turn a pair of ranges into a pair of CFIs
* @private
* @param {string} cfiBase base string for an EpubCFI
* @param {object} rangePair { start: Range, end: Range }
* @return {object} { start: "epubcfi(...)", end: "epubcfi(...)" }
*/
rangePairToCfiPair(cfiBase, rangePair){ rangePairToCfiPair(cfiBase, rangePair){
var startRange = rangePair.start; var startRange = rangePair.start;
@ -435,18 +495,11 @@ class Mapping {
return map; return map;
} }
getBounds(node) { /**
let elPos; * Set the axis for mapping
if(node.nodeType == Node.TEXT_NODE){ * @param {string} axis horizontal | vertical
let elRange = document.createRange(); * @return {boolean} is it horizontal?
elRange.selectNodeContents(node); */
elPos = elRange.getBoundingClientRect();
} else {
elPos = node.getBoundingClientRect();
}
return elPos;
}
axis(axis) { axis(axis) {
if (axis) { if (axis) {
this.horizontal = (axis === "horizontal") ? true : false; this.horizontal = (axis === "horizontal") ? true : false;

View file

@ -78,7 +78,7 @@ class Navigation {
/** /**
* Get an item from the navigation * Get an item from the navigation
* @param {string} target * @param {string} target
* @return {object} navItems * @return {object} navItem
*/ */
get(target) { get(target) {
var index; var index;
@ -100,7 +100,7 @@ class Navigation {
* Get a landmark by type * Get a landmark by type
* List of types: https://idpf.github.io/epub-vocabs/structure/ * List of types: https://idpf.github.io/epub-vocabs/structure/
* @param {string} type * @param {string} type
* @return {object} landmarkItems * @return {object} landmarkItem
*/ */
landmark(type) { landmark(type) {
var index; var index;
@ -301,6 +301,7 @@ class Navigation {
/** /**
* Load Spine Items * Load Spine Items
* @param {object} json the items to be loaded * @param {object} json the items to be loaded
* @return {Array} navItems
*/ */
load(json) { load(json) {
return json.map(item => { return json.map(item => {

View file

@ -75,7 +75,7 @@ class Packaging {
/** /**
* Parse Metadata * Parse Metadata
* @private * @private
* @param {document} xml * @param {node} xml
* @return {object} metadata * @return {object} metadata
*/ */
parseMetadata(xml){ parseMetadata(xml){
@ -107,7 +107,7 @@ class Packaging {
/** /**
* Parse Manifest * Parse Manifest
* @private * @private
* @param {document} manifestXml * @param {node} manifestXml
* @return {object} manifest * @return {object} manifest
*/ */
parseManifest(manifestXml){ parseManifest(manifestXml){
@ -140,7 +140,8 @@ class Packaging {
/** /**
* Parse Spine * Parse Spine
* @param {document} spineXml * @private
* @param {node} spineXml
* @param {Packaging.manifest} manifest * @param {Packaging.manifest} manifest
* @return {object} spine * @return {object} spine
*/ */
@ -179,6 +180,8 @@ class Packaging {
/** /**
* Find TOC NAV * Find TOC NAV
* @private * @private
* @param {element} manifestNode
* @return {string}
*/ */
findNavPath(manifestNode){ findNavPath(manifestNode){
// Find item with property "nav" // Find item with property "nav"
@ -192,6 +195,9 @@ class Packaging {
* Find TOC NCX * Find TOC NCX
* media-type="application/x-dtbncx+xml" href="toc.ncx" * media-type="application/x-dtbncx+xml" href="toc.ncx"
* @private * @private
* @param {element} manifestNode
* @param {element} spineNode
* @return {string}
*/ */
findNcxPath(manifestNode, spineNode){ findNcxPath(manifestNode, spineNode){
// var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); // var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']");
@ -216,7 +222,8 @@ class Packaging {
* Find the Cover Path * Find the Cover Path
* <item properties="cover-image" id="ci" href="cover.svg" media-type="image/svg+xml" /> * <item properties="cover-image" id="ci" href="cover.svg" media-type="image/svg+xml" />
* Fallback for Epub 2.0 * Fallback for Epub 2.0
* @param {document} packageXml * @private
* @param {node} packageXml
* @return {string} href * @return {string} href
*/ */
findCoverPath(packageXml){ findCoverPath(packageXml){
@ -245,7 +252,7 @@ class Packaging {
/** /**
* Get text of a namespaced element * Get text of a namespaced element
* @private * @private
* @param {document} xml * @param {node} xml
* @param {string} tag * @param {string} tag
* @return {string} text * @return {string} text
*/ */
@ -268,7 +275,7 @@ class Packaging {
/** /**
* Get text by property * Get text by property
* @private * @private
* @param {document} xml * @param {node} xml
* @param {string} property * @param {string} property
* @return {string} text * @return {string} text
*/ */

View file

@ -53,7 +53,7 @@ class PageList {
/** /**
* Parse a Nav PageList * Parse a Nav PageList
* @private * @private
* @param {document} navHtml * @param {node} navHtml
* @return {PageList.item[]} list * @return {PageList.item[]} list
*/ */
parseNav(navHtml){ parseNav(navHtml){
@ -77,7 +77,7 @@ class PageList {
/** /**
* Page List Item * Page List Item
* @private * @private
* @param {object} item * @param {node} item
* @return {object} pageListItem * @return {object} pageListItem
*/ */
item(item){ item(item){
@ -128,7 +128,7 @@ class PageList {
/** /**
* Get a PageList result from a EpubCFI * Get a PageList result from a EpubCFI
* @param {string} cfi EpubCFI String * @param {string} cfi EpubCFI String
* @return {string} page * @return {number} page
*/ */
pageFromCfi(cfi){ pageFromCfi(cfi){
var pg = -1; var pg = -1;
@ -165,7 +165,7 @@ class PageList {
/** /**
* Get an EpubCFI from a Page List Item * Get an EpubCFI from a Page List Item
* @param {string} pg * @param {string | number} pg
* @return {string} cfi * @return {string} cfi
*/ */
cfiFromPage(pg){ cfiFromPage(pg){
@ -188,7 +188,7 @@ class PageList {
/** /**
* Get a Page from Book percentage * Get a Page from Book percentage
* @param {number} percent * @param {number} percent
* @return {string} page * @return {number} page
*/ */
pageFromPercentage(percent){ pageFromPercentage(percent){
var pg = Math.round(this.totalPages * percent); var pg = Math.round(this.totalPages * percent);
@ -197,7 +197,7 @@ class PageList {
/** /**
* Returns a value between 0 - 1 corresponding to the location of a page * Returns a value between 0 - 1 corresponding to the location of a page
* @param {int} pg the page * @param {number} pg the page
* @return {number} percentage * @return {number} percentage
*/ */
percentageFromPage(pg){ percentageFromPage(pg){
@ -216,6 +216,9 @@ class PageList {
return percentage; return percentage;
} }
/**
* Destroy
*/
destroy() { destroy() {
this.pages = undefined; this.pages = undefined;
this.locations = undefined; this.locations = undefined;

View file

@ -839,7 +839,7 @@ class Rendition {
/** /**
* Pass the events from a view's Contents * Pass the events from a view's Contents
* @private * @private
* @param {View} view * @param {Contents} view contents
*/ */
passEvents(contents){ passEvents(contents){
var listenedEvents = Contents.listenedEvents; var listenedEvents = Contents.listenedEvents;

View file

@ -9,10 +9,10 @@ import path from "path-webpack";
* Handle Package Resources * Handle Package Resources
* @class * @class
* @param {Manifest} manifest * @param {Manifest} manifest
* @param {[object]} options * @param {object} [options]
* @param {[string="base64"]} options.replacements * @param {string} [options.replacements="base64"]
* @param {[Archive]} options.archive * @param {Archive} [options.archive]
* @param {[method]} options.resolver * @param {method} [options.resolver]
*/ */
class Resources { class Resources {
constructor(manifest, options) { constructor(manifest, options) {
@ -93,6 +93,11 @@ class Resources {
} }
/**
* Create a url to a resource
* @param {string} url
* @return {Promise<string>} Promise resolves with url string
*/
createUrl (url) { createUrl (url) {
var parsedUrl = new Url(url); var parsedUrl = new Url(url);
var mimeType = mime.lookup(parsedUrl.filename); var mimeType = mime.lookup(parsedUrl.filename);
@ -239,7 +244,7 @@ class Resources {
/** /**
* Resolve all resources URLs relative to an absolute URL * Resolve all resources URLs relative to an absolute URL
* @param {string} absolute to be resolved to * @param {string} absolute to be resolved to
* @param {[resolver]} resolver * @param {resolver} [resolver]
* @return {string[]} array with relative Urls * @return {string[]} array with relative Urls
*/ */
relativeTo(absolute, resolver){ relativeTo(absolute, resolver){

View file

@ -40,7 +40,7 @@ class Section {
/** /**
* Load the section from its url * Load the section from its url
* @param {method} _request a request method to use for loading * @param {method} [_request] a request method to use for loading
* @return {document} a promise with the xml document * @return {document} a promise with the xml document
*/ */
load(_request){ load(_request){
@ -81,7 +81,7 @@ class Section {
/** /**
* Render the contents of a section * Render the contents of a section
* @param {method} _request a request method to use for loading * @param {method} [_request] a request method to use for loading
* @return {string} output a serialized XML Document * @return {string} output a serialized XML Document
*/ */
render(_request){ render(_request){
@ -176,15 +176,15 @@ class Section {
/** /**
* Reconciles the current chapters layout properies with * Reconciles the current chapters layout properies with
* the global layout properities. * the global layout properities.
* @param {object} global The globa layout settings object, chapter properties string * @param {object} globalLayout The global layout settings object, chapter properties string
* @return {object} layoutProperties Object with layout properties * @return {object} layoutProperties Object with layout properties
*/ */
reconcileLayoutSettings(global){ reconcileLayoutSettings(globalLayout){
//-- Get the global defaults //-- Get the global defaults
var settings = { var settings = {
layout : global.layout, layout : globalLayout.layout,
spread : global.spread, spread : globalLayout.spread,
orientation : global.orientation orientation : globalLayout.orientation
}; };
//-- Get the chapter's display type //-- Get the chapter's display type

View file

@ -34,8 +34,9 @@ class Spine {
/** /**
* Unpack items from a opf into spine items * Unpack items from a opf into spine items
* @param {Package} _package * @param {Packaging} _package
* @param {method} resolver URL resolver * @param {method} resolver URL resolver
* @param {method} canonical Resolve canonical url
*/ */
unpack(_package, resolver, canonical) { unpack(_package, resolver, canonical) {
@ -112,7 +113,7 @@ class Spine {
/** /**
* Get an item from the spine * Get an item from the spine
* @param {string|int} [target] * @param {string|number} [target]
* @return {Section} section * @return {Section} section
* @example spine.get(); * @example spine.get();
* @example spine.get(1); * @example spine.get(1);
@ -214,6 +215,10 @@ class Spine {
return this.spineItems.forEach.apply(this.spineItems, arguments); return this.spineItems.forEach.apply(this.spineItems, arguments);
} }
/**
* Find the first Section in the Spine
* @return {Section} first section
*/
first() { first() {
let index = 0; let index = 0;
@ -227,6 +232,10 @@ class Spine {
} while (index < this.spineItems.length) ; } while (index < this.spineItems.length) ;
} }
/**
* Find the last Section in the Spine
* @return {Section} last section
*/
last() { last() {
let index = this.spineItems.length-1; let index = this.spineItems.length-1;

View file

@ -66,6 +66,10 @@ class Themes {
} }
} }
/**
* Register themes object
* @param {object} themes
*/
registerThemes (themes) { registerThemes (themes) {
for (var theme in themes) { for (var theme in themes) {
if (themes.hasOwnProperty(theme)) { if (themes.hasOwnProperty(theme)) {
@ -78,6 +82,11 @@ class Themes {
} }
} }
/**
* Register a url
* @param {string} name
* @param {string} input
*/
registerUrl (name, input) { registerUrl (name, input) {
var url = new Url(input); var url = new Url(input);
this._themes[name] = { "url": url.toString() }; this._themes[name] = { "url": url.toString() };
@ -86,6 +95,11 @@ class Themes {
} }
} }
/**
* Register rule
* @param {string} name
* @param {object} rules
*/
registerRules (name, rules) { registerRules (name, rules) {
this._themes[name] = { "rules": rules }; this._themes[name] = { "rules": rules };
// TODO: serialize css rules // TODO: serialize css rules
@ -94,6 +108,10 @@ class Themes {
} }
} }
/**
* Select a theme
* @param {string} name
*/
select (name) { select (name) {
var prev = this._current; var prev = this._current;
var contents; var contents;
@ -108,6 +126,10 @@ class Themes {
}); });
} }
/**
* Update a theme
* @param {string} name
*/
update (name) { update (name) {
var contents = this.rendition.getContents(); var contents = this.rendition.getContents();
contents.forEach( (content) => { contents.forEach( (content) => {
@ -115,6 +137,10 @@ class Themes {
}); });
} }
/**
* Inject all themes into contents
* @param {Contents} contents
*/
inject (contents) { inject (contents) {
var links = []; var links = [];
var themes = this._themes; var themes = this._themes;
@ -135,6 +161,11 @@ class Themes {
} }
} }
/**
* Add Theme to contents
* @param {string} name
* @param {Contents} contents
*/
add (name, contents) { add (name, contents) {
var theme = this._themes[name]; var theme = this._themes[name];
@ -152,6 +183,12 @@ class Themes {
} }
} }
/**
* Add override
* @param {string} name
* @param {string} value
* @param {boolean} priority
*/
override (name, value, priority) { override (name, value, priority) {
var contents = this.rendition.getContents(); var contents = this.rendition.getContents();
@ -165,6 +202,10 @@ class Themes {
}); });
} }
/**
* Add all overrides
* @param {Content} content
*/
overrides (contents) { overrides (contents) {
var overrides = this._overrides; var overrides = this._overrides;

View file

@ -48,6 +48,7 @@ export function documentHeight() {
/** /**
* Checks if a node is an element * Checks if a node is an element
* @param {object} obj
* @returns {boolean} * @returns {boolean}
* @memberof Core * @memberof Core
*/ */
@ -56,6 +57,7 @@ export function isElement(obj) {
} }
/** /**
* @param {any} n
* @returns {boolean} * @returns {boolean}
* @memberof Core * @memberof Core
*/ */
@ -64,6 +66,7 @@ export function isNumber(n) {
} }
/** /**
* @param {any} n
* @returns {boolean} * @returns {boolean}
* @memberof Core * @memberof Core
*/ */
@ -83,6 +86,7 @@ export function isFloat(n) {
/** /**
* Get a prefixed css property * Get a prefixed css property
* @param {string} unprefixed
* @returns {string} * @returns {string}
* @memberof Core * @memberof Core
*/ */
@ -296,6 +300,26 @@ export function borders(el) {
} }
/**
* Find the bounds of any node
* allows for getting bounds of text nodes by wrapping them in a range
* @param {node} node
* @returns {BoundingClientRect}
* @memberof Core
*/
export function nodeBounds(node) {
let elPos;
let doc = node.ownerDocument;
if(node.nodeType == Node.TEXT_NODE){
let elRange = doc.createRange();
elRange.selectNodeContents(node);
elPos = elRange.getBoundingClientRect();
} else {
elPos = node.getBoundingClientRect();
}
return elPos;
}
/** /**
* Find the equivelent of getBoundingClientRect of a browser window * Find the equivelent of getBoundingClientRect of a browser window
* @returns {{ width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number }} * @returns {{ width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number }}
@ -319,7 +343,9 @@ export function windowBounds() {
/** /**
* Gets the index of a node in its parent * Gets the index of a node in its parent
* @private * @param {Node} node
* @param {string} typeId
* @return {number} index
* @memberof Core * @memberof Core
*/ */
export function indexOfNode(node, typeId) { export function indexOfNode(node, typeId) {
@ -509,7 +535,7 @@ export function qsa(el, sel) {
* querySelector by property * querySelector by property
* @param {element} el * @param {element} el
* @param {string} sel selector string * @param {string} sel selector string
* @param {props[]} props * @param {object[]} props
* @returns {element[]} elements * @returns {element[]} elements
* @memberof Core * @memberof Core
*/ */
@ -558,6 +584,13 @@ export function sprint(root, func) {
} }
} }
/**
* Create a treeWalker
* @memberof Core
* @param {element} root element to start with
* @param {function} func function to run on each element
* @param {function | object} filter funtion or object to filter with
*/
export function treeWalker(root, func, filter) { export function treeWalker(root, func, filter) {
var treeWalker = document.createTreeWalker(root, filter, null, false); var treeWalker = document.createTreeWalker(root, filter, null, false);
let node; let node;

53
types/annotations.d.ts vendored Normal file
View file

@ -0,0 +1,53 @@
import Rendition from "./rendition";
import View from "./managers/view";
export default class Annotations {
constructor(rendition: Rendition);
add(type: string, cfiRange: string, data?: object, cb?: Function, className?: string, styles?: object): Annotation;
remove(cfiRange: string, type: string): void;
highlight(cfiRange: string, data?: object, cb?: Function, className?: string, styles?: object): void;
underline(cfiRange: string, data?: object, cb?: Function, className?: string, styles?: object): void;
mark(cfiRange: string, data?: object, cb?: Function): void;
each(): Array<Annotation>
private _removeFromAnnotationBySectionIndex(sectionIndex: number, hash: string): void;
private _annotationsAt(index: number): void;
private inject(view: View): void;
private clear(view: View): void;
}
declare class Annotation {
constructor(options: {
type: string,
cfiRange: string,
data?: object,
sectionIndex?: number,
cb?: Function,
className?: string,
styles?: object
});
update(data: object): void;
attach(view: View): any;
detach(view: View): any;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
}

27
types/archive.d.ts vendored Normal file
View file

@ -0,0 +1,27 @@
import JSZip = require('jszip');
export default class Archive {
constructor();
open(input: BinaryType, isBase64?: boolean): Promise<JSZip>;
openUrl(zipUrl: string, isBase64?: boolean): Promise<JSZip>;
request(url: string, type?: string): Promise<Blob | string | JSON | Document | XMLDocument>;
getBlob(url: string, mimeType?: string): Promise<Blob>;
getText(url: string): Promise<string>;
getBase64(url: string, mimeType?: string): Promise<string>;
createUrl(url: string, options: { base64: boolean }): Promise<string>;
revokeUrl(url: string): void;
destroy(): void;
private checkRequirements(): void;
private handleResponse(response: any, type?: string): Blob | string | JSON | Document | XMLDocument;
}

116
types/book.d.ts vendored Normal file
View file

@ -0,0 +1,116 @@
import {
PackagingManifestObject,
PackagingMetadataObject,
PackagingSpineItem,
PackagingObject
} from "./packaging";
import Rendition, { RenditionOptions } from "./rendition";
import Section, { SpineItem } from "./section";
import Archive from "./archive";
import Navigation from "./navigation";
import PageList, {PageListItem} from "./pagelist";
import Spine from "./spine";
import Locations from "./locations";
import Url from "./utils/url";
import Path from "./utils/path";
import Resources from "./resources";
import Container from "./container";
import Packaging from "./packaging";
export interface BookOptions {
requestMethod?: (url: string, type: string, withCredentials: object, headers: object) => Promise<object>;
requestCredentials?: object,
requestHeaders?: object,
encoding?: string,
replacements?: string,
canonical?: (path: string) => string,
openAs?: string
}
export default class Book {
constructor(url: string, options?: BookOptions);
constructor(options?: BookOptions);
settings: BookOptions;
opening: any; // should be core.defer
opened: Promise<void>
isOpen: boolean;
loaded: {
metadata: Promise<PackagingMetadataObject>,
spine: Promise<SpineItem[]>,
manifest: Promise<PackagingManifestObject>,
cover: Promise<string>,
navigation: Promise<Navigation>,
pageList: Promise<PageListItem[]>,
resources: Promise<string[]>,
}
ready: Promise<void>;
request: Function;
spine: Spine;
locations: Locations;
navigation: Navigation;
pageList: PageList;
url: Url;
path: Path;
archived: boolean;
archive: Archive;
resources: Resources;
rendition: Rendition
container: Container;
packaging: Packaging;
canonical(path: string): string;
coverUrl(): string;
destroy(): void;
determineType(input: string): string;
getRange(cfiRange: string): Range;
key(identifier: string): string;
load(path: string): Promise<object>;
loadNavigation(opf: XMLDocument): Promise<Navigation>;
open(input: string, what?: string): Promise<object>;
open(input: ArrayBuffer, what?: string): Promise<object>;
openContainer(url: string): Promise<string>;
openEpub(data: BinaryType, encoding?: string): Promise<Book>;
openManifest(url: string): Promise<Book>;
openPackaging(url: string): Promise<Book>;
renderTo(element: Element, options?: RenditionOptions): Rendition;
renderTo(element: string, options?: RenditionOptions): Rendition;
private replacements(): Promise<void>;
resolve(path: string, absolute?: boolean): string;
section(target: string): Section;
section(target: number): Section;
setRequestCredentials(credentials: object): void;
setRequestHeaders(headers: object): void;
unarchive(input: BinaryType, encoding?: string): Promise<Archive>;
unpack(opf: XMLDocument): Promise<Book>;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
}

7
types/container.d.ts vendored Normal file
View file

@ -0,0 +1,7 @@
export default class Container {
constructor(containerDocument: Document);
parse(containerDocument: Document): void;
destroy(): void;
}

137
types/contents.d.ts vendored Normal file
View file

@ -0,0 +1,137 @@
import EpubCFI from "./epubcfi";
export interface ViewportSettings {
width: string,
height: string,
scale: string,
scalable: string,
minimum: string,
maximum: string
}
export default class Contents {
constructor(doc: Document, content: Element, cfiBase: string, sectionIndex: number);
epubcfi: EpubCFI;
document: Document;
documentElement: Element;
content: Element;
window: Window;
sectionIndex: number;
cfiBase: string;
static listenedEvents: string[];
addClass(className: string): void;
addScript(src: string): Promise<boolean>;
addStylesheet(src: string): Promise<boolean>;
addStylesheetRules(rules: Array<object> | object): Promise<boolean>;
cfiFromNode(node: Node, ignoreClass?: string): string;
cfiFromRange(range: Range, ignoreClass?: string): string;
columns(width: number, height: number, columnWidth: number, gap: number): void;
contentHeight(h: number): number;
contentWidth(w: number): number;
css(property: string, value: string, priority?: boolean): string;
destroy(): void;
direction(dir: string): void;
fit(width: number, height: number): void;
height(h: number): number;
locationOf(target: string | EpubCFI, ignoreClass?: string): Promise<{ top: number, left: number }>;
map(layout: any): any;
mapPage(cfiBase: string, layout: object, start: number, end: number, dev: boolean): any;
overflow(overflow: string): string;
overflowX(overflow: string): string;
overflowY(overflow: string): string;
range(cfi: string, ignoreClass?: string): Range;
removeClass(className: any): void;
root(): Element;
scaler(scale: number, offsetX: number, offsetY: number): void;
scrollHeight(): number;
scrollWidth(): number;
size(width: number, height: number): void;
textHeight(): number;
textWidth(): number;
viewport(options: ViewportSettings): ViewportSettings;
width(w: number): number;
writingMode(mode: string): string;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
private addEventListeners(): void;
private addSelectionListeners(): void;
private epubReadingSystem(name: string, version: string): object;
private expand(): void;
private fontLoadListeners(): void;
private imageLoadListeners(): void;
private layoutStyle(style: string): string;
private linksHandler(): void;
private listeners(): void;
private mediaQueryListeners(): void;
private onSelectionChange(e: Event): void;
private removeEventListeners(): void;
private removeListeners(): void;
private removeSelectionListeners(): void;
private resizeCheck(): void;
private resizeListeners(): void;
private resizeObservers(): void;
private transitionListeners(): void;
private triggerEvent(e: Event): void;
private triggerSelectedEvent(selection: Selection): void;
}

83
types/core.d.ts vendored Normal file
View file

@ -0,0 +1,83 @@
export module Core {
export function uuid(): string;
export function documentHeight(): number;
export function isElement(obj: object): boolean;
export function isNumber(n: any): boolean;
export function isFloat(n: any): boolean;
export function prefixed(unprefixed: string): string;
export function defaults(obj: object): object;
export function extend(target: object): object;
export function insert(item: any, array: Array<any>, compareFunction: Function): number;
export function locationOf(item: any, array: Array<any>, compareFunction: Function, _start: Function, _end: Function): number;
export function indexOfSorted(item: any, array: Array<any>, compareFunction: Function, _start: Function, _end: Function): number;
export function bounds(el: Element): { width: Number, height: Number};
export function borders(el: Element): { width: Number, height: Number};
export function nodeBounds(node: Node): object;
export function windowBounds(): { width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number };
export function indexOfNode(node: Node, typeId: string): number;
export function indexOfTextNode(textNode: Node): number;
export function indexOfElementNode(elementNode: Element): number;
export function isXml(ext: string): boolean;
export function createBlob(content: any, mime: string): Blob;
export function createBlobUrl(content: any, mime: string): string;
export function revokeBlobUrl(url: string): void;
export function createBase64Url(content: any, mime: string): string
export function type(obj: object): string;
export function parse(markup: string, mime: string, forceXMLDom: boolean): Document;
export function qs(el: Element, sel: string): Element;
export function qsa(el: Element, sel: string): ArrayLike<Element>;
export function qsp(el: Element, sel: string, props: Array<object>): ArrayLike<Element>;
export function sprint(root: Node, func: Function): void;
export function treeWalker(root: Node, func: Function, filter: object | Function): void;
export function walk(node: Node, callback: Function): void;
export function blob2base64(blob: Blob): string;
export function defer(): Promise<any>;
export function querySelectorByType(html: Element, element: string, type: string): Array<Element>;
export function findChildren(el: Element): Array<Element>;
export function parents(node: Element): Array<Element>;
export function filterChildren(el: Element, nodeName: string, single: boolean): Array<Element>;
export function getParentByTagName(node: Element, tagname: string): Array<Element>;
export class RangeObject extends Range {
}
}

6
types/epub.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import Book, { BookOptions } from "./book";
export default Epub;
declare function Epub(url: string, options?: BookOptions) : Book;
declare function Epub(options?: BookOptions) : Book;

85
types/epubcfi.d.ts vendored Normal file
View file

@ -0,0 +1,85 @@
interface EpubCFISegment {
steps: Array<object>,
terminal: {
offset: number,
assertion: string
}
}
interface EpubCFIStep {
id: string,
tagName: string,
type: number,
index: number
}
export default class EpubCFI {
constructor(cfiFrom?: string | Range | Node, base?: string | object, ignoreClass?: string);
isCfiString(str: string): boolean;
fromNode(anchor: Node, base: string | object, ignoreClass?: string): EpubCFI;
fromRange(range: Range, base: string | object, ignoreClass?: string): EpubCFI;
parse(cfiStr: string): EpubCFI;
collapse(toStart?: boolean): void;
compare(cfiOne: string | EpubCFI, cfiTwo: string | EpubCFI): number;
equalStep(stepA: object, stepB: object): boolean;
filter(anchor: Element, ignoreClass?: string): Element | false;
toRange(_doc?: Document, ignoreClass?: string): Range;
toString(): string;
private filteredStep(node: Node, ignoreClass?: string): any;
private findNode(steps: Array<EpubCFIStep>, _doc?: Document, ignoreClass?: string): Node;
private fixMiss(steps: Array<EpubCFIStep>, offset: number, _doc?: Document, ignoreClass?: string): any;
private checkType(cfi: string | Range | Node): string | false;
private generateChapterComponent(_spineNodeIndex: number, _pos: number, id: string): string;
private getChapterComponent(cfiStr: string): string;
private getCharecterOffsetComponent(cfiStr: string): string;
private getPathComponent(cfiStr: string): string;
private getRange(cfiStr: string): string;
private joinSteps(steps: Array<EpubCFIStep>): Array<EpubCFIStep>;
private normalizedMap(children: Array<Node>, nodeType: number, ignoreClass?: string): object;
private parseComponent(componentStr: string): object;
private parseStep(stepStr: string): object;
private parseTerminal(termialStr: string): object;
private patchOffset(anchor: Node, offset: number, ignoreClass?: string): number;
private pathTo(node: Node, offset: number, ignoreClass?: string): EpubCFISegment;
private position(anchor: Node): number;
private segmentString(segment: EpubCFISegment): string;
private step(node: Node): EpubCFIStep;
private stepsToQuerySelector(steps: Array<EpubCFIStep>): string;
private stepsToXpath(steps: Array<EpubCFIStep>): string;
private textNodes(container: Node, ignoreClass?: string): Array<Node>;
private walkToNode(steps: Array<EpubCFIStep>, _doc?: Document, ignoreClass?: string): Node;
}

9
types/epubjs-tests.ts Normal file
View file

@ -0,0 +1,9 @@
import ePub, { Book } from '../';
function testEpub() {
const epub = ePub("https://s3.amazonaws.com/moby-dick/moby-dick.epub");
const book = new Book("https://s3.amazonaws.com/moby-dick/moby-dick.epub", {});
}
testEpub();

19
types/index.d.ts vendored Normal file
View file

@ -0,0 +1,19 @@
// Type definitions for epubjs 0.3
// Project: https://github.com/futurepress/epub.js#readme
// Definitions by: Fred Chasen <https://github.com/fchasen>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
import Epub from "./epub";
export as namespace ePub;
export default Epub;
export { default as Book } from './book';
export { default as EpubCFI } from './epubcfi';
export { default as Rendition } from './rendition';
export { default as Contents } from './contents';
export { default as Layout } from './layout';
declare namespace ePub {
}

48
types/layout.d.ts vendored Normal file
View file

@ -0,0 +1,48 @@
import Contents from "./contents";
interface LayoutSettings {
layout: string,
spread: string,
minSpreadWidth: number,
evenSpreads: boolean
}
export default class Layout {
constructor(settings: LayoutSettings);
settings: LayoutSettings;
name: string;
props: {
name: string,
spread: string,
flow: string,
width: number,
height: number,
spreadWidth: number,
delta: number,
columnWidth: number,
gap: number,
divisor: number
};
flow(flow: string): string;
spread(spread: string, min: number): boolean;
calculate(_width:number, _height:number, _gap?:number): void;
format(contents: Contents): void | Promise<void>;
count(totalLength: number, pageLength: number): {spreads: Number, pages: Number};
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
private update(props: object): void;
}

41
types/locations.d.ts vendored Normal file
View file

@ -0,0 +1,41 @@
import Spine from "./spine";
import Section from "./section";
import EpubCFI from "./epubcfi";
export default class Locations {
constructor(spine: Spine, request?: Function, pause?: number);
generate(chars: number): object;
process(section: Section): Promise<Array<string>>;
locationFromCfi(cfi: string | EpubCFI): Location;
percentageFromCfi(cfi: string | EpubCFI): number;
percentageFromLocation(loc: number): number;
cfiFromLocation(loc: number): string;
cfiFromPercentage(percentage: number): string;
load(locations: JSON): Array<string>;
save(): JSON;
currentLocation(): Location;
currentLocation(curr: string | number): void;
length(): number;
destroy(): void;
private createRange(): {
startContainer: Element,
startOffset: number,
endContainer: Element,
endOffset: number
};
private parse(contents: Node, cfiBase: string, chars: number) : Array<string>;
}

90
types/managers/manager.d.ts vendored Normal file
View file

@ -0,0 +1,90 @@
import Section from "../section";
import Layout from "../layout";
import Contents from "../contents";
import View, { ViewSettings } from "./view";
import { EpubCFIPair } from "../mapping";
export interface ViewLocation {
index: number,
href: string,
pages: number[],
totalPages: number,
mapping: EpubCFIPair
}
export interface ManagerOptions extends ViewSettings {
infinite?: boolean,
overflow?: string,
[key: string]: any
}
export default class Manager {
constructor(options: object);
render(element: Element, size?: { width: Number, height: Number }): void;
resize(width: Number, height: Number): void;
onOrientationChange(e: Event): void;
private createView(section: Section): View;
display(section: Section, target: string | number): Promise<void>;
private afterDisplayed(view: View): void;
private afterResized(view: View): void;
private moveTo(offset: {top: Number, left: Number}): void;
private append(section: Section): Promise<void>;
private prepend(section: Section): Promise<void>;
next(): Promise<void>;
prev(): Promise<void>;
current(): View;
clear(): void;
currentLocation(): ViewLocation[];
visible(): View[];
private scrollBy(x: number, y: number, silent: boolean): void;
private scrollTo(x: number, y: number, silent: boolean): void;
private onScroll(): void;
bounds(): object;
applyLayout(layout: Layout): void;
updateLayout(): void;
setLayout(layout: Layout): void;
updateAxis(axis: string, forceUpdate: boolean): void;
updateFlow(flow: string): void;
getContents(): Contents[];
direction(dir: string): void;
isRendered(): boolean;
destroy(): void;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
}

79
types/managers/view.d.ts vendored Normal file
View file

@ -0,0 +1,79 @@
import Section from "../section";
import Contents from "../contents";
import Layout from "../layout";
export interface ViewSettings {
ignoreClass?: string,
axis?: string,
flow?: string,
layout?: Layout,
method?: string,
width?: number,
height?: number,
forceEvenPages?: boolean
}
export default class View {
constructor(section: Section, options: ViewSettings);
create(): any;
render(request?: Function, show?: boolean): Promise<void>;
reset(): void;
size(_width: Number, _height: Number): void;
load(content: Contents): Promise<any>;
setLayout(layout: Layout): void;
setAxis(axis: string): void;
display(request?: Function): Promise<any>;
show(): void;
hide(): void;
offset(): { top: Number, left: Number };
width(): Number;
height(): Number;
position(): object;
locationOf(target: string): { top: Number, left: Number };
onDisplayed(view: View): void;
onResize(view: View): void;
bounds(force?: boolean): object;
highlight(cfiRange: string, data?: object, cb?: Function, className?: string, styles?: object): void;
underline(cfiRange: string, data?: object, cb?: Function, className?: string, styles?: object): void;
mark(cfiRange: string, data?: object, cb?: Function): void;
unhighlight(cfiRange: string): void;
ununderline(cfiRange: string): void;
unmark(cfiRange: string): void;
destroy(): void;
private onLoad(event: Event, promise: Promise<any>): void;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
}

34
types/mapping.d.ts vendored Normal file
View file

@ -0,0 +1,34 @@
import Layout from "./layout";
import Contents from "./contents";
export interface EpubCFIPair {
start: string,
end: string
}
export interface RangePair {
start: Range,
end: Range
}
export default class Mapping {
constructor(layout: Layout, direction?: string, axis?: string, dev?: boolean);
page(contents: Contents, cfiBase: string, start: number, end: number): EpubCFIPair;
axis(axis: string): boolean;
private walk(root: Node, func: Function);
private findStart(root: Node, start: number, end: number): Range;
private findEnd(root: Node, start: number, end: number): Range;
private findTextStartRange(node: Node, start: number, end: number): Range;
private findTextEndRange(node: Node, start: number, end: number): Range;
private splitTextNodeIntoRanges(node: Node, _splitter?: string): Array<Range>;
private rangePairToCfiPair(cfiBase: string, rangePair: RangePair): EpubCFIPair;
}

41
types/navigation.d.ts vendored Normal file
View file

@ -0,0 +1,41 @@
export interface NavItem {
id?: string,
href?: string,
label?: string,
subitems?: Array<NavItem>,
parent?: NavItem
}
export interface LandmarkItem {
href?: string,
label?: string,
type?: string
}
export default class Navigation {
constructor(xml: XMLDocument);
parse(xml: XMLDocument): void;
get(target: string) : NavItem;
landmark(type: string) : LandmarkItem;
load(json: JSON): Array<NavItem>;
forEach(fn: (item: NavItem) => {}): any;
private unpack(toc: Array<NavItem>): void;
private parseNav(navHtml: XMLDocument): Array<NavItem>;
private navItem(item: Element): NavItem;
private parseLandmarks(navHtml: XMLDocument): Array<LandmarkItem>;
private landmarkItem(item: Element): LandmarkItem;
private parseNcx(navHtml: XMLDocument): Array<NavItem>;
private ncxItem(item: Element): NavItem;
}

69
types/packaging.d.ts vendored Normal file
View file

@ -0,0 +1,69 @@
import { SpineItem } from "./section";
export interface PackagingObject {
metadata: PackagingMetadataObject,
spine: Array<SpineItem>,
manifest: PackagingManifestObject,
navPath: string,
ncxPath: string,
coverPath: string,
spineNodeIndex: number
}
export interface PackagingMetadataObject {
title: string,
creator: string,
description: string,
pubdate: string,
publisher: string,
identifier: string,
language: string,
rights: string,
modified_date: string,
layout: string,
orientation: string,
flow: string,
viewport: string
}
export interface PackagingSpineItem {
idref: string,
properties: Array<string>,
index: number
}
export interface PackagingManifestItem {
href: string,
type: string,
properties: Array<string>
}
export interface PackagingManifestObject {
[key: string]: PackagingManifestItem
}
export default class Packaging {
constructor(packageDocument: XMLDocument);
parse(packageDocument: XMLDocument): PackagingObject;
load(json: JSON): PackagingObject;
destroy(): void;
private parseMetadata(xml: Node): PackagingMetadataObject;
private parseManifest(xml: Node): PackagingManifestObject;
private parseSpine(xml: Node, manifest: PackagingManifestObject): Array<PackagingSpineItem>;
private findNavPath(manifestNode: Node): string | false;
private findNcxPath(manifestNode: Node, spineNode: Node): string | false;
private findCoverPath(packageXml: Node): string;
private getElementText(xml: Node, tag: string): string
private getPropertyText(xml: Node, property: string): string
}

29
types/pagelist.d.ts vendored Normal file
View file

@ -0,0 +1,29 @@
export interface PageListItem {
href: string,
page: string,
cfi?: string,
packageUrl?: string
}
export default class Pagelist {
constructor(xml: XMLDocument);
parse(xml: XMLDocument): Array<PageListItem>;
pageFromCfi(cfi: string): number;
cfiFromPage(pg: string | number): string;
pageFromPercentage(percent: number): number;
percentageFromPage(pg: number): number;
destroy(): void;
private parseNav(navHtml: Node): Array<PageListItem>;
private item(item: Node): PageListItem;
private process(pageList: Array<PageListItem>): void;
}

145
types/rendition.d.ts vendored Normal file
View file

@ -0,0 +1,145 @@
import Book from "./book";
import Contents from "./contents";
import Section from "./section";
import View from "./managers/view";
import Hook from "./utils/hook";
import Themes from "./themes";
import EpubCFI from "./epubcfi";
import Annotations from "./annotations";
import Queue from "./utils/queue";
export interface RenditionOptions {
width?: number,
height?: number,
ignoreClass?: string,
manager?: string | Function | object,
view?: string | Function | object,
layout?: string,
spread?: string,
minSpreadWidth?: number,
stylesheet?: string,
script?: string
}
export interface DisplayedLocation {
index: number,
href: string,
cfi: string,
displayed: {
page: number,
total: number
}
}
export interface Location {
start: DisplayedLocation,
end: DisplayedLocation,
atStart: boolean,
atEnd: boolean
}
export default class Rendition {
constructor(book: Book, options: RenditionOptions);
settings: RenditionOptions;
book: Book;
hooks: {
display: Hook,
serialize: Hook,
content: Hook,
unloaded: Hook,
layout: Hook,
render: Hook,
show: Hook
}
themes: Themes;
annotations: Annotations;
epubcfi: EpubCFI;
q: Queue;
location: Location;
started: Promise<void>;
adjustImages(contents: Contents): Promise<void>;
attachTo(element: Element): Promise<void>;
clear(): void;
currentLocation(): DisplayedLocation;
currentLocation(): Promise<DisplayedLocation>;
destroy(): void;
determineLayoutProperties(metadata: object): object;
direction(dir: string): void;
display(target?: string): Promise<void>;
display(target?: number): Promise<void>;
flow(flow: string): void;
getContents(): Contents;
getRange(cfi: string, ignoreClass?: string): Range;
handleLinks(contents: Contents): void;
injectIdentifier(doc: Document, section: Section): void;
injectScript(doc: Document, section: Section): void;
injectStylesheet(doc: Document, section: Section): void;
layout(settings: any): any;
located(location: Location): DisplayedLocation;
moveTo(offset: number): void;
next(): Promise<void>;
onOrientationChange(orientation: string): void;
passEvents(contents: Contents): void;
prev(): Promise<void>;
reportLocation(): Promise<void>;
requireManager(manager: string | Function | object): any;
requireView(view: string | Function | object): any;
resize(width: number, height: number): void;
setManager(manager: Function): void;
spread(spread: string, min?: number): void;
start(): void;
views(): Array<View>;
// Event emitters
emit(type: any, ...args: any[]): void;
off(type: any, listener: any): any;
on(type: any, listener: any): any;
once(type: any, listener: any, ...args: any[]): any;
private triggerMarkEvent(cfiRange: string, data: object, contents: Contents): void;
private triggerSelectedEvent(cfirange: string, contents: Contents): void;
private triggerViewEvent(e: Event, contents: Contents): void;
private onResized(size: { width: number, height: number }): void;
private afterDisplayed(view: any): void;
private afterRemoved(view: any): void;
}

31
types/resources.d.ts vendored Normal file
View file

@ -0,0 +1,31 @@
import { PackagingManifestObject } from "./packaging";
import Archive from "./archive";
export default class Resources {
constructor(manifest: PackagingManifestObject, options: {
replacements?: string,
archive?: Archive,
resolver?: Function,
request?: Function
});
createUrl(url: string): Promise<string>;
replacements(): Promise<Array<string>>;
relativeTo(absolute: boolean, resolver?: Function): Array<string>;
get(path: string): string;
substitute(content: string, url?: string): string;
destroy(): void;
private split(): void;
private splitUrls(): void;
private replaceCss(archive: Archive, resolver?: Function): Promise<Array<string>>;
private createCssFile(href: string): Promise<string>;
}

64
types/section.d.ts vendored Normal file
View file

@ -0,0 +1,64 @@
import { HooksObject } from "./utils/hook";
export interface GlobalLayout {
layout: string,
spread: string,
orientation: string
}
export interface LayoutSettings {
layout: string,
spread: string,
orientation: string
}
export interface SpineItem {
index: number,
cfiBase: string,
href?: string,
url?: string,
canonical?: string,
properties?: Array<string>,
linear?: string,
next: () => SpineItem,
prev: () => SpineItem,
}
export default class Section {
constructor(item: SpineItem, hooks: HooksObject);
idref: string;
linear: string;
properties: Array<string>;
index: number;
href: string;
url: string;
canonical: string;
next: () => SpineItem;
prev: () => SpineItem;
cfiBase: string;
document: Document;
contents: Element;
output: string;
hooks: HooksObject;
load(_request?: Function): Document;
render(_request?: Function): string;
find(_query: string): Array<Element>;
reconcileLayoutSettings(globalLayout: GlobalLayout): LayoutSettings;
cfiFromRange(_range: Range): string;
cfiFromElement(el: Element): string;
unload(): void;
destroy(): void;
private base(): void;
}

30
types/spine.d.ts vendored Normal file
View file

@ -0,0 +1,30 @@
import Packaging from "./packaging";
import Section from "./section";
import Hook from "./utils/hook";
export default class Spine {
constructor();
hooks: {
serialize: Hook,
content: Hook
};
unpack(_package: Packaging, resolver: Function, canonical: Function): void;
get(target?: string | number): Section;
each(...args: any[]): any;
first(): Section;
last(): Section;
destroy(): void;
private append(section: Section): number;
private prepend(section: Section): number;
private remove(section: Section): number;
}

38
types/themes.d.ts vendored Normal file
View file

@ -0,0 +1,38 @@
import Rendition from "./rendition";
import Contents from "./contents";
export default class Themes {
constructor(rendition: Rendition);
register( themeObject: object ): void;
register( theme: string, url: string ): void;
register( theme: string, themeObject: object ): void;
default( theme: object | string ): void;
registerThemes( themes: object ): void;
registerUrl( name: string, input: string ): void;
registerRules( name: string, rules: object ): void;
select( name: string ): void;
update( name: string ): void;
inject( content: Contents ): void;
add( name: string, contents: Contents ): void;
override(name: string, value: string, priority: boolean): void;
overrides(contents: Contents): void;
fontSize(size: string): void;
font(f: string): void;
destroy(): void;
}

24
types/tsconfig.json Normal file
View file

@ -0,0 +1,24 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6",
"dom"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"epubjs-tests.ts"
]
}

4
types/tslint.json Normal file
View file

@ -0,0 +1,4 @@
{
"extends": "dtslint/dt.json",
"rules": {}
}

9
types/utils/constants.d.ts vendored Normal file
View file

@ -0,0 +1,9 @@
export const EPUBJS_VERSION: string;
export const DOM_EVENTS: Array<string>;
export const EVENTS: {
[key: string]: {
[key: string]: string
}
}

79
types/utils/core.d.ts vendored Normal file
View file

@ -0,0 +1,79 @@
export function uuid(): string;
export function documentHeight(): number;
export function isElement(obj: object): boolean;
export function isNumber(n: any): boolean;
export function isFloat(n: any): boolean;
export function prefixed(unprefixed: string): string;
export function defaults(obj: object): object;
export function extend(target: object): object;
export function insert(item: any, array: Array<any>, compareFunction: Function): number;
export function locationOf(item: any, array: Array<any>, compareFunction: Function, _start: Function, _end: Function): number;
export function indexOfSorted(item: any, array: Array<any>, compareFunction: Function, _start: Function, _end: Function): number;
export function bounds(el: Element): { width: Number, height: Number};
export function borders(el: Element): { width: Number, height: Number};
export function nodeBounds(node: Node): object;
export function windowBounds(): { width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number };
export function indexOfNode(node: Node, typeId: string): number;
export function indexOfTextNode(textNode: Node): number;
export function indexOfElementNode(elementNode: Element): number;
export function isXml(ext: string): boolean;
export function createBlob(content: any, mime: string): Blob;
export function createBlobUrl(content: any, mime: string): string;
export function revokeBlobUrl(url: string): void;
export function createBase64Url(content: any, mime: string): string
export function type(obj: object): string;
export function parse(markup: string, mime: string, forceXMLDom: boolean): Document;
export function qs(el: Element, sel: string): Element;
export function qsa(el: Element, sel: string): ArrayLike<Element>;
export function qsp(el: Element, sel: string, props: Array<object>): ArrayLike<Element>;
export function sprint(root: Node, func: Function): void;
export function treeWalker(root: Node, func: Function, filter: object | Function): void;
export function walk(node: Node, callback: Function): void;
export function blob2base64(blob: Blob): string;
export function defer(): Promise<any>;
export function querySelectorByType(html: Element, element: string, type: string): Array<Element>;
export function findChildren(el: Element): Array<Element>;
export function parents(node: Element): Array<Element>;
export function filterChildren(el: Element, nodeName: string, single: boolean): Array<Element>;
export function getParentByTagName(node: Element, tagname: string): Array<Element>;
export class RangeObject extends Range {
}

16
types/utils/hook.d.ts vendored Normal file
View file

@ -0,0 +1,16 @@
interface HooksObject {
[key: string]: Hook
}
export default class Hook {
constructor(context: any);
register(func: Function): void;
register(arr: Array<Function>): void;
trigger(...args: any[]): Promise<any>;
list(): Array<any>;
clear(): void;
}

17
types/utils/path.d.ts vendored Normal file
View file

@ -0,0 +1,17 @@
export default class Path {
constructor(pathString: string);
parse(what: string): object;
isAbsolute(what: string): boolean;
isDirectory(what: string): boolean;
resolve(what: string): string;
relative(what: string): string;
splitPath(filename: string): string;
toString(): string;
}

34
types/utils/queue.d.ts vendored Normal file
View file

@ -0,0 +1,34 @@
import { defer } from "./core";
export interface QueuedTask {
task: any | Task,
args: any[],
deferred: any, // should be defer, but not working
promise: Promise<any>
}
export default class Queue {
constructor(context: any);
enqueue(func: Promise<Function> | Function, ...args: any[]): Promise<any>;
dequeue(): Promise<QueuedTask>;
dump(): void;
run(): Promise<void>;
flush(): Promise<void>;
clear(): void;
length(): number;
pause(): void;
stop(): void;
}
declare class Task {
constructor(task: any, args: any[], context: any);
}

12
types/utils/replacements.d.ts vendored Normal file
View file

@ -0,0 +1,12 @@
import Section from "../section";
import Contents from "../contents";
export function replaceBase(doc: Document, section: Section): void;
export function replaceCanonical(doc: Document, section: Section): void;
export function replaceMeta(doc: Document, section: Section): void;
export function replaceLinks(contents: Contents, fn: Function): void;
export function substitute(contents: Contents, urls: string[], replacements: string[]): void;

1
types/utils/request.d.ts vendored Normal file
View file

@ -0,0 +1 @@
export default function request(url: string, type: string, withCredentials: boolean, headers: object): Promise<Blob | string | JSON | Document | XMLDocument>;

13
types/utils/url.d.ts vendored Normal file
View file

@ -0,0 +1,13 @@
import Path from "./path";
export default class Url {
constructor(urlString: string, baseString: string);
path(): Path;
resolve(what: string): string;
relative(what: string): string;
toString(): string;
}