Initial
This commit is contained in:
91
resources/app/node_modules/peggy/lib/compiler/utils.js
generated
vendored
Normal file
91
resources/app/node_modules/peggy/lib/compiler/utils.js
generated
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
"use strict";
|
||||
|
||||
function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
|
||||
exports.hex = hex;
|
||||
|
||||
function stringEscape(s) {
|
||||
// ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string
|
||||
// literal except for the closing quote character, backslash, carriage
|
||||
// return, line separator, paragraph separator, and line feed. Any character
|
||||
// may appear in the form of an escape sequence.
|
||||
//
|
||||
// For portability, we also escape all control and non-ASCII characters.
|
||||
return s
|
||||
.replace(/\\/g, "\\\\") // Backslash
|
||||
.replace(/"/g, "\\\"") // Closing double quote
|
||||
.replace(/\0/g, "\\0") // Null
|
||||
.replace(/\x08/g, "\\b") // Backspace
|
||||
.replace(/\t/g, "\\t") // Horizontal tab
|
||||
.replace(/\n/g, "\\n") // Line feed
|
||||
.replace(/\v/g, "\\v") // Vertical tab
|
||||
.replace(/\f/g, "\\f") // Form feed
|
||||
.replace(/\r/g, "\\r") // Carriage return
|
||||
.replace(/[\x00-\x0F]/g, ch => "\\x0" + hex(ch))
|
||||
.replace(/[\x10-\x1F\x7F-\xFF]/g, ch => "\\x" + hex(ch))
|
||||
.replace(/[\u0100-\u0FFF]/g, ch => "\\u0" + hex(ch))
|
||||
.replace(/[\u1000-\uFFFF]/g, ch => "\\u" + hex(ch));
|
||||
}
|
||||
exports.stringEscape = stringEscape;
|
||||
|
||||
function regexpClassEscape(s) {
|
||||
// Based on ECMA-262, 5th ed., 7.8.5 & 15.10.1.
|
||||
//
|
||||
// For portability, we also escape all control and non-ASCII characters.
|
||||
return s
|
||||
.replace(/\\/g, "\\\\") // Backslash
|
||||
.replace(/\//g, "\\/") // Closing slash
|
||||
.replace(/]/g, "\\]") // Closing bracket
|
||||
.replace(/\^/g, "\\^") // Caret
|
||||
.replace(/-/g, "\\-") // Dash
|
||||
.replace(/\0/g, "\\0") // Null
|
||||
.replace(/\x08/g, "\\b") // Backspace
|
||||
.replace(/\t/g, "\\t") // Horizontal tab
|
||||
.replace(/\n/g, "\\n") // Line feed
|
||||
.replace(/\v/g, "\\v") // Vertical tab
|
||||
.replace(/\f/g, "\\f") // Form feed
|
||||
.replace(/\r/g, "\\r") // Carriage return
|
||||
.replace(/[\x00-\x0F]/g, ch => "\\x0" + hex(ch))
|
||||
.replace(/[\x10-\x1F\x7F-\xFF]/g, ch => "\\x" + hex(ch))
|
||||
.replace(/[\u0100-\u0FFF]/g, ch => "\\u0" + hex(ch))
|
||||
.replace(/[\u1000-\uFFFF]/g, ch => "\\u" + hex(ch));
|
||||
}
|
||||
exports.regexpClassEscape = regexpClassEscape;
|
||||
|
||||
/**
|
||||
* Base64 encode a Uint8Array. Needed for browser compatibility where
|
||||
* the Buffer class is not available.
|
||||
*
|
||||
* @param {Uint8Array} u8 Bytes to encode
|
||||
* @returns {string} Base64 encoded string
|
||||
*/
|
||||
function base64(u8) {
|
||||
// Note: btoa has the worst API, and even mentioning Buffer here will
|
||||
// cause rollup to suck it in.
|
||||
|
||||
// See RFC4648, sec. 4.
|
||||
// https://datatracker.ietf.org/doc/html/rfc4648#section-4
|
||||
const A = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
const rem = u8.length % 3;
|
||||
const len = u8.length - rem;
|
||||
let res = "";
|
||||
|
||||
for (let i = 0; i < len; i += 3) {
|
||||
res += A[u8[i] >> 2];
|
||||
res += A[((u8[i] & 0x3) << 4) | (u8[i + 1] >> 4)];
|
||||
res += A[((u8[i + 1] & 0xf) << 2) | (u8[i + 2] >> 6)];
|
||||
res += A[u8[i + 2] & 0x3f];
|
||||
}
|
||||
if (rem === 1) {
|
||||
res += A[u8[len] >> 2];
|
||||
res += A[(u8[len] & 0x3) << 4];
|
||||
res += "==";
|
||||
} else if (rem === 2) {
|
||||
res += A[u8[len] >> 2];
|
||||
res += A[((u8[len] & 0x3) << 4) | (u8[len + 1] >> 4)];
|
||||
res += A[(u8[len + 1] & 0xf) << 2];
|
||||
res += "=";
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
exports.base64 = base64;
|
||||
Reference in New Issue
Block a user