Skip to content

Commit

Permalink
feat: parse named colors
Browse files Browse the repository at this point in the history
  • Loading branch information
aradzie committed Nov 30, 2024
1 parent 839ccb8 commit 8c40410
Show file tree
Hide file tree
Showing 4 changed files with 175 additions and 0 deletions.
7 changes: 7 additions & 0 deletions packages/keybr-color/lib/color-rgb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ import { type Rgb } from "./types.ts";
* A color in the RGB model.
*/
export class RgbColor extends Color implements Rgb {
static fromHex(hex: number): RgbColor {
const r = (hex >>> 16) & 0xff;
const g = (hex >>> 8) & 0xff;
const b = (hex >>> 0) & 0xff;
return new RgbColor(r / 255, g / 255, b / 255);
}

#r!: number;
#g!: number;
#b!: number;
Expand Down
150 changes: 150 additions & 0 deletions packages/keybr-color/lib/named-colors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
export const namedColors: Record<string, number> = {
aliceblue: 0xf0f8ff,
antiquewhite: 0xfaebd7,
aqua: 0x00ffff,
aquamarine: 0x7fffd4,
azure: 0xf0ffff,
beige: 0xf5f5dc,
bisque: 0xffe4c4,
black: 0x000000,
blanchedalmond: 0xffebcd,
blue: 0x0000ff,
blueviolet: 0x8a2be2,
brown: 0xa52a2a,
burlywood: 0xdeb887,
cadetblue: 0x5f9ea0,
chartreuse: 0x7fff00,
chocolate: 0xd2691e,
coral: 0xff7f50,
cornflowerblue: 0x6495ed,
cornsilk: 0xfff8dc,
crimson: 0xdc143c,
cyan: 0x00ffff,
darkblue: 0x00008b,
darkcyan: 0x008b8b,
darkgoldenrod: 0xb8860b,
darkgray: 0xa9a9a9,
darkgreen: 0x006400,
darkgrey: 0xa9a9a9,
darkkhaki: 0xbdb76b,
darkmagenta: 0x8b008b,
darkolivegreen: 0x556b2f,
darkorange: 0xff8c00,
darkorchid: 0x9932cc,
darkred: 0x8b0000,
darksalmon: 0xe9967a,
darkseagreen: 0x8fbc8f,
darkslateblue: 0x483d8b,
darkslategray: 0x2f4f4f,
darkslategrey: 0x2f4f4f,
darkturquoise: 0x00ced1,
darkviolet: 0x9400d3,
deeppink: 0xff1493,
deepskyblue: 0x00bfff,
dimgray: 0x696969,
dimgrey: 0x696969,
dodgerblue: 0x1e90ff,
firebrick: 0xb22222,
floralwhite: 0xfffaf0,
forestgreen: 0x228b22,
fuchsia: 0xff00ff,
gainsboro: 0xdcdcdc,
ghostwhite: 0xf8f8ff,
gold: 0xffd700,
goldenrod: 0xdaa520,
gray: 0x808080,
green: 0x008000,
greenyellow: 0xadff2f,
grey: 0x808080,
honeydew: 0xf0fff0,
hotpink: 0xff69b4,
indianred: 0xcd5c5c,
indigo: 0x4b0082,
ivory: 0xfffff0,
khaki: 0xf0e68c,
lavender: 0xe6e6fa,
lavenderblush: 0xfff0f5,
lawngreen: 0x7cfc00,
lemonchiffon: 0xfffacd,
lightblue: 0xadd8e6,
lightcoral: 0xf08080,
lightcyan: 0xe0ffff,
lightgoldenrodyellow: 0xfafad2,
lightgray: 0xd3d3d3,
lightgreen: 0x90ee90,
lightgrey: 0xd3d3d3,
lightpink: 0xffb6c1,
lightsalmon: 0xffa07a,
lightseagreen: 0x20b2aa,
lightskyblue: 0x87cefa,
lightslategray: 0x778899,
lightslategrey: 0x778899,
lightsteelblue: 0xb0c4de,
lightyellow: 0xffffe0,
lime: 0x00ff00,
limegreen: 0x32cd32,
linen: 0xfaf0e6,
magenta: 0xff00ff,
maroon: 0x800000,
mediumaquamarine: 0x66cdaa,
mediumblue: 0x0000cd,
mediumorchid: 0xba55d3,
mediumpurple: 0x9370db,
mediumseagreen: 0x3cb371,
mediumslateblue: 0x7b68ee,
mediumspringgreen: 0x00fa9a,
mediumturquoise: 0x48d1cc,
mediumvioletred: 0xc71585,
midnightblue: 0x191970,
mintcream: 0xf5fffa,
mistyrose: 0xffe4e1,
moccasin: 0xffe4b5,
navajowhite: 0xffdead,
navy: 0x000080,
oldlace: 0xfdf5e6,
olive: 0x808000,
olivedrab: 0x6b8e23,
orange: 0xffa500,
orangered: 0xff4500,
orchid: 0xda70d6,
palegoldenrod: 0xeee8aa,
palegreen: 0x98fb98,
paleturquoise: 0xafeeee,
palevioletred: 0xdb7093,
papayawhip: 0xffefd5,
peachpuff: 0xffdab9,
peru: 0xcd853f,
pink: 0xffc0cb,
plum: 0xdda0dd,
powderblue: 0xb0e0e6,
purple: 0x800080,
rebeccapurple: 0x663399,
red: 0xff0000,
rosybrown: 0xbc8f8f,
royalblue: 0x4169e1,
saddlebrown: 0x8b4513,
salmon: 0xfa8072,
sandybrown: 0xf4a460,
seagreen: 0x2e8b57,
seashell: 0xfff5ee,
sienna: 0xa0522d,
silver: 0xc0c0c0,
skyblue: 0x87ceeb,
slateblue: 0x6a5acd,
slategray: 0x708090,
slategrey: 0x708090,
snow: 0xfffafa,
springgreen: 0x00ff7f,
steelblue: 0x4682b4,
tan: 0xd2b48c,
teal: 0x008080,
thistle: 0xd8bfd8,
tomato: 0xff6347,
turquoise: 0x40e0d0,
violet: 0xee82ee,
wheat: 0xf5deb3,
white: 0xffffff,
whitesmoke: 0xf5f5f5,
yellow: 0xffff00,
yellowgreen: 0x9acd32,
};
10 changes: 10 additions & 0 deletions packages/keybr-color/lib/parse.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ test("validate", () => {
});
});

test("parse named", () => {
equal(parseColor("transparent").format(), "rgb(0 0 0/0)");
equal(parseColor("white").format(), "rgb(255 255 255)");
equal(parseColor("gray").format(), "rgb(128 128 128)");
equal(parseColor("red").format(), "rgb(255 0 0)");
equal(parseColor("green").format(), "rgb(0 128 0)");
equal(parseColor("blue").format(), "rgb(0 0 255)");
equal(parseColor("black").format(), "rgb(0 0 0)");
});

describe("parse angle", () => {
it("should wrap around", () => {
equal(parseColor("hsl(+100.0 0% 0%)").format(), "hsl(100 0% 0%)");
Expand Down
8 changes: 8 additions & 0 deletions packages/keybr-color/lib/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { HwbColor } from "./color-hwb.ts";
import { OklabColor } from "./color-oklab.ts";
import { OklchColor } from "./color-oklch.ts";
import { RgbColor } from "./color-rgb.ts";
import { namedColors } from "./named-colors.ts";
import { parseHex } from "./parse-hex.ts";

/**
Expand All @@ -21,6 +22,13 @@ export function hexColor(hex: number): RgbColor {

export function tryParseColor(value: string): Color | null {
value = value.trim();
if (value === "transparent") {
return new RgbColor(0, 0, 0, 0);
}
const hex = namedColors[value];
if (hex != null) {
return RgbColor.fromHex(hex);
}
return parseHex(value) ?? new Parser(value).parse();
}

Expand Down

0 comments on commit 8c40410

Please sign in to comment.