]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/winterwell.markdown/src/winterwell/markdown/editors/HeaderWithUnderlineRule.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / winterwell.markdown / src / winterwell / markdown / editors / HeaderWithUnderlineRule.java
1 /**
2  * @author Telmo Brugnara
3  * 10 Feb 2014
4  */
5 package winterwell.markdown.editors;
6
7 import org.eclipse.jface.text.rules.ICharacterScanner;
8 import org.eclipse.jface.text.rules.IRule;
9 import org.eclipse.jface.text.rules.IToken;
10 import org.eclipse.jface.text.rules.Token;
11
12 public class HeaderWithUnderlineRule implements IRule {
13
14         IToken successToken = null;
15         
16         public HeaderWithUnderlineRule(IToken token) {
17                 successToken = token;
18         }
19         
20         public IToken evaluate(ICharacterScanner scanner) {
21                 int c = -1;
22                 int scanCount = 0;
23                 if (scanner.getColumn()==0) {
24                         do {
25                                 c = scanner.read();
26                                 scanCount++;
27                         } while (!isNewLine((char) c) && c != ICharacterScanner.EOF);
28                         if(c == ICharacterScanner.EOF) {
29                                 // is not a header
30                                 for(int i=0;i<scanCount;i++) { scanner.unread(); }
31                                 return Token.UNDEFINED;
32                         }
33                         c = scanner.read();
34                         scanCount++;
35                         if(c == '\r') {
36                                 c = scanner.read();
37                                 scanCount++;
38                         }
39                         if(!isUnderline((char) c)) {
40                                 // is not a header
41                                 for(int i=0;i<scanCount;i++) { scanner.unread(); }
42                                 return Token.UNDEFINED;
43                         }
44                         do {
45                                 c = scanner.read();
46                                 scanCount++;
47                                 if(isNewLine((char) c) || c == ICharacterScanner.EOF) {
48                                         //scanner.unread();
49                                         return successToken;
50                                 }
51                                 if(!isUnderline((char) c) && !isWhitespace((char) c) && c != '\r') {
52                                         // is not a header
53                                         for(int i=0;i<scanCount;i++) { scanner.unread(); }
54                                         return Token.UNDEFINED;
55                                 }
56                         } while (true);
57                 }
58
59                 return Token.UNDEFINED;
60         }
61         
62         boolean isNewLine(char c) {
63                 return c == '\n';
64         }
65
66         boolean isUnderline(char c) {
67                 return c == '=' || c == '-';
68         }
69
70         boolean isWhitespace(char c) {
71                 return c == ' ' || c == '\t';
72         }
73 }