UNPKG

epubjs

Version:
209 lines (168 loc) 5.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _core = require("./utils/core"); var _epubcfi = require("./epubcfi"); var _epubcfi2 = _interopRequireDefault(_epubcfi); var _hook = require("./utils/hook"); var _hook2 = _interopRequireDefault(_hook); var _replacements = require("./utils/replacements"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Represents a Section of the Book * In most books this is equivelent to a Chapter * @param {object} item The spine item representing the section * @param {object} hooks hooks for serialize and content */ var Section = function () { function Section(item, hooks) { _classCallCheck(this, Section); this.idref = item.idref; this.linear = item.linear; this.properties = item.properties; this.index = item.index; this.href = item.href; this.url = item.url; this.next = item.next; this.prev = item.prev; this.cfiBase = item.cfiBase; if (hooks) { this.hooks = hooks; } else { this.hooks = {}; this.hooks.serialize = new _hook2.default(this); this.hooks.content = new _hook2.default(this); } } /** * Load the section from its url * @param {method} _request a request method to use for loading * @return {document} a promise with the xml document */ _createClass(Section, [{ key: "load", value: function load(_request) { var request = _request || this.request || require("./utils/request"); var loading = new _core.defer(); var loaded = loading.promise; if (this.contents) { loading.resolve(this.contents); } else { request(this.url).then(function (xml) { // var directory = new Url(this.url).directory; this.document = xml; this.contents = xml.documentElement; return this.hooks.content.trigger(this.document, this); }.bind(this)).then(function () { loading.resolve(this.contents); }.bind(this)).catch(function (error) { loading.reject(error); }); } return loaded; } /** * Adds a base tag for resolving urls in the section * @private */ }, { key: "base", value: function base() { return (0, _replacements.replaceBase)(this.document, this); } /** * Render the contents of a section * @param {method} _request a request method to use for loading * @return {string} output a serialized XML Document */ }, { key: "render", value: function render(_request) { var rendering = new _core.defer(); var rendered = rendering.promise; this.output; // TODO: better way to return this from hooks? this.load(_request).then(function (contents) { var serializer; var Serializer; if (typeof XMLSerializer === "undefined") { Serializer = require("xmldom").XMLSerializer; } else { Serializer = XMLSerializer; } serializer = new Serializer(); this.output = serializer.serializeToString(contents); return this.output; }.bind(this)).then(function () { return this.hooks.serialize.trigger(this.output, this); }.bind(this)).then(function () { rendering.resolve(this.output); }.bind(this)).catch(function (error) { rendering.reject(error); }); return rendered; } /** * Find a string in a section * TODO: need reimplementation from v0.2 * @param {string} query [description] * @return {[type]} [description] */ }, { key: "find", value: function find() {} /** * Reconciles the current chapters layout properies with * the global layout properities. * @param {object} global The globa layout settings object, chapter properties string * @return {object} layoutProperties Object with layout properties */ }, { key: "reconcileLayoutSettings", value: function reconcileLayoutSettings(global) { //-- Get the global defaults var settings = { layout: global.layout, spread: global.spread, orientation: global.orientation }; //-- Get the chapter's display type this.properties.forEach(function (prop) { var rendition = prop.replace("rendition:", ""); var split = rendition.indexOf("-"); var property, value; if (split != -1) { property = rendition.slice(0, split); value = rendition.slice(split + 1); settings[property] = value; } }); return settings; } /** * Get a CFI from a Range in the Section * @param {range} _range * @return {string} cfi an EpubCFI string */ }, { key: "cfiFromRange", value: function cfiFromRange(_range) { return new _epubcfi2.default(_range, this.cfiBase).toString(); } /** * Get a CFI from an Element in the Section * @param {element} el * @return {string} cfi an EpubCFI string */ }, { key: "cfiFromElement", value: function cfiFromElement(el) { return new _epubcfi2.default(el, this.cfiBase).toString(); } }]); return Section; }(); exports.default = Section; module.exports = exports["default"];