/*
* This file is part of Skript.
*
* Skript is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Skript is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Skript. If not, see <http://www.gnu.org/licenses/>.
*
*
* Copyright 2011, 2012 Peter Güttinger
*
*/
package ch.njol.skript.localization;
import java.util.HashMap;
import org.eclipse.jdt.annotation.Nullable;
import ch.njol.skript.Skript;
/**
* @author Peter Güttinger
*/
public class Adjective extends Message {
// at least in German adjectives behave differently with a definite article. Cases are still not supported though and will likely never be.
private final static int DEFINITE_ARTICLE = -100;
private final static String DEFINITE_ARTICLE_TOKEN = "+";
private final HashMap<Integer, String> genders = new HashMap<Integer, String>();
@Nullable
String def;
public Adjective(final String key) {
super(key);
}
@Override
protected void onValueChange() {
genders.clear();
final String v = getValue();
def = v;
if (v == null)
return;
final int s = v.indexOf('@'), e = v.lastIndexOf('@');
if (s == -1)
return;
if (s == e) {
Skript.error("Invalid use of '@' in the adjective '" + key + "' in the " + Language.getName() + " language file: " + v);
return;
}
def = v.substring(0, s) + v.substring(e + 1);
int c = s;
do {
final int c2 = v.indexOf('@', c + 1);
final int d = v.indexOf(':', c + 1);
if (d == -1 || d > c2) {
Skript.error("Missing colon (:) to separate the gender in the adjective '" + key + "' in the " + Language.getName() + " language file at index " + c + ": " + v);
return;
}
final String gender = v.substring(c + 1, d);
final int g = gender.equals(DEFINITE_ARTICLE_TOKEN) ? DEFINITE_ARTICLE : Noun.getGender(gender, key);
if (!genders.containsKey(g))
genders.put(g, v.substring(0, s) + v.substring(d + 1, c2) + v.substring(e + 1));
c = c2;
} while (c < e);
}
@Override
public String toString() {
validate();
if (Skript.testing())
Skript.warning("Invalid use of Adjective.toString()");
return "" + def;
}
public String toString(int gender, final int flags) {
validate();
if ((flags & Language.F_DEFINITE_ARTICLE) != 0 && genders.containsKey(DEFINITE_ARTICLE))
gender = DEFINITE_ARTICLE;
else if ((flags & Language.F_PLURAL) != 0)
gender = Noun.PLURAL;
final String a = genders.get(gender);
if (a != null)
return a;
return "" + def;
}
public final static String toString(final Adjective[] adjectives, final int gender, final int flags, final boolean and) {
final StringBuilder b = new StringBuilder();
for (int i = 0; i < adjectives.length; i++) {
if (i != 0) {
if (i == adjectives.length - 1)
b.append(" ").append(and ? GeneralWords.and : GeneralWords.or).append(" ");
else
b.append(", ");
}
b.append(adjectives[i].toString(gender, flags));
}
return "" + b.toString();
}
public String toString(final Noun n, final int flags) {
return n.toString(this, flags);
}
}