codemirror-rails 3.02 → 3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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");