This repository was archived by the owner on May 11, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.mjs
More file actions
129 lines (110 loc) · 2.55 KB
/
index.mjs
File metadata and controls
129 lines (110 loc) · 2.55 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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
export var MAX_LENGTH = 250
/**
* HTML-escape a string like plug.dj escapes chat messages.
*/
export function escape (message) {
return message
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&')
}
/**
* Reverse plug.dj's chat message escaping.
*/
export function unescape (message) {
return message
.replace(/"/g, '"')
.replace(/'/g, '\'')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&')
}
/**
* Get the size in bytes of a character in a plug.dj chat message.
*/
function byteLength (c) {
// Escaped characters
if (c === 34 /* " */ || c === 39 /* ' */ || c === 38 /* & */) {
return 5
}
if (c === 60 /* < */ || c === 62 /* > */) {
return 4
}
// Multi-byte unicode characters
if (c > 0x7f && c <= 0x7ff) {
return 2
}
if (c > 0x7ff && c <= 0xffff) {
return 3
}
return 1
}
/**
* Truncate a string to fit inside a plug.dj chat message.
*/
export function truncate (string) {
var byteSize = 0
for (var i = 0; i < string.length; i += 1) {
var c = string.charCodeAt(i)
var charSize = byteLength(c)
if (byteSize + charSize > MAX_LENGTH) {
return string.slice(0, i)
}
byteSize += charSize
}
return string
}
/**
* Split a string into chunks that fit inside a plug.dj chat message. Splits on
* characters, so it will break up words.
*/
export function splitRaw (string) {
var parts = []
// Character index delimiting the current chunk
var start = 0
// Size in bytes of the current chunk
var byteSize = 0
for (var i = 0; i < string.length; i += 1) {
var c = string.charCodeAt(i)
var charSize = byteLength(c)
if (byteSize + charSize > MAX_LENGTH) {
parts.push(string.slice(start, i))
start = i
byteSize = 0
}
byteSize += charSize
}
if (byteSize !== 0) {
parts.push(string.slice(start))
}
return parts
}
/**
* Split a string into chunks. Attempts to only split on whitespace.
*/
export function split (string) {
var words = string.split(/(\S+\s+)/g)
var parts = []
var part = ''
var size = 0
for (var i = 0; i < words.length; i += 1) {
var word = words[i]
var wordSize = 0
for (var c = 0; c < word.length; c += 1) {
wordSize += byteLength(word.charCodeAt(c))
}
if (size + wordSize > MAX_LENGTH) {
parts.push(part.replace(/\s+$/, ''))
part = ''
size = 0
}
part += word
size += wordSize
}
if (size !== 0) {
parts.push(part)
}
return parts
}