plug-message-split
Version:
Splitting and word wrap utilities for plug.dj chat messages.
142 lines (119 loc) • 2.88 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var MAX_LENGTH = 250;
/**
* HTML-escape a string like plug.dj escapes chat messages.
*/
function escape (message) {
return message
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&')
}
/**
* Reverse plug.dj's chat message escaping.
*/
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.
*/
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.
*/
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.
*/
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
}
exports.MAX_LENGTH = MAX_LENGTH;
exports.escape = escape;
exports.split = split;
exports.splitRaw = splitRaw;
exports.truncate = truncate;
exports.unescape = unescape;
//# sourceMappingURL=index.js.map