/** * @author Telmo Brugnara * 10 Feb 2014 */ package winterwell.markdown.editors; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; public class HeaderWithUnderlineRule implements IRule { IToken successToken = null; public HeaderWithUnderlineRule(IToken token) { successToken = token; } public IToken evaluate(ICharacterScanner scanner) { int c = -1; int scanCount = 0; if (scanner.getColumn()==0) { do { c = scanner.read(); scanCount++; } while (!isNewLine((char) c) && c != ICharacterScanner.EOF); if(c == ICharacterScanner.EOF) { // is not a header for(int i=0;i<scanCount;i++) { scanner.unread(); } return Token.UNDEFINED; } c = scanner.read(); scanCount++; if(c == '\r') { c = scanner.read(); scanCount++; } if(!isUnderline((char) c)) { // is not a header for(int i=0;i<scanCount;i++) { scanner.unread(); } return Token.UNDEFINED; } do { c = scanner.read(); scanCount++; if(isNewLine((char) c) || c == ICharacterScanner.EOF) { //scanner.unread(); return successToken; } if(!isUnderline((char) c) && !isWhitespace((char) c) && c != '\r') { // is not a header for(int i=0;i<scanCount;i++) { scanner.unread(); } return Token.UNDEFINED; } } while (true); } return Token.UNDEFINED; } boolean isNewLine(char c) { return c == '\n'; } boolean isUnderline(char c) { return c == '=' || c == '-'; } boolean isWhitespace(char c) { return c == ' ' || c == '\t'; } }