/* * Copyright (c) 2018-2020. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.pgn.token; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.hedgecode.chess.pgn.PGNUtils; import org.hedgecode.chess.pgn.entity.Moves; import org.hedgecode.chess.position.ParseException; /** * MovesToken * * @author Dmitry Samoshin aka gotty */ public class MovesToken implements Token { enum Type { MOVE ( new MoveToken() ), COMMENT ( new CommentToken() ), VARIATION ( new VariationToken() ); private Token token; public Token token() { return token; } Type(Token token) { this.token = token; } } private static final String MOVES_REGEX = "^\\s*([^\\s])"; private static final Pattern MOVES_PATTERN = Pattern.compile(MOVES_REGEX); private static final String COMMENT = "{"; private static final String VARIATION = "("; @Override public int token(Entity entity, String pgn) throws ParseException { int pgnLength = pgn.length(); pgn = PGNUtils.stripCrlf(pgn); Token token = assignToken(pgn); while (token != null) { int index = token.token(entity, pgn); pgn = pgn.substring(index); token = assignToken(pgn); } return pgnLength; } private Token assignToken(String pgn) { Token token = null; Matcher moveMatcher = MOVES_PATTERN.matcher(pgn); if (moveMatcher.find()) { switch (moveMatcher.group(1)) { case COMMENT: token = Type.COMMENT.token(); break; case VARIATION: token = Type.VARIATION.token(); break; default: token = Type.MOVE.token(); } } return token; } }