2 * Copyright (c) 2019-2020. Developed by Hedgecode.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.hedgecode.chess.scanner.format;
19 import java.util.Arrays;
20 import java.util.Comparator;
22 import org.hedgecode.chess.scanner.StringUtils;
27 * @author Dmitry Samoshin aka gotty
31 EVENT ( "Event", true, PGNTag.QUESTION ),
32 SITE ( "Site", true, PGNTag.QUESTION ),
33 DATE ( "Date", true, PGNTag.QUESTION_DATE ),
34 ROUND ( "Round", true, PGNTag.QUESTION ),
35 WHITE ( "White", true, PGNTag.QUESTION ),
36 BLACK ( "Black", true, PGNTag.QUESTION ),
37 RESULT ( "Result", true, PGNTag.NON_RESULT ),
38 WHITE_TITLE ( "WhiteTitle", false, PGNTag.HYPHEN ),
39 BLACK_TITLE ( "BlackTitle", false, PGNTag.HYPHEN ),
40 WHITE_ELO ( "WhiteElo", false, PGNTag.HYPHEN ),
41 BLACK_ELO ( "BlackElo", false, PGNTag.HYPHEN ),
42 WHITE_USCF ( "WhiteUSCF", false, PGNTag.HYPHEN ),
43 BLACK_USCF ( "BlackUSCF", false, PGNTag.HYPHEN ),
44 WHITE_NA ( "WhiteNA", false, PGNTag.HYPHEN ),
45 BLACK_NA ( "BlackNA", false, PGNTag.HYPHEN ),
46 WHITE_TYPE ( "WhiteType", false, PGNTag.HYPHEN ),
47 BLACK_TYPE ( "BlackType", false, PGNTag.HYPHEN ),
48 EVENT_DATE ( "EventDate", false, PGNTag.QUESTION_DATE ),
49 EVENT_SPONSOR ( "EventSponsor", false, PGNTag.EMPTY ),
50 SECTION ( "Section", false, PGNTag.EMPTY ),
51 STAGE ( "Stage", false, PGNTag.EMPTY ),
52 BOARD ( "Board", false, PGNTag.EMPTY ),
53 OPENING ( "Opening", false, PGNTag.EMPTY ),
54 VARIATION ( "Variation", false, PGNTag.EMPTY ),
55 SUBVARIATION ( "SubVariation", false, PGNTag.EMPTY ),
56 ECO ( "ECO", false, PGNTag.EMPTY ),
57 NIC ( "NIC", false, PGNTag.EMPTY ),
58 TIME ( "Time", false, PGNTag.QUESTION_TIME ),
59 UTC_TIME ( "UTCTime", false, PGNTag.QUESTION_TIME ),
60 UTC_DATE ( "UTCDate", false, PGNTag.QUESTION_DATE ),
61 TIME_CONTROL ( "TimeControl", false, PGNTag.QUESTION ),
62 SETUP ( "SetUp", false, PGNTag.ZERO ),
63 FEN ( "FEN", false, PGNTag.EMPTY ),
64 TERMINATION ( "Termination", false, PGNTag.EMPTY ),
65 ANNOTATOR ( "Annotator", false, PGNTag.EMPTY ),
66 MODE ( "Mode", false, PGNTag.EMPTY ),
67 PLY_COUNT ( "PlyCount", false, PGNTag.EMPTY );
69 // todo: -> PGNConstants
70 public static final String EMPTY = "";
71 public static final String HYPHEN = "-";
72 public static final String ZERO = "0";
73 public static final String QUESTION = "?";
74 public static final String QUESTION_DATE = "????.??.??";
75 public static final String QUESTION_TIME = "??:??:??";
76 public static final String NON_RESULT = "*";
78 public static final String TAG_FORMAT = "[%s \"%s\"]";
80 public static final char[] TAG_SHIELD_CHARS = { '\\', '"' };
82 private String tagName;
83 private boolean isRequired;
84 private String defaultValue;
86 PGNTag(String name, boolean required, String defValue) {
88 isRequired = required;
89 defaultValue = defValue;
92 public String getName() {
96 public boolean isRequired() {
100 public String defaultValue() {
104 public static String formatTagValue(String tagValue) {
105 return StringUtils.shield(
106 tagValue, TAG_SHIELD_CHARS
110 public static PGNTag[] tags() {
111 PGNTag[] tags = values();
113 tags, new TagComparator()
118 static class TagComparator implements Comparator<PGNTag> {
121 public int compare(PGNTag tag1, PGNTag tag2) {
122 if (tag1.isRequired && tag2.isRequired) {
123 return tag1.ordinal() - tag2.ordinal();
125 return tag1.isRequired ? -1
126 : tag2.isRequired ? 1
127 : tag1.name().compareTo(tag2.name());