/* * 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.Pattern; import org.hedgecode.chess.pgn.entity.Moves; import org.hedgecode.chess.pgn.entity.Variation; import org.hedgecode.chess.position.ParseException; /** * VariationToken * * @author Dmitry Samoshin aka gotty */ public class VariationToken implements Token { private static final char OPEN_VARIATION = '('; private static final char CLOSE_VARIATION = ')'; private static final String VARIATION_REGEX = "^\\s*\\(([^)]+)\\)"; private static final Pattern VARIATION_PATTERN = Pattern.compile(VARIATION_REGEX); @Override public int token(Moves moves, String pgn) throws ParseException { int startToken = pgn.indexOf(OPEN_VARIATION); int endToken = endToken(pgn, startToken); Variation variation = new Variation(); Token variationToken = new MovesToken<>(); variationToken.token( variation, pgn.substring(startToken + 1, endToken) ); moves.currentMove().addVariation(variation); return endToken + 1; } private int endToken(String pgn, int startToken) throws ParseException { int open = pgn.indexOf(OPEN_VARIATION, startToken + 1); int close = pgn.indexOf(CLOSE_VARIATION, startToken + 1); while (open >= 0 && open < close) { open = pgn.indexOf(OPEN_VARIATION, open + 1); close = pgn.indexOf(CLOSE_VARIATION, close + 1); } if (close == -1) { throw new ParseException("parse.pgn.incorrect.variation", pgn); } return close; } }