UNPKG

matrix-react-sdk

Version:
110 lines (95 loc) 10.3 kB
"use strict"; 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=