UNPKG

niram

Version:

A javascript library to convert between various css colour formats.

121 lines (120 loc) 5.44 kB
import untypedNamedColours from '../assets/namedColours.json' with { type: 'json' }; import { REG_EXP_MATCH } from '../regExpMatches.js'; import { normaliseFraction } from './normalisers.js'; import { getAlphaFractionFromHex, numberTo2Hex } from './hex.js'; import { hslToRgb } from './hslToRgb.js'; const namedColours = untypedNamedColours; export function getRgbHexAndAlpha(colour) { if (!isNaN(Number(colour))) { const { 1: redHex, 2: greenHex, 3: blueHex, 4: alphaHex, } = REG_EXP_MATCH['HEX_8'].exec(Number(colour).toString(16).padStart(8, '0')) || []; return { type: 'decimal', redHex, greenHex, blueHex, alphaHex, alphaFraction: getAlphaFractionFromHex(alphaHex), }; } else if (REG_EXP_MATCH['HEX_6'].test(colour)) { const { 1: redHex, 2: greenHex, 3: blueHex } = REG_EXP_MATCH['HEX_6'].exec(colour) || []; return { type: 'hex', redHex, greenHex, blueHex, }; } else if (REG_EXP_MATCH['HEX_3'].test(colour)) { const { 1: redHex, 2: greenHex, 3: blueHex } = REG_EXP_MATCH['HEX_3'].exec(colour) || []; return { type: 'hex', redHex: `${redHex}${redHex}`, greenHex: `${greenHex}${greenHex}`, blueHex: `${blueHex}${blueHex}`, }; } else if (REG_EXP_MATCH['RGB_COMA'].test(colour)) { const { 1: red, 2: green, 3: blue } = REG_EXP_MATCH['RGB_COMA'].exec(colour) || []; return { type: 'rgb', redHex: numberTo2Hex(red), greenHex: numberTo2Hex(green), blueHex: numberTo2Hex(blue), }; } else if (REG_EXP_MATCH['RGB_SPACE'].test(colour)) { const { 1: red, 2: green, 3: blue } = REG_EXP_MATCH['RGB_SPACE'].exec(colour) || []; return { type: 'rgb_space', redHex: numberTo2Hex(red), greenHex: numberTo2Hex(green), blueHex: numberTo2Hex(blue), }; } else if (REG_EXP_MATCH['RGBA_COMA'].test(colour)) { const { 1: red, 2: green, 3: blue, 4: alphaFraction, } = REG_EXP_MATCH['RGBA_COMA'].exec(colour) || []; return { type: 'rgba', redHex: numberTo2Hex(red), greenHex: numberTo2Hex(green), blueHex: numberTo2Hex(blue), alphaFraction: normaliseFraction(alphaFraction), }; } else if (REG_EXP_MATCH['RGBA_SPACE'].test(colour)) { const { 1: red, 2: green, 3: blue, 4: alphaFraction, } = REG_EXP_MATCH['RGBA_SPACE'].exec(colour) || []; return { type: 'rgba_space', redHex: numberTo2Hex(red), greenHex: numberTo2Hex(green), blueHex: numberTo2Hex(blue), alphaFraction: normaliseFraction(alphaFraction), }; } else if (REG_EXP_MATCH['HSL_COMA'].test(colour)) { const { 1: hueDegree, 2: hueRadian, 3: satPercent, 4: levelPercent, } = REG_EXP_MATCH['HSL_COMA'].exec(colour) || []; return hslToRgb(hueDegree ? 'hsl_deg' : 'hsl_rad', hueDegree ? Number(hueDegree) : (Number(hueRadian) / Math.PI) * 180, satPercent, levelPercent); } else if (REG_EXP_MATCH['HSL_SPACE'].test(colour)) { const { 1: hueDegree, 2: hueRadian, 3: satPercent, 4: levelPercent, } = REG_EXP_MATCH['HSL_SPACE'].exec(colour) || []; return hslToRgb(hueDegree ? 'hsl_deg_space' : 'hsl_rad_space', hueDegree ? Number(hueDegree) : (Number(hueRadian) / Math.PI) * 180, satPercent, levelPercent); } else if (REG_EXP_MATCH['HSLA_COMA'].test(colour)) { const { 1: hueDegree, 2: hueRadian, 3: satPercent, 4: levelPercent, 5: alphaFraction, } = REG_EXP_MATCH['HSLA_COMA'].exec(colour) || []; return hslToRgb(hueDegree ? 'hsla_deg' : 'hsla_rad', hueDegree ? Number(hueDegree) : (Number(hueRadian) / Math.PI) * 180, satPercent, levelPercent, alphaFraction); } else if (REG_EXP_MATCH['HSLA_SPACE'].test(colour)) { const { 1: hueDegree, 2: hueRadian, 3: satPercent, 4: levelPercent, 5: alphaFraction, } = REG_EXP_MATCH['HSLA_SPACE'].exec(colour) || []; return hslToRgb(hueDegree ? 'hsla_deg_space' : 'hsla_rad_space', hueDegree ? Number(hueDegree) : (Number(hueRadian) / Math.PI) * 180, satPercent, levelPercent, alphaFraction); } else if (Object.keys(namedColours.basic).includes(colour.toLowerCase())) { const { 1: redHex, 2: greenHex, 3: blueHex, } = REG_EXP_MATCH['HEX_6'].exec(namedColours.basic[colour.toLowerCase()]) || []; return { type: 'named_basic', redHex, greenHex, blueHex, }; } else if (Object.keys(namedColours.extended).includes(colour.toLowerCase())) { const { 1: redHex, 2: greenHex, 3: blueHex, } = REG_EXP_MATCH['HEX_6'].exec(namedColours.extended[colour.toLowerCase()]) || []; return { type: 'named_extended', redHex, greenHex, blueHex, }; } return { type: 'missing', redHex: '00', greenHex: '00', blueHex: '00', alphaFraction: 0, }; } export function getColourName(hexCode) { return (Object.keys(namedColours.basic).find((key) => namedColours.basic[key] === hexCode) || Object.keys(namedColours.extended).find((key) => namedColours.extended[key] === hexCode)); }