5
if (typeof exports == "object" && typeof module == "object")
6
mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay"));
7
else if (typeof define == "function" && define.amd)
8
define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod);
11
})(function(CodeMirror) {
14
CodeMirror.defineMode('rst', function (config, options) {
16
var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/;
17
var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/;
18
var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/;
20
var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/;
21
var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/;
22
var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/;
24
var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://";
25
var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})";
26
var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*";
27
var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path);
30
token: function (stream) {
32
if (stream.match(rx_strong) && stream.match (/\W+|$/, false))
34
if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false))
36
if (stream.match(rx_literal) && stream.match (/\W+|$/, false))
38
if (stream.match(rx_number))
40
if (stream.match(rx_positive))
42
if (stream.match(rx_negative))
44
if (stream.match(rx_uri))
47
while (stream.next() != null) {
48
if (stream.match(rx_strong, false)) break;
49
if (stream.match(rx_emphasis, false)) break;
50
if (stream.match(rx_literal, false)) break;
51
if (stream.match(rx_number, false)) break;
52
if (stream.match(rx_positive, false)) break;
53
if (stream.match(rx_negative, false)) break;
54
if (stream.match(rx_uri, false)) break;
61
var mode = CodeMirror.getMode(
62
config, options.backdrop || 'rst-base'
65
return CodeMirror.overlayMode(mode, overlay, true);
71
CodeMirror.defineMode('rst-base', function (config) {
76
function format(string) {
77
var args = Array.prototype.slice.call(arguments, 1);
78
return string.replace(/{(\d+)}/g, function (match, n) {
79
return typeof args[n] != 'undefined' ? args[n] : match;
86
var mode_python = CodeMirror.getMode(config, 'python');
87
var mode_stex = CodeMirror.getMode(config, 'stex');
93
var TAIL = "(?:\\s*|\\W|$)",
94
rx_TAIL = new RegExp(format('^{0}', TAIL));
97
"(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)",
98
rx_NAME = new RegExp(format('^{0}', NAME));
100
"(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)";
101
var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS);
103
var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)";
104
var TEXT2 = "(?:[^\\`]+)",
105
rx_TEXT2 = new RegExp(format('^{0}', TEXT2));
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));
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));
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));
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));
150
var rx_verbatim = new RegExp('^::\\s*$');
151
var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s');
156
function to_normal(stream, state) {
159
if (stream.sol() && stream.match(rx_examples, false)) {
160
change(state, to_mode, {
161
mode: mode_python, local: CodeMirror.startState(mode_python)
163
} else if (stream.sol() && stream.match(rx_explicit)) {
164
change(state, to_explicit);
166
} else if (stream.sol() && stream.match(rx_section)) {
167
change(state, to_normal);
169
} else if (phase(state) == rx_role_pre ||
170
stream.match(rx_role_pre, false)) {
172
switch (stage(state)) {
174
change(state, to_normal, context(rx_role_pre, 1));
179
change(state, to_normal, context(rx_role_pre, 2));
180
stream.match(rx_NAME);
183
if (stream.current().match(/^(?:math|latex)/)) {
184
state.tmp_stex = true;
188
change(state, to_normal, context(rx_role_pre, 3));
193
if (state.tmp_stex) {
194
state.tmp_stex = undefined; state.tmp = {
195
mode: mode_stex, local: CodeMirror.startState(mode_stex)
200
if (stream.peek() == '`') {
201
change(state, to_normal, context(rx_role_pre, 4));
202
state.tmp = undefined;
206
token = state.tmp.mode.token(stream, state.tmp.local);
210
change(state, to_normal, context(rx_role_pre, 4));
211
stream.match(rx_TEXT2);
215
change(state, to_normal, context(rx_role_pre, 5));
220
change(state, to_normal, context(rx_role_pre, 6));
221
stream.match(rx_TAIL);
224
change(state, to_normal);
226
} else if (phase(state) == rx_role_suf ||
227
stream.match(rx_role_suf, false)) {
229
switch (stage(state)) {
231
change(state, to_normal, context(rx_role_suf, 1));
236
change(state, to_normal, context(rx_role_suf, 2));
237
stream.match(rx_TEXT2);
241
change(state, to_normal, context(rx_role_suf, 3));
246
change(state, to_normal, context(rx_role_suf, 4));
247
stream.match(rx_NAME);
251
change(state, to_normal, context(rx_role_suf, 5));
256
change(state, to_normal, context(rx_role_suf, 6));
257
stream.match(rx_TAIL);
260
change(state, to_normal);
262
} else if (phase(state) == rx_role || stream.match(rx_role, false)) {
264
switch (stage(state)) {
266
change(state, to_normal, context(rx_role, 1));
271
change(state, to_normal, context(rx_role, 2));
272
stream.match(rx_NAME);
276
change(state, to_normal, context(rx_role, 3));
281
change(state, to_normal, context(rx_role, 4));
282
stream.match(rx_TAIL);
285
change(state, to_normal);
287
} else if (phase(state) == rx_substitution_ref ||
288
stream.match(rx_substitution_ref, false)) {
290
switch (stage(state)) {
292
change(state, to_normal, context(rx_substitution_ref, 1));
293
stream.match(rx_substitution_text);
294
token = 'variable-2';
297
change(state, to_normal, context(rx_substitution_ref, 2));
298
if (stream.match(/^_?_?/)) token = 'link';
301
change(state, to_normal);
303
} else if (stream.match(rx_footnote_ref)) {
304
change(state, to_normal);
306
} else if (stream.match(rx_citation_ref)) {
307
change(state, to_normal);
309
} else if (stream.match(rx_link_ref1)) {
310
change(state, to_normal);
311
if (!stream.peek() || stream.peek().match(/^\W$/)) {
314
} else if (phase(state) == rx_link_ref2 ||
315
stream.match(rx_link_ref2, false)) {
317
switch (stage(state)) {
319
if (!stream.peek() || stream.peek().match(/^\W$/)) {
320
change(state, to_normal, context(rx_link_ref2, 1));
322
stream.match(rx_link_ref2);
326
change(state, to_normal, context(rx_link_ref2, 2));
331
change(state, to_normal, context(rx_link_ref2, 3));
332
stream.match(rx_TEXT2);
335
change(state, to_normal, context(rx_link_ref2, 4));
340
change(state, to_normal);
342
} else if (stream.match(rx_verbatim)) {
343
change(state, to_verbatim);
347
if (stream.next()) change(state, to_normal);
356
function to_explicit(stream, state) {
359
if (phase(state) == rx_substitution ||
360
stream.match(rx_substitution, false)) {
362
switch (stage(state)) {
364
change(state, to_explicit, context(rx_substitution, 1));
365
stream.match(rx_substitution_text);
366
token = 'variable-2';
369
change(state, to_explicit, context(rx_substitution, 2));
370
stream.match(rx_substitution_sepa);
373
change(state, to_explicit, context(rx_substitution, 3));
374
stream.match(rx_substitution_name);
378
change(state, to_explicit, context(rx_substitution, 4));
379
stream.match(rx_substitution_tail);
383
change(state, to_normal);
385
} else if (phase(state) == rx_directive ||
386
stream.match(rx_directive, false)) {
388
switch (stage(state)) {
390
change(state, to_explicit, context(rx_directive, 1));
391
stream.match(rx_directive_name);
394
if (stream.current().match(/^(?:math|latex)/))
395
state.tmp_stex = true;
396
else if (stream.current().match(/^python/))
400
change(state, to_explicit, context(rx_directive, 2));
401
stream.match(rx_directive_tail);
404
if (stream.match(/^latex\s*$/) || state.tmp_stex) {
405
state.tmp_stex = undefined; change(state, to_mode, {
406
mode: mode_stex, local: CodeMirror.startState(mode_stex)
411
change(state, to_explicit, context(rx_directive, 3));
412
if (stream.match(/^python\s*$/) || state.tmp_py) {
413
state.tmp_py = undefined; change(state, to_mode, {
414
mode: mode_python, local: CodeMirror.startState(mode_python)
419
change(state, to_normal);
421
} else if (phase(state) == rx_link || stream.match(rx_link, false)) {
423
switch (stage(state)) {
425
change(state, to_explicit, context(rx_link, 1));
426
stream.match(rx_link_head);
427
stream.match(rx_link_name);
431
change(state, to_explicit, context(rx_link, 2));
432
stream.match(rx_link_tail);
436
change(state, to_normal);
438
} else if (stream.match(rx_footnote)) {
439
change(state, to_normal);
441
} else if (stream.match(rx_citation)) {
442
change(state, to_normal);
449
change(state, to_normal);
452
change(state, to_comment);
463
function to_comment(stream, state) {
464
return as_block(stream, state, 'comment');
467
function to_verbatim(stream, state) {
468
return as_block(stream, state, 'meta');
471
function as_block(stream, state, token) {
472
if (stream.eol() || stream.eatSpace()) {
476
change(state, to_normal);
484
function to_mode(stream, state) {
486
if (state.ctx.mode && state.ctx.local) {
489
if (!stream.eatSpace()) change(state, to_normal);
493
return state.ctx.mode.token(stream, state.ctx.local);
496
change(state, to_normal);
503
function context(phase, stage, mode, local) {
504
return {phase: phase, stage: stage, mode: mode, local: local};
507
function change(state, tok, ctx) {
509
state.ctx = ctx || {};
512
function stage(state) {
513
return state.ctx.stage || 0;
516
function phase(state) {
517
return state.ctx.phase;
524
startState: function () {
525
return {tok: to_normal, ctx: context(undefined, 0)};
528
copyState: function (state) {
529
var ctx = state.ctx, tmp = state.tmp;
531
ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)};
533
tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)};
534
return {tok: state.tok, ctx: ctx, tmp: tmp};
537
innerMode: function (state) {
538
return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode}
539
: state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode}
543
token: function (stream, state) {
544
return state.tok(stream, state);
552
CodeMirror.defineMIME('text/x-rst', 'rst');