-
Notifications
You must be signed in to change notification settings - Fork 0
/
phoneticise.go
92 lines (81 loc) · 1.71 KB
/
phoneticise.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
// Package phoneticise provides a library for expanding strings to NATO phonetics
package phoneticise
import (
"fmt"
"regexp"
"strings"
"unicode"
)
// Phoneticise takes a string and outputs the phonetic alphabet expansiuon of
// the string
func Phoneticise(s string) string {
results := make([]string, 0)
// remove leading and trailing whitespace
s = strings.TrimSpace(s)
// collapse duplicate whitespace
spaceRegexp := regexp.MustCompile(`\s+`)
s = spaceRegexp.ReplaceAllString(s, " ")
var val string
for _, c := range s {
// mark spaces
if c == ' ' {
val = "(space)"
} else {
// grab the appropriate value and add to our results
val = Lookup(c)
}
results = append(results, val)
}
// join results, trim any leading or trailing whitespace
joined := strings.Join(results, " ")
trimmed := strings.TrimSpace(joined)
return trimmed
}
// Lookup takes a rune and returns the appropriate word from the phonetic alphabet
func Lookup(r rune) string {
mapper := map[rune]string{
'0': "Zero",
'1': "One",
'2': "Two",
'3': "Three",
'4': "Four",
'5': "Five",
'6': "Six",
'7': "Seven",
'8': "Eight",
'9': "Nine",
'A': "Alfa",
'B': "Bravo",
'C': "Charlie",
'D': "Delta",
'E': "Echo",
'F': "Foxtrot",
'G': "Golf",
'H': "Hotel",
'I': "India",
'J': "Juliett",
'K': "Kilo",
'L': "Lima",
'M': "Mike",
'N': "November",
'O': "Oscar",
'P': "Papa",
'Q': "Quebec",
'R': "Romeo",
'S': "Sierra",
'T': "Tango",
'U': "Uniform",
'V': "Victor",
'W': "Whiskey",
'X': "X-ray",
'Y': "Yankee",
'Z': "Zulu",
}
val, ok := mapper[unicode.ToUpper(r)]
if !ok {
// missing from the lookup
// retuin the initial value
val = fmt.Sprintf("{%c}", r)
}
return val
}