/* * Copyright (c) 2018. 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.ascii; import java.util.Map; import org.hedgecode.chess.Parsers; import org.hedgecode.chess.position.Builder; import org.hedgecode.chess.position.ColorPiece; import org.hedgecode.chess.position.ParseException; import org.hedgecode.chess.position.Position; import org.hedgecode.chess.position.Square; /** * ASCII chess diagram builder. * * @author Dmitry Samoshin aka gotty */ public final class ASCIIBuilder implements Builder { private static Builder _instance = new ASCIIBuilder(); private ASCIIBuilder() { } @Override public String build(Position position) { return _build( ASCII.getType(), position ); } private String _build(ASCIIBoardType type, Position position) { StringBuilder sb = new StringBuilder(); Map squares = position.getSquares(); String indent = ASCII.INDENT; char empty = type.getEmpty(); char space = type.getSpace(); String separator = type.getSeparator(); if (ASCII.isNotation()) sb.append(indent).append( _buildNotation(separator != null) ).append(ASCII.CRLF); if (type.getHeader() != null) sb.append(indent).append(type.getHeader()).append(ASCII.CRLF); for (int i = Square.getSize() - 1; i >= 0; --i) { if (ASCII.isNotation()) sb.append(i + 1).append(ASCII.EMPTY); else sb.append(indent); sb.append(type.getEdge()); for (int j = 0; j < Square.getSize(); ++j) { Square square = Square.getSquare(j, i); ColorPiece piece = squares.get(square); char pieceChar = (piece != null) ? ASCII.getAsciiPiece(piece) : empty; sb.append(space).append(pieceChar).append(space); if (separator != null && j < Square.getSize() - 1) sb.append(separator); } sb.append(type.getEdge()); if (ASCII.isNotation()) sb.append(ASCII.EMPTY).append(i + 1); else sb.append(indent); sb.append(ASCII.CRLF); if (i > 0 && type.getLine() != null) sb.append(indent).append(type.getLine()).append(ASCII.CRLF); } if (type.getFooter() != null) sb.append(indent).append(type.getFooter()).append(ASCII.CRLF); if (ASCII.isNotation()) sb.append(indent).append( _buildNotation(separator != null) ).append(ASCII.CRLF); return sb.toString(); } private String _buildNotation(boolean withSeparator) { StringBuilder sb = new StringBuilder(); sb.append(ASCII.EMPTY); for (char letter : ASCII.NOTATION) { sb.append(ASCII.EMPTY).append(letter).append(ASCII.EMPTY); if (withSeparator) sb.append(ASCII.EMPTY); } sb.append(ASCII.EMPTY); return sb.toString(); } public static Builder getInstance() { return _instance; } public static void main(String[] args) throws ParseException { ASCII.setType(ASCIIBoardType.HYPHEN); ASCII.setNotation(false); Position position = Parsers.FEN.parser().parse( "r7/7p/8/8/8/8/PPPPPP2/1N1Q2NR w KQkq - 20 20" ); System.out.println( getInstance().build(position) ); /* Position position = Parsers.WIKI.parser().parse( "{{Шахматная диаграмма\n" + "|\n" + "|\n" + "|rd|nd|bd|qd|kd|bd|nd|rd\n" + "|pd|pd| |pd|pd|pd|pd|pd\n" + "| | | | | | | |\n" + "| | | | | | | |\n" + "| | | |pd|pl| | |\r\n" + "| | |pl| | | | |\n" + "|pl|pl| | | |pl|pl|pl\n" + "|rl|nl|bl|ql|kl|bl|nl|rl\n" + "| }}" ); System.out.println( getInstance().build(position) ); */ /* Position position = Parsers.TCD.parser().parse("AHL30v0GIv+PqX16ap-G"); System.out.println( getInstance().build(position) ); */ /* System.out.println( getInstance().build(Positions.INITIAL.getPosition()) ); */ } }