matrix-react-sdk
Version:
SDK for matrix.org using React
68 lines (62 loc) • 9.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.textToHtmlRainbow = textToHtmlRainbow;
var _lodash = require("lodash");
/*
Copyright 2024 New Vector Ltd.
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
function textToHtmlRainbow(str) {
const frequency = 2 * Math.PI / str.length;
return (0, _lodash.split)(str, "").map((c, i) => {
if (c === " ") {
return c;
}
const [a, b] = generateAB(i * frequency, 1);
const [red, green, blue] = labToRGB(75, a, b);
return '<span data-mx-color="#' + red.toString(16).padStart(2, "0") + green.toString(16).padStart(2, "0") + blue.toString(16).padStart(2, "0") + '">' + c + "</span>";
}).join("");
}
function generateAB(hue, chroma) {
const a = chroma * 127 * Math.cos(hue);
const b = chroma * 127 * Math.sin(hue);
return [a, b];
}
function labToRGB(l, a, b) {
// 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) {
if (v > 0.2069) {
return Math.pow(v, 3);
}
return 0.1284 * v - 0.01771;
}
function gammaCorrection(v) {
// 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) {
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsInRleHRUb0h0bWxSYWluYm93Iiwic3RyIiwiZnJlcXVlbmN5IiwiTWF0aCIsIlBJIiwibGVuZ3RoIiwic3BsaXQiLCJtYXAiLCJjIiwiaSIsImEiLCJiIiwiZ2VuZXJhdGVBQiIsInJlZCIsImdyZWVuIiwiYmx1ZSIsImxhYlRvUkdCIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImpvaW4iLCJodWUiLCJjaHJvbWEiLCJjb3MiLCJzaW4iLCJsIiwieSIsIngiLCJhZGp1c3RYWVoiLCJ6IiwiYWRqdXN0UkdCIiwidiIsInBvdyIsImdhbW1hQ29ycmVjdGlvbiIsImNvcnJlY3RlZCIsImxpbWl0ZWQiLCJtaW4iLCJtYXgiLCJyb3VuZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb2xvdXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IHNwbGl0IH0gZnJvbSBcImxvZGFzaFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gdGV4dFRvSHRtbFJhaW5ib3coc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9ICgyICogTWF0aC5QSSkgLyBzdHIubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHNwbGl0KHN0ciwgXCJcIilcbiAgICAgICAgLm1hcCgoYywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGMgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBnZW5lcmF0ZUFCKGkgKiBmcmVxdWVuY3ksIDEpO1xuICAgICAgICAgICAgY29uc3QgW3JlZCwgZ3JlZW4sIGJsdWVdID0gbGFiVG9SR0IoNzUsIGEsIGIpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAnPHNwYW4gZGF0YS1teC1jb2xvcj1cIiMnICtcbiAgICAgICAgICAgICAgICByZWQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSArXG4gICAgICAgICAgICAgICAgZ3JlZW4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSArXG4gICAgICAgICAgICAgICAgYmx1ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpICtcbiAgICAgICAgICAgICAgICAnXCI+JyArXG4gICAgICAgICAgICAgICAgYyArXG4gICAgICAgICAgICAgICAgXCI8L3NwYW4+XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFCKGh1ZTogbnVtYmVyLCBjaHJvbWE6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IGEgPSBjaHJvbWEgKiAxMjcgKiBNYXRoLmNvcyhodWUpO1xuICAgIGNvbnN0IGIgPSBjaHJvbWEgKiAxMjcgKiBNYXRoLnNpbihodWUpO1xuXG4gICAgcmV0dXJuIFthLCBiXTtcbn1cblxuZnVuY3Rpb24gbGFiVG9SR0IobDogbnVtYmVyLCBhOiBudW1iZXIsIGI6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ0lFTEFCX2NvbG9yX3NwYWNlI1JldmVyc2VfdHJhbnNmb3JtYXRpb25cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TUkdCI1RoZV9mb3J3YXJkX3RyYW5zZm9ybWF0aW9uXyhDSUVfWFlaX3RvX3NSR0IpXG5cbiAgICAvLyBDb252ZXJ0IENJRUxBQiB0byBDSUVYWVogKEQ2NSlcbiAgICBsZXQgeSA9IChsICsgMTYpIC8gMTE2O1xuICAgIGNvbnN0IHggPSBhZGp1c3RYWVooeSArIGEgLyA1MDApICogMC45NTA1O1xuICAgIGNvbnN0IHogPSBhZGp1c3RYWVooeSAtIGIgLyAyMDApICogMS4wODk7XG5cbiAgICB5ID0gYWRqdXN0WFlaKHkpO1xuXG4gICAgLy8gTGluZWFyIHRyYW5zZm9ybWF0aW9uIGZyb20gQ0lFWFlaIHRvIFJHQlxuICAgIGNvbnN0IHJlZCA9IDMuMjQwOTY5OTQgKiB4IC0gMS41MzczODMxOCAqIHkgLSAwLjQ5ODYxMDc2ICogejtcbiAgICBjb25zdCBncmVlbiA9IC0wLjk2OTI0MzY0ICogeCArIDEuODc1OTY3NSAqIHkgKyAwLjA0MTU1NTA2ICogejtcbiAgICBjb25zdCBibHVlID0gMC4wNTU2MzAwOCAqIHggLSAwLjIwMzk3Njk2ICogeSArIDEuMDU2OTcxNTEgKiB6O1xuXG4gICAgcmV0dXJuIFthZGp1c3RSR0IocmVkKSwgYWRqdXN0UkdCKGdyZWVuKSwgYWRqdXN0UkdCKGJsdWUpXTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0WFlaKHY6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHYgPiAwLjIwNjkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KHYsIDMpO1xuICAgIH1cbiAgICByZXR1cm4gMC4xMjg0ICogdiAtIDAuMDE3NzE7XG59XG5cbmZ1bmN0aW9uIGdhbW1hQ29ycmVjdGlvbih2OiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIE5vbi1saW5lYXIgdHJhbnNmb3JtYXRpb24gdG8gc1JHQlxuICAgIGlmICh2IDw9IDAuMDAzMTMwOCkge1xuICAgICAgICByZXR1cm4gMTIuOTIgKiB2O1xuICAgIH1cbiAgICByZXR1cm4gMS4wNTUgKiBNYXRoLnBvdyh2LCAxIC8gMi40KSAtIDAuMDU1O1xufVxuXG5mdW5jdGlvbiBhZGp1c3RSR0IodjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb3JyZWN0ZWQgPSBnYW1tYUNvcnJlY3Rpb24odik7XG5cbiAgICAvLyBMaW1pdHMgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICAgIGNvbnN0IGxpbWl0ZWQgPSBNYXRoLm1pbihNYXRoLm1heChjb3JyZWN0ZWQsIDApLCAxKTtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKGxpbWl0ZWQgKiAyNTUpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJTyxTQUFTQyxpQkFBaUJBLENBQUNDLEdBQVcsRUFBVTtFQUNuRCxNQUFNQyxTQUFTLEdBQUksQ0FBQyxHQUFHQyxJQUFJLENBQUNDLEVBQUUsR0FBSUgsR0FBRyxDQUFDSSxNQUFNO0VBRTVDLE9BQU8sSUFBQUMsYUFBSyxFQUFDTCxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQ2hCTSxHQUFHLENBQUMsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEtBQUs7SUFDWCxJQUFJRCxDQUFDLEtBQUssR0FBRyxFQUFFO01BQ1gsT0FBT0EsQ0FBQztJQUNaO0lBQ0EsTUFBTSxDQUFDRSxDQUFDLEVBQUVDLENBQUMsQ0FBQyxHQUFHQyxVQUFVLENBQUNILENBQUMsR0FBR1AsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUNXLEdBQUcsRUFBRUMsS0FBSyxFQUFFQyxJQUFJLENBQUMsR0FBR0MsUUFBUSxDQUFDLEVBQUUsRUFBRU4sQ0FBQyxFQUFFQyxDQUFDLENBQUM7SUFDN0MsT0FDSSx3QkFBd0IsR0FDeEJFLEdBQUcsQ0FBQ0ksUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUNqQ0osS0FBSyxDQUFDRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQ25DSCxJ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