matrix-react-sdk
Version:
SDK for matrix.org using React
110 lines (95 loc) • 10.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.textToHtmlRainbow = textToHtmlRainbow;
/*
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
function textToHtmlRainbow(str
/*: string*/
)
/*: string*/
{
const frequency = 2 * Math.PI / str.length;
return Array.from(str).map((c, i) => {
if (c === " ") {
return c;
}
const [a, b] = generateAB(i * frequency, 1);
const [red, green, blue] = labToRGB(75, a, b);
return '<font color="#' + red.toString(16).padStart(2, "0") + green.toString(16).padStart(2, "0") + blue.toString(16).padStart(2, "0") + '">' + c + "</font>";
}).join("");
}
function generateAB(hue
/*: number*/
, chroma
/*: number*/
)
/*: [number, number]*/
{
const a = chroma * 127 * Math.cos(hue);
const b = chroma * 127 * Math.sin(hue);
return [a, b];
}
function labToRGB(l
/*: number*/
, a
/*: number*/
, b
/*: number*/
)
/*: [number, number, number]*/
{
// https://en.wikipedia.org/wiki/CIELAB_color_space#Reverse_transformation
// https://en.wikipedia.org/wiki/SRGB#The_forward_transformation_(CIE_XYZ_to_sRGB)
// Convert CIELAB to CIEXYZ (D65)
let y = (l + 16) / 116;
const x = adjustXYZ(y + a / 500) * 0.9505;
const z = adjustXYZ(y - b / 200) * 1.089;
y = adjustXYZ(y); // Linear transformation from CIEXYZ to RGB
const red = 3.24096994 * x - 1.53738318 * y - 0.49861076 * z;
const green = -0.96924364 * x + 1.8759675 * y + 0.04155506 * z;
const blue = 0.05563008 * x - 0.20397696 * y + 1.05697151 * z;
return [adjustRGB(red), adjustRGB(green), adjustRGB(blue)];
}
function adjustXYZ(v
/*: number*/
)
/*: number*/
{
if (v > 0.2069) {
return Math.pow(v, 3);
}
return 0.1284 * v - 0.01771;
}
function gammaCorrection(v
/*: number*/
)
/*: number*/
{
// Non-linear transformation to sRGB
if (v <= 0.0031308) {
return 12.92 * v;
}
return 1.055 * Math.pow(v, 1 / 2.4) - 0.055;
}
function adjustRGB(v
/*: number*/
)
/*: number*/
{
const corrected = gammaCorrection(v); // Limits number between 0 and 1
const limited = Math.min(Math.max(corrected, 0), 1);
return Math.round(limited * 255);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb2xvdXIudHMiXSwibmFtZXMiOlsidGV4dFRvSHRtbFJhaW5ib3ciLCJzdHIiLCJmcmVxdWVuY3kiLCJNYXRoIiwiUEkiLCJsZW5ndGgiLCJBcnJheSIsImZyb20iLCJtYXAiLCJjIiwiaSIsImEiLCJiIiwiZ2VuZXJhdGVBQiIsInJlZCIsImdyZWVuIiwiYmx1ZSIsImxhYlRvUkdCIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImpvaW4iLCJodWUiLCJjaHJvbWEiLCJjb3MiLCJzaW4iLCJsIiwieSIsIngiLCJhZGp1c3RYWVoiLCJ6IiwiYWRqdXN0UkdCIiwidiIsInBvdyIsImdhbW1hQ29ycmVjdGlvbiIsImNvcnJlY3RlZCIsImxpbWl0ZWQiLCJtaW4iLCJtYXgiLCJyb3VuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVPLFNBQVNBLGlCQUFULENBQTJCQztBQUEzQjtBQUFBO0FBQUE7QUFBZ0Q7QUFDbkQsUUFBTUMsU0FBUyxHQUFJLElBQUlDLElBQUksQ0FBQ0MsRUFBVixHQUFnQkgsR0FBRyxDQUFDSSxNQUF0QztBQUVBLFNBQU9DLEtBQUssQ0FBQ0MsSUFBTixDQUFXTixHQUFYLEVBQ0ZPLEdBREUsQ0FDRSxDQUFDQyxDQUFELEVBQUlDLENBQUosS0FBVTtBQUNYLFFBQUlELENBQUMsS0FBSyxHQUFWLEVBQWU7QUFDWCxhQUFPQSxDQUFQO0FBQ0g7O0FBQ0QsVUFBTSxDQUFDRSxDQUFELEVBQUlDLENBQUosSUFBU0MsVUFBVSxDQUFDSCxDQUFDLEdBQUdSLFNBQUwsRUFBZ0IsQ0FBaEIsQ0FBekI7QUFDQSxVQUFNLENBQUNZLEdBQUQsRUFBTUMsS0FBTixFQUFhQyxJQUFiLElBQXFCQyxRQUFRLENBQUMsRUFBRCxFQUFLTixDQUFMLEVBQVFDLENBQVIsQ0FBbkM7QUFDQSxXQUNJLG1C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LENBQXBCLENBQVQsRUFBaUMsQ0FBakMsQ0FBaEI7QUFFQSxTQUFPL0IsSUFBSSxDQUFDbUMsS0FBTCxDQUFXSCxPQUFPLEdBQUcsR0FBckIsQ0FBUDtBQUNIIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0VG9IdG1sUmFpbmJvdyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gKDIgKiBNYXRoLlBJKSAvIHN0ci5sZW5ndGg7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShzdHIpXG4gICAgICAgIC5tYXAoKGMsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChjID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gZ2VuZXJhdGVBQihpICogZnJlcXVlbmN5LCAxKTtcbiAgICAgICAgICAgIGNvbnN0IFtyZWQsIGdyZWVuLCBibHVlXSA9IGxhYlRvUkdCKDc1LCBhLCBiKTtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgJzxmb250IGNvbG9yPVwiIycgK1xuICAgICAgICAgICAgICAgIHJlZC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpICtcbiAgICAgICAgICAgICAgICBncmVlbi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpICtcbiAgICAgICAgICAgICAgICBibHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikgK1xuICAgICAgICAgICAgICAgICdcIj4nICtcbiAgICAgICAgICAgICAgICBjICtcbiAgICAgICAgICAgICAgICBcIjwvZm9udD5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQUIoaHVlOiBudW1iZXIsIGNocm9tYTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgYSA9IGNocm9tYSAqIDEyNyAqIE1hdGguY29zKGh1ZSk7XG4gICAgY29uc3QgYiA9IGNocm9tYSAqIDEyNyAqIE1hdGguc2luKGh1ZSk7XG5cbiAgICByZXR1cm4gW2EsIGJdO1xufVxuXG5mdW5jdGlvbiBsYWJUb1JHQihsOiBudW1iZXIsIGE6IG51bWJlciwgYjogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSUVMQUJfY29sb3Jfc3BhY2UjUmV2ZXJzZV90cmFuc2Zvcm1hdGlvblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NSR0IjVGhlX2ZvcndhcmRfdHJhbnNmb3JtYXRpb25fKENJRV9YWVpfdG9fc1JHQilcblxuICAgIC8vIENvbnZlcnQgQ0lFTEFCIHRvIENJRVhZWiAoRDY1KVxuICAgIGxldCB5ID0gKGwgKyAxNikgLyAxMTY7XG4gICAgY29uc3QgeCA9IGFkanVzdFhZWih5ICsgYSAvIDUwMCkgKiAwLjk1MDU7XG4gICAgY29uc3QgeiA9IGFkanVzdFhZWih5IC0gYiAvIDIwMCkgKiAxLjA4OTtcblxuICAgIHkgPSBhZGp1c3RYWVooeSk7XG5cbiAgICAvLyBMaW5lYXIgdHJhbnNmb3JtYXRpb24gZnJvbSBDSUVYWVogdG8gUkdCXG4gICAgY29uc3QgcmVkID0gMy4yNDA5Njk5NCAqIHggLSAxLjUzNzM4MzE4ICogeSAtIDAuNDk4NjEwNzYgKiB6O1xuICAgIGNvbnN0IGdyZWVuID0gLTAuOTY5MjQzNjQgKiB4ICsgMS44NzU5Njc1ICogeSArIDAuMDQxNTU1MDYgKiB6O1xuICAgIGNvbnN0IGJsdWUgPSAwLjA1NTYzMDA4ICogeCAtIDAuMjAzOTc2OTYgKiB5ICsgMS4wNTY5NzE1MSAqIHo7XG5cbiAgICByZXR1cm4gW2FkanVzdFJHQihyZWQpLCBhZGp1c3RSR0IoZ3JlZW4pLCBhZGp1c3RSR0IoYmx1ZSldO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RYWVoodjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodiA+IDAuMjA2OSkge1xuICAgICAgICByZXR1cm4gTWF0aC5wb3codiwgMyk7XG4gICAgfVxuICAgIHJldHVybiAwLjEyODQgKiB2IC0gMC4wMTc3MTtcbn1cblxuZnVuY3Rpb24gZ2FtbWFDb3JyZWN0aW9uKHY6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gTm9uLWxpbmVhciB0cmFuc2Zvcm1hdGlvbiB0byBzUkdCXG4gICAgaWYgKHYgPD0gMC4wMDMxMzA4KSB7XG4gICAgICAgIHJldHVybiAxMi45MiAqIHY7XG4gICAgfVxuICAgIHJldHVybiAxLjA1NSAqIE1hdGgucG93KHYsIDEgLyAyLjQpIC0gMC4wNTU7XG59XG5cbmZ1bmN0aW9uIGFkanVzdFJHQih2OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvcnJlY3RlZCA9IGdhbW1hQ29ycmVjdGlvbih2KTtcblxuICAgIC8vIExpbWl0cyBudW1iZXIgYmV0d2VlbiAwIGFuZCAxXG4gICAgY29uc3QgbGltaXRlZCA9IE1hdGgubWluKE1hdGgubWF4KGNvcnJlY3RlZCwgMCksIDEpO1xuXG4gICAgcmV0dXJuIE1hdGgucm91bmQobGltaXRlZCAqIDI1NSk7XG59XG4iXX0=