annotate .cms/lib/codemirror/mode/rst/rst.js @ 1:1d486627aa1e draft default tip

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