зеркало из https://github.com/mozilla/pluotsorbet.git
120 строки
3.1 KiB
JavaScript
120 строки
3.1 KiB
JavaScript
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
|
|
|
'use strict';
|
|
|
|
var util = (function () {
|
|
var Utf8TextDecoder = new TextDecoder("utf-8");
|
|
|
|
function decodeUtf8(array) {
|
|
return Utf8TextDecoder.decode(array);
|
|
}
|
|
|
|
/**
|
|
* Provides a UTF-8 decoder that will throw an exception on error rather
|
|
* than silently sanitizing the output.
|
|
*/
|
|
var fallibleUtf8Decoder = new TextDecoder("utf-8", { fatal: true });
|
|
|
|
/**
|
|
* Decodes a UTF-8 string stored in an ArrayBufferView.
|
|
*
|
|
* @param arr An ArrayBufferView to decode (such as a Uint8Array).
|
|
* @returns The decoded string.
|
|
* @throws An invalid enoding is encountered, see
|
|
* TextDecoder.prototype.decode().
|
|
*/
|
|
function decodeUtf8Array(arr) {
|
|
return fallibleUtf8Decoder.decode(arr);
|
|
}
|
|
|
|
var INT_MAX = Math.pow(2, 31) - 1;
|
|
var INT_MIN = -INT_MAX - 1;
|
|
|
|
function double2int(d) {
|
|
if (d > INT_MAX)
|
|
return INT_MAX;
|
|
if (d < INT_MIN)
|
|
return INT_MIN;
|
|
return d|0;
|
|
}
|
|
|
|
function double2long(d) {
|
|
if (d === Number.POSITIVE_INFINITY)
|
|
return Long.MAX_VALUE;
|
|
if (d === Number.NEGATIVE_INFINITY)
|
|
return Long.MIN_VALUE;
|
|
return Long.fromNumber(d);
|
|
}
|
|
|
|
var id = (function() {
|
|
var gen = 0;
|
|
return function() {
|
|
return ++gen;
|
|
}
|
|
})();
|
|
|
|
function pad(num, len) {
|
|
return "0".repeat(len - num.toString().length) + num;
|
|
}
|
|
|
|
function toCodePointArray(str) {
|
|
var chars = [];
|
|
|
|
var str = str.slice();
|
|
|
|
while (str.length > 0) {
|
|
var ucsChars = String.fromCodePoint(str.codePointAt(0));
|
|
chars.push(ucsChars);
|
|
str = str.substr(ucsChars.length);
|
|
}
|
|
|
|
return chars;
|
|
}
|
|
|
|
// rgbaToCSS() can be called frequently. Using |rgbaBuf| avoids creating
|
|
// many intermediate strings.
|
|
var rgbaBuf = ["rgba(", 0, ",", 0, ",", 0, ",", 0, ")"];
|
|
|
|
function rgbaToCSS(r, g, b, a) {
|
|
rgbaBuf[1] = r;
|
|
rgbaBuf[3] = g;
|
|
rgbaBuf[5] = b;
|
|
rgbaBuf[7] = a;
|
|
return rgbaBuf.join('');
|
|
}
|
|
|
|
function abgrIntToCSS(pixel) {
|
|
var a = (pixel >> 24) & 0xff;
|
|
var b = (pixel >> 16) & 0xff;
|
|
var g = (pixel >> 8) & 0xff;
|
|
var r = pixel & 0xff;
|
|
return rgbaToCSS(r, g, b, a/255);
|
|
}
|
|
|
|
function isPrintable(val) {
|
|
// http://stackoverflow.com/questions/12467240/determine-if-javascript-e-keycode-is-a-printable-non-control-character
|
|
return ((val >= 48 && val <= 57) || // number keys
|
|
val === 32 || val === 13 || // spacebar & return key(s) (if you want to allow carriage returns)
|
|
(val >= 65 && val <= 90) || // letter keys
|
|
(val >= 96 && val <= 111) || // numpad keys
|
|
(val >= 186 && val <= 192) || // ;=,-./` (in order)
|
|
(val >= 219 && val <= 222)); // [\]' (in order)
|
|
}
|
|
|
|
return {
|
|
INT_MAX: INT_MAX,
|
|
INT_MIN: INT_MIN,
|
|
decodeUtf8: decodeUtf8,
|
|
decodeUtf8Array: decodeUtf8Array,
|
|
double2int: double2int,
|
|
double2long: double2long,
|
|
id: id,
|
|
pad: pad,
|
|
toCodePointArray: toCodePointArray,
|
|
rgbaToCSS: rgbaToCSS,
|
|
abgrIntToCSS: abgrIntToCSS,
|
|
isPrintable: isPrintable,
|
|
};
|
|
})();
|