public static Span tokensToSpan(List<Token> tokens, Options options) {
if (options.isDebug()) {
System.out.println("Chronic.tokensToSpan: " + tokens);
}
Range range = null;
// maybe it's a specific date
Map<Handler.HandlerType, List<Handler>> definitions = Handler.definitions(options);
for (Handler handler : definitions.get(Handler.HandlerType.DATE)) {
if (handler.isCompatible(options) && (range = handler.matchCount(tokens, definitions)) != null) {
if (options.isDebug()) {
System.out.println("Chronic.tokensToSpan: date " + handler);
}
List<Token> goodTokens = new LinkedList<Token>();
for (Token token : range.subList(tokens)) {
if (token.getTag(Separator.class) == null) {
goodTokens.add(token);
}
}
return handler.getHandler().handle(goodTokens, options);
}
}
// I guess it's not a specific date, maybe it's just an anchor
for (Handler handler : definitions.get(Handler.HandlerType.ANCHOR)) {
if (handler.isCompatible(options) && (range = handler.matchCount(tokens, definitions)) != null) {
if (options.isDebug()) {
System.out.println("Chronic.tokensToSpan: anchor " + handler);
}
List<Token> goodTokens = new LinkedList<Token>();
for (Token token : range.subList(tokens)) {
if (token.getTag(Separator.class) == null) {
goodTokens.add(token);
}
}
return handler.getHandler().handle(goodTokens, options);
}
}
// not an anchor, perhaps it's an arrow
for (Handler handler : definitions.get(Handler.HandlerType.ARROW)) {
if (handler.isCompatible(options) && (range = handler.matchCount(tokens, definitions)) != null) {
if (options.isDebug()) {
System.out.println("Chronic.tokensToSpan: arrow " + handler);
}
List<Token> goodTokens = new LinkedList<Token>();
for (Token token : range.subList(tokens)) {
if (token.getTag(SeparatorAt.class) == null && token.getTag(SeparatorSlashOrDash.class) == null && token.getTag(SeparatorComma.class) == null) {
goodTokens.add(token);
}
}
return handler.getHandler().handle(goodTokens, options);
}
}
// not an arrow, let's hope it's a narrow
for (Handler handler : definitions.get(Handler.HandlerType.NARROW)) {
if (handler.isCompatible(options) && (range = handler.matchCount(tokens, definitions)) != null) {
if (options.isDebug()) {
System.out.println("Chronic.tokensToSpan: narrow " + handler);
}
//List<Token> goodTokens = new LinkedList<Token>();
//for (Token token : tokens) {
//if (token.getTag(Separator.class) == null) {
// goodTokens.add(token);
//}
//}
return handler.getHandler().handle(range.subList(tokens), options);
}
}
// I guess you're out of luck!
if (options.isDebug()) {