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