feature: vor und nachteile

This commit is contained in:
Hikyu
2026-05-31 13:54:31 +02:00
parent 552a947a1c
commit e3dad17446
23270 changed files with 3024794 additions and 200 deletions
@@ -0,0 +1,355 @@
'use strict';
const colors_keywords = require('./keywords.cjs');
function rgb2hsl(rgb) {
const c1 = rgb.r / 255, c2 = rgb.g / 255, c3 = rgb.b / 255, kmin = Math.min(c1, Math.min(c2, c3)), kmax = Math.max(c1, Math.max(c2, c3)), l = (kmax + kmin) / 2;
let s, h, delta;
if (kmax === kmin) {
s = h = 0;
} else {
if (l < 0.5) {
s = (kmax - kmin) / (kmax + kmin);
} else {
s = (kmax - kmin) / (2 - kmax - kmin);
}
delta = kmax - kmin;
if (kmax === c1) {
h = (c2 - c3) / delta;
} else if (kmax === c2) {
h = 2 + (c3 - c1) / delta;
} else {
h = 4 + (c1 - c2) / delta;
}
h = h * 60;
if (h < 0) {
h += 360;
}
}
return {
type: "hsl",
h,
s: s * 100,
l: l * 100,
alpha: rgb.alpha
};
}
function fromFunction(value) {
if (value.slice(-1) !== ")") {
return null;
}
const parts = value.slice(0, value.length - 1).split("(");
if (parts.length !== 2) {
return null;
}
const func = parts[0].trim();
const content = parts[1].trim();
let values;
let alphaStr;
switch (func) {
case "lch":
case "lab": {
const parts2 = content.split("/");
switch (parts2.length) {
case 2:
alphaStr = parts2[1].trim();
break;
case 1:
break;
default:
return null;
}
values = parts2[0].trim().split(/[\s,]+/);
break;
}
case "rgb":
case "rgba":
case "hsl":
case "hsla": {
values = content.trim().split(/[\s,]+/);
if (values.length === 4) {
alphaStr = values.pop().trim();
}
break;
}
default: {
return {
type: "function",
func,
value: content
};
}
}
let alpha = 1;
if (typeof alphaStr === "string") {
alpha = parseFloat(alphaStr);
const index = alphaStr.indexOf("%");
const hasPercentage = index !== -1;
if (isNaN(alpha) || hasPercentage && index !== alphaStr.length - 1) {
return null;
}
if (hasPercentage) {
alpha /= 100;
}
}
if (alpha < 0 || alpha > 1 || values.length !== 3) {
return null;
}
if (alpha === 0) {
return {
type: "transparent"
};
}
const isPercentage = [];
const numbers = [];
for (let i = 0; i < 3; i++) {
const colorStr = values[i];
const index = colorStr.indexOf("%");
const hasPercentage = index !== -1;
if (hasPercentage && index !== colorStr.length - 1) {
return null;
}
const colorNum = parseFloat(colorStr);
if (isNaN(colorNum)) {
return null;
}
isPercentage.push(hasPercentage);
numbers.push(colorNum);
}
switch (func) {
case "rgb":
case "rgba": {
const hasPercengage = isPercentage[0];
if (hasPercengage !== isPercentage[1] || hasPercengage !== isPercentage[2]) {
return null;
}
let r = numbers[0];
let g = numbers[1];
let b = numbers[2];
if (hasPercengage) {
r = r * 255 / 100;
g = g * 255 / 100;
b = b * 255 / 100;
}
return {
type: "rgb",
r,
g,
b,
alpha
};
}
case "hsl":
case "hsla": {
if (isPercentage[0] || !isPercentage[1] || !isPercentage[2]) {
return null;
}
return {
type: "hsl",
h: numbers[0],
s: numbers[1],
l: numbers[2],
alpha
};
}
case "lab":
case "lch": {
if (!isPercentage[0] || isPercentage[1] || isPercentage[2]) {
return null;
}
return func === "lab" ? {
type: "lab",
l: numbers[0],
a: numbers[1],
b: numbers[2],
alpha
} : {
type: "lch",
l: numbers[0],
c: numbers[1],
h: numbers[2],
alpha
};
}
}
return null;
}
function fromHex(value) {
if (value.slice(0, 1) === "#") {
value = value.slice(1);
}
if (!/^[\da-f]+$/i.test(value)) {
return null;
}
let alpha = 1;
const hex = ["", "", ""];
switch (value.length) {
case 4: {
alpha = parseInt(value[3] + value[3], 16) / 255;
}
case 3: {
hex[0] = value[0] + value[0];
hex[1] = value[1] + value[1];
hex[2] = value[2] + value[2];
break;
}
case 8: {
alpha = parseInt(value[6] + value[7], 16) / 255;
}
case 6: {
hex[0] = value[0] + value[1];
hex[1] = value[2] + value[3];
hex[2] = value[4] + value[5];
break;
}
default:
return null;
}
return alpha === 0 ? {
type: "transparent"
} : {
type: "rgb",
r: parseInt(hex[0], 16),
g: parseInt(hex[1], 16),
b: parseInt(hex[2], 16),
alpha
};
}
function stringToColor(value) {
value = value.toLowerCase().trim();
if (colors_keywords.colorKeywords[value]) {
return { ...colors_keywords.colorKeywords[value] };
}
if (value.indexOf("(") !== -1) {
return fromFunction(value);
}
return fromHex(value);
}
function compareColors(color1, color2) {
if (color1.type === color2.type) {
let testKeys = new Set(Object.keys(color1));
switch (color1.type) {
case "hsl": {
if (color1.s === 0) {
testKeys.delete("h");
}
if (color1.l === 0 || color1.l === 100) {
testKeys.delete("h");
testKeys.delete("s");
}
}
case "rgb":
if (color1.alpha === 0) {
testKeys = /* @__PURE__ */ new Set(["a"]);
}
}
const keys = Array.from(testKeys);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (color1[key] !== color2[key]) {
return false;
}
}
return true;
}
const list = [color1, color2].sort((a, b) => a.type.localeCompare(b.type));
const item1 = list[0];
const item2 = list[1];
switch (item1.type) {
case "hsl": {
switch (item2.type) {
case "rgb": {
return compareColors(item1, rgb2hsl(item2));
}
case "transparent":
return item1.alpha === 0;
}
return false;
}
case "rgb": {
switch (item2.type) {
case "transparent":
return item1.alpha === 0;
}
}
}
return false;
}
function colorToHexString(color, canCompact = true) {
if (color.alpha !== 1) {
return null;
}
let result = "";
const attrs = ["r", "g", "b"];
for (let i = 0; i < attrs.length; i++) {
const value = color[attrs[i]];
if (Math.round(value) !== value) {
return null;
}
const hex = value.toString(16);
result += (value < 16 ? "0" : "") + hex;
}
if (result.length !== 6) {
return null;
}
if (canCompact && result[0] === result[1] && result[2] === result[3] && result[4] === result[5]) {
result = result[0] + result[2] + result[4];
}
return "#" + result;
}
function colorToString(color) {
if (color.alpha === 0) {
return "transparent";
}
switch (color.type) {
case "none":
case "transparent":
return color.type;
case "current":
return "currentColor";
case "rgb": {
const hex = colorToHexString(color);
if (hex !== null) {
return hex;
}
const list = [color.r, color.g, color.b];
if (color.alpha !== 1) {
list.push(color.alpha);
}
return "rgb" + (list.length === 4 ? "a(" : "(") + list.join(", ") + ")";
}
case "hsl": {
const list = [
color.h,
color.s.toString() + "%",
color.l.toString() + "%"
];
if (color.alpha !== 1) {
list.push(color.alpha);
}
return "hsl" + (list.length === 4 ? "a(" : "(") + list.join(", ") + ")";
}
case "lab": {
const list = [color.l.toString() + "%", color.a, color.b];
if (color.alpha !== 1) {
list.push("/ " + color.alpha.toString());
}
return "lab(" + list.join(" ") + ")";
}
case "lch": {
const list = [color.l.toString() + "%", color.c, color.h];
if (color.alpha !== 1) {
list.push("/ " + color.alpha.toString());
}
return "lch(" + list.join(" ") + ")";
}
case "function": {
return color.func + "(" + color.value + ")";
}
}
}
exports.colorToHexString = colorToHexString;
exports.colorToString = colorToString;
exports.compareColors = compareColors;
exports.stringToColor = stringToColor;
@@ -0,0 +1,20 @@
import { Color, RGBColor } from './types.cjs';
/**
* String to color
*/
declare function stringToColor(value: string): Color | null;
/**
* Check if colors are identical
*/
declare function compareColors(color1: Color, color2: Color): boolean;
/**
* Color to hex
*/
declare function colorToHexString(color: RGBColor, canCompact?: boolean): string | null;
/**
* Convert color to string
*/
declare function colorToString(color: Color): string;
export { colorToHexString, colorToString, compareColors, stringToColor };
@@ -0,0 +1,20 @@
import { Color, RGBColor } from './types.mjs';
/**
* String to color
*/
declare function stringToColor(value: string): Color | null;
/**
* Check if colors are identical
*/
declare function compareColors(color1: Color, color2: Color): boolean;
/**
* Color to hex
*/
declare function colorToHexString(color: RGBColor, canCompact?: boolean): string | null;
/**
* Convert color to string
*/
declare function colorToString(color: Color): string;
export { colorToHexString, colorToString, compareColors, stringToColor };
@@ -0,0 +1,20 @@
import { Color, RGBColor } from './types.js';
/**
* String to color
*/
declare function stringToColor(value: string): Color | null;
/**
* Check if colors are identical
*/
declare function compareColors(color1: Color, color2: Color): boolean;
/**
* Color to hex
*/
declare function colorToHexString(color: RGBColor, canCompact?: boolean): string | null;
/**
* Convert color to string
*/
declare function colorToString(color: Color): string;
export { colorToHexString, colorToString, compareColors, stringToColor };
@@ -0,0 +1,350 @@
import { colorKeywords } from './keywords.mjs';
function rgb2hsl(rgb) {
const c1 = rgb.r / 255, c2 = rgb.g / 255, c3 = rgb.b / 255, kmin = Math.min(c1, Math.min(c2, c3)), kmax = Math.max(c1, Math.max(c2, c3)), l = (kmax + kmin) / 2;
let s, h, delta;
if (kmax === kmin) {
s = h = 0;
} else {
if (l < 0.5) {
s = (kmax - kmin) / (kmax + kmin);
} else {
s = (kmax - kmin) / (2 - kmax - kmin);
}
delta = kmax - kmin;
if (kmax === c1) {
h = (c2 - c3) / delta;
} else if (kmax === c2) {
h = 2 + (c3 - c1) / delta;
} else {
h = 4 + (c1 - c2) / delta;
}
h = h * 60;
if (h < 0) {
h += 360;
}
}
return {
type: "hsl",
h,
s: s * 100,
l: l * 100,
alpha: rgb.alpha
};
}
function fromFunction(value) {
if (value.slice(-1) !== ")") {
return null;
}
const parts = value.slice(0, value.length - 1).split("(");
if (parts.length !== 2) {
return null;
}
const func = parts[0].trim();
const content = parts[1].trim();
let values;
let alphaStr;
switch (func) {
case "lch":
case "lab": {
const parts2 = content.split("/");
switch (parts2.length) {
case 2:
alphaStr = parts2[1].trim();
break;
case 1:
break;
default:
return null;
}
values = parts2[0].trim().split(/[\s,]+/);
break;
}
case "rgb":
case "rgba":
case "hsl":
case "hsla": {
values = content.trim().split(/[\s,]+/);
if (values.length === 4) {
alphaStr = values.pop().trim();
}
break;
}
default: {
return {
type: "function",
func,
value: content
};
}
}
let alpha = 1;
if (typeof alphaStr === "string") {
alpha = parseFloat(alphaStr);
const index = alphaStr.indexOf("%");
const hasPercentage = index !== -1;
if (isNaN(alpha) || hasPercentage && index !== alphaStr.length - 1) {
return null;
}
if (hasPercentage) {
alpha /= 100;
}
}
if (alpha < 0 || alpha > 1 || values.length !== 3) {
return null;
}
if (alpha === 0) {
return {
type: "transparent"
};
}
const isPercentage = [];
const numbers = [];
for (let i = 0; i < 3; i++) {
const colorStr = values[i];
const index = colorStr.indexOf("%");
const hasPercentage = index !== -1;
if (hasPercentage && index !== colorStr.length - 1) {
return null;
}
const colorNum = parseFloat(colorStr);
if (isNaN(colorNum)) {
return null;
}
isPercentage.push(hasPercentage);
numbers.push(colorNum);
}
switch (func) {
case "rgb":
case "rgba": {
const hasPercengage = isPercentage[0];
if (hasPercengage !== isPercentage[1] || hasPercengage !== isPercentage[2]) {
return null;
}
let r = numbers[0];
let g = numbers[1];
let b = numbers[2];
if (hasPercengage) {
r = r * 255 / 100;
g = g * 255 / 100;
b = b * 255 / 100;
}
return {
type: "rgb",
r,
g,
b,
alpha
};
}
case "hsl":
case "hsla": {
if (isPercentage[0] || !isPercentage[1] || !isPercentage[2]) {
return null;
}
return {
type: "hsl",
h: numbers[0],
s: numbers[1],
l: numbers[2],
alpha
};
}
case "lab":
case "lch": {
if (!isPercentage[0] || isPercentage[1] || isPercentage[2]) {
return null;
}
return func === "lab" ? {
type: "lab",
l: numbers[0],
a: numbers[1],
b: numbers[2],
alpha
} : {
type: "lch",
l: numbers[0],
c: numbers[1],
h: numbers[2],
alpha
};
}
}
return null;
}
function fromHex(value) {
if (value.slice(0, 1) === "#") {
value = value.slice(1);
}
if (!/^[\da-f]+$/i.test(value)) {
return null;
}
let alpha = 1;
const hex = ["", "", ""];
switch (value.length) {
case 4: {
alpha = parseInt(value[3] + value[3], 16) / 255;
}
case 3: {
hex[0] = value[0] + value[0];
hex[1] = value[1] + value[1];
hex[2] = value[2] + value[2];
break;
}
case 8: {
alpha = parseInt(value[6] + value[7], 16) / 255;
}
case 6: {
hex[0] = value[0] + value[1];
hex[1] = value[2] + value[3];
hex[2] = value[4] + value[5];
break;
}
default:
return null;
}
return alpha === 0 ? {
type: "transparent"
} : {
type: "rgb",
r: parseInt(hex[0], 16),
g: parseInt(hex[1], 16),
b: parseInt(hex[2], 16),
alpha
};
}
function stringToColor(value) {
value = value.toLowerCase().trim();
if (colorKeywords[value]) {
return { ...colorKeywords[value] };
}
if (value.indexOf("(") !== -1) {
return fromFunction(value);
}
return fromHex(value);
}
function compareColors(color1, color2) {
if (color1.type === color2.type) {
let testKeys = new Set(Object.keys(color1));
switch (color1.type) {
case "hsl": {
if (color1.s === 0) {
testKeys.delete("h");
}
if (color1.l === 0 || color1.l === 100) {
testKeys.delete("h");
testKeys.delete("s");
}
}
case "rgb":
if (color1.alpha === 0) {
testKeys = /* @__PURE__ */ new Set(["a"]);
}
}
const keys = Array.from(testKeys);
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (color1[key] !== color2[key]) {
return false;
}
}
return true;
}
const list = [color1, color2].sort((a, b) => a.type.localeCompare(b.type));
const item1 = list[0];
const item2 = list[1];
switch (item1.type) {
case "hsl": {
switch (item2.type) {
case "rgb": {
return compareColors(item1, rgb2hsl(item2));
}
case "transparent":
return item1.alpha === 0;
}
return false;
}
case "rgb": {
switch (item2.type) {
case "transparent":
return item1.alpha === 0;
}
}
}
return false;
}
function colorToHexString(color, canCompact = true) {
if (color.alpha !== 1) {
return null;
}
let result = "";
const attrs = ["r", "g", "b"];
for (let i = 0; i < attrs.length; i++) {
const value = color[attrs[i]];
if (Math.round(value) !== value) {
return null;
}
const hex = value.toString(16);
result += (value < 16 ? "0" : "") + hex;
}
if (result.length !== 6) {
return null;
}
if (canCompact && result[0] === result[1] && result[2] === result[3] && result[4] === result[5]) {
result = result[0] + result[2] + result[4];
}
return "#" + result;
}
function colorToString(color) {
if (color.alpha === 0) {
return "transparent";
}
switch (color.type) {
case "none":
case "transparent":
return color.type;
case "current":
return "currentColor";
case "rgb": {
const hex = colorToHexString(color);
if (hex !== null) {
return hex;
}
const list = [color.r, color.g, color.b];
if (color.alpha !== 1) {
list.push(color.alpha);
}
return "rgb" + (list.length === 4 ? "a(" : "(") + list.join(", ") + ")";
}
case "hsl": {
const list = [
color.h,
color.s.toString() + "%",
color.l.toString() + "%"
];
if (color.alpha !== 1) {
list.push(color.alpha);
}
return "hsl" + (list.length === 4 ? "a(" : "(") + list.join(", ") + ")";
}
case "lab": {
const list = [color.l.toString() + "%", color.a, color.b];
if (color.alpha !== 1) {
list.push("/ " + color.alpha.toString());
}
return "lab(" + list.join(" ") + ")";
}
case "lch": {
const list = [color.l.toString() + "%", color.c, color.h];
if (color.alpha !== 1) {
list.push("/ " + color.alpha.toString());
}
return "lch(" + list.join(" ") + ")";
}
case "function": {
return color.func + "(" + color.value + ")";
}
}
}
export { colorToHexString, colorToString, compareColors, stringToColor };
@@ -0,0 +1,190 @@
'use strict';
const colorKeywords = {
transparent: {
type: "transparent"
},
none: {
type: "none"
},
currentcolor: {
type: "current"
}
};
function add(keyword, colors) {
const type = "rgb";
const r = colors[0];
const length = colors.length;
colorKeywords[keyword] = {
type,
r,
g: length > 1 ? colors[1] : r,
b: length > 2 ? colors[2] : r,
alpha: length > 3 ? colors[3] : 1
};
}
add("silver", [192]);
add("gray", [128]);
add("white", [255]);
add("maroon", [128, 0, 0]);
add("red", [255, 0, 0]);
add("purple", [128, 0]);
add("fuchsia", [255, 0]);
add("green", [0, 128]);
add("lime", [0, 255]);
add("olive", [128, 128, 0]);
add("yellow", [255, 255, 0]);
add("navy", [0, 0, 128]);
add("blue", [0, 0, 255]);
add("teal", [0, 128, 128]);
add("aqua", [0, 255, 255]);
add("aliceblue", [240, 248, 255]);
add("antiquewhite", [250, 235, 215]);
add("aqua", [0, 255, 255]);
add("aquamarine", [127, 255, 212]);
add("azure", [240, 255, 255]);
add("beige", [245, 245, 220]);
add("bisque", [255, 228, 196]);
add("black", [0]);
add("blanchedalmond", [255, 235, 205]);
add("blue", [0, 0, 255]);
add("blueviolet", [138, 43, 226]);
add("brown", [165, 42, 42]);
add("burlywood", [222, 184, 135]);
add("cadetblue", [95, 158, 160]);
add("chartreuse", [127, 255, 0]);
add("chocolate", [210, 105, 30]);
add("coral", [255, 127, 80]);
add("cornflowerblue", [100, 149, 237]);
add("cornsilk", [255, 248, 220]);
add("crimson", [220, 20, 60]);
add("cyan", [0, 255, 255]);
add("darkblue", [0, 0, 139]);
add("darkcyan", [0, 139, 139]);
add("darkgoldenrod", [184, 134, 11]);
add("darkgray", [169]);
add("darkgreen", [0, 100]);
add("darkgrey", [169]);
add("darkkhaki", [189, 183, 107]);
add("darkmagenta", [139, 0]);
add("darkolivegreen", [85, 107, 47]);
add("darkorange", [255, 140, 0]);
add("darkorchid", [153, 50, 204]);
add("darkred", [139, 0, 0]);
add("darksalmon", [233, 150, 122]);
add("darkseagreen", [143, 188]);
add("darkslateblue", [72, 61, 139]);
add("darkslategray", [47, 79, 79]);
add("darkslategrey", [47, 79, 79]);
add("darkturquoise", [0, 206, 209]);
add("darkviolet", [148, 0, 211]);
add("deeppink", [255, 20, 147]);
add("deepskyblue", [0, 191, 255]);
add("dimgray", [105]);
add("dimgrey", [105]);
add("dodgerblue", [30, 144, 255]);
add("firebrick", [178, 34, 34]);
add("floralwhite", [255, 250, 240]);
add("forestgreen", [34, 139]);
add("fuchsia", [255, 0]);
add("gainsboro", [220]);
add("ghostwhite", [248, 248, 255]);
add("gold", [255, 215, 0]);
add("goldenrod", [218, 165, 32]);
add("gray", [128]);
add("green", [0, 128]);
add("greenyellow", [173, 255, 47]);
add("grey", [128]);
add("honeydew", [240, 255]);
add("hotpink", [255, 105, 180]);
add("indianred", [205, 92, 92]);
add("indigo", [75, 0, 130]);
add("ivory", [255, 255, 240]);
add("khaki", [240, 230, 140]);
add("lavender", [230, 230, 250]);
add("lavenderblush", [255, 240, 245]);
add("lawngreen", [124, 252, 0]);
add("lemonchiffon", [255, 250, 205]);
add("lightblue", [173, 216, 230]);
add("lightcoral", [240, 128, 128]);
add("lightcyan", [224, 255, 255]);
add("lightgoldenrodyellow", [250, 250, 210]);
add("lightgray", [211]);
add("lightgreen", [144, 238]);
add("lightgrey", [211]);
add("lightpink", [255, 182, 193]);
add("lightsalmon", [255, 160, 122]);
add("lightseagreen", [32, 178, 170]);
add("lightskyblue", [135, 206, 250]);
add("lightslategray", [119, 136, 153]);
add("lightslategrey", [119, 136, 153]);
add("lightsteelblue", [176, 196, 222]);
add("lightyellow", [255, 255, 224]);
add("lime", [0, 255]);
add("limegreen", [50, 205]);
add("linen", [250, 240, 230]);
add("magenta", [255, 0]);
add("maroon", [128, 0, 0]);
add("mediumaquamarine", [102, 205, 170]);
add("mediumblue", [0, 0, 205]);
add("mediumorchid", [186, 85, 211]);
add("mediumpurple", [147, 112, 219]);
add("mediumseagreen", [60, 179, 113]);
add("mediumslateblue", [123, 104, 238]);
add("mediumspringgreen", [0, 250, 154]);
add("mediumturquoise", [72, 209, 204]);
add("mediumvioletred", [199, 21, 133]);
add("midnightblue", [25, 25, 112]);
add("mintcream", [245, 255, 250]);
add("mistyrose", [255, 228, 225]);
add("moccasin", [255, 228, 181]);
add("navajowhite", [255, 222, 173]);
add("navy", [0, 0, 128]);
add("oldlace", [253, 245, 230]);
add("olive", [128, 128, 0]);
add("olivedrab", [107, 142, 35]);
add("orange", [255, 165, 0]);
add("orangered", [255, 69, 0]);
add("orchid", [218, 112, 214]);
add("palegoldenrod", [238, 232, 170]);
add("palegreen", [152, 251]);
add("paleturquoise", [175, 238, 238]);
add("palevioletred", [219, 112, 147]);
add("papayawhip", [255, 239, 213]);
add("peachpuff", [255, 218, 185]);
add("peru", [205, 133, 63]);
add("pink", [255, 192, 203]);
add("plum", [221, 160]);
add("powderblue", [176, 224, 230]);
add("purple", [128, 0]);
add("rebeccapurple", [102, 51, 153]);
add("red", [255, 0, 0]);
add("rosybrown", [188, 143, 143]);
add("royalblue", [65, 105, 225]);
add("saddlebrown", [139, 69, 19]);
add("salmon", [250, 128, 114]);
add("sandybrown", [244, 164, 96]);
add("seagreen", [46, 139, 87]);
add("seashell", [255, 245, 238]);
add("sienna", [160, 82, 45]);
add("silver", [192]);
add("skyblue", [135, 206, 235]);
add("slateblue", [106, 90, 205]);
add("slategray", [112, 128, 144]);
add("slategrey", [112, 128, 144]);
add("snow", [255, 250, 250]);
add("springgreen", [0, 255, 127]);
add("steelblue", [70, 130, 180]);
add("tan", [210, 180, 140]);
add("teal", [0, 128, 128]);
add("thistle", [216, 191]);
add("tomato", [255, 99, 71]);
add("turquoise", [64, 224, 208]);
add("violet", [238, 130]);
add("wheat", [245, 222, 179]);
add("white", [255]);
add("whitesmoke", [245]);
add("yellow", [255, 255, 0]);
add("yellowgreen", [154, 205, 50]);
exports.colorKeywords = colorKeywords;
@@ -0,0 +1,8 @@
import { Color } from './types.cjs';
/**
* Color keywords
*/
declare const colorKeywords: Record<string, Color>;
export { colorKeywords };
@@ -0,0 +1,8 @@
import { Color } from './types.mjs';
/**
* Color keywords
*/
declare const colorKeywords: Record<string, Color>;
export { colorKeywords };
@@ -0,0 +1,8 @@
import { Color } from './types.js';
/**
* Color keywords
*/
declare const colorKeywords: Record<string, Color>;
export { colorKeywords };
@@ -0,0 +1,188 @@
const colorKeywords = {
transparent: {
type: "transparent"
},
none: {
type: "none"
},
currentcolor: {
type: "current"
}
};
function add(keyword, colors) {
const type = "rgb";
const r = colors[0];
const length = colors.length;
colorKeywords[keyword] = {
type,
r,
g: length > 1 ? colors[1] : r,
b: length > 2 ? colors[2] : r,
alpha: length > 3 ? colors[3] : 1
};
}
add("silver", [192]);
add("gray", [128]);
add("white", [255]);
add("maroon", [128, 0, 0]);
add("red", [255, 0, 0]);
add("purple", [128, 0]);
add("fuchsia", [255, 0]);
add("green", [0, 128]);
add("lime", [0, 255]);
add("olive", [128, 128, 0]);
add("yellow", [255, 255, 0]);
add("navy", [0, 0, 128]);
add("blue", [0, 0, 255]);
add("teal", [0, 128, 128]);
add("aqua", [0, 255, 255]);
add("aliceblue", [240, 248, 255]);
add("antiquewhite", [250, 235, 215]);
add("aqua", [0, 255, 255]);
add("aquamarine", [127, 255, 212]);
add("azure", [240, 255, 255]);
add("beige", [245, 245, 220]);
add("bisque", [255, 228, 196]);
add("black", [0]);
add("blanchedalmond", [255, 235, 205]);
add("blue", [0, 0, 255]);
add("blueviolet", [138, 43, 226]);
add("brown", [165, 42, 42]);
add("burlywood", [222, 184, 135]);
add("cadetblue", [95, 158, 160]);
add("chartreuse", [127, 255, 0]);
add("chocolate", [210, 105, 30]);
add("coral", [255, 127, 80]);
add("cornflowerblue", [100, 149, 237]);
add("cornsilk", [255, 248, 220]);
add("crimson", [220, 20, 60]);
add("cyan", [0, 255, 255]);
add("darkblue", [0, 0, 139]);
add("darkcyan", [0, 139, 139]);
add("darkgoldenrod", [184, 134, 11]);
add("darkgray", [169]);
add("darkgreen", [0, 100]);
add("darkgrey", [169]);
add("darkkhaki", [189, 183, 107]);
add("darkmagenta", [139, 0]);
add("darkolivegreen", [85, 107, 47]);
add("darkorange", [255, 140, 0]);
add("darkorchid", [153, 50, 204]);
add("darkred", [139, 0, 0]);
add("darksalmon", [233, 150, 122]);
add("darkseagreen", [143, 188]);
add("darkslateblue", [72, 61, 139]);
add("darkslategray", [47, 79, 79]);
add("darkslategrey", [47, 79, 79]);
add("darkturquoise", [0, 206, 209]);
add("darkviolet", [148, 0, 211]);
add("deeppink", [255, 20, 147]);
add("deepskyblue", [0, 191, 255]);
add("dimgray", [105]);
add("dimgrey", [105]);
add("dodgerblue", [30, 144, 255]);
add("firebrick", [178, 34, 34]);
add("floralwhite", [255, 250, 240]);
add("forestgreen", [34, 139]);
add("fuchsia", [255, 0]);
add("gainsboro", [220]);
add("ghostwhite", [248, 248, 255]);
add("gold", [255, 215, 0]);
add("goldenrod", [218, 165, 32]);
add("gray", [128]);
add("green", [0, 128]);
add("greenyellow", [173, 255, 47]);
add("grey", [128]);
add("honeydew", [240, 255]);
add("hotpink", [255, 105, 180]);
add("indianred", [205, 92, 92]);
add("indigo", [75, 0, 130]);
add("ivory", [255, 255, 240]);
add("khaki", [240, 230, 140]);
add("lavender", [230, 230, 250]);
add("lavenderblush", [255, 240, 245]);
add("lawngreen", [124, 252, 0]);
add("lemonchiffon", [255, 250, 205]);
add("lightblue", [173, 216, 230]);
add("lightcoral", [240, 128, 128]);
add("lightcyan", [224, 255, 255]);
add("lightgoldenrodyellow", [250, 250, 210]);
add("lightgray", [211]);
add("lightgreen", [144, 238]);
add("lightgrey", [211]);
add("lightpink", [255, 182, 193]);
add("lightsalmon", [255, 160, 122]);
add("lightseagreen", [32, 178, 170]);
add("lightskyblue", [135, 206, 250]);
add("lightslategray", [119, 136, 153]);
add("lightslategrey", [119, 136, 153]);
add("lightsteelblue", [176, 196, 222]);
add("lightyellow", [255, 255, 224]);
add("lime", [0, 255]);
add("limegreen", [50, 205]);
add("linen", [250, 240, 230]);
add("magenta", [255, 0]);
add("maroon", [128, 0, 0]);
add("mediumaquamarine", [102, 205, 170]);
add("mediumblue", [0, 0, 205]);
add("mediumorchid", [186, 85, 211]);
add("mediumpurple", [147, 112, 219]);
add("mediumseagreen", [60, 179, 113]);
add("mediumslateblue", [123, 104, 238]);
add("mediumspringgreen", [0, 250, 154]);
add("mediumturquoise", [72, 209, 204]);
add("mediumvioletred", [199, 21, 133]);
add("midnightblue", [25, 25, 112]);
add("mintcream", [245, 255, 250]);
add("mistyrose", [255, 228, 225]);
add("moccasin", [255, 228, 181]);
add("navajowhite", [255, 222, 173]);
add("navy", [0, 0, 128]);
add("oldlace", [253, 245, 230]);
add("olive", [128, 128, 0]);
add("olivedrab", [107, 142, 35]);
add("orange", [255, 165, 0]);
add("orangered", [255, 69, 0]);
add("orchid", [218, 112, 214]);
add("palegoldenrod", [238, 232, 170]);
add("palegreen", [152, 251]);
add("paleturquoise", [175, 238, 238]);
add("palevioletred", [219, 112, 147]);
add("papayawhip", [255, 239, 213]);
add("peachpuff", [255, 218, 185]);
add("peru", [205, 133, 63]);
add("pink", [255, 192, 203]);
add("plum", [221, 160]);
add("powderblue", [176, 224, 230]);
add("purple", [128, 0]);
add("rebeccapurple", [102, 51, 153]);
add("red", [255, 0, 0]);
add("rosybrown", [188, 143, 143]);
add("royalblue", [65, 105, 225]);
add("saddlebrown", [139, 69, 19]);
add("salmon", [250, 128, 114]);
add("sandybrown", [244, 164, 96]);
add("seagreen", [46, 139, 87]);
add("seashell", [255, 245, 238]);
add("sienna", [160, 82, 45]);
add("silver", [192]);
add("skyblue", [135, 206, 235]);
add("slateblue", [106, 90, 205]);
add("slategray", [112, 128, 144]);
add("slategrey", [112, 128, 144]);
add("snow", [255, 250, 250]);
add("springgreen", [0, 255, 127]);
add("steelblue", [70, 130, 180]);
add("tan", [210, 180, 140]);
add("teal", [0, 128, 128]);
add("thistle", [216, 191]);
add("tomato", [255, 99, 71]);
add("turquoise", [64, 224, 208]);
add("violet", [238, 130]);
add("wheat", [245, 222, 179]);
add("white", [255]);
add("whitesmoke", [245]);
add("yellow", [255, 255, 0]);
add("yellowgreen", [154, 205, 50]);
export { colorKeywords };
@@ -0,0 +1,2 @@
'use strict';
@@ -0,0 +1,45 @@
interface RGBColor {
type: 'rgb';
r: number;
g: number;
b: number;
alpha: number;
}
interface HSLColor {
type: 'hsl';
h: number;
s: number;
l: number;
alpha: number;
}
interface LABColor {
type: 'lab';
l: number;
a: number;
b: number;
alpha: number;
}
interface LCHColor {
type: 'lch';
l: number;
c: number;
h: number;
alpha: number;
}
interface FunctionColor {
type: 'function';
func: string;
value: string;
}
interface TransparentColor {
type: 'transparent';
}
interface NoColor {
type: 'none';
}
interface CurrentColor {
type: 'current';
}
type Color = RGBColor | HSLColor | LABColor | LCHColor | FunctionColor | TransparentColor | NoColor | CurrentColor;
export type { Color, CurrentColor, FunctionColor, HSLColor, LABColor, LCHColor, NoColor, RGBColor, TransparentColor };
@@ -0,0 +1,45 @@
interface RGBColor {
type: 'rgb';
r: number;
g: number;
b: number;
alpha: number;
}
interface HSLColor {
type: 'hsl';
h: number;
s: number;
l: number;
alpha: number;
}
interface LABColor {
type: 'lab';
l: number;
a: number;
b: number;
alpha: number;
}
interface LCHColor {
type: 'lch';
l: number;
c: number;
h: number;
alpha: number;
}
interface FunctionColor {
type: 'function';
func: string;
value: string;
}
interface TransparentColor {
type: 'transparent';
}
interface NoColor {
type: 'none';
}
interface CurrentColor {
type: 'current';
}
type Color = RGBColor | HSLColor | LABColor | LCHColor | FunctionColor | TransparentColor | NoColor | CurrentColor;
export type { Color, CurrentColor, FunctionColor, HSLColor, LABColor, LCHColor, NoColor, RGBColor, TransparentColor };
@@ -0,0 +1,45 @@
interface RGBColor {
type: 'rgb';
r: number;
g: number;
b: number;
alpha: number;
}
interface HSLColor {
type: 'hsl';
h: number;
s: number;
l: number;
alpha: number;
}
interface LABColor {
type: 'lab';
l: number;
a: number;
b: number;
alpha: number;
}
interface LCHColor {
type: 'lch';
l: number;
c: number;
h: number;
alpha: number;
}
interface FunctionColor {
type: 'function';
func: string;
value: string;
}
interface TransparentColor {
type: 'transparent';
}
interface NoColor {
type: 'none';
}
interface CurrentColor {
type: 'current';
}
type Color = RGBColor | HSLColor | LABColor | LCHColor | FunctionColor | TransparentColor | NoColor | CurrentColor;
export type { Color, CurrentColor, FunctionColor, HSLColor, LABColor, LCHColor, NoColor, RGBColor, TransparentColor };
@@ -0,0 +1,94 @@
'use strict';
const svg_html = require('../svg/html.cjs');
const svg_size = require('../svg/size.cjs');
const svg_url = require('../svg/url.cjs');
const icon_square = require('../icon/square.cjs');
const svg_build = require('../svg/build.cjs');
require('../icon/defaults.cjs');
require('../customisations/defaults.cjs');
require('../svg/defs.cjs');
function getCommonCSSRules(options) {
const result = {
display: "inline-block",
width: "1em",
height: "1em"
};
const varName = options.varName;
if (options.pseudoSelector) {
result["content"] = "''";
}
switch (options.mode) {
case "background":
if (varName) {
result["background-image"] = "var(--" + varName + ")";
}
result["background-repeat"] = "no-repeat";
result["background-size"] = "100% 100%";
break;
case "mask":
result["background-color"] = "currentColor";
if (varName) {
result["mask-image"] = result["-webkit-mask-image"] = "var(--" + varName + ")";
}
result["mask-repeat"] = result["-webkit-mask-repeat"] = "no-repeat";
result["mask-size"] = result["-webkit-mask-size"] = "100% 100%";
break;
}
return result;
}
function generateItemCSSRules(icon, options) {
const result = {};
const varName = options.varName;
const buildResult = svg_build.iconToSVG(icon);
let viewBox = buildResult.viewBox;
if (viewBox[2] !== viewBox[3]) {
if (options.forceSquare) {
viewBox = icon_square.makeViewBoxSquare(viewBox);
} else {
result["width"] = svg_size.calculateSize("1em", viewBox[2] / viewBox[3]);
}
}
const svg = svg_html.iconToHTML(
buildResult.body.replace(/currentColor/g, options.color || "black"),
{
viewBox: `${viewBox[0]} ${viewBox[1]} ${viewBox[2]} ${viewBox[3]}`,
width: `${viewBox[2]}`,
height: `${viewBox[3]}`
}
);
const url = svg_url.svgToURL(svg);
if (varName) {
result["--" + varName] = url;
} else {
switch (options.mode) {
case "background":
result["background-image"] = url;
break;
case "mask":
result["mask-image"] = result["-webkit-mask-image"] = url;
break;
}
}
return result;
}
function generateItemContent(icon, options) {
const buildResult = svg_build.iconToSVG(icon);
const viewBox = buildResult.viewBox;
const height = options.height;
const width = options.width ?? svg_size.calculateSize(height, viewBox[2] / viewBox[3]);
const svg = svg_html.iconToHTML(
buildResult.body.replace(/currentColor/g, options.color || "black"),
{
viewBox: `${viewBox[0]} ${viewBox[1]} ${viewBox[2]} ${viewBox[3]}`,
width: width.toString(),
height: height.toString()
}
);
return svg_url.svgToURL(svg);
}
exports.generateItemCSSRules = generateItemCSSRules;
exports.generateItemContent = generateItemContent;
exports.getCommonCSSRules = getCommonCSSRules;
@@ -0,0 +1,19 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSCommonCodeOptions, IconCSSItemOptions, IconContentItemOptions } from './types.cjs';
/**
* Generates common CSS rules for multiple icons, rendered as background/mask
*/
declare function getCommonCSSRules(options: IconCSSCommonCodeOptions): Record<string, string>;
/**
* Generate CSS rules for one icon, rendered as background/mask
*
* This function excludes common rules
*/
declare function generateItemCSSRules(icon: Required<IconifyIcon>, options: IconCSSItemOptions): Record<string, string>;
/**
* Generate content for one icon, rendered as content of pseudo-selector
*/
declare function generateItemContent(icon: Required<IconifyIcon>, options: IconContentItemOptions): string;
export { generateItemCSSRules, generateItemContent, getCommonCSSRules };
@@ -0,0 +1,19 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSCommonCodeOptions, IconCSSItemOptions, IconContentItemOptions } from './types.mjs';
/**
* Generates common CSS rules for multiple icons, rendered as background/mask
*/
declare function getCommonCSSRules(options: IconCSSCommonCodeOptions): Record<string, string>;
/**
* Generate CSS rules for one icon, rendered as background/mask
*
* This function excludes common rules
*/
declare function generateItemCSSRules(icon: Required<IconifyIcon>, options: IconCSSItemOptions): Record<string, string>;
/**
* Generate content for one icon, rendered as content of pseudo-selector
*/
declare function generateItemContent(icon: Required<IconifyIcon>, options: IconContentItemOptions): string;
export { generateItemCSSRules, generateItemContent, getCommonCSSRules };
@@ -0,0 +1,19 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSCommonCodeOptions, IconCSSItemOptions, IconContentItemOptions } from './types.js';
/**
* Generates common CSS rules for multiple icons, rendered as background/mask
*/
declare function getCommonCSSRules(options: IconCSSCommonCodeOptions): Record<string, string>;
/**
* Generate CSS rules for one icon, rendered as background/mask
*
* This function excludes common rules
*/
declare function generateItemCSSRules(icon: Required<IconifyIcon>, options: IconCSSItemOptions): Record<string, string>;
/**
* Generate content for one icon, rendered as content of pseudo-selector
*/
declare function generateItemContent(icon: Required<IconifyIcon>, options: IconContentItemOptions): string;
export { generateItemCSSRules, generateItemContent, getCommonCSSRules };
@@ -0,0 +1,90 @@
import { iconToHTML } from '../svg/html.mjs';
import { calculateSize } from '../svg/size.mjs';
import { svgToURL } from '../svg/url.mjs';
import { makeViewBoxSquare } from '../icon/square.mjs';
import { iconToSVG } from '../svg/build.mjs';
import '../icon/defaults.mjs';
import '../customisations/defaults.mjs';
import '../svg/defs.mjs';
function getCommonCSSRules(options) {
const result = {
display: "inline-block",
width: "1em",
height: "1em"
};
const varName = options.varName;
if (options.pseudoSelector) {
result["content"] = "''";
}
switch (options.mode) {
case "background":
if (varName) {
result["background-image"] = "var(--" + varName + ")";
}
result["background-repeat"] = "no-repeat";
result["background-size"] = "100% 100%";
break;
case "mask":
result["background-color"] = "currentColor";
if (varName) {
result["mask-image"] = result["-webkit-mask-image"] = "var(--" + varName + ")";
}
result["mask-repeat"] = result["-webkit-mask-repeat"] = "no-repeat";
result["mask-size"] = result["-webkit-mask-size"] = "100% 100%";
break;
}
return result;
}
function generateItemCSSRules(icon, options) {
const result = {};
const varName = options.varName;
const buildResult = iconToSVG(icon);
let viewBox = buildResult.viewBox;
if (viewBox[2] !== viewBox[3]) {
if (options.forceSquare) {
viewBox = makeViewBoxSquare(viewBox);
} else {
result["width"] = calculateSize("1em", viewBox[2] / viewBox[3]);
}
}
const svg = iconToHTML(
buildResult.body.replace(/currentColor/g, options.color || "black"),
{
viewBox: `${viewBox[0]} ${viewBox[1]} ${viewBox[2]} ${viewBox[3]}`,
width: `${viewBox[2]}`,
height: `${viewBox[3]}`
}
);
const url = svgToURL(svg);
if (varName) {
result["--" + varName] = url;
} else {
switch (options.mode) {
case "background":
result["background-image"] = url;
break;
case "mask":
result["mask-image"] = result["-webkit-mask-image"] = url;
break;
}
}
return result;
}
function generateItemContent(icon, options) {
const buildResult = iconToSVG(icon);
const viewBox = buildResult.viewBox;
const height = options.height;
const width = options.width ?? calculateSize(height, viewBox[2] / viewBox[3]);
const svg = iconToHTML(
buildResult.body.replace(/currentColor/g, options.color || "black"),
{
viewBox: `${viewBox[0]} ${viewBox[1]} ${viewBox[2]} ${viewBox[3]}`,
width: width.toString(),
height: height.toString()
}
);
return svgToURL(svg);
}
export { generateItemCSSRules, generateItemContent, getCommonCSSRules };
@@ -0,0 +1,40 @@
'use strict';
const format = {
selectorStart: {
compressed: "{",
compact: " {",
expanded: " {"
},
selectorEnd: {
compressed: "}",
compact: "; }\n",
expanded: ";\n}\n"
},
rule: {
compressed: "{key}:",
compact: " {key}: ",
expanded: "\n {key}: "
}
};
function formatCSS(data, mode = "expanded") {
const results = [];
for (let i = 0; i < data.length; i++) {
const { selector, rules } = data[i];
const fullSelector = selector instanceof Array ? selector.join(mode === "compressed" ? "," : ", ") : selector;
let entry = fullSelector + format.selectorStart[mode];
let firstRule = true;
for (const key in rules) {
if (!firstRule) {
entry += ";";
}
entry += format.rule[mode].replace("{key}", key) + rules[key];
firstRule = false;
}
entry += format.selectorEnd[mode];
results.push(entry);
}
return results.join(mode === "compressed" ? "" : "\n");
}
exports.formatCSS = formatCSS;
@@ -0,0 +1,10 @@
import { CSSUnformattedItem, CSSFormatMode } from './types.cjs';
/**
* Format data
*
* Key is selector, value is list of rules
*/
declare function formatCSS(data: CSSUnformattedItem[], mode?: CSSFormatMode): string;
export { formatCSS };
@@ -0,0 +1,10 @@
import { CSSUnformattedItem, CSSFormatMode } from './types.mjs';
/**
* Format data
*
* Key is selector, value is list of rules
*/
declare function formatCSS(data: CSSUnformattedItem[], mode?: CSSFormatMode): string;
export { formatCSS };
@@ -0,0 +1,10 @@
import { CSSUnformattedItem, CSSFormatMode } from './types.js';
/**
* Format data
*
* Key is selector, value is list of rules
*/
declare function formatCSS(data: CSSUnformattedItem[], mode?: CSSFormatMode): string;
export { formatCSS };
@@ -0,0 +1,38 @@
const format = {
selectorStart: {
compressed: "{",
compact: " {",
expanded: " {"
},
selectorEnd: {
compressed: "}",
compact: "; }\n",
expanded: ";\n}\n"
},
rule: {
compressed: "{key}:",
compact: " {key}: ",
expanded: "\n {key}: "
}
};
function formatCSS(data, mode = "expanded") {
const results = [];
for (let i = 0; i < data.length; i++) {
const { selector, rules } = data[i];
const fullSelector = selector instanceof Array ? selector.join(mode === "compressed" ? "," : ", ") : selector;
let entry = fullSelector + format.selectorStart[mode];
let firstRule = true;
for (const key in rules) {
if (!firstRule) {
entry += ";";
}
entry += format.rule[mode].replace("{key}", key) + rules[key];
firstRule = false;
}
entry += format.selectorEnd[mode];
results.push(entry);
}
return results.join(mode === "compressed" ? "" : "\n");
}
export { formatCSS };
@@ -0,0 +1,79 @@
'use strict';
const icon_defaults = require('../icon/defaults.cjs');
const css_common = require('./common.cjs');
const css_format = require('./format.cjs');
require('../svg/html.cjs');
require('../svg/size.cjs');
require('../svg/url.cjs');
require('../icon/square.cjs');
require('../svg/build.cjs');
require('../customisations/defaults.cjs');
require('../svg/defs.cjs');
function getIconCSS(icon, options = {}) {
const body = options.customise ? options.customise(icon.body) : icon.body;
const mode = options.mode || (options.color || !body.includes("currentColor") ? "background" : "mask");
let varName = options.varName;
if (varName === void 0 && mode === "mask") {
varName = "svg";
}
const newOptions = {
...options,
// Override mode and varName
mode,
varName
};
if (mode === "background") {
delete newOptions.varName;
}
const rules = {
...options.rules,
...css_common.getCommonCSSRules(newOptions),
...css_common.generateItemCSSRules(
{
...icon_defaults.defaultIconProps,
...icon,
body
},
newOptions
)
};
const selector = options.iconSelector || ".icon";
return css_format.formatCSS(
[
{
selector,
rules
}
],
newOptions.format
);
}
function getIconContentCSS(icon, options) {
const body = options.customise ? options.customise(icon.body) : icon.body;
const content = css_common.generateItemContent(
{
...icon_defaults.defaultIconProps,
...icon,
body
},
options
);
const selector = options.iconSelector || ".icon::after";
return css_format.formatCSS(
[
{
selector,
rules: {
...options.rules,
content
}
}
],
options.format
);
}
exports.getIconCSS = getIconCSS;
exports.getIconContentCSS = getIconContentCSS;
@@ -0,0 +1,13 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSIconOptions, IconContentIconOptions } from './types.cjs';
/**
* Get CSS for icon, rendered as background or mask
*/
declare function getIconCSS(icon: IconifyIcon, options?: IconCSSIconOptions): string;
/**
* Get CSS for icon, rendered as content
*/
declare function getIconContentCSS(icon: IconifyIcon, options: IconContentIconOptions): string;
export { getIconCSS, getIconContentCSS };
@@ -0,0 +1,13 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSIconOptions, IconContentIconOptions } from './types.mjs';
/**
* Get CSS for icon, rendered as background or mask
*/
declare function getIconCSS(icon: IconifyIcon, options?: IconCSSIconOptions): string;
/**
* Get CSS for icon, rendered as content
*/
declare function getIconContentCSS(icon: IconifyIcon, options: IconContentIconOptions): string;
export { getIconCSS, getIconContentCSS };
@@ -0,0 +1,13 @@
import { IconifyIcon } from '@iconify/types';
import { IconCSSIconOptions, IconContentIconOptions } from './types.js';
/**
* Get CSS for icon, rendered as background or mask
*/
declare function getIconCSS(icon: IconifyIcon, options?: IconCSSIconOptions): string;
/**
* Get CSS for icon, rendered as content
*/
declare function getIconContentCSS(icon: IconifyIcon, options: IconContentIconOptions): string;
export { getIconCSS, getIconContentCSS };
@@ -0,0 +1,76 @@
import { defaultIconProps } from '../icon/defaults.mjs';
import { getCommonCSSRules, generateItemCSSRules, generateItemContent } from './common.mjs';
import { formatCSS } from './format.mjs';
import '../svg/html.mjs';
import '../svg/size.mjs';
import '../svg/url.mjs';
import '../icon/square.mjs';
import '../svg/build.mjs';
import '../customisations/defaults.mjs';
import '../svg/defs.mjs';
function getIconCSS(icon, options = {}) {
const body = options.customise ? options.customise(icon.body) : icon.body;
const mode = options.mode || (options.color || !body.includes("currentColor") ? "background" : "mask");
let varName = options.varName;
if (varName === void 0 && mode === "mask") {
varName = "svg";
}
const newOptions = {
...options,
// Override mode and varName
mode,
varName
};
if (mode === "background") {
delete newOptions.varName;
}
const rules = {
...options.rules,
...getCommonCSSRules(newOptions),
...generateItemCSSRules(
{
...defaultIconProps,
...icon,
body
},
newOptions
)
};
const selector = options.iconSelector || ".icon";
return formatCSS(
[
{
selector,
rules
}
],
newOptions.format
);
}
function getIconContentCSS(icon, options) {
const body = options.customise ? options.customise(icon.body) : icon.body;
const content = generateItemContent(
{
...defaultIconProps,
...icon,
body
},
options
);
const selector = options.iconSelector || ".icon::after";
return formatCSS(
[
{
selector,
rules: {
...options.rules,
content
}
}
],
options.format
);
}
export { getIconCSS, getIconContentCSS };
@@ -0,0 +1,172 @@
'use strict';
const iconSet_getIcon = require('../icon-set/get-icon.cjs');
const icon_defaults = require('../icon/defaults.cjs');
const css_common = require('./common.cjs');
const css_format = require('./format.cjs');
require('../icon/merge.cjs');
require('../icon/transformations.cjs');
require('../icon-set/tree.cjs');
require('../svg/html.cjs');
require('../svg/size.cjs');
require('../svg/url.cjs');
require('../icon/square.cjs');
require('../svg/build.cjs');
require('../customisations/defaults.cjs');
require('../svg/defs.cjs');
const commonSelector = ".icon--{prefix}";
const iconSelector = ".icon--{prefix}--{name}";
const contentSelector = ".icon--{prefix}--{name}::after";
const defaultSelectors = {
commonSelector,
iconSelector,
overrideSelector: commonSelector + iconSelector
};
function getIconsCSSData(iconSet, names, options = {}) {
const css = [];
const errors = [];
const palette = options.color ? true : void 0;
let mode = options.mode || typeof palette === "boolean" && (palette ? "background" : "mask");
if (!mode) {
for (let i = 0; i < names.length; i++) {
const name = names[i];
const icon = iconSet_getIcon.getIconData(iconSet, name);
if (icon) {
const body = options.customise ? options.customise(icon.body, name) : icon.body;
mode = body.includes("currentColor") ? "mask" : "background";
break;
}
}
if (!mode) {
mode = "mask";
errors.push(
"/* cannot detect icon mode: not set in options and icon set is missing info, rendering as " + mode + " */"
);
}
}
let varName = options.varName;
if (varName === void 0 && mode === "mask") {
varName = "svg";
}
const newOptions = {
...options,
// Override mode and varName
mode,
varName
};
const { commonSelector: commonSelector2, iconSelector: iconSelector2, overrideSelector } = newOptions.iconSelector ? newOptions : defaultSelectors;
const iconSelectorWithPrefix = iconSelector2.replace(
/{prefix}/g,
iconSet.prefix
);
const commonRules = {
...options.rules,
...css_common.getCommonCSSRules(newOptions)
};
const hasCommonRules = commonSelector2 && commonSelector2 !== iconSelector2;
const commonSelectors = /* @__PURE__ */ new Set();
if (hasCommonRules) {
css.push({
selector: commonSelector2.replace(/{prefix}/g, iconSet.prefix),
rules: commonRules
});
}
for (let i = 0; i < names.length; i++) {
const name = names[i];
const iconData = iconSet_getIcon.getIconData(iconSet, name);
if (!iconData) {
errors.push("/* Could not find icon: " + name + " */");
continue;
}
const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
const rules = css_common.generateItemCSSRules(
{
...icon_defaults.defaultIconProps,
...iconData,
body
},
newOptions
);
let requiresOverride = false;
if (hasCommonRules && overrideSelector) {
for (const key in rules) {
if (key in commonRules) {
requiresOverride = true;
}
}
}
const selector = (requiresOverride && overrideSelector ? overrideSelector.replace(/{prefix}/g, iconSet.prefix) : iconSelectorWithPrefix).replace(/{name}/g, name);
css.push({
selector,
rules
});
if (!hasCommonRules) {
commonSelectors.add(selector);
}
}
const result = {
css,
errors
};
if (!hasCommonRules && commonSelectors.size) {
const selector = Array.from(commonSelectors).join(
newOptions.format === "compressed" ? "," : ", "
);
result.common = {
selector,
rules: commonRules
};
}
return result;
}
function getIconsCSS(iconSet, names, options = {}) {
const { css, errors, common } = getIconsCSSData(iconSet, names, options);
if (common) {
if (css.length === 1 && css[0].selector === common.selector) {
css[0].rules = {
// Common first, override later
...common.rules,
...css[0].rules
};
} else {
css.unshift(common);
}
}
return css_format.formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
}
function getIconsContentCSS(iconSet, names, options) {
const errors = [];
const css = [];
const iconSelectorWithPrefix = (options.iconSelector ?? contentSelector).replace(/{prefix}/g, iconSet.prefix);
for (let i = 0; i < names.length; i++) {
const name = names[i];
const iconData = iconSet_getIcon.getIconData(iconSet, name);
if (!iconData) {
errors.push("/* Could not find icon: " + name + " */");
continue;
}
const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
const content = css_common.generateItemContent(
{
...icon_defaults.defaultIconProps,
...iconData,
body
},
options
);
const selector = iconSelectorWithPrefix.replace(/{name}/g, name);
css.push({
selector,
rules: {
...options.rules,
content
}
});
}
return css_format.formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
}
exports.getIconsCSS = getIconsCSS;
exports.getIconsCSSData = getIconsCSSData;
exports.getIconsContentCSS = getIconsContentCSS;
@@ -0,0 +1,22 @@
import { IconifyJSON } from '@iconify/types';
import { IconCSSIconSetOptions, IconContentIconSetOptions, CSSUnformattedItem } from './types.cjs';
interface CSSData {
common?: CSSUnformattedItem;
css: CSSUnformattedItem[];
errors: string[];
}
/**
* Get data for getIconsCSS()
*/
declare function getIconsCSSData(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): CSSData;
/**
* Get CSS for icons as background/mask
*/
declare function getIconsCSS(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): string;
/**
* Get CSS for icons as content
*/
declare function getIconsContentCSS(iconSet: IconifyJSON, names: string[], options: IconContentIconSetOptions): string;
export { getIconsCSS, getIconsCSSData, getIconsContentCSS };
@@ -0,0 +1,22 @@
import { IconifyJSON } from '@iconify/types';
import { IconCSSIconSetOptions, IconContentIconSetOptions, CSSUnformattedItem } from './types.mjs';
interface CSSData {
common?: CSSUnformattedItem;
css: CSSUnformattedItem[];
errors: string[];
}
/**
* Get data for getIconsCSS()
*/
declare function getIconsCSSData(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): CSSData;
/**
* Get CSS for icons as background/mask
*/
declare function getIconsCSS(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): string;
/**
* Get CSS for icons as content
*/
declare function getIconsContentCSS(iconSet: IconifyJSON, names: string[], options: IconContentIconSetOptions): string;
export { getIconsCSS, getIconsCSSData, getIconsContentCSS };
@@ -0,0 +1,22 @@
import { IconifyJSON } from '@iconify/types';
import { IconCSSIconSetOptions, IconContentIconSetOptions, CSSUnformattedItem } from './types.js';
interface CSSData {
common?: CSSUnformattedItem;
css: CSSUnformattedItem[];
errors: string[];
}
/**
* Get data for getIconsCSS()
*/
declare function getIconsCSSData(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): CSSData;
/**
* Get CSS for icons as background/mask
*/
declare function getIconsCSS(iconSet: IconifyJSON, names: string[], options?: IconCSSIconSetOptions): string;
/**
* Get CSS for icons as content
*/
declare function getIconsContentCSS(iconSet: IconifyJSON, names: string[], options: IconContentIconSetOptions): string;
export { getIconsCSS, getIconsCSSData, getIconsContentCSS };
@@ -0,0 +1,168 @@
import { getIconData } from '../icon-set/get-icon.mjs';
import { defaultIconProps } from '../icon/defaults.mjs';
import { getCommonCSSRules, generateItemCSSRules, generateItemContent } from './common.mjs';
import { formatCSS } from './format.mjs';
import '../icon/merge.mjs';
import '../icon/transformations.mjs';
import '../icon-set/tree.mjs';
import '../svg/html.mjs';
import '../svg/size.mjs';
import '../svg/url.mjs';
import '../icon/square.mjs';
import '../svg/build.mjs';
import '../customisations/defaults.mjs';
import '../svg/defs.mjs';
const commonSelector = ".icon--{prefix}";
const iconSelector = ".icon--{prefix}--{name}";
const contentSelector = ".icon--{prefix}--{name}::after";
const defaultSelectors = {
commonSelector,
iconSelector,
overrideSelector: commonSelector + iconSelector
};
function getIconsCSSData(iconSet, names, options = {}) {
const css = [];
const errors = [];
const palette = options.color ? true : void 0;
let mode = options.mode || typeof palette === "boolean" && (palette ? "background" : "mask");
if (!mode) {
for (let i = 0; i < names.length; i++) {
const name = names[i];
const icon = getIconData(iconSet, name);
if (icon) {
const body = options.customise ? options.customise(icon.body, name) : icon.body;
mode = body.includes("currentColor") ? "mask" : "background";
break;
}
}
if (!mode) {
mode = "mask";
errors.push(
"/* cannot detect icon mode: not set in options and icon set is missing info, rendering as " + mode + " */"
);
}
}
let varName = options.varName;
if (varName === void 0 && mode === "mask") {
varName = "svg";
}
const newOptions = {
...options,
// Override mode and varName
mode,
varName
};
const { commonSelector: commonSelector2, iconSelector: iconSelector2, overrideSelector } = newOptions.iconSelector ? newOptions : defaultSelectors;
const iconSelectorWithPrefix = iconSelector2.replace(
/{prefix}/g,
iconSet.prefix
);
const commonRules = {
...options.rules,
...getCommonCSSRules(newOptions)
};
const hasCommonRules = commonSelector2 && commonSelector2 !== iconSelector2;
const commonSelectors = /* @__PURE__ */ new Set();
if (hasCommonRules) {
css.push({
selector: commonSelector2.replace(/{prefix}/g, iconSet.prefix),
rules: commonRules
});
}
for (let i = 0; i < names.length; i++) {
const name = names[i];
const iconData = getIconData(iconSet, name);
if (!iconData) {
errors.push("/* Could not find icon: " + name + " */");
continue;
}
const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
const rules = generateItemCSSRules(
{
...defaultIconProps,
...iconData,
body
},
newOptions
);
let requiresOverride = false;
if (hasCommonRules && overrideSelector) {
for (const key in rules) {
if (key in commonRules) {
requiresOverride = true;
}
}
}
const selector = (requiresOverride && overrideSelector ? overrideSelector.replace(/{prefix}/g, iconSet.prefix) : iconSelectorWithPrefix).replace(/{name}/g, name);
css.push({
selector,
rules
});
if (!hasCommonRules) {
commonSelectors.add(selector);
}
}
const result = {
css,
errors
};
if (!hasCommonRules && commonSelectors.size) {
const selector = Array.from(commonSelectors).join(
newOptions.format === "compressed" ? "," : ", "
);
result.common = {
selector,
rules: commonRules
};
}
return result;
}
function getIconsCSS(iconSet, names, options = {}) {
const { css, errors, common } = getIconsCSSData(iconSet, names, options);
if (common) {
if (css.length === 1 && css[0].selector === common.selector) {
css[0].rules = {
// Common first, override later
...common.rules,
...css[0].rules
};
} else {
css.unshift(common);
}
}
return formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
}
function getIconsContentCSS(iconSet, names, options) {
const errors = [];
const css = [];
const iconSelectorWithPrefix = (options.iconSelector ?? contentSelector).replace(/{prefix}/g, iconSet.prefix);
for (let i = 0; i < names.length; i++) {
const name = names[i];
const iconData = getIconData(iconSet, name);
if (!iconData) {
errors.push("/* Could not find icon: " + name + " */");
continue;
}
const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
const content = generateItemContent(
{
...defaultIconProps,
...iconData,
body
},
options
);
const selector = iconSelectorWithPrefix.replace(/{name}/g, name);
css.push({
selector,
rules: {
...options.rules,
content
}
});
}
return formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
}
export { getIconsCSS, getIconsCSSData, getIconsContentCSS };
@@ -0,0 +1,2 @@
'use strict';
@@ -0,0 +1,107 @@
/**
* Icon mode
*/
type IconCSSMode = 'mask' | 'background';
/**
* Selector for icon
*/
interface IconCSSIconSelectorOptions {
pseudoSelector?: boolean;
iconSelector?: string;
}
/**
* Selector for icon when generating data from icon set
*/
interface IconCSSSelectorOptions extends IconCSSIconSelectorOptions {
commonSelector?: string;
overrideSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconCSSSharedOptions {
varName?: string | null;
forceSquare?: boolean;
color?: string;
rules?: Record<string, string>;
}
/**
* Mode
*/
interface IconCSSModeOptions {
mode?: IconCSSMode;
}
/**
* Options for generating common code
*
* Requires mode
*/
interface IconCSSCommonCodeOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, Required<IconCSSModeOptions> {
}
/**
* Options for generating data for one icon
*/
interface IconCSSItemOptions extends IconCSSSharedOptions, Required<IconCSSModeOptions> {
}
/**
* Selector for icon
*/
interface IconContentIconSelectorOptions {
iconSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconContentSharedOptions {
height: number;
width?: number;
color?: string;
rules?: Record<string, string>;
}
/**
* Options for generating data for one icon
*/
type IconContentItemOptions = IconContentSharedOptions;
/**
* Formatting modes. Same as in SASS
*/
type CSSFormatMode = 'expanded' | 'compact' | 'compressed';
/**
* Item to format
*/
interface CSSUnformattedItem {
selector: string | string[];
rules: Record<string, string>;
}
/**
* Formatting options
*/
interface IconCSSFormatOptions {
format?: CSSFormatMode;
}
/**
* Options for generating data for one icon as background/mask
*/
interface IconCSSIconOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating data for one icon as content
*/
interface IconContentIconOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating multiple icons as background/mask
*/
interface IconCSSIconSetOptions extends IconCSSSharedOptions, IconCSSSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
/**
* Options for generating multiple icons as content
*/
interface IconContentIconSetOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
export type { CSSFormatMode, CSSUnformattedItem, IconCSSCommonCodeOptions, IconCSSFormatOptions, IconCSSIconOptions, IconCSSIconSelectorOptions, IconCSSIconSetOptions, IconCSSItemOptions, IconCSSMode, IconCSSModeOptions, IconCSSSelectorOptions, IconCSSSharedOptions, IconContentIconOptions, IconContentIconSelectorOptions, IconContentIconSetOptions, IconContentItemOptions, IconContentSharedOptions };
@@ -0,0 +1,107 @@
/**
* Icon mode
*/
type IconCSSMode = 'mask' | 'background';
/**
* Selector for icon
*/
interface IconCSSIconSelectorOptions {
pseudoSelector?: boolean;
iconSelector?: string;
}
/**
* Selector for icon when generating data from icon set
*/
interface IconCSSSelectorOptions extends IconCSSIconSelectorOptions {
commonSelector?: string;
overrideSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconCSSSharedOptions {
varName?: string | null;
forceSquare?: boolean;
color?: string;
rules?: Record<string, string>;
}
/**
* Mode
*/
interface IconCSSModeOptions {
mode?: IconCSSMode;
}
/**
* Options for generating common code
*
* Requires mode
*/
interface IconCSSCommonCodeOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, Required<IconCSSModeOptions> {
}
/**
* Options for generating data for one icon
*/
interface IconCSSItemOptions extends IconCSSSharedOptions, Required<IconCSSModeOptions> {
}
/**
* Selector for icon
*/
interface IconContentIconSelectorOptions {
iconSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconContentSharedOptions {
height: number;
width?: number;
color?: string;
rules?: Record<string, string>;
}
/**
* Options for generating data for one icon
*/
type IconContentItemOptions = IconContentSharedOptions;
/**
* Formatting modes. Same as in SASS
*/
type CSSFormatMode = 'expanded' | 'compact' | 'compressed';
/**
* Item to format
*/
interface CSSUnformattedItem {
selector: string | string[];
rules: Record<string, string>;
}
/**
* Formatting options
*/
interface IconCSSFormatOptions {
format?: CSSFormatMode;
}
/**
* Options for generating data for one icon as background/mask
*/
interface IconCSSIconOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating data for one icon as content
*/
interface IconContentIconOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating multiple icons as background/mask
*/
interface IconCSSIconSetOptions extends IconCSSSharedOptions, IconCSSSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
/**
* Options for generating multiple icons as content
*/
interface IconContentIconSetOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
export type { CSSFormatMode, CSSUnformattedItem, IconCSSCommonCodeOptions, IconCSSFormatOptions, IconCSSIconOptions, IconCSSIconSelectorOptions, IconCSSIconSetOptions, IconCSSItemOptions, IconCSSMode, IconCSSModeOptions, IconCSSSelectorOptions, IconCSSSharedOptions, IconContentIconOptions, IconContentIconSelectorOptions, IconContentIconSetOptions, IconContentItemOptions, IconContentSharedOptions };
@@ -0,0 +1,107 @@
/**
* Icon mode
*/
type IconCSSMode = 'mask' | 'background';
/**
* Selector for icon
*/
interface IconCSSIconSelectorOptions {
pseudoSelector?: boolean;
iconSelector?: string;
}
/**
* Selector for icon when generating data from icon set
*/
interface IconCSSSelectorOptions extends IconCSSIconSelectorOptions {
commonSelector?: string;
overrideSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconCSSSharedOptions {
varName?: string | null;
forceSquare?: boolean;
color?: string;
rules?: Record<string, string>;
}
/**
* Mode
*/
interface IconCSSModeOptions {
mode?: IconCSSMode;
}
/**
* Options for generating common code
*
* Requires mode
*/
interface IconCSSCommonCodeOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, Required<IconCSSModeOptions> {
}
/**
* Options for generating data for one icon
*/
interface IconCSSItemOptions extends IconCSSSharedOptions, Required<IconCSSModeOptions> {
}
/**
* Selector for icon
*/
interface IconContentIconSelectorOptions {
iconSelector?: string;
}
/**
* Options common for both multiple icons and single icon
*/
interface IconContentSharedOptions {
height: number;
width?: number;
color?: string;
rules?: Record<string, string>;
}
/**
* Options for generating data for one icon
*/
type IconContentItemOptions = IconContentSharedOptions;
/**
* Formatting modes. Same as in SASS
*/
type CSSFormatMode = 'expanded' | 'compact' | 'compressed';
/**
* Item to format
*/
interface CSSUnformattedItem {
selector: string | string[];
rules: Record<string, string>;
}
/**
* Formatting options
*/
interface IconCSSFormatOptions {
format?: CSSFormatMode;
}
/**
* Options for generating data for one icon as background/mask
*/
interface IconCSSIconOptions extends IconCSSSharedOptions, IconCSSIconSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating data for one icon as content
*/
interface IconContentIconOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string) => string;
}
/**
* Options for generating multiple icons as background/mask
*/
interface IconCSSIconSetOptions extends IconCSSSharedOptions, IconCSSSelectorOptions, IconCSSModeOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
/**
* Options for generating multiple icons as content
*/
interface IconContentIconSetOptions extends IconContentSharedOptions, IconContentIconSelectorOptions, IconCSSFormatOptions {
customise?: (content: string, name: string) => string;
}
export type { CSSFormatMode, CSSUnformattedItem, IconCSSCommonCodeOptions, IconCSSFormatOptions, IconCSSIconOptions, IconCSSIconSelectorOptions, IconCSSIconSetOptions, IconCSSItemOptions, IconCSSMode, IconCSSModeOptions, IconCSSSelectorOptions, IconCSSSharedOptions, IconContentIconOptions, IconContentIconSelectorOptions, IconContentIconSetOptions, IconContentItemOptions, IconContentSharedOptions };
@@ -0,0 +1,24 @@
'use strict';
function toBoolean(name, value, defaultValue) {
switch (typeof value) {
case "boolean":
return value;
case "number":
return !!value;
case "string":
switch (value.toLowerCase()) {
case "1":
case "true":
case name.toLowerCase():
return true;
case "0":
case "false":
case "":
return false;
}
}
return defaultValue;
}
exports.toBoolean = toBoolean;
@@ -0,0 +1,6 @@
/**
* Get boolean customisation value from attribute
*/
declare function toBoolean(name: string, value: unknown, defaultValue: boolean): boolean;
export { toBoolean };
@@ -0,0 +1,6 @@
/**
* Get boolean customisation value from attribute
*/
declare function toBoolean(name: string, value: unknown, defaultValue: boolean): boolean;
export { toBoolean };
@@ -0,0 +1,6 @@
/**
* Get boolean customisation value from attribute
*/
declare function toBoolean(name: string, value: unknown, defaultValue: boolean): boolean;
export { toBoolean };
@@ -0,0 +1,22 @@
function toBoolean(name, value, defaultValue) {
switch (typeof value) {
case "boolean":
return value;
case "number":
return !!value;
case "string":
switch (value.toLowerCase()) {
case "1":
case "true":
case name.toLowerCase():
return true;
case "0":
case "false":
case "":
return false;
}
}
return defaultValue;
}
export { toBoolean };
@@ -0,0 +1,17 @@
'use strict';
const icon_defaults = require('../icon/defaults.cjs');
const defaultIconSizeCustomisations = Object.freeze({
width: null,
height: null
});
const defaultIconCustomisations = Object.freeze({
// Dimensions
...defaultIconSizeCustomisations,
// Transformations
...icon_defaults.defaultIconTransformations
});
exports.defaultIconCustomisations = defaultIconCustomisations;
exports.defaultIconSizeCustomisations = defaultIconSizeCustomisations;
@@ -0,0 +1,26 @@
import { IconifyTransformations } from '@iconify/types';
/**
* Icon size
*/
type IconifyIconSize = null | string | number;
/**
* Dimensions
*/
interface IconifyIconSizeCustomisations {
width?: IconifyIconSize;
height?: IconifyIconSize;
}
/**
* Icon customisations
*/
interface IconifyIconCustomisations extends IconifyTransformations, IconifyIconSizeCustomisations {
}
type FullIconCustomisations = Required<IconifyIconCustomisations>;
/**
* Default icon customisations values
*/
declare const defaultIconSizeCustomisations: Required<IconifyIconSizeCustomisations>;
declare const defaultIconCustomisations: FullIconCustomisations;
export { type FullIconCustomisations, type IconifyIconCustomisations, type IconifyIconSize, type IconifyIconSizeCustomisations, defaultIconCustomisations, defaultIconSizeCustomisations };
@@ -0,0 +1,26 @@
import { IconifyTransformations } from '@iconify/types';
/**
* Icon size
*/
type IconifyIconSize = null | string | number;
/**
* Dimensions
*/
interface IconifyIconSizeCustomisations {
width?: IconifyIconSize;
height?: IconifyIconSize;
}
/**
* Icon customisations
*/
interface IconifyIconCustomisations extends IconifyTransformations, IconifyIconSizeCustomisations {
}
type FullIconCustomisations = Required<IconifyIconCustomisations>;
/**
* Default icon customisations values
*/
declare const defaultIconSizeCustomisations: Required<IconifyIconSizeCustomisations>;
declare const defaultIconCustomisations: FullIconCustomisations;
export { type FullIconCustomisations, type IconifyIconCustomisations, type IconifyIconSize, type IconifyIconSizeCustomisations, defaultIconCustomisations, defaultIconSizeCustomisations };
@@ -0,0 +1,26 @@
import { IconifyTransformations } from '@iconify/types';
/**
* Icon size
*/
type IconifyIconSize = null | string | number;
/**
* Dimensions
*/
interface IconifyIconSizeCustomisations {
width?: IconifyIconSize;
height?: IconifyIconSize;
}
/**
* Icon customisations
*/
interface IconifyIconCustomisations extends IconifyTransformations, IconifyIconSizeCustomisations {
}
type FullIconCustomisations = Required<IconifyIconCustomisations>;
/**
* Default icon customisations values
*/
declare const defaultIconSizeCustomisations: Required<IconifyIconSizeCustomisations>;
declare const defaultIconCustomisations: FullIconCustomisations;
export { type FullIconCustomisations, type IconifyIconCustomisations, type IconifyIconSize, type IconifyIconSizeCustomisations, defaultIconCustomisations, defaultIconSizeCustomisations };
@@ -0,0 +1,14 @@
import { defaultIconTransformations } from '../icon/defaults.mjs';
const defaultIconSizeCustomisations = Object.freeze({
width: null,
height: null
});
const defaultIconCustomisations = Object.freeze({
// Dimensions
...defaultIconSizeCustomisations,
// Transformations
...defaultIconTransformations
});
export { defaultIconCustomisations, defaultIconSizeCustomisations };
@@ -0,0 +1,18 @@
'use strict';
const separator = /[\s,]+/;
function flipFromString(custom, flip) {
flip.split(separator).forEach((str) => {
const value = str.trim();
switch (value) {
case "horizontal":
custom.hFlip = true;
break;
case "vertical":
custom.vFlip = true;
break;
}
});
}
exports.flipFromString = flipFromString;
@@ -0,0 +1,15 @@
import { IconifyIconCustomisations } from './defaults.cjs';
import '@iconify/types';
/**
* Additional shorthand customisations
*/
interface ShorthandIconCustomisations {
flip?: string;
}
/**
* Apply "flip" string to icon customisations
*/
declare function flipFromString(custom: IconifyIconCustomisations, flip: string): void;
export { type ShorthandIconCustomisations, flipFromString };
@@ -0,0 +1,15 @@
import { IconifyIconCustomisations } from './defaults.mjs';
import '@iconify/types';
/**
* Additional shorthand customisations
*/
interface ShorthandIconCustomisations {
flip?: string;
}
/**
* Apply "flip" string to icon customisations
*/
declare function flipFromString(custom: IconifyIconCustomisations, flip: string): void;
export { type ShorthandIconCustomisations, flipFromString };
@@ -0,0 +1,15 @@
import { IconifyIconCustomisations } from './defaults.js';
import '@iconify/types';
/**
* Additional shorthand customisations
*/
interface ShorthandIconCustomisations {
flip?: string;
}
/**
* Apply "flip" string to icon customisations
*/
declare function flipFromString(custom: IconifyIconCustomisations, flip: string): void;
export { type ShorthandIconCustomisations, flipFromString };
@@ -0,0 +1,16 @@
const separator = /[\s,]+/;
function flipFromString(custom, flip) {
flip.split(separator).forEach((str) => {
const value = str.trim();
switch (value) {
case "horizontal":
custom.hFlip = true;
break;
case "vertical":
custom.vFlip = true;
break;
}
});
}
export { flipFromString };
@@ -0,0 +1,24 @@
'use strict';
const customisations_defaults = require('./defaults.cjs');
require('../icon/defaults.cjs');
function mergeCustomisations(defaults, item) {
const result = {
...defaults
};
for (const key in item) {
const value = item[key];
const valueType = typeof value;
if (key in customisations_defaults.defaultIconSizeCustomisations) {
if (value === null || value && (valueType === "string" || valueType === "number")) {
result[key] = value;
}
} else if (valueType === typeof result[key]) {
result[key] = key === "rotate" ? value % 4 : value;
}
}
return result;
}
exports.mergeCustomisations = mergeCustomisations;
@@ -0,0 +1,9 @@
import { FullIconCustomisations, IconifyIconCustomisations } from './defaults.cjs';
import '@iconify/types';
/**
* Convert IconifyIconCustomisations to FullIconCustomisations, checking value types
*/
declare function mergeCustomisations<T extends FullIconCustomisations>(defaults: T, item: IconifyIconCustomisations): T;
export { mergeCustomisations };
@@ -0,0 +1,9 @@
import { FullIconCustomisations, IconifyIconCustomisations } from './defaults.mjs';
import '@iconify/types';
/**
* Convert IconifyIconCustomisations to FullIconCustomisations, checking value types
*/
declare function mergeCustomisations<T extends FullIconCustomisations>(defaults: T, item: IconifyIconCustomisations): T;
export { mergeCustomisations };
@@ -0,0 +1,9 @@
import { FullIconCustomisations, IconifyIconCustomisations } from './defaults.js';
import '@iconify/types';
/**
* Convert IconifyIconCustomisations to FullIconCustomisations, checking value types
*/
declare function mergeCustomisations<T extends FullIconCustomisations>(defaults: T, item: IconifyIconCustomisations): T;
export { mergeCustomisations };
@@ -0,0 +1,22 @@
import { defaultIconSizeCustomisations } from './defaults.mjs';
import '../icon/defaults.mjs';
function mergeCustomisations(defaults, item) {
const result = {
...defaults
};
for (const key in item) {
const value = item[key];
const valueType = typeof value;
if (key in defaultIconSizeCustomisations) {
if (value === null || value && (valueType === "string" || valueType === "number")) {
result[key] = value;
}
} else if (valueType === typeof result[key]) {
result[key] = key === "rotate" ? value % 4 : value;
}
}
return result;
}
export { mergeCustomisations };
@@ -0,0 +1,35 @@
'use strict';
function rotateFromString(value, defaultValue = 0) {
const units = value.replace(/^-?[0-9.]*/, "");
function cleanup(value2) {
while (value2 < 0) {
value2 += 4;
}
return value2 % 4;
}
if (units === "") {
const num = parseInt(value);
return isNaN(num) ? 0 : cleanup(num);
} else if (units !== value) {
let split = 0;
switch (units) {
case "%":
split = 25;
break;
case "deg":
split = 90;
}
if (split) {
let num = parseFloat(value.slice(0, value.length - units.length));
if (isNaN(num)) {
return 0;
}
num = num / split;
return num % 1 === 0 ? cleanup(num) : 0;
}
}
return defaultValue;
}
exports.rotateFromString = rotateFromString;
@@ -0,0 +1,6 @@
/**
* Get rotation value
*/
declare function rotateFromString(value: string, defaultValue?: number): number;
export { rotateFromString };
@@ -0,0 +1,6 @@
/**
* Get rotation value
*/
declare function rotateFromString(value: string, defaultValue?: number): number;
export { rotateFromString };
@@ -0,0 +1,6 @@
/**
* Get rotation value
*/
declare function rotateFromString(value: string, defaultValue?: number): number;
export { rotateFromString };
@@ -0,0 +1,33 @@
function rotateFromString(value, defaultValue = 0) {
const units = value.replace(/^-?[0-9.]*/, "");
function cleanup(value2) {
while (value2 < 0) {
value2 += 4;
}
return value2 % 4;
}
if (units === "") {
const num = parseInt(value);
return isNaN(num) ? 0 : cleanup(num);
} else if (units !== value) {
let split = 0;
switch (units) {
case "%":
split = 25;
break;
case "deg":
split = 90;
}
if (split) {
let num = parseFloat(value.slice(0, value.length - units.length));
if (isNaN(num)) {
return 0;
}
num = num / split;
return num % 1 === 0 ? cleanup(num) : 0;
}
}
return defaultValue;
}
export { rotateFromString };
@@ -0,0 +1,57 @@
'use strict';
const emoji_convert = require('./convert.cjs');
const emoji_data = require('./data.cjs');
function getEmojiSequenceFromString(value) {
return value.trim().split(/[^0-9A-F]+/i).filter((item) => item.length > 0).map(emoji_convert.getEmojiCodePoint);
}
function getSequenceFromEmojiStringOrKeyword(value) {
if (!value.match(/^[0-9a-fA-F-\s]+$/)) {
const results = [];
for (const codePoint of value) {
const code = codePoint.codePointAt(0);
if (code) {
results.push(code);
} else {
return getEmojiSequenceFromString(value);
}
}
return results;
}
return getEmojiSequenceFromString(value);
}
function splitEmojiSequences(sequence, separator = emoji_data.joinerEmoji) {
const results = [];
let queue = [];
for (let i = 0; i < sequence.length; i++) {
const code = sequence[i];
if (code === separator) {
results.push(queue);
queue = [];
} else {
queue.push(code);
}
}
results.push(queue);
return results;
}
function joinEmojiSequences(sequences, separator = emoji_data.joinerEmoji) {
let results = [];
for (let i = 0; i < sequences.length; i++) {
if (i > 0) {
results.push(separator);
}
results = results.concat(sequences[i]);
}
return results;
}
function getUnqualifiedEmojiSequence(sequence) {
return sequence.filter((num) => num !== emoji_data.vs16Emoji);
}
exports.getEmojiSequenceFromString = getEmojiSequenceFromString;
exports.getSequenceFromEmojiStringOrKeyword = getSequenceFromEmojiStringOrKeyword;
exports.getUnqualifiedEmojiSequence = getUnqualifiedEmojiSequence;
exports.joinEmojiSequences = joinEmojiSequences;
exports.splitEmojiSequences = splitEmojiSequences;
@@ -0,0 +1,42 @@
/**
* Get emoji sequence from string
*
* Examples (shows same emoji sequence formatted differently):
* '1F441 FE0F 200D 1F5E8 FE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '1f441-fe0f-200d-1f5e8-fe0f' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
*/
declare function getEmojiSequenceFromString(value: string): number[];
/**
* Convert emoji sequence or keyword
*
* If sequence is characters list, like '1f441-fe0f', it will be converted to [0x1f441, 0xfe0f]
* If sequence contains anything other than [0-9A-F-\s], it will be converted character by character
*
* This is used to treat keywords, like ':cat:' differently when converting strings to sequences
*/
declare function getSequenceFromEmojiStringOrKeyword(value: string): number[];
/**
* Split emoji sequence by joiner
*
* Result represents one emoji, split in smaller sequences separated by 0x200D
*
* Example:
* [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC] => [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]]
*/
declare function splitEmojiSequences(sequence: number[], separator?: number): number[][];
/**
* Join emoji sequences
*
* Parameter represents one emoji, split in smaller sequences
*
* Example:
* [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]] => [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC]
*/
declare function joinEmojiSequences(sequences: number[][], separator?: number): number[];
/**
* Get unqualified sequence
*/
declare function getUnqualifiedEmojiSequence(sequence: number[]): number[];
export { getEmojiSequenceFromString, getSequenceFromEmojiStringOrKeyword, getUnqualifiedEmojiSequence, joinEmojiSequences, splitEmojiSequences };
@@ -0,0 +1,42 @@
/**
* Get emoji sequence from string
*
* Examples (shows same emoji sequence formatted differently):
* '1F441 FE0F 200D 1F5E8 FE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '1f441-fe0f-200d-1f5e8-fe0f' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
*/
declare function getEmojiSequenceFromString(value: string): number[];
/**
* Convert emoji sequence or keyword
*
* If sequence is characters list, like '1f441-fe0f', it will be converted to [0x1f441, 0xfe0f]
* If sequence contains anything other than [0-9A-F-\s], it will be converted character by character
*
* This is used to treat keywords, like ':cat:' differently when converting strings to sequences
*/
declare function getSequenceFromEmojiStringOrKeyword(value: string): number[];
/**
* Split emoji sequence by joiner
*
* Result represents one emoji, split in smaller sequences separated by 0x200D
*
* Example:
* [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC] => [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]]
*/
declare function splitEmojiSequences(sequence: number[], separator?: number): number[][];
/**
* Join emoji sequences
*
* Parameter represents one emoji, split in smaller sequences
*
* Example:
* [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]] => [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC]
*/
declare function joinEmojiSequences(sequences: number[][], separator?: number): number[];
/**
* Get unqualified sequence
*/
declare function getUnqualifiedEmojiSequence(sequence: number[]): number[];
export { getEmojiSequenceFromString, getSequenceFromEmojiStringOrKeyword, getUnqualifiedEmojiSequence, joinEmojiSequences, splitEmojiSequences };
@@ -0,0 +1,42 @@
/**
* Get emoji sequence from string
*
* Examples (shows same emoji sequence formatted differently):
* '1F441 FE0F 200D 1F5E8 FE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '1f441-fe0f-200d-1f5e8-fe0f' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
* '\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8\\uFE0F' => [0x1f441, 0xfe0f, 0x200d, 0x1f5e8, 0xfe0f]
*/
declare function getEmojiSequenceFromString(value: string): number[];
/**
* Convert emoji sequence or keyword
*
* If sequence is characters list, like '1f441-fe0f', it will be converted to [0x1f441, 0xfe0f]
* If sequence contains anything other than [0-9A-F-\s], it will be converted character by character
*
* This is used to treat keywords, like ':cat:' differently when converting strings to sequences
*/
declare function getSequenceFromEmojiStringOrKeyword(value: string): number[];
/**
* Split emoji sequence by joiner
*
* Result represents one emoji, split in smaller sequences separated by 0x200D
*
* Example:
* [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC] => [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]]
*/
declare function splitEmojiSequences(sequence: number[], separator?: number): number[][];
/**
* Join emoji sequences
*
* Parameter represents one emoji, split in smaller sequences
*
* Example:
* [[0x1FAF1, 0x1F3FB], [0x1FAF2, 0x1F3FC]] => [0x1FAF1, 0x1F3FB, 0x200D, 0x1FAF2, 0x1F3FC]
*/
declare function joinEmojiSequences(sequences: number[][], separator?: number): number[];
/**
* Get unqualified sequence
*/
declare function getUnqualifiedEmojiSequence(sequence: number[]): number[];
export { getEmojiSequenceFromString, getSequenceFromEmojiStringOrKeyword, getUnqualifiedEmojiSequence, joinEmojiSequences, splitEmojiSequences };
@@ -0,0 +1,51 @@
import { getEmojiCodePoint } from './convert.mjs';
import { joinerEmoji, vs16Emoji } from './data.mjs';
function getEmojiSequenceFromString(value) {
return value.trim().split(/[^0-9A-F]+/i).filter((item) => item.length > 0).map(getEmojiCodePoint);
}
function getSequenceFromEmojiStringOrKeyword(value) {
if (!value.match(/^[0-9a-fA-F-\s]+$/)) {
const results = [];
for (const codePoint of value) {
const code = codePoint.codePointAt(0);
if (code) {
results.push(code);
} else {
return getEmojiSequenceFromString(value);
}
}
return results;
}
return getEmojiSequenceFromString(value);
}
function splitEmojiSequences(sequence, separator = joinerEmoji) {
const results = [];
let queue = [];
for (let i = 0; i < sequence.length; i++) {
const code = sequence[i];
if (code === separator) {
results.push(queue);
queue = [];
} else {
queue.push(code);
}
}
results.push(queue);
return results;
}
function joinEmojiSequences(sequences, separator = joinerEmoji) {
let results = [];
for (let i = 0; i < sequences.length; i++) {
if (i > 0) {
results.push(separator);
}
results = results.concat(sequences[i]);
}
return results;
}
function getUnqualifiedEmojiSequence(sequence) {
return sequence.filter((num) => num !== vs16Emoji);
}
export { getEmojiSequenceFromString, getSequenceFromEmojiStringOrKeyword, getUnqualifiedEmojiSequence, joinEmojiSequences, splitEmojiSequences };
@@ -0,0 +1,92 @@
'use strict';
const emoji_data = require('./data.cjs');
function getEmojiCodePoint(code) {
return parseInt(code, 16);
}
function utf32FirstNum(code) {
return (code - emoji_data.minUTF32 >> 10 | 0) + emoji_data.startUTF32Pair1;
}
function utf32SecondNum(code) {
return (code - emoji_data.minUTF32 & 1023) + emoji_data.startUTF32Pair2;
}
function splitUTF32Number(code) {
if (code >= emoji_data.minUTF32) {
return [utf32FirstNum(code), utf32SecondNum(code)];
}
}
function isUTF32SplitNumber(value) {
if (value >= emoji_data.startUTF32Pair1) {
if (value < emoji_data.startUTF32Pair2) {
return 1;
}
if (value < emoji_data.endUTF32Pair) {
return 2;
}
}
return false;
}
function mergeUTF32Numbers(part1, part2) {
if (part1 < emoji_data.startUTF32Pair1 || part1 >= emoji_data.startUTF32Pair2 || part2 < emoji_data.startUTF32Pair2 || part2 >= emoji_data.endUTF32Pair) {
return;
}
return (part1 - emoji_data.startUTF32Pair1 << 10) + (part2 - emoji_data.startUTF32Pair2) + emoji_data.minUTF32;
}
function getEmojiUnicode(code) {
return String.fromCodePoint(
typeof code === "number" ? code : getEmojiCodePoint(code)
);
}
function convertEmojiSequenceToUTF16(numbers) {
const results = [];
for (let i = 0; i < numbers.length; i++) {
const code = numbers[i];
if (code >= emoji_data.minUTF32) {
results.push(utf32FirstNum(code));
results.push(utf32SecondNum(code));
} else {
results.push(code);
}
}
return results;
}
function convertEmojiSequenceToUTF32(numbers, throwOnError = true) {
const results = [];
for (let i = 0; i < numbers.length; i++) {
const code = numbers[i];
if (code >= emoji_data.minUTF32) {
results.push(code);
continue;
}
const part = isUTF32SplitNumber(code);
if (!part) {
results.push(code);
continue;
}
if (part === 1 && numbers.length > i + 1) {
const merged = mergeUTF32Numbers(code, numbers[i + 1]);
if (merged) {
i++;
results.push(merged);
continue;
}
}
if (throwOnError) {
const nextCode = numbers[i + 1];
throw new Error(
`Invalid UTF-16 sequence: ${code.toString(16)}-${nextCode ? nextCode.toString(16) : "undefined"}`
);
}
results.push(code);
}
return results;
}
exports.convertEmojiSequenceToUTF16 = convertEmojiSequenceToUTF16;
exports.convertEmojiSequenceToUTF32 = convertEmojiSequenceToUTF32;
exports.getEmojiCodePoint = getEmojiCodePoint;
exports.getEmojiUnicode = getEmojiUnicode;
exports.isUTF32SplitNumber = isUTF32SplitNumber;
exports.mergeUTF32Numbers = mergeUTF32Numbers;
exports.splitUTF32Number = splitUTF32Number;
@@ -0,0 +1,35 @@
/**
* Convert string to number
*/
declare function getEmojiCodePoint(code: string): number;
/**
* Get UTF-32 as UTF-16 sequence
*/
declare function splitUTF32Number(code: number): [number, number] | undefined;
/**
* Check if number is UTF-32 split as UTF-16
*
* Returns:
* - 1 if number fits first number in sequence
* - 2 if number fits second number in sequence
* - false on failure
*/
declare function isUTF32SplitNumber(value: number): 1 | 2 | false;
/**
* Get UTF-16 sequence as UTF-32
*/
declare function mergeUTF32Numbers(part1: number, part2: number): number | undefined;
/**
* Convert hexadecimal string or number to unicode
*/
declare function getEmojiUnicode(code: number | string): string;
/**
* Convert sequence to UTF-16
*/
declare function convertEmojiSequenceToUTF16(numbers: number[]): number[];
/**
* Convert sequence to UTF-32
*/
declare function convertEmojiSequenceToUTF32(numbers: number[], throwOnError?: boolean): number[];
export { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, getEmojiCodePoint, getEmojiUnicode, isUTF32SplitNumber, mergeUTF32Numbers, splitUTF32Number };
@@ -0,0 +1,35 @@
/**
* Convert string to number
*/
declare function getEmojiCodePoint(code: string): number;
/**
* Get UTF-32 as UTF-16 sequence
*/
declare function splitUTF32Number(code: number): [number, number] | undefined;
/**
* Check if number is UTF-32 split as UTF-16
*
* Returns:
* - 1 if number fits first number in sequence
* - 2 if number fits second number in sequence
* - false on failure
*/
declare function isUTF32SplitNumber(value: number): 1 | 2 | false;
/**
* Get UTF-16 sequence as UTF-32
*/
declare function mergeUTF32Numbers(part1: number, part2: number): number | undefined;
/**
* Convert hexadecimal string or number to unicode
*/
declare function getEmojiUnicode(code: number | string): string;
/**
* Convert sequence to UTF-16
*/
declare function convertEmojiSequenceToUTF16(numbers: number[]): number[];
/**
* Convert sequence to UTF-32
*/
declare function convertEmojiSequenceToUTF32(numbers: number[], throwOnError?: boolean): number[];
export { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, getEmojiCodePoint, getEmojiUnicode, isUTF32SplitNumber, mergeUTF32Numbers, splitUTF32Number };
@@ -0,0 +1,35 @@
/**
* Convert string to number
*/
declare function getEmojiCodePoint(code: string): number;
/**
* Get UTF-32 as UTF-16 sequence
*/
declare function splitUTF32Number(code: number): [number, number] | undefined;
/**
* Check if number is UTF-32 split as UTF-16
*
* Returns:
* - 1 if number fits first number in sequence
* - 2 if number fits second number in sequence
* - false on failure
*/
declare function isUTF32SplitNumber(value: number): 1 | 2 | false;
/**
* Get UTF-16 sequence as UTF-32
*/
declare function mergeUTF32Numbers(part1: number, part2: number): number | undefined;
/**
* Convert hexadecimal string or number to unicode
*/
declare function getEmojiUnicode(code: number | string): string;
/**
* Convert sequence to UTF-16
*/
declare function convertEmojiSequenceToUTF16(numbers: number[]): number[];
/**
* Convert sequence to UTF-32
*/
declare function convertEmojiSequenceToUTF32(numbers: number[], throwOnError?: boolean): number[];
export { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, getEmojiCodePoint, getEmojiUnicode, isUTF32SplitNumber, mergeUTF32Numbers, splitUTF32Number };
@@ -0,0 +1,84 @@
import { minUTF32, startUTF32Pair1, startUTF32Pair2, endUTF32Pair } from './data.mjs';
function getEmojiCodePoint(code) {
return parseInt(code, 16);
}
function utf32FirstNum(code) {
return (code - minUTF32 >> 10 | 0) + startUTF32Pair1;
}
function utf32SecondNum(code) {
return (code - minUTF32 & 1023) + startUTF32Pair2;
}
function splitUTF32Number(code) {
if (code >= minUTF32) {
return [utf32FirstNum(code), utf32SecondNum(code)];
}
}
function isUTF32SplitNumber(value) {
if (value >= startUTF32Pair1) {
if (value < startUTF32Pair2) {
return 1;
}
if (value < endUTF32Pair) {
return 2;
}
}
return false;
}
function mergeUTF32Numbers(part1, part2) {
if (part1 < startUTF32Pair1 || part1 >= startUTF32Pair2 || part2 < startUTF32Pair2 || part2 >= endUTF32Pair) {
return;
}
return (part1 - startUTF32Pair1 << 10) + (part2 - startUTF32Pair2) + minUTF32;
}
function getEmojiUnicode(code) {
return String.fromCodePoint(
typeof code === "number" ? code : getEmojiCodePoint(code)
);
}
function convertEmojiSequenceToUTF16(numbers) {
const results = [];
for (let i = 0; i < numbers.length; i++) {
const code = numbers[i];
if (code >= minUTF32) {
results.push(utf32FirstNum(code));
results.push(utf32SecondNum(code));
} else {
results.push(code);
}
}
return results;
}
function convertEmojiSequenceToUTF32(numbers, throwOnError = true) {
const results = [];
for (let i = 0; i < numbers.length; i++) {
const code = numbers[i];
if (code >= minUTF32) {
results.push(code);
continue;
}
const part = isUTF32SplitNumber(code);
if (!part) {
results.push(code);
continue;
}
if (part === 1 && numbers.length > i + 1) {
const merged = mergeUTF32Numbers(code, numbers[i + 1]);
if (merged) {
i++;
results.push(merged);
continue;
}
}
if (throwOnError) {
const nextCode = numbers[i + 1];
throw new Error(
`Invalid UTF-16 sequence: ${code.toString(16)}-${nextCode ? nextCode.toString(16) : "undefined"}`
);
}
results.push(code);
}
return results;
}
export { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32, getEmojiCodePoint, getEmojiUnicode, isUTF32SplitNumber, mergeUTF32Numbers, splitUTF32Number };
@@ -0,0 +1,26 @@
'use strict';
const joinerEmoji = 8205;
const vs16Emoji = 65039;
const keycapEmoji = 8419;
const emojiComponents = {
// Hair styles
"hair-style": [129456, 129460],
// Skin tones
"skin-tone": [127995, 128e3]
};
const minUTF32 = 65536;
const startUTF32Pair1 = 55296;
const startUTF32Pair2 = 56320;
const endUTF32Pair = 57344;
const emojiVersion = "16.0";
exports.emojiComponents = emojiComponents;
exports.emojiVersion = emojiVersion;
exports.endUTF32Pair = endUTF32Pair;
exports.joinerEmoji = joinerEmoji;
exports.keycapEmoji = keycapEmoji;
exports.minUTF32 = minUTF32;
exports.startUTF32Pair1 = startUTF32Pair1;
exports.startUTF32Pair2 = startUTF32Pair2;
exports.vs16Emoji = vs16Emoji;
@@ -0,0 +1,33 @@
/**
* Various codes
*/
declare const joinerEmoji = 8205;
declare const vs16Emoji = 65039;
declare const keycapEmoji = 8419;
/**
* Variations, UTF-32
*
* First value in array is minimum, second value is maximum+1
*/
type EmojiComponentType = 'skin-tone' | 'hair-style';
type Range = [number, number];
declare const emojiComponents: Record<EmojiComponentType, Range>;
/**
* Minimum UTF-32 number
*/
declare const minUTF32 = 65536;
/**
* Codes for UTF-32 characters presented as UTF-16
*
* startUTF32Pair1 <= code < startUTF32Pair2 -> code for first character in pair
* startUTF32Pair2 <= code < endUTF32Pair -> code for second character in pair
*/
declare const startUTF32Pair1 = 55296;
declare const startUTF32Pair2 = 56320;
declare const endUTF32Pair = 57344;
/**
* Emoji version as string
*/
declare const emojiVersion = "16.0";
export { type EmojiComponentType, emojiComponents, emojiVersion, endUTF32Pair, joinerEmoji, keycapEmoji, minUTF32, startUTF32Pair1, startUTF32Pair2, vs16Emoji };
@@ -0,0 +1,33 @@
/**
* Various codes
*/
declare const joinerEmoji = 8205;
declare const vs16Emoji = 65039;
declare const keycapEmoji = 8419;
/**
* Variations, UTF-32
*
* First value in array is minimum, second value is maximum+1
*/
type EmojiComponentType = 'skin-tone' | 'hair-style';
type Range = [number, number];
declare const emojiComponents: Record<EmojiComponentType, Range>;
/**
* Minimum UTF-32 number
*/
declare const minUTF32 = 65536;
/**
* Codes for UTF-32 characters presented as UTF-16
*
* startUTF32Pair1 <= code < startUTF32Pair2 -> code for first character in pair
* startUTF32Pair2 <= code < endUTF32Pair -> code for second character in pair
*/
declare const startUTF32Pair1 = 55296;
declare const startUTF32Pair2 = 56320;
declare const endUTF32Pair = 57344;
/**
* Emoji version as string
*/
declare const emojiVersion = "16.0";
export { type EmojiComponentType, emojiComponents, emojiVersion, endUTF32Pair, joinerEmoji, keycapEmoji, minUTF32, startUTF32Pair1, startUTF32Pair2, vs16Emoji };
@@ -0,0 +1,33 @@
/**
* Various codes
*/
declare const joinerEmoji = 8205;
declare const vs16Emoji = 65039;
declare const keycapEmoji = 8419;
/**
* Variations, UTF-32
*
* First value in array is minimum, second value is maximum+1
*/
type EmojiComponentType = 'skin-tone' | 'hair-style';
type Range = [number, number];
declare const emojiComponents: Record<EmojiComponentType, Range>;
/**
* Minimum UTF-32 number
*/
declare const minUTF32 = 65536;
/**
* Codes for UTF-32 characters presented as UTF-16
*
* startUTF32Pair1 <= code < startUTF32Pair2 -> code for first character in pair
* startUTF32Pair2 <= code < endUTF32Pair -> code for second character in pair
*/
declare const startUTF32Pair1 = 55296;
declare const startUTF32Pair2 = 56320;
declare const endUTF32Pair = 57344;
/**
* Emoji version as string
*/
declare const emojiVersion = "16.0";
export { type EmojiComponentType, emojiComponents, emojiVersion, endUTF32Pair, joinerEmoji, keycapEmoji, minUTF32, startUTF32Pair1, startUTF32Pair2, vs16Emoji };
@@ -0,0 +1,16 @@
const joinerEmoji = 8205;
const vs16Emoji = 65039;
const keycapEmoji = 8419;
const emojiComponents = {
// Hair styles
"hair-style": [129456, 129460],
// Skin tones
"skin-tone": [127995, 128e3]
};
const minUTF32 = 65536;
const startUTF32Pair1 = 55296;
const startUTF32Pair2 = 56320;
const endUTF32Pair = 57344;
const emojiVersion = "16.0";
export { emojiComponents, emojiVersion, endUTF32Pair, joinerEmoji, keycapEmoji, minUTF32, startUTF32Pair1, startUTF32Pair2, vs16Emoji };
@@ -0,0 +1,48 @@
'use strict';
const emoji_convert = require('./convert.cjs');
require('./data.cjs');
const defaultUnicodeOptions = {
prefix: "",
separator: "",
case: "lower",
format: "utf-32",
add0: false,
throwOnError: true
};
function convert(sequence, options) {
const prefix = options.prefix;
const func = options.case === "upper" ? "toUpperCase" : "toLowerCase";
const cleanSequence = options.format === "utf-16" ? emoji_convert.convertEmojiSequenceToUTF16(sequence) : emoji_convert.convertEmojiSequenceToUTF32(sequence, options.throwOnError);
return cleanSequence.map((code) => {
let str = code.toString(16);
if (options.add0 && str.length < 4) {
str = "0".repeat(4 - str.length) + str;
}
return prefix + str[func]();
}).join(options.separator);
}
function getEmojiUnicodeString(code, options = {}) {
return convert([code], {
...defaultUnicodeOptions,
...options
});
}
const defaultSequenceOptions = {
...defaultUnicodeOptions,
separator: "-"
};
function getEmojiSequenceString(sequence, options = {}) {
return convert(sequence, {
...defaultSequenceOptions,
...options
});
}
function getEmojiSequenceKeyword(sequence) {
return sequence.map((code) => code.toString(16)).join("-");
}
exports.getEmojiSequenceKeyword = getEmojiSequenceKeyword;
exports.getEmojiSequenceString = getEmojiSequenceString;
exports.getEmojiUnicodeString = getEmojiUnicodeString;
@@ -0,0 +1,30 @@
interface UnicodeFormattingOptions {
prefix: string;
separator: string;
case: 'upper' | 'lower';
format: 'utf-32' | 'utf-16';
add0: boolean;
throwOnError: boolean;
}
/**
* Convert unicode number to string
*
* Example:
* 0x1F600 => '1F600'
*/
declare function getEmojiUnicodeString(code: number, options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Example:
* [0x1f441, 0xfe0f] => '1f441-fe0f'
*/
declare function getEmojiSequenceString(sequence: number[], options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Simple version of `getEmojiSequenceString()` without options that otherwise add to bundle
*/
declare function getEmojiSequenceKeyword(sequence: number[]): string;
export { type UnicodeFormattingOptions, getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicodeString };
@@ -0,0 +1,30 @@
interface UnicodeFormattingOptions {
prefix: string;
separator: string;
case: 'upper' | 'lower';
format: 'utf-32' | 'utf-16';
add0: boolean;
throwOnError: boolean;
}
/**
* Convert unicode number to string
*
* Example:
* 0x1F600 => '1F600'
*/
declare function getEmojiUnicodeString(code: number, options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Example:
* [0x1f441, 0xfe0f] => '1f441-fe0f'
*/
declare function getEmojiSequenceString(sequence: number[], options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Simple version of `getEmojiSequenceString()` without options that otherwise add to bundle
*/
declare function getEmojiSequenceKeyword(sequence: number[]): string;
export { type UnicodeFormattingOptions, getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicodeString };
@@ -0,0 +1,30 @@
interface UnicodeFormattingOptions {
prefix: string;
separator: string;
case: 'upper' | 'lower';
format: 'utf-32' | 'utf-16';
add0: boolean;
throwOnError: boolean;
}
/**
* Convert unicode number to string
*
* Example:
* 0x1F600 => '1F600'
*/
declare function getEmojiUnicodeString(code: number, options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Example:
* [0x1f441, 0xfe0f] => '1f441-fe0f'
*/
declare function getEmojiSequenceString(sequence: number[], options?: Partial<UnicodeFormattingOptions>): string;
/**
* Convert unicode numbers sequence to string
*
* Simple version of `getEmojiSequenceString()` without options that otherwise add to bundle
*/
declare function getEmojiSequenceKeyword(sequence: number[]): string;
export { type UnicodeFormattingOptions, getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicodeString };
@@ -0,0 +1,44 @@
import { convertEmojiSequenceToUTF16, convertEmojiSequenceToUTF32 } from './convert.mjs';
import './data.mjs';
const defaultUnicodeOptions = {
prefix: "",
separator: "",
case: "lower",
format: "utf-32",
add0: false,
throwOnError: true
};
function convert(sequence, options) {
const prefix = options.prefix;
const func = options.case === "upper" ? "toUpperCase" : "toLowerCase";
const cleanSequence = options.format === "utf-16" ? convertEmojiSequenceToUTF16(sequence) : convertEmojiSequenceToUTF32(sequence, options.throwOnError);
return cleanSequence.map((code) => {
let str = code.toString(16);
if (options.add0 && str.length < 4) {
str = "0".repeat(4 - str.length) + str;
}
return prefix + str[func]();
}).join(options.separator);
}
function getEmojiUnicodeString(code, options = {}) {
return convert([code], {
...defaultUnicodeOptions,
...options
});
}
const defaultSequenceOptions = {
...defaultUnicodeOptions,
separator: "-"
};
function getEmojiSequenceString(sequence, options = {}) {
return convert(sequence, {
...defaultSequenceOptions,
...options
});
}
function getEmojiSequenceKeyword(sequence) {
return sequence.map((code) => code.toString(16)).join("-");
}
export { getEmojiSequenceKeyword, getEmojiSequenceString, getEmojiUnicodeString };
@@ -0,0 +1,61 @@
'use strict';
const emoji_cleanup = require('./cleanup.cjs');
const emoji_format = require('./format.cjs');
const emoji_regex_create = require('./regex/create.cjs');
const emoji_test_missing = require('./test/missing.cjs');
const emoji_test_parse = require('./test/parse.cjs');
const emoji_test_similar = require('./test/similar.cjs');
const emoji_test_tree = require('./test/tree.cjs');
const emoji_test_variations = require('./test/variations.cjs');
require('./convert.cjs');
require('./data.cjs');
require('./regex/tree.cjs');
require('./regex/base.cjs');
require('./regex/numbers.cjs');
require('./regex/similar.cjs');
require('./test/components.cjs');
require('./test/name.cjs');
function prepareEmojiForIconsList(icons, rawTestData) {
const testData = rawTestData ? emoji_test_parse.parseEmojiTestFile(rawTestData) : void 0;
let iconsList = [];
for (const char in icons) {
const sequence = emoji_cleanup.getEmojiSequenceFromString(char);
iconsList.push({
icon: icons[char],
sequence
});
}
iconsList = emoji_test_variations.getQualifiedEmojiVariations(iconsList);
if (testData) {
iconsList = iconsList.concat(
emoji_test_missing.findMissingEmojis(
iconsList,
emoji_test_tree.getEmojiTestDataTree(emoji_test_similar.combineSimilarEmojiTestData(testData))
)
);
}
const preparedIcons = iconsList.map((item) => {
const sequence = emoji_format.getEmojiSequenceKeyword(
emoji_cleanup.getUnqualifiedEmojiSequence(item.sequence)
);
return {
icon: item.icon,
sequence
};
});
const regex = emoji_regex_create.createOptimisedRegexForEmojiSequences(
iconsList.map((item) => item.sequence)
);
return {
regex,
icons: preparedIcons
};
}
function prepareEmojiForIconSet(iconSet, rawTestData) {
return prepareEmojiForIconsList(iconSet.chars || {}, rawTestData);
}
exports.prepareEmojiForIconSet = prepareEmojiForIconSet;
exports.prepareEmojiForIconsList = prepareEmojiForIconsList;
@@ -0,0 +1,32 @@
import { IconifyJSON } from '@iconify/types';
/**
* Parsed icon
*/
interface PreparedEmojiIcon {
icon: string;
sequence: string;
}
/**
* Parse
*/
interface PreparedEmojiResult {
icons: PreparedEmojiIcon[];
regex: string;
}
/**
* Prepare emoji for icons list
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconsList(icons: Record<string, string>, rawTestData?: string): PreparedEmojiResult;
/**
* Prepare emoji for an icon set
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconSet(iconSet: IconifyJSON, rawTestData?: string): PreparedEmojiResult;
export { type PreparedEmojiIcon, type PreparedEmojiResult, prepareEmojiForIconSet, prepareEmojiForIconsList };
@@ -0,0 +1,32 @@
import { IconifyJSON } from '@iconify/types';
/**
* Parsed icon
*/
interface PreparedEmojiIcon {
icon: string;
sequence: string;
}
/**
* Parse
*/
interface PreparedEmojiResult {
icons: PreparedEmojiIcon[];
regex: string;
}
/**
* Prepare emoji for icons list
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconsList(icons: Record<string, string>, rawTestData?: string): PreparedEmojiResult;
/**
* Prepare emoji for an icon set
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconSet(iconSet: IconifyJSON, rawTestData?: string): PreparedEmojiResult;
export { type PreparedEmojiIcon, type PreparedEmojiResult, prepareEmojiForIconSet, prepareEmojiForIconsList };
@@ -0,0 +1,32 @@
import { IconifyJSON } from '@iconify/types';
/**
* Parsed icon
*/
interface PreparedEmojiIcon {
icon: string;
sequence: string;
}
/**
* Parse
*/
interface PreparedEmojiResult {
icons: PreparedEmojiIcon[];
regex: string;
}
/**
* Prepare emoji for icons list
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconsList(icons: Record<string, string>, rawTestData?: string): PreparedEmojiResult;
/**
* Prepare emoji for an icon set
*
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
* It is used to detect missing emojis and optimise regular expression
*/
declare function prepareEmojiForIconSet(iconSet: IconifyJSON, rawTestData?: string): PreparedEmojiResult;
export { type PreparedEmojiIcon, type PreparedEmojiResult, prepareEmojiForIconSet, prepareEmojiForIconsList };
@@ -0,0 +1,58 @@
import { getEmojiSequenceFromString, getUnqualifiedEmojiSequence } from './cleanup.mjs';
import { getEmojiSequenceKeyword } from './format.mjs';
import { createOptimisedRegexForEmojiSequences } from './regex/create.mjs';
import { findMissingEmojis } from './test/missing.mjs';
import { parseEmojiTestFile } from './test/parse.mjs';
import { combineSimilarEmojiTestData } from './test/similar.mjs';
import { getEmojiTestDataTree } from './test/tree.mjs';
import { getQualifiedEmojiVariations } from './test/variations.mjs';
import './convert.mjs';
import './data.mjs';
import './regex/tree.mjs';
import './regex/base.mjs';
import './regex/numbers.mjs';
import './regex/similar.mjs';
import './test/components.mjs';
import './test/name.mjs';
function prepareEmojiForIconsList(icons, rawTestData) {
const testData = rawTestData ? parseEmojiTestFile(rawTestData) : void 0;
let iconsList = [];
for (const char in icons) {
const sequence = getEmojiSequenceFromString(char);
iconsList.push({
icon: icons[char],
sequence
});
}
iconsList = getQualifiedEmojiVariations(iconsList);
if (testData) {
iconsList = iconsList.concat(
findMissingEmojis(
iconsList,
getEmojiTestDataTree(combineSimilarEmojiTestData(testData))
)
);
}
const preparedIcons = iconsList.map((item) => {
const sequence = getEmojiSequenceKeyword(
getUnqualifiedEmojiSequence(item.sequence)
);
return {
icon: item.icon,
sequence
};
});
const regex = createOptimisedRegexForEmojiSequences(
iconsList.map((item) => item.sequence)
);
return {
regex,
icons: preparedIcons
};
}
function prepareEmojiForIconSet(iconSet, rawTestData) {
return prepareEmojiForIconsList(iconSet.chars || {}, rawTestData);
}
export { prepareEmojiForIconSet, prepareEmojiForIconsList };
@@ -0,0 +1,242 @@
'use strict';
function toString(number) {
if (number < 255) {
if (number > 32 && number < 127) {
const char = String.fromCharCode(number);
if (
// 0-9
number > 47 && number < 58 || // A-Z
number > 64 && number < 91 || // _`a-z
number > 94 && number < 123
) {
return char;
}
return "\\" + char;
}
return "\\x" + (number < 16 ? "0" : "") + number.toString(16).toUpperCase();
}
return "\\u" + number.toString(16).toUpperCase();
}
function wrapRegexInGroup(regex) {
return "(?:" + regex + ")";
}
function updateUTF16EmojiRegexItem(item) {
const numbers = item.numbers;
if (numbers.length === 1) {
const num = numbers[0];
return item.regex = toString(num);
}
numbers.sort((a, b) => a - b);
const chars = [];
let range = null;
const addRange = () => {
if (range) {
const { start, last, numbers: numbers2 } = range;
range = null;
if (last > start + 1) {
chars.push(toString(start) + "-" + toString(last));
} else {
for (let i = 0; i < numbers2.length; i++) {
chars.push(toString(numbers2[i]));
}
}
}
};
for (let i = 0; i < numbers.length; i++) {
const num = numbers[i];
if (range) {
if (range.last === num) {
continue;
}
if (range.last === num - 1) {
range.numbers.push(num);
range.last = num;
continue;
}
}
addRange();
range = {
start: num,
last: num,
numbers: [num]
};
}
addRange();
if (!chars.length) {
throw new Error("Unexpected empty range");
}
return item.regex = "[" + chars.join("") + "]";
}
function createUTF16EmojiRegexItem(numbers) {
const result = {
type: "utf16",
regex: "",
numbers,
length: 1,
group: true
};
updateUTF16EmojiRegexItem(result);
return result;
}
function updateSequenceEmojiRegexItem(item) {
return item.regex = item.items.map((childItem) => {
if (!childItem.group && childItem.type === "set") {
return wrapRegexInGroup(childItem.regex);
}
return childItem.regex;
}).join("");
}
function createSequenceEmojiRegexItem(sequence, numbers) {
let items = [];
sequence.forEach((item) => {
if (item.type === "sequence") {
items = items.concat(item.items);
} else {
items.push(item);
}
});
if (!items.length) {
throw new Error("Empty sequence");
}
const result = {
type: "sequence",
items,
regex: "",
length: items.reduce((length, item) => item.length + length, 0),
group: false
};
if (sequence.length === 1) {
const firstItem = sequence[0];
result.group = firstItem.group;
if (firstItem.type !== "optional") {
const numbers2 = firstItem.numbers;
if (numbers2) {
result.numbers = numbers2;
}
}
}
if (numbers) {
result.numbers = numbers;
}
updateSequenceEmojiRegexItem(result);
return result;
}
function updateSetEmojiRegexItem(item) {
if (item.sets.length === 1) {
const firstItem = item.sets[0];
item.group = firstItem.group;
return item.regex = firstItem.regex;
}
item.group = false;
return item.regex = item.sets.map((childItem) => childItem.regex).join("|");
}
function createSetEmojiRegexItem(set) {
let sets = [];
let numbers = [];
set.forEach((item) => {
if (item.type === "set") {
sets = sets.concat(item.sets);
} else {
sets.push(item);
}
if (numbers) {
if (item.type === "optional" || !item.numbers) {
numbers = null;
} else {
numbers = [...numbers, ...item.numbers];
}
}
});
sets.sort((a, b) => {
if (a.length === b.length) {
return a.regex.localeCompare(b.regex);
}
return b.length - a.length;
});
const result = {
type: "set",
sets,
regex: "",
length: sets.reduce(
(length, item) => length ? Math.min(length, item.length) : item.length,
0
),
group: false
};
if (numbers) {
result.numbers = numbers;
}
if (set.length === 1) {
const firstItem = set[0];
result.group = firstItem.group;
}
updateSetEmojiRegexItem(result);
return result;
}
function updateOptionalEmojiRegexItem(item) {
const childItem = item.item;
const regex = (childItem.group ? childItem.regex : wrapRegexInGroup(childItem.regex)) + "?";
return item.regex = regex;
}
function createOptionalEmojiRegexItem(item) {
if (item.type === "optional") {
return item;
}
const result = {
type: "optional",
item,
regex: "",
length: item.length,
group: true
};
updateOptionalEmojiRegexItem(result);
return result;
}
function cloneEmojiRegexItem(item, shallow = false) {
const result = {
...item
};
if (result.type !== "optional" && result.numbers) {
result.numbers = [...result.numbers];
}
switch (result.type) {
case "utf16":
break;
case "sequence":
if (shallow) {
result.items = [...result.items];
} else {
result.items = result.items.map(
(item2) => cloneEmojiRegexItem(item2, false)
);
}
break;
case "set":
if (shallow) {
result.sets = [...result.sets];
} else {
result.sets = result.sets.map(
(item2) => cloneEmojiRegexItem(item2, false)
);
}
break;
case "optional":
if (!shallow) {
result.item = cloneEmojiRegexItem(result.item, false);
}
break;
}
return result;
}
exports.cloneEmojiRegexItem = cloneEmojiRegexItem;
exports.createOptionalEmojiRegexItem = createOptionalEmojiRegexItem;
exports.createSequenceEmojiRegexItem = createSequenceEmojiRegexItem;
exports.createSetEmojiRegexItem = createSetEmojiRegexItem;
exports.createUTF16EmojiRegexItem = createUTF16EmojiRegexItem;
exports.updateOptionalEmojiRegexItem = updateOptionalEmojiRegexItem;
exports.updateSequenceEmojiRegexItem = updateSequenceEmojiRegexItem;
exports.updateSetEmojiRegexItem = updateSetEmojiRegexItem;
exports.updateUTF16EmojiRegexItem = updateUTF16EmojiRegexItem;
exports.wrapRegexInGroup = wrapRegexInGroup;
@@ -0,0 +1,75 @@
/**
* Regex in item
*/
interface BaseEmojiItemRegex {
type: 'utf16' | 'sequence' | 'set' | 'optional';
regex: string;
group: boolean;
length: number;
}
interface EmojiItemRegexWithNumbers {
numbers?: number[];
}
interface UTF16EmojiItemRegex extends BaseEmojiItemRegex, Required<EmojiItemRegexWithNumbers> {
type: 'utf16';
group: true;
}
type SequenceEmojiItemRegexItem = UTF16EmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
interface SequenceEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'sequence';
items: SequenceEmojiItemRegexItem[];
}
type SetEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | OptionalEmojiItemRegex;
interface SetEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'set';
sets: SetEmojiItemRegexItem[];
}
type OptionalEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex;
interface OptionalEmojiItemRegex extends BaseEmojiItemRegex {
type: 'optional';
item: OptionalEmojiItemRegexItem;
group: true;
}
type EmojiItemRegex = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
/**
* Wrap regex in group
*/
declare function wrapRegexInGroup(regex: string): string;
/**
* Update UTF16 item, return regex
*/
declare function updateUTF16EmojiRegexItem(item: UTF16EmojiItemRegex): string;
/**
* Create UTF-16 regex
*/
declare function createUTF16EmojiRegexItem(numbers: number[]): UTF16EmojiItemRegex;
/**
* Update sequence regex. Does not update group
*/
declare function updateSequenceEmojiRegexItem(item: SequenceEmojiItemRegex): string;
/**
* Create sequence regex
*/
declare function createSequenceEmojiRegexItem(sequence: EmojiItemRegex[], numbers?: number[]): SequenceEmojiItemRegex;
/**
* Update set regex and group
*/
declare function updateSetEmojiRegexItem(item: SetEmojiItemRegex): string;
/**
* Create set regex
*/
declare function createSetEmojiRegexItem(set: EmojiItemRegex[]): SetEmojiItemRegex;
/**
* Update optional regex
*/
declare function updateOptionalEmojiRegexItem(item: OptionalEmojiItemRegex): string;
/**
* Create optional item
*/
declare function createOptionalEmojiRegexItem(item: EmojiItemRegex): OptionalEmojiItemRegex;
/**
* Clone item
*/
declare function cloneEmojiRegexItem<T extends BaseEmojiItemRegex>(item: T, shallow?: boolean): T;
export { type EmojiItemRegex, type OptionalEmojiItemRegex, type SequenceEmojiItemRegex, type SetEmojiItemRegex, type SetEmojiItemRegexItem, type UTF16EmojiItemRegex, cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem, updateOptionalEmojiRegexItem, updateSequenceEmojiRegexItem, updateSetEmojiRegexItem, updateUTF16EmojiRegexItem, wrapRegexInGroup };
@@ -0,0 +1,75 @@
/**
* Regex in item
*/
interface BaseEmojiItemRegex {
type: 'utf16' | 'sequence' | 'set' | 'optional';
regex: string;
group: boolean;
length: number;
}
interface EmojiItemRegexWithNumbers {
numbers?: number[];
}
interface UTF16EmojiItemRegex extends BaseEmojiItemRegex, Required<EmojiItemRegexWithNumbers> {
type: 'utf16';
group: true;
}
type SequenceEmojiItemRegexItem = UTF16EmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
interface SequenceEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'sequence';
items: SequenceEmojiItemRegexItem[];
}
type SetEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | OptionalEmojiItemRegex;
interface SetEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'set';
sets: SetEmojiItemRegexItem[];
}
type OptionalEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex;
interface OptionalEmojiItemRegex extends BaseEmojiItemRegex {
type: 'optional';
item: OptionalEmojiItemRegexItem;
group: true;
}
type EmojiItemRegex = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
/**
* Wrap regex in group
*/
declare function wrapRegexInGroup(regex: string): string;
/**
* Update UTF16 item, return regex
*/
declare function updateUTF16EmojiRegexItem(item: UTF16EmojiItemRegex): string;
/**
* Create UTF-16 regex
*/
declare function createUTF16EmojiRegexItem(numbers: number[]): UTF16EmojiItemRegex;
/**
* Update sequence regex. Does not update group
*/
declare function updateSequenceEmojiRegexItem(item: SequenceEmojiItemRegex): string;
/**
* Create sequence regex
*/
declare function createSequenceEmojiRegexItem(sequence: EmojiItemRegex[], numbers?: number[]): SequenceEmojiItemRegex;
/**
* Update set regex and group
*/
declare function updateSetEmojiRegexItem(item: SetEmojiItemRegex): string;
/**
* Create set regex
*/
declare function createSetEmojiRegexItem(set: EmojiItemRegex[]): SetEmojiItemRegex;
/**
* Update optional regex
*/
declare function updateOptionalEmojiRegexItem(item: OptionalEmojiItemRegex): string;
/**
* Create optional item
*/
declare function createOptionalEmojiRegexItem(item: EmojiItemRegex): OptionalEmojiItemRegex;
/**
* Clone item
*/
declare function cloneEmojiRegexItem<T extends BaseEmojiItemRegex>(item: T, shallow?: boolean): T;
export { type EmojiItemRegex, type OptionalEmojiItemRegex, type SequenceEmojiItemRegex, type SetEmojiItemRegex, type SetEmojiItemRegexItem, type UTF16EmojiItemRegex, cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem, updateOptionalEmojiRegexItem, updateSequenceEmojiRegexItem, updateSetEmojiRegexItem, updateUTF16EmojiRegexItem, wrapRegexInGroup };
@@ -0,0 +1,75 @@
/**
* Regex in item
*/
interface BaseEmojiItemRegex {
type: 'utf16' | 'sequence' | 'set' | 'optional';
regex: string;
group: boolean;
length: number;
}
interface EmojiItemRegexWithNumbers {
numbers?: number[];
}
interface UTF16EmojiItemRegex extends BaseEmojiItemRegex, Required<EmojiItemRegexWithNumbers> {
type: 'utf16';
group: true;
}
type SequenceEmojiItemRegexItem = UTF16EmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
interface SequenceEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'sequence';
items: SequenceEmojiItemRegexItem[];
}
type SetEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | OptionalEmojiItemRegex;
interface SetEmojiItemRegex extends BaseEmojiItemRegex, EmojiItemRegexWithNumbers {
type: 'set';
sets: SetEmojiItemRegexItem[];
}
type OptionalEmojiItemRegexItem = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex;
interface OptionalEmojiItemRegex extends BaseEmojiItemRegex {
type: 'optional';
item: OptionalEmojiItemRegexItem;
group: true;
}
type EmojiItemRegex = UTF16EmojiItemRegex | SequenceEmojiItemRegex | SetEmojiItemRegex | OptionalEmojiItemRegex;
/**
* Wrap regex in group
*/
declare function wrapRegexInGroup(regex: string): string;
/**
* Update UTF16 item, return regex
*/
declare function updateUTF16EmojiRegexItem(item: UTF16EmojiItemRegex): string;
/**
* Create UTF-16 regex
*/
declare function createUTF16EmojiRegexItem(numbers: number[]): UTF16EmojiItemRegex;
/**
* Update sequence regex. Does not update group
*/
declare function updateSequenceEmojiRegexItem(item: SequenceEmojiItemRegex): string;
/**
* Create sequence regex
*/
declare function createSequenceEmojiRegexItem(sequence: EmojiItemRegex[], numbers?: number[]): SequenceEmojiItemRegex;
/**
* Update set regex and group
*/
declare function updateSetEmojiRegexItem(item: SetEmojiItemRegex): string;
/**
* Create set regex
*/
declare function createSetEmojiRegexItem(set: EmojiItemRegex[]): SetEmojiItemRegex;
/**
* Update optional regex
*/
declare function updateOptionalEmojiRegexItem(item: OptionalEmojiItemRegex): string;
/**
* Create optional item
*/
declare function createOptionalEmojiRegexItem(item: EmojiItemRegex): OptionalEmojiItemRegex;
/**
* Clone item
*/
declare function cloneEmojiRegexItem<T extends BaseEmojiItemRegex>(item: T, shallow?: boolean): T;
export { type EmojiItemRegex, type OptionalEmojiItemRegex, type SequenceEmojiItemRegex, type SetEmojiItemRegex, type SetEmojiItemRegexItem, type UTF16EmojiItemRegex, cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem, updateOptionalEmojiRegexItem, updateSequenceEmojiRegexItem, updateSetEmojiRegexItem, updateUTF16EmojiRegexItem, wrapRegexInGroup };
@@ -0,0 +1,231 @@
function toString(number) {
if (number < 255) {
if (number > 32 && number < 127) {
const char = String.fromCharCode(number);
if (
// 0-9
number > 47 && number < 58 || // A-Z
number > 64 && number < 91 || // _`a-z
number > 94 && number < 123
) {
return char;
}
return "\\" + char;
}
return "\\x" + (number < 16 ? "0" : "") + number.toString(16).toUpperCase();
}
return "\\u" + number.toString(16).toUpperCase();
}
function wrapRegexInGroup(regex) {
return "(?:" + regex + ")";
}
function updateUTF16EmojiRegexItem(item) {
const numbers = item.numbers;
if (numbers.length === 1) {
const num = numbers[0];
return item.regex = toString(num);
}
numbers.sort((a, b) => a - b);
const chars = [];
let range = null;
const addRange = () => {
if (range) {
const { start, last, numbers: numbers2 } = range;
range = null;
if (last > start + 1) {
chars.push(toString(start) + "-" + toString(last));
} else {
for (let i = 0; i < numbers2.length; i++) {
chars.push(toString(numbers2[i]));
}
}
}
};
for (let i = 0; i < numbers.length; i++) {
const num = numbers[i];
if (range) {
if (range.last === num) {
continue;
}
if (range.last === num - 1) {
range.numbers.push(num);
range.last = num;
continue;
}
}
addRange();
range = {
start: num,
last: num,
numbers: [num]
};
}
addRange();
if (!chars.length) {
throw new Error("Unexpected empty range");
}
return item.regex = "[" + chars.join("") + "]";
}
function createUTF16EmojiRegexItem(numbers) {
const result = {
type: "utf16",
regex: "",
numbers,
length: 1,
group: true
};
updateUTF16EmojiRegexItem(result);
return result;
}
function updateSequenceEmojiRegexItem(item) {
return item.regex = item.items.map((childItem) => {
if (!childItem.group && childItem.type === "set") {
return wrapRegexInGroup(childItem.regex);
}
return childItem.regex;
}).join("");
}
function createSequenceEmojiRegexItem(sequence, numbers) {
let items = [];
sequence.forEach((item) => {
if (item.type === "sequence") {
items = items.concat(item.items);
} else {
items.push(item);
}
});
if (!items.length) {
throw new Error("Empty sequence");
}
const result = {
type: "sequence",
items,
regex: "",
length: items.reduce((length, item) => item.length + length, 0),
group: false
};
if (sequence.length === 1) {
const firstItem = sequence[0];
result.group = firstItem.group;
if (firstItem.type !== "optional") {
const numbers2 = firstItem.numbers;
if (numbers2) {
result.numbers = numbers2;
}
}
}
if (numbers) {
result.numbers = numbers;
}
updateSequenceEmojiRegexItem(result);
return result;
}
function updateSetEmojiRegexItem(item) {
if (item.sets.length === 1) {
const firstItem = item.sets[0];
item.group = firstItem.group;
return item.regex = firstItem.regex;
}
item.group = false;
return item.regex = item.sets.map((childItem) => childItem.regex).join("|");
}
function createSetEmojiRegexItem(set) {
let sets = [];
let numbers = [];
set.forEach((item) => {
if (item.type === "set") {
sets = sets.concat(item.sets);
} else {
sets.push(item);
}
if (numbers) {
if (item.type === "optional" || !item.numbers) {
numbers = null;
} else {
numbers = [...numbers, ...item.numbers];
}
}
});
sets.sort((a, b) => {
if (a.length === b.length) {
return a.regex.localeCompare(b.regex);
}
return b.length - a.length;
});
const result = {
type: "set",
sets,
regex: "",
length: sets.reduce(
(length, item) => length ? Math.min(length, item.length) : item.length,
0
),
group: false
};
if (numbers) {
result.numbers = numbers;
}
if (set.length === 1) {
const firstItem = set[0];
result.group = firstItem.group;
}
updateSetEmojiRegexItem(result);
return result;
}
function updateOptionalEmojiRegexItem(item) {
const childItem = item.item;
const regex = (childItem.group ? childItem.regex : wrapRegexInGroup(childItem.regex)) + "?";
return item.regex = regex;
}
function createOptionalEmojiRegexItem(item) {
if (item.type === "optional") {
return item;
}
const result = {
type: "optional",
item,
regex: "",
length: item.length,
group: true
};
updateOptionalEmojiRegexItem(result);
return result;
}
function cloneEmojiRegexItem(item, shallow = false) {
const result = {
...item
};
if (result.type !== "optional" && result.numbers) {
result.numbers = [...result.numbers];
}
switch (result.type) {
case "utf16":
break;
case "sequence":
if (shallow) {
result.items = [...result.items];
} else {
result.items = result.items.map(
(item2) => cloneEmojiRegexItem(item2, false)
);
}
break;
case "set":
if (shallow) {
result.sets = [...result.sets];
} else {
result.sets = result.sets.map(
(item2) => cloneEmojiRegexItem(item2, false)
);
}
break;
case "optional":
if (!shallow) {
result.item = cloneEmojiRegexItem(result.item, false);
}
break;
}
return result;
}
export { cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem, updateOptionalEmojiRegexItem, updateSequenceEmojiRegexItem, updateSetEmojiRegexItem, updateUTF16EmojiRegexItem, wrapRegexInGroup };
@@ -0,0 +1,34 @@
'use strict';
const emoji_cleanup = require('../cleanup.cjs');
const emoji_convert = require('../convert.cjs');
const emoji_test_variations = require('../test/variations.cjs');
const emoji_regex_tree = require('./tree.cjs');
require('../data.cjs');
require('../format.cjs');
require('./base.cjs');
require('./numbers.cjs');
require('./similar.cjs');
function createOptimisedRegexForEmojiSequences(sequences) {
sequences = sequences.map((item) => emoji_convert.convertEmojiSequenceToUTF32(item));
const tree = emoji_regex_tree.createEmojisTree(sequences);
const regex = emoji_regex_tree.parseEmojiTree(tree);
return regex.regex;
}
function createOptimisedRegex(emojis) {
let sequences = emojis.map(
(item) => typeof item === "string" ? emoji_cleanup.getSequenceFromEmojiStringOrKeyword(item) : item
);
sequences = emoji_test_variations.getQualifiedEmojiVariations(
sequences.map((sequence) => {
return {
sequence
};
})
).map((item) => item.sequence);
return createOptimisedRegexForEmojiSequences(sequences);
}
exports.createOptimisedRegex = createOptimisedRegex;
exports.createOptimisedRegexForEmojiSequences = createOptimisedRegexForEmojiSequences;
@@ -0,0 +1,21 @@
/**
* Create optimised regex
*/
declare function createOptimisedRegexForEmojiSequences(sequences: number[][]): string;
/**
* Create optimised regex for emojis
*
* First parameter is array of emojis, entry can be either list of
* code points or emoji sequence as a string
*
* Examples of acceptable strings (case insensitive):
* '1F636 200D 1F32B FE0F' - space separated UTF32 sequence
* '1f636-200d-1f32b-fe0f' - dash separated UTF32 sequence
* 'd83d-de36-200d-d83c-df2b-fe0f' - dash separated UTF16 sequence
* '\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B\\uFE0F' - UTF16 sequence escaped with '\\u'
*
* All examples above refer to the same emoji and will generate the same regex result
*/
declare function createOptimisedRegex(emojis: (string | number[])[]): string;
export { createOptimisedRegex, createOptimisedRegexForEmojiSequences };
@@ -0,0 +1,21 @@
/**
* Create optimised regex
*/
declare function createOptimisedRegexForEmojiSequences(sequences: number[][]): string;
/**
* Create optimised regex for emojis
*
* First parameter is array of emojis, entry can be either list of
* code points or emoji sequence as a string
*
* Examples of acceptable strings (case insensitive):
* '1F636 200D 1F32B FE0F' - space separated UTF32 sequence
* '1f636-200d-1f32b-fe0f' - dash separated UTF32 sequence
* 'd83d-de36-200d-d83c-df2b-fe0f' - dash separated UTF16 sequence
* '\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B\\uFE0F' - UTF16 sequence escaped with '\\u'
*
* All examples above refer to the same emoji and will generate the same regex result
*/
declare function createOptimisedRegex(emojis: (string | number[])[]): string;
export { createOptimisedRegex, createOptimisedRegexForEmojiSequences };
@@ -0,0 +1,21 @@
/**
* Create optimised regex
*/
declare function createOptimisedRegexForEmojiSequences(sequences: number[][]): string;
/**
* Create optimised regex for emojis
*
* First parameter is array of emojis, entry can be either list of
* code points or emoji sequence as a string
*
* Examples of acceptable strings (case insensitive):
* '1F636 200D 1F32B FE0F' - space separated UTF32 sequence
* '1f636-200d-1f32b-fe0f' - dash separated UTF32 sequence
* 'd83d-de36-200d-d83c-df2b-fe0f' - dash separated UTF16 sequence
* '\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B\\uFE0F' - UTF16 sequence escaped with '\\u'
*
* All examples above refer to the same emoji and will generate the same regex result
*/
declare function createOptimisedRegex(emojis: (string | number[])[]): string;
export { createOptimisedRegex, createOptimisedRegexForEmojiSequences };
@@ -0,0 +1,31 @@
import { getSequenceFromEmojiStringOrKeyword } from '../cleanup.mjs';
import { convertEmojiSequenceToUTF32 } from '../convert.mjs';
import { getQualifiedEmojiVariations } from '../test/variations.mjs';
import { createEmojisTree, parseEmojiTree } from './tree.mjs';
import '../data.mjs';
import '../format.mjs';
import './base.mjs';
import './numbers.mjs';
import './similar.mjs';
function createOptimisedRegexForEmojiSequences(sequences) {
sequences = sequences.map((item) => convertEmojiSequenceToUTF32(item));
const tree = createEmojisTree(sequences);
const regex = parseEmojiTree(tree);
return regex.regex;
}
function createOptimisedRegex(emojis) {
let sequences = emojis.map(
(item) => typeof item === "string" ? getSequenceFromEmojiStringOrKeyword(item) : item
);
sequences = getQualifiedEmojiVariations(
sequences.map((sequence) => {
return {
sequence
};
})
).map((item) => item.sequence);
return createOptimisedRegexForEmojiSequences(sequences);
}
export { createOptimisedRegex, createOptimisedRegexForEmojiSequences };

Some files were not shown because too many files have changed in this diff Show More