[fix] server word count, [add] client word count
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
b9b9ad2098
commit
1b8b5060f1
@ -45,9 +45,15 @@ class EBookReader {
|
||||
* Load progress and generate locations
|
||||
**/
|
||||
async setupReader() {
|
||||
// Get Word Count (If Needed)
|
||||
if (this.bookState.words == 0)
|
||||
this.bookState.words = await this.countWords();
|
||||
|
||||
// Load Progress
|
||||
let { cfi } = await this.getCFIFromXPath(this.bookState.progress);
|
||||
if (!cfi) this.bookState.currentWord = 0;
|
||||
this.bookState.currentWord = cfi
|
||||
? this.bookState.percentage * (this.bookState.words / 100)
|
||||
: 0;
|
||||
|
||||
let getStats = function () {
|
||||
// Start Timer
|
||||
@ -1038,6 +1044,21 @@ class EBookReader {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the words of the book. Useful for keeping a more accurate track
|
||||
* of progress percentage. Implementation returns the same number as the
|
||||
* server side implementation.
|
||||
**/
|
||||
countWords() {
|
||||
// Iterate over each item in the spine, render, and count words.
|
||||
return this.book.spine.spineItems.reduce(async (totalCount, item) => {
|
||||
let currentCount = await totalCount;
|
||||
let newDoc = await item.load(this.book.load.bind(this.book));
|
||||
let itemCount = newDoc.innerText.trim().split(/\s+/).length;
|
||||
return currentCount + itemCount;
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save settings to localStorage
|
||||
**/
|
||||
|
@ -1,11 +1,10 @@
|
||||
package metadata
|
||||
|
||||
import (
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
"github.com/taylorskalyo/goreader/epub"
|
||||
"golang.org/x/net/html"
|
||||
)
|
||||
|
||||
func getEPUBMetadata(filepath string) (*MetadataInfo, error) {
|
||||
@ -32,33 +31,9 @@ func countEPUBWords(filepath string) (int64, error) {
|
||||
var completeCount int64
|
||||
for _, item := range rf.Spine.Itemrefs {
|
||||
f, _ := item.Open()
|
||||
tokenizer := html.NewTokenizer(f)
|
||||
newCount, err := countTokenizerWords(*tokenizer)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
completeCount = completeCount + newCount
|
||||
doc, _ := goquery.NewDocumentFromReader(f)
|
||||
completeCount = completeCount + int64(len(strings.Fields(doc.Text())))
|
||||
}
|
||||
|
||||
return completeCount, nil
|
||||
}
|
||||
|
||||
func countTokenizerWords(tokenizer html.Tokenizer) (int64, error) {
|
||||
var err error
|
||||
var totalWords int64
|
||||
for {
|
||||
tokenType := tokenizer.Next()
|
||||
token := tokenizer.Token()
|
||||
if tokenType == html.TextToken {
|
||||
currStr := string(token.Data)
|
||||
totalWords = totalWords + int64(len(strings.Fields(currStr)))
|
||||
} else if tokenType == html.ErrorToken {
|
||||
err = tokenizer.Err()
|
||||
}
|
||||
if err == io.EOF {
|
||||
return totalWords, nil
|
||||
} else if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
func TestGetWordCount(t *testing.T) {
|
||||
var want int64 = 30477
|
||||
var want int64 = 30080
|
||||
wordCount, err := countEPUBWords("../_test_files/alice.epub")
|
||||
|
||||
if wordCount != want {
|
||||
|
Loading…
Reference in New Issue
Block a user