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;
25 * @author Dmitry Samoshin aka gotty
29 EVENT ( "Event", true, PGNTag.QUESTION ),
30 SITE ( "Site", true, PGNTag.QUESTION ),
31 DATE ( "Date", true, PGNTag.QUESTION_DATE ),
32 ROUND ( "Round", true, PGNTag.QUESTION ),
33 WHITE ( "White", true, PGNTag.QUESTION ),
34 BLACK ( "Black", true, PGNTag.QUESTION ),
35 RESULT ( "Result", true, PGNTag.NON_RESULT ),
36 WHITE_TITLE ( "WhiteTitle", false, PGNTag.HYPHEN ),
37 BLACK_TITLE ( "BlackTitle", false, PGNTag.HYPHEN ),
38 WHITE_ELO ( "WhiteElo", false, PGNTag.HYPHEN ),
39 BLACK_ELO ( "BlackElo", false, PGNTag.HYPHEN ),
40 WHITE_USCF ( "WhiteUSCF", false, PGNTag.HYPHEN ),
41 BLACK_USCF ( "BlackUSCF", false, PGNTag.HYPHEN ),
42 WHITE_NA ( "WhiteNA", false, PGNTag.HYPHEN ),
43 BLACK_NA ( "BlackNA", false, PGNTag.HYPHEN ),
44 WHITE_TYPE ( "WhiteType", false, PGNTag.HYPHEN ),
45 BLACK_TYPE ( "BlackType", false, PGNTag.HYPHEN ),
46 EVENT_DATE ( "EventDate", false, PGNTag.QUESTION_DATE ),
47 EVENT_SPONSOR ( "EventSponsor", false, PGNTag.EMPTY ),
48 SECTION ( "Section", false, PGNTag.EMPTY ),
49 STAGE ( "Stage", false, PGNTag.EMPTY ),
50 BOARD ( "Board", false, PGNTag.EMPTY ),
51 OPENING ( "Opening", false, PGNTag.EMPTY ),
52 VARIATION ( "Variation", false, PGNTag.EMPTY ),
53 SUBVARIATION ( "SubVariation", false, PGNTag.EMPTY ),
54 ECO ( "ECO", false, PGNTag.EMPTY ),
55 NIC ( "NIC", false, PGNTag.EMPTY ),
56 TIME ( "Time", false, PGNTag.QUESTION_TIME ),
57 UTC_TIME ( "UTCTime", false, PGNTag.QUESTION_TIME ),
58 UTC_DATE ( "UTCDate", false, PGNTag.QUESTION_DATE ),
59 TIME_CONTROL ( "TimeControl", false, PGNTag.QUESTION ),
60 SETUP ( "SetUp", false, PGNTag.ZERO ),
61 FEN ( "FEN", false, PGNTag.EMPTY ),
62 TERMINATION ( "Termination", false, PGNTag.EMPTY ),
63 ANNOTATOR ( "Annotator", false, PGNTag.EMPTY ),
64 MODE ( "Mode", false, PGNTag.EMPTY ),
65 PLY_COUNT ( "PlyCount", false, PGNTag.EMPTY );
67 public static final String EMPTY = "";
68 public static final String HYPHEN = "-";
69 public static final String ZERO = "0";
70 public static final String QUESTION = "?";
71 public static final String QUESTION_DATE = "????.??.??";
72 public static final String QUESTION_TIME = "??:??:??";
73 public static final String NON_RESULT = "*";
75 public static final String TAG_FORMAT = "[%s \"%s\"]";
77 private String tagName;
78 private boolean isRequired;
79 private String defaultValue;
81 PGNTag(String name, boolean required, String defValue) {
83 isRequired = required;
84 defaultValue = defValue;
87 public String getName() {
91 public boolean isRequired() {
95 public String defaultValue() {
99 public static PGNTag[] tags() {
100 PGNTag[] tags = values();
102 tags, new TagComparator()
107 static class TagComparator implements Comparator<PGNTag> {
110 public int compare(PGNTag tag1, PGNTag tag2) {
111 if (tag1.isRequired && tag2.isRequired) {
112 return tag1.ordinal() - tag2.ordinal();
114 return tag1.isRequired ? -1
115 : tag2.isRequired ? 1
116 : tag1.name().compareTo(tag2.name());