codemirror-rails 3.02 → 3.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -1
  3. data/LICENSE +1 -1
  4. data/codemirror-rails.gemspec +1 -0
  5. data/doc/CodeMirror-LICENSE +5 -1
  6. data/lib/codemirror/rails/version.rb +2 -2
  7. data/vendor/assets/javascripts/codemirror/{utils → addons/dialog}/dialog.js +4 -0
  8. data/vendor/assets/javascripts/codemirror/addons/display/placeholder.js +54 -0
  9. data/vendor/assets/javascripts/codemirror/addons/edit/closebrackets.js +54 -0
  10. data/vendor/assets/javascripts/codemirror/{utils → addons/edit}/closetag.js +9 -8
  11. data/vendor/assets/javascripts/codemirror/{utils → addons/edit}/continuecomment.js +12 -4
  12. data/vendor/assets/javascripts/codemirror/addons/edit/continuelist.js +25 -0
  13. data/vendor/assets/javascripts/codemirror/{utils → addons/edit}/matchbrackets.js +30 -11
  14. data/vendor/assets/javascripts/codemirror/addons/fold/brace-fold.js +31 -0
  15. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +32 -0
  16. data/vendor/assets/javascripts/codemirror/addons/fold/indent-fold.js +11 -0
  17. data/vendor/assets/javascripts/codemirror/addons/fold/xml-fold.js +64 -0
  18. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +582 -0
  19. data/vendor/assets/javascripts/codemirror/{utils → addons/hint}/javascript-hint.js +15 -11
  20. data/vendor/assets/javascripts/codemirror/{utils → addons/hint}/pig-hint.js +19 -19
  21. data/vendor/assets/javascripts/codemirror/{utils → addons/hint}/python-hint.js +2 -2
  22. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +180 -0
  23. data/vendor/assets/javascripts/codemirror/{utils → addons/hint}/xml-hint.js +5 -18
  24. data/vendor/assets/javascripts/codemirror/addons/lint/javascript-lint.js +127 -0
  25. data/vendor/assets/javascripts/codemirror/addons/lint/json-lint.js +14 -0
  26. data/vendor/assets/javascripts/codemirror/addons/lint/lint.js +197 -0
  27. data/vendor/assets/javascripts/codemirror/{utils → addons/mode}/loadmode.js +0 -0
  28. data/vendor/assets/javascripts/codemirror/{utils → addons/mode}/multiplex.js +2 -2
  29. data/vendor/assets/javascripts/codemirror/{utils → addons/mode}/overlay.js +2 -2
  30. data/vendor/assets/javascripts/codemirror/{utils → addons/runmode}/colorize.js +0 -0
  31. data/vendor/assets/javascripts/codemirror/{utils → addons/runmode}/runmode-standalone.js +2 -3
  32. data/vendor/assets/javascripts/codemirror/{utils → addons/runmode}/runmode.js +0 -0
  33. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +89 -0
  34. data/vendor/assets/javascripts/codemirror/addons/search/match-highlighter.js +60 -0
  35. data/vendor/assets/javascripts/codemirror/{utils → addons/search}/search.js +5 -5
  36. data/vendor/assets/javascripts/codemirror/{utils → addons/search}/searchcursor.js +37 -30
  37. data/vendor/assets/javascripts/codemirror/addons/selection/active-line.js +39 -0
  38. data/vendor/assets/javascripts/codemirror/addons/selection/mark-selection.js +34 -0
  39. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +721 -188
  40. data/vendor/assets/javascripts/codemirror/modes/asterisk.js +6 -6
  41. data/vendor/assets/javascripts/codemirror/modes/clike.js +14 -14
  42. data/vendor/assets/javascripts/codemirror/modes/clojure.js +23 -7
  43. data/vendor/assets/javascripts/codemirror/modes/coffeescript.js +2 -2
  44. data/vendor/assets/javascripts/codemirror/modes/css.js +337 -235
  45. data/vendor/assets/javascripts/codemirror/modes/ecl.js +12 -12
  46. data/vendor/assets/javascripts/codemirror/modes/erlang.js +1 -1
  47. data/vendor/assets/javascripts/codemirror/modes/gas.js +326 -0
  48. data/vendor/assets/javascripts/codemirror/modes/gfm.js +1 -0
  49. data/vendor/assets/javascripts/codemirror/modes/haskell.js +26 -26
  50. data/vendor/assets/javascripts/codemirror/modes/haxe.js +17 -17
  51. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +6 -6
  52. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +43 -23
  53. data/vendor/assets/javascripts/codemirror/modes/javascript.js +78 -33
  54. data/vendor/assets/javascripts/codemirror/modes/jinja2.js +2 -2
  55. data/vendor/assets/javascripts/codemirror/modes/less.js +38 -38
  56. data/vendor/assets/javascripts/codemirror/modes/livescript.js +267 -0
  57. data/vendor/assets/javascripts/codemirror/modes/lua.js +7 -7
  58. data/vendor/assets/javascripts/codemirror/modes/markdown.js +108 -57
  59. data/vendor/assets/javascripts/codemirror/modes/mirc.js +177 -0
  60. data/vendor/assets/javascripts/codemirror/modes/ntriples.js +22 -22
  61. data/vendor/assets/javascripts/codemirror/modes/ocaml.js +1 -1
  62. data/vendor/assets/javascripts/codemirror/modes/perl.js +791 -791
  63. data/vendor/assets/javascripts/codemirror/modes/php.js +1 -1
  64. data/vendor/assets/javascripts/codemirror/modes/pig.js +163 -163
  65. data/vendor/assets/javascripts/codemirror/modes/python.js +31 -31
  66. data/vendor/assets/javascripts/codemirror/modes/q.js +124 -0
  67. data/vendor/assets/javascripts/codemirror/modes/rst.js +486 -250
  68. data/vendor/assets/javascripts/codemirror/modes/sass.js +3 -3
  69. data/vendor/assets/javascripts/codemirror/modes/scss_test.js +80 -0
  70. data/vendor/assets/javascripts/codemirror/modes/shell.js +2 -2
  71. data/vendor/assets/javascripts/codemirror/modes/sieve.js +10 -10
  72. data/vendor/assets/javascripts/codemirror/modes/smalltalk.js +129 -129
  73. data/vendor/assets/javascripts/codemirror/modes/smarty.js +3 -3
  74. data/vendor/assets/javascripts/codemirror/modes/sparql.js +1 -1
  75. data/vendor/assets/javascripts/codemirror/modes/sql.js +23 -23
  76. data/vendor/assets/javascripts/codemirror/modes/stex.js +192 -121
  77. data/vendor/assets/javascripts/codemirror/modes/tcl.js +131 -0
  78. data/vendor/assets/javascripts/codemirror/modes/test.js +64 -0
  79. data/vendor/assets/javascripts/codemirror/modes/tiddlywiki.js +345 -345
  80. data/vendor/assets/javascripts/codemirror/modes/tiki.js +297 -298
  81. data/vendor/assets/javascripts/codemirror/modes/turtle.js +145 -0
  82. data/vendor/assets/javascripts/codemirror/modes/vb.js +31 -32
  83. data/vendor/assets/javascripts/codemirror/modes/vbscript.js +4 -4
  84. data/vendor/assets/javascripts/codemirror/modes/xml.js +10 -6
  85. data/vendor/assets/javascripts/codemirror/modes/xquery.js +55 -55
  86. data/vendor/assets/javascripts/codemirror/modes/yaml.js +90 -90
  87. data/vendor/assets/javascripts/codemirror/modes/z80.js +82 -110
  88. data/vendor/assets/javascripts/codemirror.js +1914 -1115
  89. data/vendor/assets/stylesheets/codemirror/{utils → addons/dialog}/dialog.css +0 -0
  90. data/vendor/assets/stylesheets/codemirror/addons/hint/show-hint.css +38 -0
  91. data/vendor/assets/stylesheets/codemirror/addons/lint/lint.css +96 -0
  92. data/vendor/assets/stylesheets/codemirror/modes/tiki.css +2 -2
  93. data/vendor/assets/stylesheets/codemirror/themes/ambiance-mobile.css +0 -1
  94. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +0 -1
  95. data/vendor/assets/stylesheets/codemirror/themes/eclipse.css +2 -2
  96. data/vendor/assets/stylesheets/codemirror/themes/erlang-dark.css +5 -5
  97. data/vendor/assets/stylesheets/codemirror/themes/midnight.css +52 -0
  98. data/vendor/assets/stylesheets/codemirror/themes/xq-light.css +43 -0
  99. data/vendor/assets/stylesheets/codemirror.css +16 -10
  100. metadata +60 -52
  101. data/vendor/assets/javascripts/codemirror/modes/mysql.js +0 -203
  102. data/vendor/assets/javascripts/codemirror/modes/plsql.js +0 -216
  103. data/vendor/assets/javascripts/codemirror/utils/collapserange.js +0 -68
  104. data/vendor/assets/javascripts/codemirror/utils/continuelist.js +0 -28
  105. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +0 -183
  106. data/vendor/assets/javascripts/codemirror/utils/formatting.js +0 -114
  107. data/vendor/assets/javascripts/codemirror/utils/match-highlighter.js +0 -46
  108. data/vendor/assets/javascripts/codemirror/utils/simple-hint.js +0 -102
  109. data/vendor/assets/stylesheets/codemirror/utils/simple-hint.css +0 -16
@@ -1,352 +1,352 @@
1
1
  /***
2
- |''Name''|tiddlywiki.js|
3
- |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
4
- |''Author''|PMario|
5
- |''Version''|0.1.7|
6
- |''Status''|''stable''|
7
- |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
8
- |''Documentation''|http://codemirror.tiddlyspace.com/|
9
- |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
10
- |''CoreVersion''|2.5.0|
11
- |''Requires''|codemirror.js|
12
- |''Keywords''|syntax highlighting color code mirror codemirror|
13
- ! Info
14
- CoreVersion parameter is needed for TiddlyWiki only!
2
+ |''Name''|tiddlywiki.js|
3
+ |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror|
4
+ |''Author''|PMario|
5
+ |''Version''|0.1.7|
6
+ |''Status''|''stable''|
7
+ |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]|
8
+ |''Documentation''|http://codemirror.tiddlyspace.com/|
9
+ |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]|
10
+ |''CoreVersion''|2.5.0|
11
+ |''Requires''|codemirror.js|
12
+ |''Keywords''|syntax highlighting color code mirror codemirror|
13
+ ! Info
14
+ CoreVersion parameter is needed for TiddlyWiki only!
15
15
  ***/
16
16
  //{{{
17
17
  CodeMirror.defineMode("tiddlywiki", function () {
18
- // Tokenizer
19
- var textwords = {};
20
-
21
- var keywords = function () {
22
- function kw(type) {
23
- return { type: type, style: "macro"};
24
- }
25
- return {
26
- "allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'),
27
- "newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'),
28
- "permaview": kw('permaview'), "saveChanges": kw('saveChanges'),
29
- "search": kw('search'), "slider": kw('slider'), "tabs": kw('tabs'),
30
- "tag": kw('tag'), "tagging": kw('tagging'), "tags": kw('tags'),
31
- "tiddler": kw('tiddler'), "timeline": kw('timeline'),
32
- "today": kw('today'), "version": kw('version'), "option": kw('option'),
33
-
34
- "with": kw('with'),
35
- "filter": kw('filter')
36
- };
37
- }();
38
-
39
- var isSpaceName = /[\w_\-]/i,
40
- reHR = /^\-\-\-\-+$/, // <hr>
41
- reWikiCommentStart = /^\/\*\*\*$/, // /***
42
- reWikiCommentStop = /^\*\*\*\/$/, // ***/
43
- reBlockQuote = /^<<<$/,
44
-
45
- reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start
46
- reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop
47
- reXmlCodeStart = /^<!--\{\{\{-->$/, // xml block start
48
- reXmlCodeStop = /^<!--\}\}\}-->$/, // xml stop
49
-
50
- reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start
51
- reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop
52
-
53
- reUntilCodeStop = /.*?\}\}\}/;
54
-
55
- function chain(stream, state, f) {
56
- state.tokenize = f;
57
- return f(stream, state);
58
- }
59
-
60
- // Used as scratch variables to communicate multiple values without
61
- // consing up tons of objects.
62
- var type, content;
63
-
64
- function ret(tp, style, cont) {
65
- type = tp;
66
- content = cont;
67
- return style;
68
- }
69
-
70
- function jsTokenBase(stream, state) {
71
- var sol = stream.sol(), ch;
72
-
73
- state.block = false; // indicates the start of a code block.
74
-
75
- ch = stream.peek(); // don't eat, to make matching simpler
76
-
77
- // check start of blocks
78
- if (sol && /[<\/\*{}\-]/.test(ch)) {
79
- if (stream.match(reCodeBlockStart)) {
80
- state.block = true;
81
- return chain(stream, state, twTokenCode);
82
- }
83
- if (stream.match(reBlockQuote)) {
84
- return ret('quote', 'quote');
85
- }
86
- if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
87
- return ret('code', 'comment');
88
- }
89
- if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
90
- return ret('code', 'comment');
91
- }
92
- if (stream.match(reHR)) {
93
- return ret('hr', 'hr');
94
- }
95
- } // sol
96
- ch = stream.next();
97
-
98
- if (sol && /[\/\*!#;:>|]/.test(ch)) {
99
- if (ch == "!") { // tw header
100
- stream.skipToEnd();
101
- return ret("header", "header");
102
- }
103
- if (ch == "*") { // tw list
104
- stream.eatWhile('*');
105
- return ret("list", "comment");
106
- }
107
- if (ch == "#") { // tw numbered list
108
- stream.eatWhile('#');
109
- return ret("list", "comment");
110
- }
111
- if (ch == ";") { // definition list, term
112
- stream.eatWhile(';');
113
- return ret("list", "comment");
114
- }
115
- if (ch == ":") { // definition list, description
116
- stream.eatWhile(':');
117
- return ret("list", "comment");
118
- }
119
- if (ch == ">") { // single line quote
120
- stream.eatWhile(">");
121
- return ret("quote", "quote");
122
- }
123
- if (ch == '|') {
124
- return ret('table', 'header');
125
- }
126
- }
127
-
128
- if (ch == '{' && stream.match(/\{\{/)) {
129
- return chain(stream, state, twTokenCode);
130
- }
131
-
132
- // rudimentary html:// file:// link matching. TW knows much more ...
133
- if (/[hf]/i.test(ch)) {
134
- if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
135
- return ret("link", "link");
136
- }
137
- }
138
- // just a little string indicator, don't want to have the whole string covered
139
- if (ch == '"') {
140
- return ret('string', 'string');
141
- }
142
- if (ch == '~') { // _no_ CamelCase indicator should be bold
143
- return ret('text', 'brace');
144
- }
145
- if (/[\[\]]/.test(ch)) { // check for [[..]]
146
- if (stream.peek() == ch) {
147
- stream.next();
148
- return ret('brace', 'brace');
149
- }
150
- }
151
- if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting
152
- stream.eatWhile(isSpaceName);
153
- return ret("link", "link");
154
- }
155
- if (/\d/.test(ch)) { // numbers
156
- stream.eatWhile(/\d/);
157
- return ret("number", "number");
158
- }
159
- if (ch == "/") { // tw invisible comment
160
- if (stream.eat("%")) {
161
- return chain(stream, state, twTokenComment);
162
- }
163
- else if (stream.eat("/")) { //
164
- return chain(stream, state, twTokenEm);
165
- }
166
- }
167
- if (ch == "_") { // tw underline
168
- if (stream.eat("_")) {
169
- return chain(stream, state, twTokenUnderline);
170
- }
171
- }
172
- // strikethrough and mdash handling
173
- if (ch == "-") {
174
- if (stream.eat("-")) {
175
- // if strikethrough looks ugly, change CSS.
176
- if (stream.peek() != ' ')
177
- return chain(stream, state, twTokenStrike);
178
- // mdash
179
- if (stream.peek() == ' ')
180
- return ret('text', 'brace');
181
- }
182
- }
183
- if (ch == "'") { // tw bold
184
- if (stream.eat("'")) {
185
- return chain(stream, state, twTokenStrong);
186
- }
187
- }
188
- if (ch == "<") { // tw macro
189
- if (stream.eat("<")) {
190
- return chain(stream, state, twTokenMacro);
191
- }
192
- }
193
- else {
194
- return ret(ch);
195
- }
196
-
197
- // core macro handling
198
- stream.eatWhile(/[\w\$_]/);
199
- var word = stream.current(),
200
- known = textwords.propertyIsEnumerable(word) && textwords[word];
201
-
202
- return known ? ret(known.type, known.style, word) : ret("text", null, word);
203
-
204
- } // jsTokenBase()
205
-
206
- // tw invisible comment
207
- function twTokenComment(stream, state) {
208
- var maybeEnd = false,
209
- ch;
210
- while (ch = stream.next()) {
211
- if (ch == "/" && maybeEnd) {
212
- state.tokenize = jsTokenBase;
213
- break;
214
- }
215
- maybeEnd = (ch == "%");
216
- }
217
- return ret("comment", "comment");
218
- }
219
-
220
- // tw strong / bold
221
- function twTokenStrong(stream, state) {
222
- var maybeEnd = false,
223
- ch;
224
- while (ch = stream.next()) {
225
- if (ch == "'" && maybeEnd) {
226
- state.tokenize = jsTokenBase;
227
- break;
228
- }
229
- maybeEnd = (ch == "'");
230
- }
231
- return ret("text", "strong");
232
- }
233
-
234
- // tw code
235
- function twTokenCode(stream, state) {
236
- var ch, sb = state.block;
237
-
238
- if (sb && stream.current()) {
239
- return ret("code", "comment");
240
- }
241
-
242
- if (!sb && stream.match(reUntilCodeStop)) {
243
- state.tokenize = jsTokenBase;
244
- return ret("code", "comment");
245
- }
246
-
247
- if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
248
- state.tokenize = jsTokenBase;
249
- return ret("code", "comment");
250
- }
251
-
252
- ch = stream.next();
253
- return (sb) ? ret("code", "comment") : ret("code", "comment");
254
- }
255
-
256
- // tw em / italic
257
- function twTokenEm(stream, state) {
258
- var maybeEnd = false,
259
- ch;
260
- while (ch = stream.next()) {
261
- if (ch == "/" && maybeEnd) {
262
- state.tokenize = jsTokenBase;
263
- break;
264
- }
265
- maybeEnd = (ch == "/");
266
- }
267
- return ret("text", "em");
268
- }
269
-
270
- // tw underlined text
271
- function twTokenUnderline(stream, state) {
272
- var maybeEnd = false,
273
- ch;
274
- while (ch = stream.next()) {
275
- if (ch == "_" && maybeEnd) {
276
- state.tokenize = jsTokenBase;
277
- break;
278
- }
279
- maybeEnd = (ch == "_");
280
- }
281
- return ret("text", "underlined");
282
- }
283
-
284
- // tw strike through text looks ugly
285
- // change CSS if needed
286
- function twTokenStrike(stream, state) {
287
- var maybeEnd = false, ch;
288
-
289
- while (ch = stream.next()) {
290
- if (ch == "-" && maybeEnd) {
291
- state.tokenize = jsTokenBase;
292
- break;
293
- }
294
- maybeEnd = (ch == "-");
295
- }
296
- return ret("text", "strikethrough");
297
- }
298
-
299
- // macro
300
- function twTokenMacro(stream, state) {
301
- var ch, word, known;
302
-
303
- if (stream.current() == '<<') {
304
- return ret('brace', 'macro');
305
- }
306
-
307
- ch = stream.next();
308
- if (!ch) {
309
- state.tokenize = jsTokenBase;
310
- return ret(ch);
311
- }
312
- if (ch == ">") {
313
- if (stream.peek() == '>') {
314
- stream.next();
315
- state.tokenize = jsTokenBase;
316
- return ret("brace", "macro");
317
- }
318
- }
319
-
320
- stream.eatWhile(/[\w\$_]/);
321
- word = stream.current();
322
- known = keywords.propertyIsEnumerable(word) && keywords[word];
323
-
324
- if (known) {
325
- return ret(known.type, known.style, word);
326
- }
327
- else {
328
- return ret("macro", null, word);
329
- }
330
- }
331
-
332
- // Interface
333
- return {
334
- startState: function () {
335
- return {
336
- tokenize: jsTokenBase,
337
- indented: 0,
338
- level: 0
339
- };
340
- },
341
-
342
- token: function (stream, state) {
343
- if (stream.eatSpace()) return null;
344
- var style = state.tokenize(stream, state);
345
- return style;
346
- },
347
-
348
- electricChars: ""
349
- };
18
+ // Tokenizer
19
+ var textwords = {};
20
+
21
+ var keywords = function () {
22
+ function kw(type) {
23
+ return { type: type, style: "macro"};
24
+ }
25
+ return {
26
+ "allTags": kw('allTags'), "closeAll": kw('closeAll'), "list": kw('list'),
27
+ "newJournal": kw('newJournal'), "newTiddler": kw('newTiddler'),
28
+ "permaview": kw('permaview'), "saveChanges": kw('saveChanges'),
29
+ "search": kw('search'), "slider": kw('slider'), "tabs": kw('tabs'),
30
+ "tag": kw('tag'), "tagging": kw('tagging'), "tags": kw('tags'),
31
+ "tiddler": kw('tiddler'), "timeline": kw('timeline'),
32
+ "today": kw('today'), "version": kw('version'), "option": kw('option'),
33
+
34
+ "with": kw('with'),
35
+ "filter": kw('filter')
36
+ };
37
+ }();
38
+
39
+ var isSpaceName = /[\w_\-]/i,
40
+ reHR = /^\-\-\-\-+$/, // <hr>
41
+ reWikiCommentStart = /^\/\*\*\*$/, // /***
42
+ reWikiCommentStop = /^\*\*\*\/$/, // ***/
43
+ reBlockQuote = /^<<<$/,
44
+
45
+ reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start
46
+ reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop
47
+ reXmlCodeStart = /^<!--\{\{\{-->$/, // xml block start
48
+ reXmlCodeStop = /^<!--\}\}\}-->$/, // xml stop
49
+
50
+ reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start
51
+ reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop
52
+
53
+ reUntilCodeStop = /.*?\}\}\}/;
54
+
55
+ function chain(stream, state, f) {
56
+ state.tokenize = f;
57
+ return f(stream, state);
58
+ }
59
+
60
+ // Used as scratch variables to communicate multiple values without
61
+ // consing up tons of objects.
62
+ var type, content;
63
+
64
+ function ret(tp, style, cont) {
65
+ type = tp;
66
+ content = cont;
67
+ return style;
68
+ }
69
+
70
+ function jsTokenBase(stream, state) {
71
+ var sol = stream.sol(), ch;
72
+
73
+ state.block = false; // indicates the start of a code block.
74
+
75
+ ch = stream.peek(); // don't eat, to make matching simpler
76
+
77
+ // check start of blocks
78
+ if (sol && /[<\/\*{}\-]/.test(ch)) {
79
+ if (stream.match(reCodeBlockStart)) {
80
+ state.block = true;
81
+ return chain(stream, state, twTokenCode);
82
+ }
83
+ if (stream.match(reBlockQuote)) {
84
+ return ret('quote', 'quote');
85
+ }
86
+ if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) {
87
+ return ret('code', 'comment');
88
+ }
89
+ if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) {
90
+ return ret('code', 'comment');
91
+ }
92
+ if (stream.match(reHR)) {
93
+ return ret('hr', 'hr');
94
+ }
95
+ } // sol
96
+ ch = stream.next();
97
+
98
+ if (sol && /[\/\*!#;:>|]/.test(ch)) {
99
+ if (ch == "!") { // tw header
100
+ stream.skipToEnd();
101
+ return ret("header", "header");
102
+ }
103
+ if (ch == "*") { // tw list
104
+ stream.eatWhile('*');
105
+ return ret("list", "comment");
106
+ }
107
+ if (ch == "#") { // tw numbered list
108
+ stream.eatWhile('#');
109
+ return ret("list", "comment");
110
+ }
111
+ if (ch == ";") { // definition list, term
112
+ stream.eatWhile(';');
113
+ return ret("list", "comment");
114
+ }
115
+ if (ch == ":") { // definition list, description
116
+ stream.eatWhile(':');
117
+ return ret("list", "comment");
118
+ }
119
+ if (ch == ">") { // single line quote
120
+ stream.eatWhile(">");
121
+ return ret("quote", "quote");
122
+ }
123
+ if (ch == '|') {
124
+ return ret('table', 'header');
125
+ }
126
+ }
127
+
128
+ if (ch == '{' && stream.match(/\{\{/)) {
129
+ return chain(stream, state, twTokenCode);
130
+ }
131
+
132
+ // rudimentary html:// file:// link matching. TW knows much more ...
133
+ if (/[hf]/i.test(ch)) {
134
+ if (/[ti]/i.test(stream.peek()) && stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) {
135
+ return ret("link", "link");
136
+ }
137
+ }
138
+ // just a little string indicator, don't want to have the whole string covered
139
+ if (ch == '"') {
140
+ return ret('string', 'string');
141
+ }
142
+ if (ch == '~') { // _no_ CamelCase indicator should be bold
143
+ return ret('text', 'brace');
144
+ }
145
+ if (/[\[\]]/.test(ch)) { // check for [[..]]
146
+ if (stream.peek() == ch) {
147
+ stream.next();
148
+ return ret('brace', 'brace');
149
+ }
150
+ }
151
+ if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting
152
+ stream.eatWhile(isSpaceName);
153
+ return ret("link", "link");
154
+ }
155
+ if (/\d/.test(ch)) { // numbers
156
+ stream.eatWhile(/\d/);
157
+ return ret("number", "number");
158
+ }
159
+ if (ch == "/") { // tw invisible comment
160
+ if (stream.eat("%")) {
161
+ return chain(stream, state, twTokenComment);
162
+ }
163
+ else if (stream.eat("/")) { //
164
+ return chain(stream, state, twTokenEm);
165
+ }
166
+ }
167
+ if (ch == "_") { // tw underline
168
+ if (stream.eat("_")) {
169
+ return chain(stream, state, twTokenUnderline);
170
+ }
171
+ }
172
+ // strikethrough and mdash handling
173
+ if (ch == "-") {
174
+ if (stream.eat("-")) {
175
+ // if strikethrough looks ugly, change CSS.
176
+ if (stream.peek() != ' ')
177
+ return chain(stream, state, twTokenStrike);
178
+ // mdash
179
+ if (stream.peek() == ' ')
180
+ return ret('text', 'brace');
181
+ }
182
+ }
183
+ if (ch == "'") { // tw bold
184
+ if (stream.eat("'")) {
185
+ return chain(stream, state, twTokenStrong);
186
+ }
187
+ }
188
+ if (ch == "<") { // tw macro
189
+ if (stream.eat("<")) {
190
+ return chain(stream, state, twTokenMacro);
191
+ }
192
+ }
193
+ else {
194
+ return ret(ch);
195
+ }
196
+
197
+ // core macro handling
198
+ stream.eatWhile(/[\w\$_]/);
199
+ var word = stream.current(),
200
+ known = textwords.propertyIsEnumerable(word) && textwords[word];
201
+
202
+ return known ? ret(known.type, known.style, word) : ret("text", null, word);
203
+
204
+ } // jsTokenBase()
205
+
206
+ // tw invisible comment
207
+ function twTokenComment(stream, state) {
208
+ var maybeEnd = false,
209
+ ch;
210
+ while (ch = stream.next()) {
211
+ if (ch == "/" && maybeEnd) {
212
+ state.tokenize = jsTokenBase;
213
+ break;
214
+ }
215
+ maybeEnd = (ch == "%");
216
+ }
217
+ return ret("comment", "comment");
218
+ }
219
+
220
+ // tw strong / bold
221
+ function twTokenStrong(stream, state) {
222
+ var maybeEnd = false,
223
+ ch;
224
+ while (ch = stream.next()) {
225
+ if (ch == "'" && maybeEnd) {
226
+ state.tokenize = jsTokenBase;
227
+ break;
228
+ }
229
+ maybeEnd = (ch == "'");
230
+ }
231
+ return ret("text", "strong");
232
+ }
233
+
234
+ // tw code
235
+ function twTokenCode(stream, state) {
236
+ var ch, sb = state.block;
237
+
238
+ if (sb && stream.current()) {
239
+ return ret("code", "comment");
240
+ }
241
+
242
+ if (!sb && stream.match(reUntilCodeStop)) {
243
+ state.tokenize = jsTokenBase;
244
+ return ret("code", "comment");
245
+ }
246
+
247
+ if (sb && stream.sol() && stream.match(reCodeBlockStop)) {
248
+ state.tokenize = jsTokenBase;
249
+ return ret("code", "comment");
250
+ }
251
+
252
+ ch = stream.next();
253
+ return (sb) ? ret("code", "comment") : ret("code", "comment");
254
+ }
255
+
256
+ // tw em / italic
257
+ function twTokenEm(stream, state) {
258
+ var maybeEnd = false,
259
+ ch;
260
+ while (ch = stream.next()) {
261
+ if (ch == "/" && maybeEnd) {
262
+ state.tokenize = jsTokenBase;
263
+ break;
264
+ }
265
+ maybeEnd = (ch == "/");
266
+ }
267
+ return ret("text", "em");
268
+ }
269
+
270
+ // tw underlined text
271
+ function twTokenUnderline(stream, state) {
272
+ var maybeEnd = false,
273
+ ch;
274
+ while (ch = stream.next()) {
275
+ if (ch == "_" && maybeEnd) {
276
+ state.tokenize = jsTokenBase;
277
+ break;
278
+ }
279
+ maybeEnd = (ch == "_");
280
+ }
281
+ return ret("text", "underlined");
282
+ }
283
+
284
+ // tw strike through text looks ugly
285
+ // change CSS if needed
286
+ function twTokenStrike(stream, state) {
287
+ var maybeEnd = false, ch;
288
+
289
+ while (ch = stream.next()) {
290
+ if (ch == "-" && maybeEnd) {
291
+ state.tokenize = jsTokenBase;
292
+ break;
293
+ }
294
+ maybeEnd = (ch == "-");
295
+ }
296
+ return ret("text", "strikethrough");
297
+ }
298
+
299
+ // macro
300
+ function twTokenMacro(stream, state) {
301
+ var ch, word, known;
302
+
303
+ if (stream.current() == '<<') {
304
+ return ret('brace', 'macro');
305
+ }
306
+
307
+ ch = stream.next();
308
+ if (!ch) {
309
+ state.tokenize = jsTokenBase;
310
+ return ret(ch);
311
+ }
312
+ if (ch == ">") {
313
+ if (stream.peek() == '>') {
314
+ stream.next();
315
+ state.tokenize = jsTokenBase;
316
+ return ret("brace", "macro");
317
+ }
318
+ }
319
+
320
+ stream.eatWhile(/[\w\$_]/);
321
+ word = stream.current();
322
+ known = keywords.propertyIsEnumerable(word) && keywords[word];
323
+
324
+ if (known) {
325
+ return ret(known.type, known.style, word);
326
+ }
327
+ else {
328
+ return ret("macro", null, word);
329
+ }
330
+ }
331
+
332
+ // Interface
333
+ return {
334
+ startState: function () {
335
+ return {
336
+ tokenize: jsTokenBase,
337
+ indented: 0,
338
+ level: 0
339
+ };
340
+ },
341
+
342
+ token: function (stream, state) {
343
+ if (stream.eatSpace()) return null;
344
+ var style = state.tokenize(stream, state);
345
+ return style;
346
+ },
347
+
348
+ electricChars: ""
349
+ };
350
350
  });
351
351
 
352
352
  CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki");