/
parser_number.go
100 lines (84 loc) · 2.53 KB
/
parser_number.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package anitogo
import (
"strconv"
"github.com/juju/errors"
)
// Some validation constants
const (
animeYearMin = 1900
animeYearMax = 2050
episodeNumberMax = animeYearMin - 1
volumeNumberMax = 20 // is this too low?
)
func validEpisodeNumber(numstr string) bool {
num, err := strconv.ParseUint(numstr, 10, 16)
if err != nil {
return false
}
return num <= episodeNumberMax
}
func (p *parser) SetEpisodeNumber(numstr string, tkn *token, validate bool) error {
if validate && !validEpisodeNumber(numstr) {
return errors.Trace(ErrorInvalidEpisodeNumber)
}
tkn.Category = tokenCategoryIdentifier
category := categoryEpisodeNumber
var episodeNumber uint
var num uint
// handle equivalent numbers
if p.AnimeFile.checkAltNumber {
// TODO: check if getting only the first episode number is enough
episodeNumber = p.AnimeFile.EpisodeNumber[0]
num64, err := strconv.ParseUint(numstr, 10, 16)
if err != nil {
return errors.Trace(ErrorInvalidEpisodeNumber)
}
num = uint(num64)
if num > episodeNumber {
category = categoryEpisodeNumberAlt
} else if num < episodeNumber {
p.AnimeFile.EpisodeNumber = []uint{}
p.AnimeFile.EpisodeNumberAlt = episodeNumber
}
}
if category == categoryEpisodeNumber {
p.AnimeFile.EpisodeNumber = []uint{episodeNumber}
} else if category == categoryEpisodeNumberAlt {
p.AnimeFile.EpisodeNumberAlt = episodeNumber
}
return errors.Trace(nil)
}
func (p *parser) SetAlternativeEpisodeNumber(numstr string, tkn *token) error {
num, err := strconv.ParseUint(numstr, 10, 16)
if err != nil {
return errors.Trace(err)
}
p.AnimeFile.EpisodeNumberAlt = uint(num)
tkn.Category = tokenCategoryIdentifier
return errors.Trace(nil)
}
func (p *parser) CheckExtentKeyword(cat category, tkn *token) error {
nextToken, err := p.tokenizer.tokenManager.tokens.FindNext(*tkn, tokenFlagsNotDelimiter)
if err != nil {
return errors.Trace(err)
}
if nextToken.Category == tokenCategoryUnknown {
if !nextToken.Empty() && findNumberInString(nextToken.Content) > -1 {
if cat == categoryEpisodeNumber {
if !p.MatchEpisodePattern(nextToken.Content, nextToken) {
p.SetEpisodeNumber(nextToken.Content, nextToken, false)
}
} else if cat == categoryVolumeNumber {
if !p.matchVolumePattern(nextToken.Content, nextToken) {
p.SetVolumeNumber(nextToken.Content, nextToken, false)
}
} else {
// not implemented?
return errors.Trace(ErrorPlaceholder)
}
tkn.Category = tokenCategoryIdentifier
return errors.Trace(nil)
}
}
return errors.Trace(ErrorPlaceholder)
}