UNPKG

@snippetify/book-reader

Version:
118 lines (97 loc) 2.67 kB
const config = require('./config') const PageBuilder = require('./PageBuilder') const MenuBuilder = require('./MenuBuilder') const EventManager = require('./EventManager') const StyleBuilder = require('./StyleBuilder') const SelectionManager = require('./SelectionManager') const DecoratorManager = require('./DecoratorManager') class BookBuilder { constructor () { this.pages = [] this.config = config this.decorators = [] this.rootElement = document this.events = EventManager.getInstance() this.pageBuilder = PageBuilder.getInstance() this.menuBuilder = MenuBuilder.getInstance() this.styleBuilder = StyleBuilder.getInstance() this.selectionManager = SelectionManager.getInstance() this.decoratorManager = DecoratorManager.getInstance() } static getInstance () { return new BookBuilder() } build () { // Page this.pageBuilder .setConfig(this.config.page) // Decorator this.decoratorManager .setEvents(this.events) .setMany(this.decorators) .setConfig(this.config.decorator) .setRootElement(this.rootElement) .initDispatcher() // Selection this.selectionManager .setEvents(this.events) .setRootElement(this.rootElement) .initDispatcher() // Style this.styleBuilder .setConfig(this.config.style) .setRootElement(this.rootElement) // Context menu builder this.menuBuilder .setEvents(this.events) .setConfig(this.config.contextMenu) .setRootElement(this.rootElement) .initListeners() return this } setConfig (config) { this.config = { ...config, ...this.config } return this } setRootElement (element) { this.rootElement = $(element)[0] return this } setPages (items) { this.pages = items || [] return this } setDecorators (items) { this.decorators = items || [] return this } print () { // Print pages $(this.rootElement).html(this.buildContent()) // Print others after this.styleBuilder.print() this.decoratorManager.print() return this } isPrinted () { return $(this.rootElement).find('[data-id]').length > 0 } buildContent () { const content = $('<div />', { class: 'reading' }) this.pages.forEach(v => { content.append(this.pageBuilder.reset().setPage(v).build()) }) return content } getReadingStyle () { return this.styleBuilder.find('reading') } updateReadingStyle (style) { this.styleBuilder .add('reading', style) .print() return this } } module.exports = BookBuilder module.exports.default = BookBuilder