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