Download Jar. Uses 6678K of libraries. Click here for Pure Java version (10625L/75K).
1  | !7  | 
2  | |
3  | sS snippetID;  | 
4  | sS savedText, remoteText;  | 
5  | static EditorFrame e;  | 
6  | |
7  | import org.fife.ui.rsyntaxtextarea.*;  | 
8  | |
9  | sclass JavaXTokenizer extends AbstractTokenMaker {
 | 
10  |   public TokenMap getWordsToHighlight() { | 
11  | ret new TokenMap;  | 
12  | }  | 
13  | |
14  | int currentTokenStart, currentTokenType, startTokenType;  | 
15  | |
16  | /**  | 
17  | * Returns a list of tokens representing the given text.  | 
18  | *  | 
19  | * @param text The text to break into tokens.  | 
20  | * @param startTokenType The token with which to start tokenizing.  | 
21  | * @param startOffset The offset at which the line of tokens begins.  | 
22  | * @return A linked list of tokens representing <code>text</code>.  | 
23  | */  | 
24  |   public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
 | 
25  | resetTokenList();  | 
26  | |
27  | char[] array = text.array;  | 
28  | int offset = text.offset;  | 
29  | int count = text.count;  | 
30  | int end = offset + count;  | 
31  | |
32  | // Token starting offsets are always of the form:  | 
33  | // 'startOffset + (currentTokenStart-offset)', but since startOffset and  | 
34  | // offset are constant, tokens' starting positions become:  | 
35  | // 'newStartOffset+currentTokenStart'.  | 
36  | int newStartOffset = startOffset - offset;  | 
37  | |
38  | currentTokenStart = offset;  | 
39  | currentTokenType = startTokenType;  | 
40  | |
41  |    for (int i=offset; i<end; i++) { | 
42  | |
43  | char c = array[i];  | 
44  | |
45  |       switch (currentTokenType) { | 
46  | |
47  | case Token.NULL:  | 
48  | |
49  | currentTokenStart = i; // Starting a new token here.  | 
50  | |
51  |             switch (c) { | 
52  | |
53  | case ' ':  | 
54  | case '\t':  | 
55  | currentTokenType = Token.WHITESPACE;  | 
56  | break;  | 
57  | |
58  | case '"':  | 
59  | currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;  | 
60  | break;  | 
61  | |
62  | case '#':  | 
63  | currentTokenType = Token.COMMENT_EOL;  | 
64  | break;  | 
65  | |
66  | default:  | 
67  |                   if (RSyntaxUtilities.isDigit(c)) { | 
68  | currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;  | 
69  | break;  | 
70  | }  | 
71  |                   else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') { | 
72  | currentTokenType = Token.IDENTIFIER;  | 
73  | break;  | 
74  | }  | 
75  | |
76  | // Anything not currently handled - mark as an identifier  | 
77  | currentTokenType = Token.IDENTIFIER;  | 
78  | break;  | 
79  | |
80  | } // End of switch (c).  | 
81  | |
82  | break;  | 
83  | |
84  | case Token.WHITESPACE:  | 
85  | |
86  |             switch (c) { | 
87  | |
88  | case ' ':  | 
89  | case '\t':  | 
90  | break; // Still whitespace.  | 
91  | |
92  | case '"':  | 
93  | addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);  | 
94  | currentTokenStart = i;  | 
95  | currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;  | 
96  | break;  | 
97  | |
98  | case '#':  | 
99  | addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);  | 
100  | currentTokenStart = i;  | 
101  | currentTokenType = Token.COMMENT_EOL;  | 
102  | break;  | 
103  | |
104  | default: // Add the whitespace token and start anew.  | 
105  | |
106  | addToken(text, currentTokenStart,i-1, Token.WHITESPACE, newStartOffset+currentTokenStart);  | 
107  | currentTokenStart = i;  | 
108  | |
109  |                   if (RSyntaxUtilities.isDigit(c)) { | 
110  | currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;  | 
111  | break;  | 
112  | }  | 
113  |                   else if (RSyntaxUtilities.isLetter(c) || c=='/' || c=='_') { | 
114  | currentTokenType = Token.IDENTIFIER;  | 
115  | break;  | 
116  | }  | 
117  | |
118  | // Anything not currently handled - mark as identifier  | 
119  | currentTokenType = Token.IDENTIFIER;  | 
120  | |
121  | } // End of switch (c).  | 
122  | |
123  | break;  | 
124  | |
125  | default: // Should never happen  | 
126  | case Token.IDENTIFIER:  | 
127  | |
128  |             switch (c) { | 
129  | |
130  | case ' ':  | 
131  | case '\t':  | 
132  | addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);  | 
133  | currentTokenStart = i;  | 
134  | currentTokenType = Token.WHITESPACE;  | 
135  | break;  | 
136  | |
137  | case '"':  | 
138  | addToken(text, currentTokenStart,i-1, Token.IDENTIFIER, newStartOffset+currentTokenStart);  | 
139  | currentTokenStart = i;  | 
140  | currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;  | 
141  | break;  | 
142  | |
143  | default:  | 
144  |                   if (RSyntaxUtilities.isLetterOrDigit(c) || c=='/' || c=='_') { | 
145  | break; // Still an identifier of some type.  | 
146  | }  | 
147  | // Otherwise, we're still an identifier (?).  | 
148  | |
149  | } // End of switch (c).  | 
150  | |
151  | break;  | 
152  | |
153  | case Token.LITERAL_NUMBER_DECIMAL_INT:  | 
154  | |
155  |             switch (c) { | 
156  | |
157  | case ' ':  | 
158  | case '\t':  | 
159  | addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);  | 
160  | currentTokenStart = i;  | 
161  | currentTokenType = Token.WHITESPACE;  | 
162  | break;  | 
163  | |
164  | case '"':  | 
165  | addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);  | 
166  | currentTokenStart = i;  | 
167  | currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;  | 
168  | break;  | 
169  | |
170  | default:  | 
171  | |
172  |                   if (RSyntaxUtilities.isDigit(c)) { | 
173  | break; // Still a literal number.  | 
174  | }  | 
175  | |
176  | // Otherwise, remember this was a number and start over.  | 
177  | addToken(text, currentTokenStart,i-1, Token.LITERAL_NUMBER_DECIMAL_INT, newStartOffset+currentTokenStart);  | 
178  | i--;  | 
179  | currentTokenType = Token.NULL;  | 
180  | |
181  | } // End of switch (c).  | 
182  | |
183  | break;  | 
184  | |
185  | case Token.COMMENT_EOL:  | 
186  | i = end - 1;  | 
187  | addToken(text, currentTokenStart,i, currentTokenType, newStartOffset+currentTokenStart);  | 
188  | // We need to set token type to null so at the bottom we don't add one more token.  | 
189  | currentTokenType = Token.NULL;  | 
190  | break;  | 
191  | |
192  | case Token.LITERAL_STRING_DOUBLE_QUOTE:  | 
193  |             if (c=='"') { | 
194  | addToken(text, currentTokenStart,i, Token.LITERAL_STRING_DOUBLE_QUOTE, newStartOffset+currentTokenStart);  | 
195  | currentTokenType = Token.NULL;  | 
196  | }  | 
197  | break;  | 
198  | |
199  | } // End of switch (currentTokenType).  | 
200  | |
201  | } // End of for (int i=offset; i<end; i++).  | 
202  | |
203  |    switch (currentTokenType) { | 
204  | |
205  | // Remember what token type to begin the next line with.  | 
206  | case Token.LITERAL_STRING_DOUBLE_QUOTE:  | 
207  | addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);  | 
208  | break;  | 
209  | |
210  | // Do nothing if everything was okay.  | 
211  | case Token.NULL:  | 
212  | addNullToken();  | 
213  | break;  | 
214  | |
215  | // All other token types don't continue to the next line...  | 
216  | default:  | 
217  | addToken(text, currentTokenStart,end-1, currentTokenType, newStartOffset+currentTokenStart);  | 
218  | addNullToken();  | 
219  | |
220  | }  | 
221  | |
222  | // Return the first token in our linked list.  | 
223  | return firstToken;  | 
224  | |
225  | }  | 
226  | }  | 
227  | |
228  | |
229  | p-substance {
 | 
230  | autoRestart();  | 
231  |   load('savedText);
 | 
232  | |
233  | e = new EditorFrame;  | 
234  | e.getDocument().setSyntaxStyle(new JavaXTokenizer);  | 
235  | e._setFont(deriveFont(e._getFont(), 16));  | 
236  | e.setText(savedText);  | 
237  | showFrame(e);  | 
238  | frameIcon(e, #1004655);  | 
239  | |
240  | addMenu(e, "New", "New text", f newText);  | 
241  | |
242  |   addMenu(e, "Load", "Load snippet...", r {
 | 
243  | selectSnippetID_v2(vf1(f _loadSnippet));  | 
244  | });  | 
245  | |
246  |   addMenu(e, "Save", "Save snippet", r { saveSnippetThen(null) });
 | 
247  | |
248  | addMenu(e, "Transpile",  | 
249  |     "Save & Quick Transpile", r { transpile(false) },
 | 
250  |     "Save & Medium Transpile", r { transpile(true) });
 | 
251  | addMenu(e, "Activate", "Butter-Reload", f _butterReload);  | 
252  | |
253  |   S snippetID = cast readPersistentVar('snippetID);
 | 
254  | if (snippetID != null) _loadSnippet(snippetID);  | 
255  | |
256  | hideConsole();  | 
257  | |
258  | awtCalcEvery(e, 1000, f update);  | 
259  | onFrameDeactivated(e, f fullUpdate);  | 
260  | }  | 
261  | |
262  | svoid update { update(windowActive(e)); }
 | 
263  | svoid fullUpdate { update(true); }
 | 
264  | svoid update(bool full) {
 | 
265  | S text = e.getText();  | 
266  | setAndSaveIfChanged(savedText := text);  | 
267  | |
268  | if (!full) ret;  | 
269  | |
270  | Pair<Int, S> p = testBracketHygieneExt(text);  | 
271  | S status = "";  | 
272  | if (remoteText != null && neq(remoteText, text))  | 
273  | status = "Changes. ";  | 
274  | if (p == null)  | 
275  | status += "Hygienic";  | 
276  |   else {
 | 
277  | status += p.b;  | 
278  | //setCaretPosition(ta, p.a);  | 
279  | }  | 
280  | silentStatus(trim(status));  | 
281  | }  | 
282  | |
283  | svoid status(S s) {
 | 
284  | silentStatus(infoBoxAndReturn(s));  | 
285  | }  | 
286  | |
287  | svoid silentStatus(S s) {
 | 
288  | e.setStatus(s);  | 
289  | }  | 
290  | |
291  | svoid saveSnippetThen(final Runnable next) {
 | 
292  | if (empty(snippetID)) ret;  | 
293  | fS text = getText(e.textArea);  | 
294  |   status("Saving...");
 | 
295  |   thread {
 | 
296  | fS page = editSnippet(snippetID, text);  | 
297  | remoteText = text; // TODO: check save result  | 
298  |     status("Saved snippet: " + page);
 | 
299  | awtCallF(next);  | 
300  | }  | 
301  | }  | 
302  | |
303  | svoid _butterReload() {
 | 
304  |   time { butterReload(snippetID); }
 | 
305  |   infoBox("Reloaded in " + lastTiming_format100ms());
 | 
306  | }  | 
307  | |
308  | svoid transpile(final bool medium) {
 | 
309  |   saveSnippetThen(r { _transpile(medium) });
 | 
310  | }  | 
311  | |
312  | svoid _transpile(final bool medium) {
 | 
313  |   status("Transpiling...");
 | 
314  | //jdisable(btnEleuReload);  | 
315  | |
316  |   thread "Transpiling" {
 | 
317  |     try {
 | 
318  | final Pair<Bool, S> p = transpileOnServer(snippetID, medium ? "medium" : "quick");  | 
319  |       awt {
 | 
320  | if (p.a)  | 
321  |           status("Transpiled OK!");
 | 
322  |         else {
 | 
323  |           status("Transpilation error. " + p.b);
 | 
324  |           showText("Transpilation Error", p.b);
 | 
325  | }  | 
326  | }  | 
327  |     } catch print e {
 | 
328  |       status("Transpilation problem. " + e);
 | 
329  | }  | 
330  | //jenable(btnEleuReload);  | 
331  | }  | 
332  | }  | 
333  | |
334  | svoid _loadSnippet(S snippetID) {
 | 
335  | e.textArea.setText(remoteText = loadSnippet(snippetID));  | 
336  |   setAndSave('snippetID, snippetID);
 | 
337  | frameTitle(e, snippetID);  | 
338  | }  | 
339  | |
340  | svoid newText {
 | 
341  | setAndSave(snippetID := null);  | 
342  | remoteText = null;  | 
343  | S lastText = e.getText();  | 
344  |   if (nempty(lastText)) logQuotedWithDate("saved-texts.log", lastText);
 | 
345  |   e.setText("");
 | 
346  | frameTitle(e, programTitle());  | 
347  | }  | 
348  | |
349  | svoid cleanMeUp {
 | 
350  | setAndSaveIfChanged(savedText := e.getText());  | 
351  | }  | 
Began life as a copy of #1014780
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1014799 | 
| Snippet name: | Try to make a JavaX tokenizer for RSTA [dev.] | 
| Eternal ID of this version: | #1014799/8 | 
| Text MD5: | eea7eac202bfa483846d944cd328e6b1 | 
| Transpilation MD5: | c470766a357981dc0b56c271a1aa5eca | 
| Author: | stefan | 
| Category: | javax / gui | 
| Type: | JavaX source code (desktop) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2018-05-02 21:55:17 | 
| Source code size: | 10363 bytes / 351 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 657 / 1714 | 
| Version history: | 7 change(s) | 
| Referenced in: | [show references] |