AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./** @package tiny_accessibilitychecker* @copyright 2022, Stevani Andolo <stevani@hotmail.com.au>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/export default class {REGEX_HEX = /^#?([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})(\ufffe)?/;REGEX_HEX3 = /^#?([\da-fA-F]{1})([\da-fA-F]{1})([\da-fA-F]{1})(\ufffe)?/;REGEX_RGB = /rgba?\(([\d]{1,3}), ?([\d]{1,3}), ?([\d]{1,3}),? ?([.\d]*)?\)/;TYPES = {HEX: 'hex',RGB: 'rgb',RGBA: 'rgba'};KEYWORDS = {black: '000',silver: 'c0c0c0',gray: '808080',white: 'fff',maroon: '800000',red: 'f00',purple: '800080',fuchsia: 'f0f',green: '008000',lime: '0f0',olive: '808000',yellow: 'ff0',navy: '000080',blue: '00f',teal: '008080',aqua: '0ff'};STR_HEX = '#{*}{*}{*}';STR_RGB = 'rgb({*}, {*}, {*})';STR_RGBA = 'rgba({*}, {*}, {*}, {*})';toHex = (str) => {var clr = this._convertTo(str, 'hex'),isTransparent = clr.toLowerCase() === 'transparent';if (clr.charAt(0) !== '#' && !isTransparent) {clr = '#' + clr;}return isTransparent ? clr.toLowerCase() : clr.toUpperCase();};toRGB = (str) => {var clr = this._convertTo(str, 'rgb');return clr.toLowerCase();};toRGBA = (str) => {var clr = this._convertTo(str, 'rgba');return clr.toLowerCase();};toArray = (str) => {// Parse with regex and return "matches" array.var type = this.findType(str).toUpperCase(),regex,arr,length,lastItem;if (type === 'HEX' && str.length < 5) {type = 'HEX3';}if (type.charAt(type.length - 1) === 'A') {type = type.slice(0, -1);}regex = this._getRightValue('REGEX_' + type);if (regex) {arr = regex.exec(str) || [];length = arr.length;if (length) {arr.shift();length--;if (type === 'HEX3') {arr[0] += arr[0];arr[1] += arr[1];arr[2] += arr[2];}lastItem = arr[length - 1];if (!lastItem) {arr[length - 1] = 1;}}}return arr;};fromArray = (arr, template) => {arr = arr.concat();if (typeof template === 'undefined') {return arr.join(', ');}var replace = '{*}';template = this._getRightValue('STR_' + template.toUpperCase());if (arr.length === 3 && template.match(/\{\*\}/g).length === 4) {arr.push(1);}while (template.indexOf(replace) >= 0 && arr.length > 0) {template = template.replace(replace, arr.shift());}return template;};findType = (str) => {if (this.KEYWORDS[str]) {return 'keyword';}var index = str.indexOf('('),key;if (index > 0) {key = str.substr(0, index);}if (key && this.TYPES[key.toUpperCase()]) {return this.TYPES[key.toUpperCase()];}return 'hex';};_getAlpha = (clr) => {var alpha,arr = this.toArray(clr);if (arr.length > 3) {alpha = arr.pop();}return +alpha || 1;};_keywordToHex = (clr) => {var keyword = this.KEYWORDS[clr];if (keyword) {return keyword;}return keyword;};_convertTo = (clr, to) => {if (clr === 'transparent') {return clr;}var from = this.findType(clr),originalTo = to,needsAlpha,alpha,method,ucTo;if (from === 'keyword') {clr = this._keywordToHex(clr);from = 'hex';}if (from === 'hex' && clr.length < 5) {if (clr.charAt(0) === '#') {clr = clr.substr(1);}clr = '#' + clr.charAt(0) + clr.charAt(0) +clr.charAt(1) + clr.charAt(1) +clr.charAt(2) + clr.charAt(2);}if (from === to) {return clr;}if (from.charAt(from.length - 1) === 'a') {from = from.slice(0, -1);}needsAlpha = (to.charAt(to.length - 1) === 'a');if (needsAlpha) {to = to.slice(0, -1);alpha = this._getAlpha(clr);}ucTo = to.charAt(0).toUpperCase() + to.substr(1).toLowerCase();method = window['_' + from + 'To' + ucTo];// Check to see if need conversion to rgb first.// Check to see if there is a direct conversion method.// Convertions are: hex <-> rgb <-> hsl.if (!method) {if (from !== 'rgb' && to !== 'rgb') {clr = window['_' + from + 'ToRgb'](clr);from = 'rgb';method = window['_' + from + 'To' + ucTo];}}if (method) {clr = ((method)(clr, needsAlpha));}// Process clr from arrays to strings after conversions if alpha is needed.if (needsAlpha) {if (!Array.isArray(clr)) {clr = this.toArray(clr);}clr.push(alpha);clr = this.fromArray(clr, originalTo.toUpperCase());}return clr;};_hexToRgb = (str, array) => {var r, g, b;/* jshint bitwise:false */if (str.charAt(0) === '#') {str = str.substr(1);}/* eslint no-bitwise: */str = parseInt(str, 16);r = str >> 16;g = str >> 8 & 0xFF;b = str & 0xFF;if (array) {return [r, g, b];}return 'rgb(' + r + ', ' + g + ', ' + b + ')';};_rgbToHex = (str) => {/* jshint bitwise:false */var rgb = this.toArray(str),hex = rgb[2] | (rgb[1] << 8) | (rgb[0] << 16);hex = (+hex).toString(16);while (hex.length < 6) {hex = '0' + hex;}return '#' + hex;};_getRightValue = (string) => {let regex = null;if (string === 'REGEX_RGB') {regex = this.REGEX_RGB;} else if (string === 'REGEX_HEX') {regex = this.REGEX_HEX;} else if (string === 'REGEX_HEX3') {regex = this.REGEX_HEX3;} else if (string === 'STR_HEX') {regex = this.STR_HEX;} else if (string === 'STR_RGB') {regex = this.STR_RGB;} else if (string === 'STR_RGBA') {regex = this.STR_RGBA;}return regex;};}