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