codemirror-rails 3.21 → 3.22

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codemirror/rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/codemirror.js +89 -43
  4. data/vendor/assets/javascripts/codemirror/addons/comment/continuecomment.js +16 -3
  5. data/vendor/assets/javascripts/codemirror/addons/dialog/dialog.js +1 -0
  6. data/vendor/assets/javascripts/codemirror/addons/display/rulers.js +47 -0
  7. data/vendor/assets/javascripts/codemirror/addons/edit/closetag.js +1 -0
  8. data/vendor/assets/javascripts/codemirror/addons/fold/foldcode.js +6 -0
  9. data/vendor/assets/javascripts/codemirror/addons/fold/markdown-fold.js +34 -0
  10. data/vendor/assets/javascripts/codemirror/addons/hint/anyword-hint.js +2 -2
  11. data/vendor/assets/javascripts/codemirror/addons/hint/html-hint.js +0 -0
  12. data/vendor/assets/javascripts/codemirror/addons/hint/show-hint.js +25 -18
  13. data/vendor/assets/javascripts/codemirror/addons/lint/yaml-lint.js +14 -0
  14. data/vendor/assets/javascripts/codemirror/addons/runmode/runmode.node.js +2 -2
  15. data/vendor/assets/javascripts/codemirror/addons/scroll/scrollpastend.js +2 -0
  16. data/vendor/assets/javascripts/codemirror/addons/search/search.js +9 -3
  17. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +126 -54
  18. data/vendor/assets/javascripts/codemirror/modes/clojure.js +6 -5
  19. data/vendor/assets/javascripts/codemirror/modes/css.js +19 -9
  20. data/vendor/assets/javascripts/codemirror/modes/gas.js +1 -1
  21. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +4 -1
  22. data/vendor/assets/javascripts/codemirror/modes/javascript.js +11 -3
  23. data/vendor/assets/javascripts/codemirror/modes/julia.js +47 -23
  24. data/vendor/assets/javascripts/codemirror/modes/markdown.js +5 -3
  25. data/vendor/assets/javascripts/codemirror/modes/octave.js +6 -4
  26. data/vendor/assets/javascripts/codemirror/modes/puppet.js +204 -0
  27. data/vendor/assets/javascripts/codemirror/modes/python.js +4 -0
  28. data/vendor/assets/javascripts/codemirror/modes/rst.js +520 -517
  29. data/vendor/assets/javascripts/codemirror/modes/ruby.js +1 -0
  30. data/vendor/assets/javascripts/codemirror/modes/solr.js +89 -0
  31. data/vendor/assets/javascripts/codemirror/modes/sql.js +2 -2
  32. data/vendor/assets/javascripts/codemirror/modes/xml.js +2 -1
  33. data/vendor/assets/stylesheets/codemirror.css +12 -11
  34. data/vendor/assets/stylesheets/codemirror/themes/mdn-like.css +44 -0
  35. data/vendor/assets/stylesheets/codemirror/themes/solarized.css +1 -0
  36. metadata +8 -2
@@ -151,6 +151,10 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
151
151
  return 'builtin';
152
152
  }
153
153
 
154
+ if (stream.match(/^(self|cls)\b/)) {
155
+ return "variable-2";
156
+ }
157
+
154
158
  if (stream.match(identifiers)) {
155
159
  if (state.lastToken == 'def' || state.lastToken == 'class') {
156
160
  return 'def';
@@ -1,554 +1,557 @@
1
- CodeMirror.defineMode('rst-base', function (config) {
2
-
3
- ///////////////////////////////////////////////////////////////////////////
4
- ///////////////////////////////////////////////////////////////////////////
1
+ CodeMirror.defineMode('rst', function (config, options) {
5
2
 
6
- function format(string) {
7
- var args = Array.prototype.slice.call(arguments, 1);
8
- return string.replace(/{(\d+)}/g, function (match, n) {
9
- return typeof args[n] != 'undefined' ? args[n] : match;
10
- });
3
+ var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/;
4
+ var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/;
5
+ var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/;
6
+
7
+ var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/;
8
+ var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/;
9
+ var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/;
10
+
11
+ var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://";
12
+ var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})";
13
+ var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*";
14
+ var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path);
15
+
16
+ var overlay = {
17
+ token: function (stream) {
18
+
19
+ if (stream.match(rx_strong) && stream.match (/\W+|$/, false))
20
+ return 'strong';
21
+ if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false))
22
+ return 'em';
23
+ if (stream.match(rx_literal) && stream.match (/\W+|$/, false))
24
+ return 'string-2';
25
+ if (stream.match(rx_number))
26
+ return 'number';
27
+ if (stream.match(rx_positive))
28
+ return 'positive';
29
+ if (stream.match(rx_negative))
30
+ return 'negative';
31
+ if (stream.match(rx_uri))
32
+ return 'link';
33
+
34
+ while (stream.next() != null) {
35
+ if (stream.match(rx_strong, false)) break;
36
+ if (stream.match(rx_emphasis, false)) break;
37
+ if (stream.match(rx_literal, false)) break;
38
+ if (stream.match(rx_number, false)) break;
39
+ if (stream.match(rx_positive, false)) break;
40
+ if (stream.match(rx_negative, false)) break;
41
+ if (stream.match(rx_uri, false)) break;
42
+ }
43
+
44
+ return null;
11
45
  }
46
+ };
12
47
 
13
- function AssertException(message) {
14
- this.message = message;
15
- }
48
+ var mode = CodeMirror.getMode(
49
+ config, options.backdrop || 'rst-base'
50
+ );
16
51
 
17
- AssertException.prototype.toString = function () {
18
- return 'AssertException: ' + this.message;
19
- };
52
+ return CodeMirror.overlayMode(mode, overlay, true); // combine
53
+ }, 'python', 'stex');
20
54
 
21
- function assert(expression, message) {
22
- if (!expression) throw new AssertException(message);
23
- return expression;
24
- }
55
+ ///////////////////////////////////////////////////////////////////////////////
56
+ ///////////////////////////////////////////////////////////////////////////////
25
57
 
26
- ///////////////////////////////////////////////////////////////////////////
27
- ///////////////////////////////////////////////////////////////////////////
28
-
29
- var mode_python = CodeMirror.getMode(config, 'python');
30
- var mode_stex = CodeMirror.getMode(config, 'stex');
31
-
32
- ///////////////////////////////////////////////////////////////////////////
33
- ///////////////////////////////////////////////////////////////////////////
34
-
35
- var SEPA = "\\s+";
36
- var TAIL = "(?:\\s*|\\W|$)",
37
- rx_TAIL = new RegExp(format('^{0}', TAIL));
38
-
39
- var NAME =
40
- "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)",
41
- rx_NAME = new RegExp(format('^{0}', NAME));
42
- var NAME_WWS =
43
- "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)";
44
- var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);
45
-
46
- var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)";
47
- var TEXT2 = "(?:[^\\`]+)",
48
- rx_TEXT2 = new RegExp(format('^{0}', TEXT2));
49
-
50
- var rx_section = new RegExp(
51
- "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$");
52
- var rx_explicit = new RegExp(
53
- format('^\\.\\.{0}', SEPA));
54
- var rx_link = new RegExp(
55
- format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL));
56
- var rx_directive = new RegExp(
57
- format('^{0}::{1}', REF_NAME, TAIL));
58
- var rx_substitution = new RegExp(
59
- format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL));
60
- var rx_footnote = new RegExp(
61
- format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL));
62
- var rx_citation = new RegExp(
63
- format('^\\[{0}\\]{1}', REF_NAME, TAIL));
64
-
65
- var rx_substitution_ref = new RegExp(
66
- format('^\\|{0}\\|', TEXT1));
67
- var rx_footnote_ref = new RegExp(
68
- format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME));
69
- var rx_citation_ref = new RegExp(
70
- format('^\\[{0}\\]_', REF_NAME));
71
- var rx_link_ref1 = new RegExp(
72
- format('^{0}__?', REF_NAME));
73
- var rx_link_ref2 = new RegExp(
74
- format('^`{0}`_', TEXT2));
75
-
76
- var rx_role_pre = new RegExp(
77
- format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL));
78
- var rx_role_suf = new RegExp(
79
- format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL));
80
- var rx_role = new RegExp(
81
- format('^:{0}:{1}', NAME, TAIL));
82
-
83
- var rx_directive_name = new RegExp(format('^{0}', REF_NAME));
84
- var rx_directive_tail = new RegExp(format('^::{0}', TAIL));
85
- var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1));
86
- var rx_substitution_sepa = new RegExp(format('^{0}', SEPA));
87
- var rx_substitution_name = new RegExp(format('^{0}', REF_NAME));
88
- var rx_substitution_tail = new RegExp(format('^::{0}', TAIL));
89
- var rx_link_head = new RegExp("^_");
90
- var rx_link_name = new RegExp(format('^{0}|_', REF_NAME));
91
- var rx_link_tail = new RegExp(format('^:{0}', TAIL));
92
-
93
- var rx_verbatim = new RegExp('^::\\s*$');
94
- var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s');
95
-
96
- ///////////////////////////////////////////////////////////////////////////
97
- ///////////////////////////////////////////////////////////////////////////
98
-
99
- function to_normal(stream, state) {
100
- var token = null;
101
-
102
- if (stream.sol() && stream.match(rx_examples, false)) {
103
- change(state, to_mode, {
104
- mode: mode_python, local: mode_python.startState()
105
- });
106
- } else if (stream.sol() && stream.match(rx_explicit)) {
107
- change(state, to_explicit);
108
- token = 'meta';
109
- } else if (stream.sol() && stream.match(rx_section)) {
110
- change(state, to_normal);
111
- token = 'header';
112
- } else if (phase(state) == rx_role_pre ||
113
- stream.match(rx_role_pre, false)) {
114
-
115
- switch (stage(state)) {
116
- case 0:
117
- change(state, to_normal, context(rx_role_pre, 1));
118
- assert(stream.match(/^:/));
119
- token = 'meta';
120
- break;
121
- case 1:
122
- change(state, to_normal, context(rx_role_pre, 2));
123
- assert(stream.match(rx_NAME));
124
- token = 'keyword';
125
-
126
- if (stream.current().match(/^(?:math|latex)/)) {
127
- state.tmp_stex = true;
128
- }
129
- break;
130
- case 2:
131
- change(state, to_normal, context(rx_role_pre, 3));
132
- assert(stream.match(/^:`/));
133
- token = 'meta';
134
- break;
135
- case 3:
136
- if (state.tmp_stex) {
137
- state.tmp_stex = undefined; state.tmp = {
138
- mode: mode_stex, local: mode_stex.startState()
139
- };
140
- }
141
-
142
- if (state.tmp) {
143
- if (stream.peek() == '`') {
144
- change(state, to_normal, context(rx_role_pre, 4));
145
- state.tmp = undefined;
146
- break;
147
- }
148
-
149
- token = state.tmp.mode.token(stream, state.tmp.local);
150
- break;
151
- }
152
-
153
- change(state, to_normal, context(rx_role_pre, 4));
154
- assert(stream.match(rx_TEXT2));
155
- token = 'string';
156
- break;
157
- case 4:
158
- change(state, to_normal, context(rx_role_pre, 5));
159
- assert(stream.match(/^`/));
160
- token = 'meta';
161
- break;
162
- case 5:
163
- change(state, to_normal, context(rx_role_pre, 6));
164
- assert(stream.match(rx_TAIL));
165
- break;
166
- default:
167
- change(state, to_normal);
168
- assert(stream.current() == '');
169
- }
170
- } else if (phase(state) == rx_role_suf ||
171
- stream.match(rx_role_suf, false)) {
172
-
173
- switch (stage(state)) {
174
- case 0:
175
- change(state, to_normal, context(rx_role_suf, 1));
176
- assert(stream.match(/^`/));
177
- token = 'meta';
178
- break;
179
- case 1:
180
- change(state, to_normal, context(rx_role_suf, 2));
181
- assert(stream.match(rx_TEXT2));
182
- token = 'string';
183
- break;
184
- case 2:
185
- change(state, to_normal, context(rx_role_suf, 3));
186
- assert(stream.match(/^`:/));
187
- token = 'meta';
188
- break;
189
- case 3:
190
- change(state, to_normal, context(rx_role_suf, 4));
191
- assert(stream.match(rx_NAME));
192
- token = 'keyword';
193
- break;
194
- case 4:
195
- change(state, to_normal, context(rx_role_suf, 5));
196
- assert(stream.match(/^:/));
197
- token = 'meta';
198
- break;
199
- case 5:
200
- change(state, to_normal, context(rx_role_suf, 6));
201
- assert(stream.match(rx_TAIL));
202
- break;
203
- default:
204
- change(state, to_normal);
205
- assert(stream.current() == '');
206
- }
207
- } else if (phase(state) == rx_role || stream.match(rx_role, false)) {
208
-
209
- switch (stage(state)) {
210
- case 0:
211
- change(state, to_normal, context(rx_role, 1));
212
- assert(stream.match(/^:/));
213
- token = 'meta';
214
- break;
215
- case 1:
216
- change(state, to_normal, context(rx_role, 2));
217
- assert(stream.match(rx_NAME));
218
- token = 'keyword';
219
- break;
220
- case 2:
221
- change(state, to_normal, context(rx_role, 3));
222
- assert(stream.match(/^:/));
223
- token = 'meta';
224
- break;
225
- case 3:
226
- change(state, to_normal, context(rx_role, 4));
227
- assert(stream.match(rx_TAIL));
228
- break;
229
- default:
230
- change(state, to_normal);
231
- assert(stream.current() == '');
232
- }
233
- } else if (phase(state) == rx_substitution_ref ||
234
- stream.match(rx_substitution_ref, false)) {
235
-
236
- switch (stage(state)) {
237
- case 0:
238
- change(state, to_normal, context(rx_substitution_ref, 1));
239
- assert(stream.match(rx_substitution_text));
240
- token = 'variable-2';
241
- break;
242
- case 1:
243
- change(state, to_normal, context(rx_substitution_ref, 2));
244
- if (stream.match(/^_?_?/)) token = 'link';
245
- break;
246
- default:
247
- change(state, to_normal);
248
- assert(stream.current() == '');
249
- }
250
- } else if (stream.match(rx_footnote_ref)) {
251
- change(state, to_normal);
252
- token = 'quote';
253
- } else if (stream.match(rx_citation_ref)) {
254
- change(state, to_normal);
255
- token = 'quote';
256
- } else if (stream.match(rx_link_ref1)) {
257
- change(state, to_normal);
258
- if (!stream.peek() || stream.peek().match(/^\W$/)) {
259
- token = 'link';
260
- }
261
- } else if (phase(state) == rx_link_ref2 ||
262
- stream.match(rx_link_ref2, false)) {
263
-
264
- switch (stage(state)) {
265
- case 0:
266
- if (!stream.peek() || stream.peek().match(/^\W$/)) {
267
- change(state, to_normal, context(rx_link_ref2, 1));
268
- } else {
269
- stream.match(rx_link_ref2);
270
- }
271
- break;
272
- case 1:
273
- change(state, to_normal, context(rx_link_ref2, 2));
274
- assert(stream.match(/^`/));
275
- token = 'link';
276
- break;
277
- case 2:
278
- change(state, to_normal, context(rx_link_ref2, 3));
279
- assert(stream.match(rx_TEXT2));
280
- break;
281
- case 3:
282
- change(state, to_normal, context(rx_link_ref2, 4));
283
- assert(stream.match(/^`_/));
284
- token = 'link';
285
- break;
286
- default:
287
- change(state, to_normal);
288
- assert(stream.current() == '');
289
- }
290
- } else if (stream.match(rx_verbatim)) {
291
- change(state, to_verbatim);
292
- }
58
+ CodeMirror.defineMode('rst-base', function (config) {
293
59
 
294
- else {
295
- if (stream.next()) change(state, to_normal);
60
+ ///////////////////////////////////////////////////////////////////////////
61
+ ///////////////////////////////////////////////////////////////////////////
62
+
63
+ function format(string) {
64
+ var args = Array.prototype.slice.call(arguments, 1);
65
+ return string.replace(/{(\d+)}/g, function (match, n) {
66
+ return typeof args[n] != 'undefined' ? args[n] : match;
67
+ });
68
+ }
69
+
70
+ function AssertException(message) {
71
+ this.message = message;
72
+ }
73
+
74
+ AssertException.prototype.toString = function () {
75
+ return 'AssertException: ' + this.message;
76
+ };
77
+
78
+ function assert(expression, message) {
79
+ if (!expression) throw new AssertException(message);
80
+ return expression;
81
+ }
82
+
83
+ ///////////////////////////////////////////////////////////////////////////
84
+ ///////////////////////////////////////////////////////////////////////////
85
+
86
+ var mode_python = CodeMirror.getMode(config, 'python');
87
+ var mode_stex = CodeMirror.getMode(config, 'stex');
88
+
89
+ ///////////////////////////////////////////////////////////////////////////
90
+ ///////////////////////////////////////////////////////////////////////////
91
+
92
+ var SEPA = "\\s+";
93
+ var TAIL = "(?:\\s*|\\W|$)",
94
+ rx_TAIL = new RegExp(format('^{0}', TAIL));
95
+
96
+ var NAME =
97
+ "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)",
98
+ rx_NAME = new RegExp(format('^{0}', NAME));
99
+ var NAME_WWS =
100
+ "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)";
101
+ var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);
102
+
103
+ var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)";
104
+ var TEXT2 = "(?:[^\\`]+)",
105
+ rx_TEXT2 = new RegExp(format('^{0}', TEXT2));
106
+
107
+ var rx_section = new RegExp(
108
+ "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$");
109
+ var rx_explicit = new RegExp(
110
+ format('^\\.\\.{0}', SEPA));
111
+ var rx_link = new RegExp(
112
+ format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL));
113
+ var rx_directive = new RegExp(
114
+ format('^{0}::{1}', REF_NAME, TAIL));
115
+ var rx_substitution = new RegExp(
116
+ format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL));
117
+ var rx_footnote = new RegExp(
118
+ format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL));
119
+ var rx_citation = new RegExp(
120
+ format('^\\[{0}\\]{1}', REF_NAME, TAIL));
121
+
122
+ var rx_substitution_ref = new RegExp(
123
+ format('^\\|{0}\\|', TEXT1));
124
+ var rx_footnote_ref = new RegExp(
125
+ format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME));
126
+ var rx_citation_ref = new RegExp(
127
+ format('^\\[{0}\\]_', REF_NAME));
128
+ var rx_link_ref1 = new RegExp(
129
+ format('^{0}__?', REF_NAME));
130
+ var rx_link_ref2 = new RegExp(
131
+ format('^`{0}`_', TEXT2));
132
+
133
+ var rx_role_pre = new RegExp(
134
+ format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL));
135
+ var rx_role_suf = new RegExp(
136
+ format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL));
137
+ var rx_role = new RegExp(
138
+ format('^:{0}:{1}', NAME, TAIL));
139
+
140
+ var rx_directive_name = new RegExp(format('^{0}', REF_NAME));
141
+ var rx_directive_tail = new RegExp(format('^::{0}', TAIL));
142
+ var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1));
143
+ var rx_substitution_sepa = new RegExp(format('^{0}', SEPA));
144
+ var rx_substitution_name = new RegExp(format('^{0}', REF_NAME));
145
+ var rx_substitution_tail = new RegExp(format('^::{0}', TAIL));
146
+ var rx_link_head = new RegExp("^_");
147
+ var rx_link_name = new RegExp(format('^{0}|_', REF_NAME));
148
+ var rx_link_tail = new RegExp(format('^:{0}', TAIL));
149
+
150
+ var rx_verbatim = new RegExp('^::\\s*$');
151
+ var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s');
152
+
153
+ ///////////////////////////////////////////////////////////////////////////
154
+ ///////////////////////////////////////////////////////////////////////////
155
+
156
+ function to_normal(stream, state) {
157
+ var token = null;
158
+
159
+ if (stream.sol() && stream.match(rx_examples, false)) {
160
+ change(state, to_mode, {
161
+ mode: mode_python, local: CodeMirror.startState(mode_python)
162
+ });
163
+ } else if (stream.sol() && stream.match(rx_explicit)) {
164
+ change(state, to_explicit);
165
+ token = 'meta';
166
+ } else if (stream.sol() && stream.match(rx_section)) {
167
+ change(state, to_normal);
168
+ token = 'header';
169
+ } else if (phase(state) == rx_role_pre ||
170
+ stream.match(rx_role_pre, false)) {
171
+
172
+ switch (stage(state)) {
173
+ case 0:
174
+ change(state, to_normal, context(rx_role_pre, 1));
175
+ assert(stream.match(/^:/));
176
+ token = 'meta';
177
+ break;
178
+ case 1:
179
+ change(state, to_normal, context(rx_role_pre, 2));
180
+ assert(stream.match(rx_NAME));
181
+ token = 'keyword';
182
+
183
+ if (stream.current().match(/^(?:math|latex)/)) {
184
+ state.tmp_stex = true;
185
+ }
186
+ break;
187
+ case 2:
188
+ change(state, to_normal, context(rx_role_pre, 3));
189
+ assert(stream.match(/^:`/));
190
+ token = 'meta';
191
+ break;
192
+ case 3:
193
+ if (state.tmp_stex) {
194
+ state.tmp_stex = undefined; state.tmp = {
195
+ mode: mode_stex, local: CodeMirror.startState(mode_stex)
196
+ };
296
197
  }
297
198
 
298
- return token;
299
- }
199
+ if (state.tmp) {
200
+ if (stream.peek() == '`') {
201
+ change(state, to_normal, context(rx_role_pre, 4));
202
+ state.tmp = undefined;
203
+ break;
204
+ }
300
205
 
301
- ///////////////////////////////////////////////////////////////////////////
302
- ///////////////////////////////////////////////////////////////////////////
303
-
304
- function to_explicit(stream, state) {
305
- var token = null;
306
-
307
- if (phase(state) == rx_substitution ||
308
- stream.match(rx_substitution, false)) {
309
-
310
- switch (stage(state)) {
311
- case 0:
312
- change(state, to_explicit, context(rx_substitution, 1));
313
- assert(stream.match(rx_substitution_text));
314
- token = 'variable-2';
315
- break;
316
- case 1:
317
- change(state, to_explicit, context(rx_substitution, 2));
318
- assert(stream.match(rx_substitution_sepa));
319
- break;
320
- case 2:
321
- change(state, to_explicit, context(rx_substitution, 3));
322
- assert(stream.match(rx_substitution_name));
323
- token = 'keyword';
324
- break;
325
- case 3:
326
- change(state, to_explicit, context(rx_substitution, 4));
327
- assert(stream.match(rx_substitution_tail));
328
- token = 'meta';
329
- break;
330
- default:
331
- change(state, to_normal);
332
- assert(stream.current() == '');
333
- }
334
- } else if (phase(state) == rx_directive ||
335
- stream.match(rx_directive, false)) {
336
-
337
- switch (stage(state)) {
338
- case 0:
339
- change(state, to_explicit, context(rx_directive, 1));
340
- assert(stream.match(rx_directive_name));
341
- token = 'keyword';
342
-
343
- if (stream.current().match(/^(?:math|latex)/))
344
- state.tmp_stex = true;
345
- else if (stream.current().match(/^python/))
346
- state.tmp_py = true;
347
- break;
348
- case 1:
349
- change(state, to_explicit, context(rx_directive, 2));
350
- assert(stream.match(rx_directive_tail));
351
- token = 'meta';
352
-
353
- if (stream.match(/^latex\s*$/) || state.tmp_stex) {
354
- state.tmp_stex = undefined; change(state, to_mode, {
355
- mode: mode_stex, local: mode_stex.startState()
356
- });
357
- }
358
- break;
359
- case 2:
360
- change(state, to_explicit, context(rx_directive, 3));
361
- if (stream.match(/^python\s*$/) || state.tmp_py) {
362
- state.tmp_py = undefined; change(state, to_mode, {
363
- mode: mode_python, local: mode_python.startState()
364
- });
365
- }
366
- break;
367
- default:
368
- change(state, to_normal);
369
- assert(stream.current() == '');
370
- }
371
- } else if (phase(state) == rx_link || stream.match(rx_link, false)) {
372
-
373
- switch (stage(state)) {
374
- case 0:
375
- change(state, to_explicit, context(rx_link, 1));
376
- assert(stream.match(rx_link_head));
377
- assert(stream.match(rx_link_name));
378
- token = 'link';
379
- break;
380
- case 1:
381
- change(state, to_explicit, context(rx_link, 2));
382
- assert(stream.match(rx_link_tail));
383
- token = 'meta';
384
- break;
385
- default:
386
- change(state, to_normal);
387
- assert(stream.current() == '');
388
- }
389
- } else if (stream.match(rx_footnote)) {
390
- change(state, to_normal);
391
- token = 'quote';
392
- } else if (stream.match(rx_citation)) {
393
- change(state, to_normal);
394
- token = 'quote';
206
+ token = state.tmp.mode.token(stream, state.tmp.local);
207
+ break;
395
208
  }
396
209
 
397
- else {
398
- stream.eatSpace();
399
- if (stream.eol()) {
400
- change(state, to_normal);
401
- } else {
402
- stream.skipToEnd();
403
- change(state, to_comment);
404
- token = 'comment';
405
- }
210
+ change(state, to_normal, context(rx_role_pre, 4));
211
+ assert(stream.match(rx_TEXT2));
212
+ token = 'string';
213
+ break;
214
+ case 4:
215
+ change(state, to_normal, context(rx_role_pre, 5));
216
+ assert(stream.match(/^`/));
217
+ token = 'meta';
218
+ break;
219
+ case 5:
220
+ change(state, to_normal, context(rx_role_pre, 6));
221
+ assert(stream.match(rx_TAIL));
222
+ break;
223
+ default:
224
+ change(state, to_normal);
225
+ assert(stream.current() == '');
226
+ }
227
+ } else if (phase(state) == rx_role_suf ||
228
+ stream.match(rx_role_suf, false)) {
229
+
230
+ switch (stage(state)) {
231
+ case 0:
232
+ change(state, to_normal, context(rx_role_suf, 1));
233
+ assert(stream.match(/^`/));
234
+ token = 'meta';
235
+ break;
236
+ case 1:
237
+ change(state, to_normal, context(rx_role_suf, 2));
238
+ assert(stream.match(rx_TEXT2));
239
+ token = 'string';
240
+ break;
241
+ case 2:
242
+ change(state, to_normal, context(rx_role_suf, 3));
243
+ assert(stream.match(/^`:/));
244
+ token = 'meta';
245
+ break;
246
+ case 3:
247
+ change(state, to_normal, context(rx_role_suf, 4));
248
+ assert(stream.match(rx_NAME));
249
+ token = 'keyword';
250
+ break;
251
+ case 4:
252
+ change(state, to_normal, context(rx_role_suf, 5));
253
+ assert(stream.match(/^:/));
254
+ token = 'meta';
255
+ break;
256
+ case 5:
257
+ change(state, to_normal, context(rx_role_suf, 6));
258
+ assert(stream.match(rx_TAIL));
259
+ break;
260
+ default:
261
+ change(state, to_normal);
262
+ assert(stream.current() == '');
263
+ }
264
+ } else if (phase(state) == rx_role || stream.match(rx_role, false)) {
265
+
266
+ switch (stage(state)) {
267
+ case 0:
268
+ change(state, to_normal, context(rx_role, 1));
269
+ assert(stream.match(/^:/));
270
+ token = 'meta';
271
+ break;
272
+ case 1:
273
+ change(state, to_normal, context(rx_role, 2));
274
+ assert(stream.match(rx_NAME));
275
+ token = 'keyword';
276
+ break;
277
+ case 2:
278
+ change(state, to_normal, context(rx_role, 3));
279
+ assert(stream.match(/^:/));
280
+ token = 'meta';
281
+ break;
282
+ case 3:
283
+ change(state, to_normal, context(rx_role, 4));
284
+ assert(stream.match(rx_TAIL));
285
+ break;
286
+ default:
287
+ change(state, to_normal);
288
+ assert(stream.current() == '');
289
+ }
290
+ } else if (phase(state) == rx_substitution_ref ||
291
+ stream.match(rx_substitution_ref, false)) {
292
+
293
+ switch (stage(state)) {
294
+ case 0:
295
+ change(state, to_normal, context(rx_substitution_ref, 1));
296
+ assert(stream.match(rx_substitution_text));
297
+ token = 'variable-2';
298
+ break;
299
+ case 1:
300
+ change(state, to_normal, context(rx_substitution_ref, 2));
301
+ if (stream.match(/^_?_?/)) token = 'link';
302
+ break;
303
+ default:
304
+ change(state, to_normal);
305
+ assert(stream.current() == '');
306
+ }
307
+ } else if (stream.match(rx_footnote_ref)) {
308
+ change(state, to_normal);
309
+ token = 'quote';
310
+ } else if (stream.match(rx_citation_ref)) {
311
+ change(state, to_normal);
312
+ token = 'quote';
313
+ } else if (stream.match(rx_link_ref1)) {
314
+ change(state, to_normal);
315
+ if (!stream.peek() || stream.peek().match(/^\W$/)) {
316
+ token = 'link';
317
+ }
318
+ } else if (phase(state) == rx_link_ref2 ||
319
+ stream.match(rx_link_ref2, false)) {
320
+
321
+ switch (stage(state)) {
322
+ case 0:
323
+ if (!stream.peek() || stream.peek().match(/^\W$/)) {
324
+ change(state, to_normal, context(rx_link_ref2, 1));
325
+ } else {
326
+ stream.match(rx_link_ref2);
406
327
  }
407
-
408
- return token;
409
- }
410
-
411
- ///////////////////////////////////////////////////////////////////////////
412
- ///////////////////////////////////////////////////////////////////////////
413
-
414
- function to_comment(stream, state) {
415
- return as_block(stream, state, 'comment');
328
+ break;
329
+ case 1:
330
+ change(state, to_normal, context(rx_link_ref2, 2));
331
+ assert(stream.match(/^`/));
332
+ token = 'link';
333
+ break;
334
+ case 2:
335
+ change(state, to_normal, context(rx_link_ref2, 3));
336
+ assert(stream.match(rx_TEXT2));
337
+ break;
338
+ case 3:
339
+ change(state, to_normal, context(rx_link_ref2, 4));
340
+ assert(stream.match(/^`_/));
341
+ token = 'link';
342
+ break;
343
+ default:
344
+ change(state, to_normal);
345
+ assert(stream.current() == '');
346
+ }
347
+ } else if (stream.match(rx_verbatim)) {
348
+ change(state, to_verbatim);
416
349
  }
417
350
 
418
- function to_verbatim(stream, state) {
419
- return as_block(stream, state, 'meta');
351
+ else {
352
+ if (stream.next()) change(state, to_normal);
420
353
  }
421
354
 
422
- function as_block(stream, state, token) {
423
- if (stream.eol() || stream.eatSpace()) {
424
- stream.skipToEnd();
425
- return token;
426
- } else {
427
- change(state, to_normal);
428
- return null;
355
+ return token;
356
+ }
357
+
358
+ ///////////////////////////////////////////////////////////////////////////
359
+ ///////////////////////////////////////////////////////////////////////////
360
+
361
+ function to_explicit(stream, state) {
362
+ var token = null;
363
+
364
+ if (phase(state) == rx_substitution ||
365
+ stream.match(rx_substitution, false)) {
366
+
367
+ switch (stage(state)) {
368
+ case 0:
369
+ change(state, to_explicit, context(rx_substitution, 1));
370
+ assert(stream.match(rx_substitution_text));
371
+ token = 'variable-2';
372
+ break;
373
+ case 1:
374
+ change(state, to_explicit, context(rx_substitution, 2));
375
+ assert(stream.match(rx_substitution_sepa));
376
+ break;
377
+ case 2:
378
+ change(state, to_explicit, context(rx_substitution, 3));
379
+ assert(stream.match(rx_substitution_name));
380
+ token = 'keyword';
381
+ break;
382
+ case 3:
383
+ change(state, to_explicit, context(rx_substitution, 4));
384
+ assert(stream.match(rx_substitution_tail));
385
+ token = 'meta';
386
+ break;
387
+ default:
388
+ change(state, to_normal);
389
+ assert(stream.current() == '');
390
+ }
391
+ } else if (phase(state) == rx_directive ||
392
+ stream.match(rx_directive, false)) {
393
+
394
+ switch (stage(state)) {
395
+ case 0:
396
+ change(state, to_explicit, context(rx_directive, 1));
397
+ assert(stream.match(rx_directive_name));
398
+ token = 'keyword';
399
+
400
+ if (stream.current().match(/^(?:math|latex)/))
401
+ state.tmp_stex = true;
402
+ else if (stream.current().match(/^python/))
403
+ state.tmp_py = true;
404
+ break;
405
+ case 1:
406
+ change(state, to_explicit, context(rx_directive, 2));
407
+ assert(stream.match(rx_directive_tail));
408
+ token = 'meta';
409
+
410
+ if (stream.match(/^latex\s*$/) || state.tmp_stex) {
411
+ state.tmp_stex = undefined; change(state, to_mode, {
412
+ mode: mode_stex, local: CodeMirror.startState(mode_stex)
413
+ });
429
414
  }
430
- }
431
-
432
- ///////////////////////////////////////////////////////////////////////////
433
- ///////////////////////////////////////////////////////////////////////////
434
-
435
- function to_mode(stream, state) {
436
-
437
- if (state.ctx.mode && state.ctx.local) {
438
-
439
- if (stream.sol()) {
440
- if (!stream.eatSpace()) change(state, to_normal);
441
- return null;
442
- }
443
-
444
- return state.ctx.mode.token(stream, state.ctx.local);
415
+ break;
416
+ case 2:
417
+ change(state, to_explicit, context(rx_directive, 3));
418
+ if (stream.match(/^python\s*$/) || state.tmp_py) {
419
+ state.tmp_py = undefined; change(state, to_mode, {
420
+ mode: mode_python, local: CodeMirror.startState(mode_python)
421
+ });
445
422
  }
446
-
423
+ break;
424
+ default:
447
425
  change(state, to_normal);
448
- return null;
449
- }
450
-
451
- ///////////////////////////////////////////////////////////////////////////
452
- ///////////////////////////////////////////////////////////////////////////
453
-
454
- function context(phase, stage, mode, local) {
455
- return {phase: phase, stage: stage, mode: mode, local: local};
456
- }
457
-
458
- function change(state, tok, ctx) {
459
- state.tok = tok;
460
- state.ctx = ctx || {};
426
+ assert(stream.current() == '');
427
+ }
428
+ } else if (phase(state) == rx_link || stream.match(rx_link, false)) {
429
+
430
+ switch (stage(state)) {
431
+ case 0:
432
+ change(state, to_explicit, context(rx_link, 1));
433
+ assert(stream.match(rx_link_head));
434
+ assert(stream.match(rx_link_name));
435
+ token = 'link';
436
+ break;
437
+ case 1:
438
+ change(state, to_explicit, context(rx_link, 2));
439
+ assert(stream.match(rx_link_tail));
440
+ token = 'meta';
441
+ break;
442
+ default:
443
+ change(state, to_normal);
444
+ assert(stream.current() == '');
445
+ }
446
+ } else if (stream.match(rx_footnote)) {
447
+ change(state, to_normal);
448
+ token = 'quote';
449
+ } else if (stream.match(rx_citation)) {
450
+ change(state, to_normal);
451
+ token = 'quote';
461
452
  }
462
453
 
463
- function stage(state) {
464
- return state.ctx.stage || 0;
454
+ else {
455
+ stream.eatSpace();
456
+ if (stream.eol()) {
457
+ change(state, to_normal);
458
+ } else {
459
+ stream.skipToEnd();
460
+ change(state, to_comment);
461
+ token = 'comment';
462
+ }
465
463
  }
466
464
 
467
- function phase(state) {
468
- return state.ctx.phase;
469
- }
465
+ return token;
466
+ }
470
467
 
471
- ///////////////////////////////////////////////////////////////////////////
472
- ///////////////////////////////////////////////////////////////////////////
468
+ ///////////////////////////////////////////////////////////////////////////
469
+ ///////////////////////////////////////////////////////////////////////////
473
470
 
474
- return {
475
- startState: function () {
476
- return {tok: to_normal, ctx: context(undefined, 0)};
477
- },
471
+ function to_comment(stream, state) {
472
+ return as_block(stream, state, 'comment');
473
+ }
478
474
 
479
- copyState: function (state) {
480
- return {tok: state.tok, ctx: state.ctx};
481
- },
475
+ function to_verbatim(stream, state) {
476
+ return as_block(stream, state, 'meta');
477
+ }
482
478
 
483
- innerMode: function (state) {
484
- return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode}
485
- : state.ctx ? {state: state.ctx.local, mode: state.ctx.mode}
486
- : null;
487
- },
479
+ function as_block(stream, state, token) {
480
+ if (stream.eol() || stream.eatSpace()) {
481
+ stream.skipToEnd();
482
+ return token;
483
+ } else {
484
+ change(state, to_normal);
485
+ return null;
486
+ }
487
+ }
488
488
 
489
- token: function (stream, state) {
490
- return state.tok(stream, state);
491
- }
492
- };
493
- }, 'python', 'stex');
489
+ ///////////////////////////////////////////////////////////////////////////
490
+ ///////////////////////////////////////////////////////////////////////////
494
491
 
495
- ///////////////////////////////////////////////////////////////////////////////
496
- ///////////////////////////////////////////////////////////////////////////////
492
+ function to_mode(stream, state) {
497
493
 
498
- CodeMirror.defineMode('rst', function (config, options) {
494
+ if (state.ctx.mode && state.ctx.local) {
499
495
 
500
- var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/;
501
- var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/;
502
- var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/;
503
-
504
- var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/;
505
- var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/;
506
- var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/;
507
-
508
- var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://";
509
- var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})";
510
- var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*";
511
- var rx_uri = new RegExp("^" +
512
- rx_uri_protocol + rx_uri_domain + rx_uri_path
513
- );
514
-
515
- var overlay = {
516
- token: function (stream) {
517
-
518
- if (stream.match(rx_strong) && stream.match (/\W+|$/, false))
519
- return 'strong';
520
- if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false))
521
- return 'em';
522
- if (stream.match(rx_literal) && stream.match (/\W+|$/, false))
523
- return 'string-2';
524
- if (stream.match(rx_number))
525
- return 'number';
526
- if (stream.match(rx_positive))
527
- return 'positive';
528
- if (stream.match(rx_negative))
529
- return 'negative';
530
- if (stream.match(rx_uri))
531
- return 'link';
532
-
533
- while (stream.next() != null) {
534
- if (stream.match(rx_strong, false)) break;
535
- if (stream.match(rx_emphasis, false)) break;
536
- if (stream.match(rx_literal, false)) break;
537
- if (stream.match(rx_number, false)) break;
538
- if (stream.match(rx_positive, false)) break;
539
- if (stream.match(rx_negative, false)) break;
540
- if (stream.match(rx_uri, false)) break;
541
- }
542
-
543
- return null;
544
- }
545
- };
496
+ if (stream.sol()) {
497
+ if (!stream.eatSpace()) change(state, to_normal);
498
+ return null;
499
+ }
546
500
 
547
- var mode = CodeMirror.getMode(
548
- config, options.backdrop || 'rst-base'
549
- );
501
+ return state.ctx.mode.token(stream, state.ctx.local);
502
+ }
550
503
 
551
- return CodeMirror.overlayMode(mode, overlay, true); // combine
504
+ change(state, to_normal);
505
+ return null;
506
+ }
507
+
508
+ ///////////////////////////////////////////////////////////////////////////
509
+ ///////////////////////////////////////////////////////////////////////////
510
+
511
+ function context(phase, stage, mode, local) {
512
+ return {phase: phase, stage: stage, mode: mode, local: local};
513
+ }
514
+
515
+ function change(state, tok, ctx) {
516
+ state.tok = tok;
517
+ state.ctx = ctx || {};
518
+ }
519
+
520
+ function stage(state) {
521
+ return state.ctx.stage || 0;
522
+ }
523
+
524
+ function phase(state) {
525
+ return state.ctx.phase;
526
+ }
527
+
528
+ ///////////////////////////////////////////////////////////////////////////
529
+ ///////////////////////////////////////////////////////////////////////////
530
+
531
+ return {
532
+ startState: function () {
533
+ return {tok: to_normal, ctx: context(undefined, 0)};
534
+ },
535
+
536
+ copyState: function (state) {
537
+ var ctx = state.ctx, tmp = state.tmp;
538
+ if (ctx.local)
539
+ ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)};
540
+ if (tmp)
541
+ tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)};
542
+ return {tok: state.tok, ctx: ctx, tmp: tmp};
543
+ },
544
+
545
+ innerMode: function (state) {
546
+ return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode}
547
+ : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode}
548
+ : null;
549
+ },
550
+
551
+ token: function (stream, state) {
552
+ return state.tok(stream, state);
553
+ }
554
+ };
552
555
  }, 'python', 'stex');
553
556
 
554
557
  ///////////////////////////////////////////////////////////////////////////////