blob: 81c0a40db85f1db2e6b8e648f3041653e4647b8c [file] [log] [blame]
package org.unicode.cldr.test;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.unicode.cldr.test.CheckCLDR.CheckStatus.Subtype;
import org.unicode.cldr.util.RegexUtilities;
public class CheckNames extends CheckCLDR {
private static final Pattern YEARS_NOT_ALLOWED =
Pattern.compile(
"//ldml/localeDisplayNames/(languages|currencies|scripts|territories|measurementSystemNames|transformNames)/.*");
@Override
public CheckCLDR handleCheck(
String path, String fullPath, String value, Options options, List<CheckStatus> result) {
if (value == null) {
return this;
}
if (!YEARS_NOT_ALLOWED.matcher(path).matches() || !getCldrFileToCheck().isNotRoot(path)) {
return this;
}
if (!accept(result)) return this;
Matcher matcher = RegexUtilities.PATTERN_3_OR_4_DIGITS.matcher(value);
if (matcher.find()) {
// If same as the code-fallback value (territories) then no error
if (path.startsWith("//ldml/localeDisplayNames/territories")
&& getCldrFileToCheck().getBaileyValue(path, null, null).equals(value)) {
return this;
}
// Allow years in currencies if enclosed by brackets.
if (path.startsWith("//ldml/localeDisplayNames/currencies")
&& (isEnclosedByBraces(matcher, value, '(', ')')
|| isEnclosedByBraces(matcher, value, '[', ']'))) {
// no errors
} else {
result.add(
new CheckStatus()
.setCause(this)
.setMainType(CheckStatus.errorType)
.setSubtype(Subtype.nameContainsYear)
.setMessage(
"The name should not contain any years or region codes ({0})",
matcher.group()));
}
}
return this;
}
private boolean isEnclosedByBraces(
Matcher matcher, String value, char startBrace, char endBrace) {
return value.lastIndexOf(startBrace, matcher.start()) > -1
&& value.indexOf(endBrace, matcher.end()) >= -1;
}
}