-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse.go
More file actions
71 lines (59 loc) · 1.45 KB
/
Copy pathparse.go
File metadata and controls
71 lines (59 loc) · 1.45 KB
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
package main
import (
"fmt"
"regexp"
"strconv"
"strings"
)
type Reference struct {
Book *Book
Chapter int
VerseStart int // 0 = whole chapter
VerseEnd int
}
var (
reKorean = regexp.MustCompile(`^([가-힣]+)(\d+.*)$`)
reEnglish = regexp.MustCompile(`^(\d*[a-zA-Z]+)(\d+.*)$`)
reChVerse = regexp.MustCompile(`^(\d+)(?::(\d+)(?:-(\d+))?)?$`)
)
func parseReference(input string) (*Reference, error) {
input = strings.TrimSpace(input)
input = strings.ReplaceAll(input, " ", "")
var bookName, rest string
if m := reKorean.FindStringSubmatch(input); m != nil {
bookName, rest = m[1], m[2]
} else if m := reEnglish.FindStringSubmatch(input); m != nil {
bookName, rest = m[1], m[2]
} else {
return nil, fmt.Errorf("invalid reference: %s", input)
}
book := lookupBook(bookName)
if book == nil {
return nil, fmt.Errorf("unknown book: %s", bookName)
}
m := reChVerse.FindStringSubmatch(rest)
if m == nil {
return nil, fmt.Errorf("invalid chapter/verse format: %s", rest)
}
chapter, _ := strconv.Atoi(m[1])
if chapter == 0 {
return nil, fmt.Errorf("invalid chapter: 0")
}
var verseStart, verseEnd int
if m[2] != "" {
verseStart, _ = strconv.Atoi(m[2])
verseEnd = verseStart
}
if m[3] != "" {
verseEnd, _ = strconv.Atoi(m[3])
}
if verseEnd < verseStart {
verseStart, verseEnd = verseEnd, verseStart
}
return &Reference{
Book: book,
Chapter: chapter,
VerseStart: verseStart,
VerseEnd: verseEnd,
}, nil
}