package gherkin.lexer;
import gherkin.I18n;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class I18nLexer implements Lexer {
private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^([\\W]+)?\\s*#|^\\s*$");
private static final Pattern LANGUAGE_PATTERN = Pattern.compile("^([\\W]+)?\\s*#\\s*language\\s*:\\s*([a-zA-Z\\-]+)");
private final Listener listener;
private I18n i18n;
private String isoCode;
public I18nLexer(Listener listener) {
this(listener, false, "en");
}
public I18nLexer(Listener listener, boolean forceRubyDummy) {
this(listener, forceRubyDummy, "en");
}
public I18nLexer(Listener listener, boolean forceRubyDummy, String isoCode) {
this.listener = listener;
this.isoCode = isoCode;
}
/**
* @return the i18n language from the previous scanned source.
*/
public I18n getI18nLanguage() {
return i18n;
}
public void scan(String source) {
createDelegate(source).scan(source);
}
private Lexer createDelegate(String source) {
i18n = i18nLanguageForSource(source);
return i18n.lexer(listener);
}
private I18n i18nLanguageForSource(String source) {
String key = isoCode;
for (String line : source.split("\\n")) {
if (!COMMENT_OR_EMPTY_LINE_PATTERN.matcher(line).find()) {
break;
}
Matcher matcher = LANGUAGE_PATTERN.matcher(line);
if (matcher.find()) {
key = matcher.group(2);
break;
}
}
return new I18n(key);
}
}