56 lines
1.7 KiB
Plaintext
56 lines
1.7 KiB
Plaintext
'use strict';
|
|
|
|
const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
|
|
const colonSeparated = value.split(":");
|
|
if (value.slice(0, 1) === "@") {
|
|
if (colonSeparated.length < 2 || colonSeparated.length > 3) {
|
|
return null;
|
|
}
|
|
provider = colonSeparated.shift().slice(1);
|
|
}
|
|
if (colonSeparated.length > 3 || !colonSeparated.length) {
|
|
return null;
|
|
}
|
|
if (colonSeparated.length > 1) {
|
|
const name2 = colonSeparated.pop();
|
|
const prefix = colonSeparated.pop();
|
|
const result = {
|
|
// Allow provider without '@': "provider:prefix:name"
|
|
provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
|
|
prefix,
|
|
name: name2
|
|
};
|
|
return validate && !validateIconName(result) ? null : result;
|
|
}
|
|
const name = colonSeparated[0];
|
|
const dashSeparated = name.split("-");
|
|
if (dashSeparated.length > 1) {
|
|
const result = {
|
|
provider,
|
|
prefix: dashSeparated.shift(),
|
|
name: dashSeparated.join("-")
|
|
};
|
|
return validate && !validateIconName(result) ? null : result;
|
|
}
|
|
if (allowSimpleName && provider === "") {
|
|
const result = {
|
|
provider,
|
|
prefix: "",
|
|
name
|
|
};
|
|
return validate && !validateIconName(result, allowSimpleName) ? null : result;
|
|
}
|
|
return null;
|
|
};
|
|
const validateIconName = (icon, allowSimpleName) => {
|
|
if (!icon) {
|
|
return false;
|
|
}
|
|
return !!((icon.provider === "" || icon.provider.match(matchIconName)) && (allowSimpleName && icon.prefix === "" || icon.prefix.match(matchIconName)) && icon.name.match(matchIconName));
|
|
};
|
|
|
|
exports.matchIconName = matchIconName;
|
|
exports.stringToIcon = stringToIcon;
|
|
exports.validateIconName = validateIconName;
|