Remove old files
This commit is contained in:
parent
46f3d1f095
commit
c3f5fdcd18
@ -1,25 +0,0 @@
|
|||||||
import { Chapter } from './Chapter.js'
|
|
||||||
import { Player } from './Player.js'
|
|
||||||
|
|
||||||
export class Book {
|
|
||||||
constructor() {
|
|
||||||
this.chapters = [new Chapter('')]
|
|
||||||
this.curIdx = 0
|
|
||||||
this.player = new Player()
|
|
||||||
}
|
|
||||||
|
|
||||||
get currentChapter() {
|
|
||||||
return this.chapters(curIdx)
|
|
||||||
}
|
|
||||||
|
|
||||||
addChapter(chapter) {
|
|
||||||
this.chapters.push(chapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
removeChapter(chapter) {
|
|
||||||
this.chapters.filter(el => el !== chapter)
|
|
||||||
if (this.curIdx > 0) {
|
|
||||||
this.curIdx--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,139 +0,0 @@
|
|||||||
import { parseText } from './textProcessing/parseText.js'
|
|
||||||
|
|
||||||
export class Chapter {
|
|
||||||
constructor(text, maxLength = -1) {
|
|
||||||
this._originalText = text
|
|
||||||
this._maxLength = maxLength
|
|
||||||
this.initSegments()
|
|
||||||
}
|
|
||||||
|
|
||||||
initSegments() {
|
|
||||||
let { segments, words, sentences } = parseText(this._text, this._maxLength)
|
|
||||||
this.segments = segments
|
|
||||||
this.words = words
|
|
||||||
this.sentences = sentences
|
|
||||||
this.resetIndex()
|
|
||||||
}
|
|
||||||
|
|
||||||
resetIndex() {
|
|
||||||
this.currentIdx = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
setText(text) {
|
|
||||||
this._originalText = text
|
|
||||||
this.initSegments()
|
|
||||||
}
|
|
||||||
|
|
||||||
setMaxLength(maxLength) {
|
|
||||||
this._maxLength = maxLength
|
|
||||||
this.initSegments()
|
|
||||||
}
|
|
||||||
|
|
||||||
get currentSegment() {
|
|
||||||
return this.segments[this.currentIdx]
|
|
||||||
}
|
|
||||||
|
|
||||||
get metainfo() {
|
|
||||||
return {
|
|
||||||
segmentCount: this.segments.length,
|
|
||||||
wordsCount: this.words.length,
|
|
||||||
sentenceCount: this.sentences.length,
|
|
||||||
currentSegment: currentIdx + 1,
|
|
||||||
currentWord: -1,
|
|
||||||
currentSentence: -1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
next() {
|
|
||||||
if (!this.hasNext()) return null
|
|
||||||
this.currentIdx += 1
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
prev() {
|
|
||||||
if (!this.hasPrev()) return null
|
|
||||||
this.currentIdx -= 1
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
nextWord() {
|
|
||||||
if (!this.hasNextWord()) return null
|
|
||||||
this.currentIdx = getNextBiggerNumber(this.currentIdx, this.words)
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
prevWord() {
|
|
||||||
if (!this.hasPrevWord()) return null
|
|
||||||
this.currentIdx = getNextSmallerNumber(this.currentIdx, this.words)
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
nextSentence() {
|
|
||||||
if (!this.hasNextSentence()) return null
|
|
||||||
this.currentIdx = getNextBiggerNumber(this.currentIdx, this.sentences)
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
prevSentence() {
|
|
||||||
if (!this.hasPrevSentence()) return null
|
|
||||||
this.currentIdx = getNextSmallerNumber(this.currentIdx, this.sentences)
|
|
||||||
return this.currentSegment
|
|
||||||
}
|
|
||||||
|
|
||||||
hasNext() {
|
|
||||||
return this.currentIdx < this.segments.length - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
hasPrev() {
|
|
||||||
return this.currentIdx > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
hasNextWord() {
|
|
||||||
return this.currentIdx < lastEntry(this.words)
|
|
||||||
}
|
|
||||||
|
|
||||||
hasPrevWord() {
|
|
||||||
return this.currentIdx > this.words[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
hasNextSentence() {
|
|
||||||
return this.currentIdx < lastEntry(this.sentences)
|
|
||||||
}
|
|
||||||
|
|
||||||
hasPrevSentence() {
|
|
||||||
return this.currentIdx > this.sentences[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the next bigger number from a sorted Array of numbers.
|
|
||||||
* Returns null if num is the biggest number
|
|
||||||
* @param {Number} idx
|
|
||||||
* @param {Array<Number>} sortedArray
|
|
||||||
*/
|
|
||||||
function getNextBiggerNumber(num, sortedArray) {
|
|
||||||
for (let currentNumber of sortedArray) {
|
|
||||||
if (currentNumber > num) return currentNumber
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the next smaller number from a sorted Array of numbers.
|
|
||||||
* Returns null if num is the smallest number
|
|
||||||
* @param {Number} idx
|
|
||||||
* @param {Array<Number>} sortedArray
|
|
||||||
*/
|
|
||||||
function getNextSmallerNumber(num, sortedArray) {
|
|
||||||
let reversedArray = [...sortedArray].reverse()
|
|
||||||
for (let currentNumber of reversedArray) {
|
|
||||||
if (currentNumber < num) return currentNumber
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
function lastEntry(arr) {
|
|
||||||
return arr[arr.length - 1]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const _privates = { getNextBiggerNumber }
|
|
@ -1,45 +0,0 @@
|
|||||||
export class Player {
|
|
||||||
constructor(interval = 200) {
|
|
||||||
this.intervalHandle = null
|
|
||||||
this.interval = interval
|
|
||||||
this.subscribers = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
get playing() {
|
|
||||||
return this.intervalHandle !== null
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
clearInterval(this.intervalHandle)
|
|
||||||
this.intervalHandle = setInterval(this.tick.bind(this), this.interval)
|
|
||||||
}
|
|
||||||
|
|
||||||
stop() {
|
|
||||||
clearInterval(this.intervalHandle)
|
|
||||||
this.intervalHandle = null
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle() {
|
|
||||||
if (this.playing) this.stop()
|
|
||||||
else this.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
updateInterval(interval) {
|
|
||||||
this.interval = interval
|
|
||||||
if (this.intervalHandle) this.start()
|
|
||||||
}
|
|
||||||
|
|
||||||
tick() {
|
|
||||||
for (let callback of Object.values(this.subscribers)) {
|
|
||||||
callback()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
subscribe(name, callback) {
|
|
||||||
this.subscribers[name] = callback
|
|
||||||
}
|
|
||||||
|
|
||||||
unsubscribe(name) {
|
|
||||||
delete subscribers[name]
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
import { RSVPPlayer } from './RSVPPlayer.js'
|
|
||||||
|
|
||||||
const initialOptions = {
|
|
||||||
maxLength: 10,
|
|
||||||
autoPlayNextChapter: false,
|
|
||||||
wordsPerMinute: 200,
|
|
||||||
pivotMethod: 'default',
|
|
||||||
pauseOnPunctuation: true
|
|
||||||
}
|
|
||||||
|
|
||||||
export class RSVPController {
|
|
||||||
constructor(options = {}) {
|
|
||||||
this.options = initialOptions
|
|
||||||
this.setOptions(options)
|
|
||||||
|
|
||||||
this.rsvpPlayer = new RSVPPlayer()
|
|
||||||
this.rsvpPlayer.onTick = this.onChange
|
|
||||||
|
|
||||||
this.applyOptions()
|
|
||||||
}
|
|
||||||
|
|
||||||
setOptions(options) {
|
|
||||||
this.options = { ...this.options, ...options }
|
|
||||||
}
|
|
||||||
|
|
||||||
applyOptions() {
|
|
||||||
let { options } = this
|
|
||||||
let { chapter, player } = this.rsvpPlayer
|
|
||||||
chapter.setMaxLength = options.maxLength
|
|
||||||
player.updateInterval(1000 / options.wordsPerMinute)
|
|
||||||
}
|
|
||||||
|
|
||||||
updateOptions(options) {
|
|
||||||
this.setOptions(options)
|
|
||||||
this.applyOptions()
|
|
||||||
this.onChange()
|
|
||||||
}
|
|
||||||
|
|
||||||
processAction(action, payload) {
|
|
||||||
let { chapter, player } = this.rsvpPlayer
|
|
||||||
switch (action) {
|
|
||||||
case 'prevSentence':
|
|
||||||
chapter.prevSentence()
|
|
||||||
break
|
|
||||||
case 'nextSentence':
|
|
||||||
chapter.nextSentence()
|
|
||||||
break
|
|
||||||
case 'prevWord':
|
|
||||||
chapter.prevWord()
|
|
||||||
break
|
|
||||||
case 'nextWord':
|
|
||||||
chapter.nextWord()
|
|
||||||
break
|
|
||||||
case 'playpause':
|
|
||||||
player.toggle()
|
|
||||||
break
|
|
||||||
case 'stop':
|
|
||||||
player.stop()
|
|
||||||
chapter.reset()
|
|
||||||
break
|
|
||||||
case 'load':
|
|
||||||
chapter = new Chapter(payload, 10)
|
|
||||||
}
|
|
||||||
this.onChange()
|
|
||||||
}
|
|
||||||
|
|
||||||
onChange() {
|
|
||||||
console.warn('RSVPController: onChange not set')
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
import { Player } from './Player.js'
|
|
||||||
import { Book } from './Book.js'
|
|
||||||
import { Chapter } from './Chapter.js'
|
|
||||||
|
|
||||||
export class RSVPPlayer {
|
|
||||||
constructor(maxLength) {
|
|
||||||
this.chapter = new Chapter(maxLength)
|
|
||||||
this.player = new Player()
|
|
||||||
|
|
||||||
this.player.subscribe('main', this.tick.bind(this))
|
|
||||||
}
|
|
||||||
|
|
||||||
tick() {
|
|
||||||
if (!this.chapter.hasNext()) {
|
|
||||||
this.player.stop()
|
|
||||||
} else {
|
|
||||||
this.chapter.next()
|
|
||||||
}
|
|
||||||
this.onTick()
|
|
||||||
}
|
|
||||||
|
|
||||||
onTick() {
|
|
||||||
console.warn('RSVPPlayer: onTick not set')
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user