fentastic
Version:
Validate and parse Forsyth-Edwards Notation (FEN) used to describe a chess game board position.
44 lines (43 loc) • 1.55 kB
JavaScript
import { tokenIs } from './token.js';
import { ParseError } from './ParseError.js';
export const isWhiteSpace = tokenIs(/ /);
const isAnyWhiteSpace = tokenIs(/\s/);
const prefix = 'Whitespace';
// Collapses string of white spaces into a single white space
const collapseWhiteSpace = (tokens) => {
return tokens.filter(((token, i) => (!isAnyWhiteSpace(token) || !tokens[i - 1] || !isAnyWhiteSpace(tokens[i - 1]))));
};
const forEachWsToken = (tokens, fn) => {
tokens.filter(isAnyWhiteSpace).forEach(fn);
};
export const correctWhiteSpace = (tokens) => {
tokens = collapseWhiteSpace(tokens);
if (isAnyWhiteSpace(tokens[0])) {
tokens.shift();
}
if (isAnyWhiteSpace(tokens.at(-1))) {
tokens.pop();
}
forEachWsToken(tokens, (t) => {
t.value = ' ';
});
return tokens;
};
export const validateWhiteSpace = (tokens) => {
if (isAnyWhiteSpace(tokens[0])) {
throw new ParseError(prefix, tokens[0].value, 0);
}
const repeatedWsToken = tokens.find((token, i, tokens) => (isAnyWhiteSpace(token) && tokens[i - 1] && isAnyWhiteSpace(tokens[i - 1])));
if (repeatedWsToken) {
throw new ParseError(prefix, repeatedWsToken.value, repeatedWsToken.index);
}
if (isAnyWhiteSpace(tokens.at(-1))) {
throw new ParseError(prefix, tokens.at(-1).value, tokens.at(-1).index);
}
forEachWsToken(tokens, (t) => {
if (!isWhiteSpace(t)) {
throw new ParseError(prefix, t.value, t.index, ' ', 'ASCII space');
}
});
return tokens;
};