forked from robertkrimen/otto
-
Notifications
You must be signed in to change notification settings - Fork 0
/
unescapeUnicode.go
77 lines (65 loc) · 1.32 KB
/
unescapeUnicode.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
package regexp
import (
"unicode/utf8"
"github.com/kirillDanshin/myutils"
)
const (
sequencePrefix = "x{"
sequenceEnd = "}"
)
func UnescapeUnicode(pattern string) string {
s := []byte(pattern)
result := ""
for utf8.RuneCount(s) >= 1 {
r, size := utf8.DecodeRune(s)
s = s[size:]
nextR, size := utf8.DecodeRune(s)
switch r {
case '\\':
if nextR == 'u' || nextR == 'U' {
result = myutils.Concat(result, uppercaseHex(r), sequencePrefix)
s = s[size:]
r, size = utf8.DecodeRune(s)
result = myutils.Concat(result, uppercaseHex(r))
s = s[size:]
r, size = utf8.DecodeRune(s)
result = myutils.Concat(result, uppercaseHex(r))
s = s[size:]
r, size = utf8.DecodeRune(s)
result = myutils.Concat(result, uppercaseHex(r))
s = s[size:]
r, size = utf8.DecodeRune(s)
result = myutils.Concat(result, uppercaseHex(r), sequenceEnd)
s = s[size:]
}
default:
result = myutils.Concat(result, string(r))
}
}
return result
}
const (
upperA = "A"
upperB = "B"
upperC = "C"
upperD = "D"
upperE = "E"
upperF = "F"
)
func uppercaseHex(r rune) string {
switch r {
case 'a', 'A':
return upperA
case 'b', 'B':
return upperB
case 'c', 'C':
return upperC
case 'd', 'D':
return upperD
case 'e', 'E':
return upperE
case 'f', 'F':
return upperF
}
return string(r)
}