/**
* <copyright>
* </copyright>
*
*
*/
package org.emftext.term.propositional.expression.resource.expression.mopp;
/**
* The ExpressionTaskItemDetector is used to find task items in text documents.
* The current implementation searches for specific keywords to detect task items.
* The ExpressionTaskItemDetector is used both by the TaskItemBuilder and the
* editor.
*/
public class ExpressionTaskItemDetector {
public static String[] TASK_ITEM_KEYWORDS = new String[] {"TODO", "FIXME", "XXX"};
public java.util.List<org.emftext.term.propositional.expression.resource.expression.mopp.ExpressionTaskItem> findTaskItems(String text, int line, int charStart) {
java.util.List<org.emftext.term.propositional.expression.resource.expression.mopp.ExpressionTaskItem> foundItems = new java.util.ArrayList<org.emftext.term.propositional.expression.resource.expression.mopp.ExpressionTaskItem>();
String remainingText = text;
boolean continueSearch = true;
int localCharStart = charStart;
while (remainingText != null && continueSearch) {
continueSearch = false;
for (String keyword : TASK_ITEM_KEYWORDS) {
int index = remainingText.indexOf(keyword);
if (index >= 0) {
continueSearch = true;
String message = remainingText.substring(index);
// stop at end of line and check whether the next lines do also contain task items
int eolIndex = remainingText.indexOf("\n", index);
if (eolIndex < 0) {
eolIndex = remainingText.indexOf("\r", index);
}
if (eolIndex > 0) {
message = remainingText.substring(index, eolIndex);
if (message.startsWith("\r")) {
message = message.substring(1);
}
if (message.startsWith("\n")) {
message = message.substring(1);
}
message = message.trim();
remainingText = remainingText.substring(eolIndex);
} else {
remainingText = null;
}
// This is a somewhat arbitrary heuristics to remove the end delimiters from
// multi-line comments. Since comments are usually implemented using hidden
// (unused) tokens, there are no token resolvers that could be used to strip
// delimiters. Thus, this is a reasonable default which reflects the fact that
// many languages use Java-style multi-line comments.
if (message.endsWith("*/")) {
message = message.substring(0, message.length() - 2);
}
message = message.trim();
int offset = index + localCharStart;
int end = offset + keyword.length();
int localLine = line + text.substring(0, offset - charStart).split("(\r\n|\r|\n)").length - 1;
foundItems.add(new org.emftext.term.propositional.expression.resource.expression.mopp.ExpressionTaskItem(keyword, message, localLine, offset, end));
localCharStart += eolIndex;
// stop looping over the keywords, we've found one
break;
}
}
}
return foundItems;
}
}