107 lines
No EOL
3.2 KiB
TypeScript
107 lines
No EOL
3.2 KiB
TypeScript
import { console } from './log';
|
|
|
|
const parseSelect = (selectString: string, but = false) : {
|
|
isSelected: (val: string|string[]) => boolean,
|
|
values: string[]
|
|
} => {
|
|
if (!selectString)
|
|
return {
|
|
values: [],
|
|
isSelected: () => but
|
|
};
|
|
const parts = selectString.split(',');
|
|
const select: string[] = [];
|
|
|
|
parts.forEach(part => {
|
|
if (part.includes('-')) {
|
|
const splits = part.split('-');
|
|
if (splits.length !== 2) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
|
|
const firstPart = splits[0];
|
|
const match = firstPart.match(/[A-Za-z]+/);
|
|
if (match && match.length > 0) {
|
|
if (match.index && match.index !== 0) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
const letters = firstPart.substring(0, match[0].length);
|
|
const number = parseFloat(firstPart.substring(match[0].length));
|
|
const b = parseFloat(splits[1]);
|
|
if (isNaN(number) || isNaN(b)) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
for (let i = number; i <= b; i++) {
|
|
select.push(`${letters}${i}`);
|
|
}
|
|
|
|
} else {
|
|
const a = parseFloat(firstPart);
|
|
const b = parseFloat(splits[1]);
|
|
if (isNaN(a) || isNaN(b)) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
for (let i = a; i <= b; i++) {
|
|
select.push(`${i}`);
|
|
}
|
|
}
|
|
|
|
} else {
|
|
if (part.match(/[0-9A-Z]{9}/)) {
|
|
select.push(part);
|
|
return;
|
|
}
|
|
const match = part.match(/[A-Za-z]+/);
|
|
if (match && match.length > 0) {
|
|
if (match.index && match.index !== 0) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
const letters = part.substring(0, match[0].length);
|
|
const number = parseFloat(part.substring(match[0].length));
|
|
if (isNaN(number)) {
|
|
console.warn(`[WARN] Unable to parse input "${part}"`);
|
|
return;
|
|
}
|
|
select.push(`${letters}${number}`);
|
|
} else {
|
|
select.push(`${parseFloat(part)}`);
|
|
}
|
|
}
|
|
});
|
|
|
|
return {
|
|
values: select,
|
|
isSelected: (st) => {
|
|
if (typeof st === 'string')
|
|
st = [st];
|
|
return st.some(st => {
|
|
const match = st.match(/[A-Za-z]+/);
|
|
if (st.match(/[0-9A-Z]{9}/)) {
|
|
const included = select.includes(st);
|
|
return but ? !included : included;
|
|
} else if (match && match.length > 0) {
|
|
if (match.index && match.index !== 0) {
|
|
return false;
|
|
}
|
|
const letter = st.substring(0, match[0].length);
|
|
const number = parseFloat(st.substring(match[0].length));
|
|
if (isNaN(number)) {
|
|
return false;
|
|
}
|
|
const included = select.includes(`${letter}${number}`);
|
|
return but ? !included : included;
|
|
} else {
|
|
const included = select.includes(`${parseFloat(st)}`);
|
|
return but ? !included : included;
|
|
}
|
|
});
|
|
}
|
|
};
|
|
};
|
|
|
|
export default parseSelect; |