@snippetify/book-reader
Version:
Book reader utilities
118 lines (97 loc) • 2.67 kB
JavaScript
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