AnthoLume/metadata/epub.go
Evan Reichard cdec621043
All checks were successful
continuous-integration/drone/push Build is passing
[add] better error handling, [add] font selector, [add] tailwind generation
2023-10-25 19:52:01 -04:00

65 lines
1.3 KiB
Go

package metadata
import (
"io"
"strings"
"github.com/taylorskalyo/goreader/epub"
"golang.org/x/net/html"
)
func getEPUBMetadata(filepath string) (*MetadataInfo, error) {
rc, err := epub.OpenReader(filepath)
if err != nil {
return nil, err
}
rf := rc.Rootfiles[0]
return &MetadataInfo{
Title: &rf.Title,
Author: &rf.Creator,
Description: &rf.Description,
}, nil
}
func countEPUBWords(filepath string) (int64, error) {
rc, err := epub.OpenReader(filepath)
if err != nil {
return 0, err
}
rf := rc.Rootfiles[0]
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
}
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
}
}
}