| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | // CodeMirror, copyright (c) by Marijn Haverbeke and others
 | 
					
						
							| 
									
										
										
										
											2018-10-07 12:02:07 +02:00
										 |  |  | // Distributed under an MIT license: https://codemirror.net/LICENSE
 | 
					
						
							| 
									
										
										
										
											2018-01-21 10:33:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | (function(mod) { | 
					
						
							|  |  |  |   if (typeof exports == "object" && typeof module == "object") // CommonJS
 | 
					
						
							|  |  |  |     mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); | 
					
						
							|  |  |  |   else if (typeof define == "function" && define.amd) // AMD
 | 
					
						
							|  |  |  |     define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); | 
					
						
							|  |  |  |   else // Plain browser env
 | 
					
						
							|  |  |  |     mod(CodeMirror); | 
					
						
							|  |  |  | })(function(CodeMirror) { | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMode('rst', function (config, options) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; | 
					
						
							|  |  |  |   var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; | 
					
						
							|  |  |  |   var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; | 
					
						
							|  |  |  |   var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; | 
					
						
							|  |  |  |   var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; | 
					
						
							|  |  |  |   var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; | 
					
						
							|  |  |  |   var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; | 
					
						
							|  |  |  |   var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var overlay = { | 
					
						
							|  |  |  |     token: function (stream) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) | 
					
						
							|  |  |  |         return 'strong'; | 
					
						
							|  |  |  |       if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) | 
					
						
							|  |  |  |         return 'em'; | 
					
						
							|  |  |  |       if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) | 
					
						
							|  |  |  |         return 'string-2'; | 
					
						
							|  |  |  |       if (stream.match(rx_number)) | 
					
						
							|  |  |  |         return 'number'; | 
					
						
							|  |  |  |       if (stream.match(rx_positive)) | 
					
						
							|  |  |  |         return 'positive'; | 
					
						
							|  |  |  |       if (stream.match(rx_negative)) | 
					
						
							|  |  |  |         return 'negative'; | 
					
						
							|  |  |  |       if (stream.match(rx_uri)) | 
					
						
							|  |  |  |         return 'link'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       while (stream.next() != null) { | 
					
						
							|  |  |  |         if (stream.match(rx_strong, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_emphasis, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_literal, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_number, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_positive, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_negative, false)) break; | 
					
						
							|  |  |  |         if (stream.match(rx_uri, false)) break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var mode = CodeMirror.getMode( | 
					
						
							|  |  |  |     config, options.backdrop || 'rst-base' | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return CodeMirror.overlayMode(mode, overlay, true); // combine
 | 
					
						
							|  |  |  | }, 'python', 'stex'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMode('rst-base', function (config) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function format(string) { | 
					
						
							|  |  |  |     var args = Array.prototype.slice.call(arguments, 1); | 
					
						
							|  |  |  |     return string.replace(/{(\d+)}/g, function (match, n) { | 
					
						
							|  |  |  |       return typeof args[n] != 'undefined' ? args[n] : match; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var mode_python = CodeMirror.getMode(config, 'python'); | 
					
						
							|  |  |  |   var mode_stex = CodeMirror.getMode(config, 'stex'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var SEPA = "\\s+"; | 
					
						
							|  |  |  |   var TAIL = "(?:\\s*|\\W|$)", | 
					
						
							|  |  |  |   rx_TAIL = new RegExp(format('^{0}', TAIL)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var NAME = | 
					
						
							|  |  |  |     "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", | 
					
						
							|  |  |  |   rx_NAME = new RegExp(format('^{0}', NAME)); | 
					
						
							|  |  |  |   var NAME_WWS = | 
					
						
							|  |  |  |     "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; | 
					
						
							|  |  |  |   var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; | 
					
						
							|  |  |  |   var TEXT2 = "(?:[^\\`]+)", | 
					
						
							|  |  |  |   rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_section = new RegExp( | 
					
						
							|  |  |  |     "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); | 
					
						
							|  |  |  |   var rx_explicit = new RegExp( | 
					
						
							|  |  |  |     format('^\\.\\.{0}', SEPA)); | 
					
						
							|  |  |  |   var rx_link = new RegExp( | 
					
						
							|  |  |  |     format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); | 
					
						
							|  |  |  |   var rx_directive = new RegExp( | 
					
						
							|  |  |  |     format('^{0}::{1}', REF_NAME, TAIL)); | 
					
						
							|  |  |  |   var rx_substitution = new RegExp( | 
					
						
							|  |  |  |     format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); | 
					
						
							|  |  |  |   var rx_footnote = new RegExp( | 
					
						
							|  |  |  |     format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); | 
					
						
							|  |  |  |   var rx_citation = new RegExp( | 
					
						
							|  |  |  |     format('^\\[{0}\\]{1}', REF_NAME, TAIL)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_substitution_ref = new RegExp( | 
					
						
							|  |  |  |     format('^\\|{0}\\|', TEXT1)); | 
					
						
							|  |  |  |   var rx_footnote_ref = new RegExp( | 
					
						
							|  |  |  |     format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); | 
					
						
							|  |  |  |   var rx_citation_ref = new RegExp( | 
					
						
							|  |  |  |     format('^\\[{0}\\]_', REF_NAME)); | 
					
						
							|  |  |  |   var rx_link_ref1 = new RegExp( | 
					
						
							|  |  |  |     format('^{0}__?', REF_NAME)); | 
					
						
							|  |  |  |   var rx_link_ref2 = new RegExp( | 
					
						
							|  |  |  |     format('^`{0}`_', TEXT2)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_role_pre = new RegExp( | 
					
						
							|  |  |  |     format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); | 
					
						
							|  |  |  |   var rx_role_suf = new RegExp( | 
					
						
							|  |  |  |     format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); | 
					
						
							|  |  |  |   var rx_role = new RegExp( | 
					
						
							|  |  |  |     format('^:{0}:{1}', NAME, TAIL)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); | 
					
						
							|  |  |  |   var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); | 
					
						
							|  |  |  |   var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); | 
					
						
							|  |  |  |   var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); | 
					
						
							|  |  |  |   var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); | 
					
						
							|  |  |  |   var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); | 
					
						
							|  |  |  |   var rx_link_head = new RegExp("^_"); | 
					
						
							|  |  |  |   var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); | 
					
						
							|  |  |  |   var rx_link_tail = new RegExp(format('^:{0}', TAIL)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var rx_verbatim = new RegExp('^::\\s*$'); | 
					
						
							|  |  |  |   var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function to_normal(stream, state) { | 
					
						
							|  |  |  |     var token = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (stream.sol() && stream.match(rx_examples, false)) { | 
					
						
							|  |  |  |       change(state, to_mode, { | 
					
						
							|  |  |  |         mode: mode_python, local: CodeMirror.startState(mode_python) | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } else if (stream.sol() && stream.match(rx_explicit)) { | 
					
						
							|  |  |  |       change(state, to_explicit); | 
					
						
							|  |  |  |       token = 'meta'; | 
					
						
							|  |  |  |     } else if (stream.sol() && stream.match(rx_section)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       token = 'header'; | 
					
						
							|  |  |  |     } else if (phase(state) == rx_role_pre || | 
					
						
							|  |  |  |                stream.match(rx_role_pre, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 1)); | 
					
						
							|  |  |  |         stream.match(/^:/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 2)); | 
					
						
							|  |  |  |         stream.match(rx_NAME); | 
					
						
							|  |  |  |         token = 'keyword'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (stream.current().match(/^(?:math|latex)/)) { | 
					
						
							|  |  |  |           state.tmp_stex = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 3)); | 
					
						
							|  |  |  |         stream.match(/^:`/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         if (state.tmp_stex) { | 
					
						
							|  |  |  |           state.tmp_stex = undefined; state.tmp = { | 
					
						
							|  |  |  |             mode: mode_stex, local: CodeMirror.startState(mode_stex) | 
					
						
							|  |  |  |           }; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (state.tmp) { | 
					
						
							|  |  |  |           if (stream.peek() == '`') { | 
					
						
							|  |  |  |             change(state, to_normal, context(rx_role_pre, 4)); | 
					
						
							|  |  |  |             state.tmp = undefined; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           token = state.tmp.mode.token(stream, state.tmp.local); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 4)); | 
					
						
							|  |  |  |         stream.match(rx_TEXT2); | 
					
						
							|  |  |  |         token = 'string'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 4: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 5)); | 
					
						
							|  |  |  |         stream.match(/^`/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 5: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_pre, 6)); | 
					
						
							|  |  |  |         stream.match(rx_TAIL); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_role_suf || | 
					
						
							|  |  |  |                stream.match(rx_role_suf, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 1)); | 
					
						
							|  |  |  |         stream.match(/^`/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 2)); | 
					
						
							|  |  |  |         stream.match(rx_TEXT2); | 
					
						
							|  |  |  |         token = 'string'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 3)); | 
					
						
							|  |  |  |         stream.match(/^`:/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 4)); | 
					
						
							|  |  |  |         stream.match(rx_NAME); | 
					
						
							|  |  |  |         token = 'keyword'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 4: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 5)); | 
					
						
							|  |  |  |         stream.match(/^:/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 5: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role_suf, 6)); | 
					
						
							|  |  |  |         stream.match(rx_TAIL); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_role || stream.match(rx_role, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role, 1)); | 
					
						
							|  |  |  |         stream.match(/^:/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role, 2)); | 
					
						
							|  |  |  |         stream.match(rx_NAME); | 
					
						
							|  |  |  |         token = 'keyword'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role, 3)); | 
					
						
							|  |  |  |         stream.match(/^:/); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_role, 4)); | 
					
						
							|  |  |  |         stream.match(rx_TAIL); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_substitution_ref || | 
					
						
							|  |  |  |                stream.match(rx_substitution_ref, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_substitution_ref, 1)); | 
					
						
							|  |  |  |         stream.match(rx_substitution_text); | 
					
						
							|  |  |  |         token = 'variable-2'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_substitution_ref, 2)); | 
					
						
							|  |  |  |         if (stream.match(/^_?_?/)) token = 'link'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (stream.match(rx_footnote_ref)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       token = 'quote'; | 
					
						
							|  |  |  |     } else if (stream.match(rx_citation_ref)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       token = 'quote'; | 
					
						
							|  |  |  |     } else if (stream.match(rx_link_ref1)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       if (!stream.peek() || stream.peek().match(/^\W$/)) { | 
					
						
							|  |  |  |         token = 'link'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_link_ref2 || | 
					
						
							|  |  |  |                stream.match(rx_link_ref2, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         if (!stream.peek() || stream.peek().match(/^\W$/)) { | 
					
						
							|  |  |  |           change(state, to_normal, context(rx_link_ref2, 1)); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           stream.match(rx_link_ref2); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_link_ref2, 2)); | 
					
						
							|  |  |  |         stream.match(/^`/); | 
					
						
							|  |  |  |         token = 'link'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_link_ref2, 3)); | 
					
						
							|  |  |  |         stream.match(rx_TEXT2); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         change(state, to_normal, context(rx_link_ref2, 4)); | 
					
						
							|  |  |  |         stream.match(/^`_/); | 
					
						
							|  |  |  |         token = 'link'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (stream.match(rx_verbatim)) { | 
					
						
							|  |  |  |       change(state, to_verbatim); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |       if (stream.next()) change(state, to_normal); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return token; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function to_explicit(stream, state) { | 
					
						
							|  |  |  |     var token = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (phase(state) == rx_substitution || | 
					
						
							|  |  |  |         stream.match(rx_substitution, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_substitution, 1)); | 
					
						
							|  |  |  |         stream.match(rx_substitution_text); | 
					
						
							|  |  |  |         token = 'variable-2'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_substitution, 2)); | 
					
						
							|  |  |  |         stream.match(rx_substitution_sepa); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_substitution, 3)); | 
					
						
							|  |  |  |         stream.match(rx_substitution_name); | 
					
						
							|  |  |  |         token = 'keyword'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_substitution, 4)); | 
					
						
							|  |  |  |         stream.match(rx_substitution_tail); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_directive || | 
					
						
							|  |  |  |                stream.match(rx_directive, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_directive, 1)); | 
					
						
							|  |  |  |         stream.match(rx_directive_name); | 
					
						
							|  |  |  |         token = 'keyword'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (stream.current().match(/^(?:math|latex)/)) | 
					
						
							|  |  |  |           state.tmp_stex = true; | 
					
						
							|  |  |  |         else if (stream.current().match(/^python/)) | 
					
						
							|  |  |  |           state.tmp_py = true; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_directive, 2)); | 
					
						
							|  |  |  |         stream.match(rx_directive_tail); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (stream.match(/^latex\s*$/) || state.tmp_stex) { | 
					
						
							|  |  |  |           state.tmp_stex = undefined; change(state, to_mode, { | 
					
						
							|  |  |  |             mode: mode_stex, local: CodeMirror.startState(mode_stex) | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_directive, 3)); | 
					
						
							|  |  |  |         if (stream.match(/^python\s*$/) || state.tmp_py) { | 
					
						
							|  |  |  |           state.tmp_py = undefined; change(state, to_mode, { | 
					
						
							|  |  |  |             mode: mode_python, local: CodeMirror.startState(mode_python) | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (phase(state) == rx_link || stream.match(rx_link, false)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       switch (stage(state)) { | 
					
						
							|  |  |  |       case 0: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_link, 1)); | 
					
						
							|  |  |  |         stream.match(rx_link_head); | 
					
						
							|  |  |  |         stream.match(rx_link_name); | 
					
						
							|  |  |  |         token = 'link'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         change(state, to_explicit, context(rx_link, 2)); | 
					
						
							|  |  |  |         stream.match(rx_link_tail); | 
					
						
							|  |  |  |         token = 'meta'; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else if (stream.match(rx_footnote)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       token = 'quote'; | 
					
						
							|  |  |  |     } else if (stream.match(rx_citation)) { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       token = 'quote'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |       stream.eatSpace(); | 
					
						
							|  |  |  |       if (stream.eol()) { | 
					
						
							|  |  |  |         change(state, to_normal); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         stream.skipToEnd(); | 
					
						
							|  |  |  |         change(state, to_comment); | 
					
						
							|  |  |  |         token = 'comment'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return token; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function to_comment(stream, state) { | 
					
						
							|  |  |  |     return as_block(stream, state, 'comment'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function to_verbatim(stream, state) { | 
					
						
							|  |  |  |     return as_block(stream, state, 'meta'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function as_block(stream, state, token) { | 
					
						
							|  |  |  |     if (stream.eol() || stream.eatSpace()) { | 
					
						
							|  |  |  |       stream.skipToEnd(); | 
					
						
							|  |  |  |       return token; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       change(state, to_normal); | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function to_mode(stream, state) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (state.ctx.mode && state.ctx.local) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (stream.sol()) { | 
					
						
							|  |  |  |         if (!stream.eatSpace()) change(state, to_normal); | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return state.ctx.mode.token(stream, state.ctx.local); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     change(state, to_normal); | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function context(phase, stage, mode, local) { | 
					
						
							|  |  |  |     return {phase: phase, stage: stage, mode: mode, local: local}; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function change(state, tok, ctx) { | 
					
						
							|  |  |  |     state.tok = tok; | 
					
						
							|  |  |  |     state.ctx = ctx || {}; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function stage(state) { | 
					
						
							|  |  |  |     return state.ctx.stage || 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function phase(state) { | 
					
						
							|  |  |  |     return state.ctx.phase; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  |   ///////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     startState: function () { | 
					
						
							|  |  |  |       return {tok: to_normal, ctx: context(undefined, 0)}; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     copyState: function (state) { | 
					
						
							|  |  |  |       var ctx = state.ctx, tmp = state.tmp; | 
					
						
							|  |  |  |       if (ctx.local) | 
					
						
							|  |  |  |         ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; | 
					
						
							|  |  |  |       if (tmp) | 
					
						
							|  |  |  |         tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; | 
					
						
							|  |  |  |       return {tok: state.tok, ctx: ctx, tmp: tmp}; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     innerMode: function (state) { | 
					
						
							|  |  |  |       return state.tmp      ? {state: state.tmp.local, mode: state.tmp.mode} | 
					
						
							|  |  |  |       : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} | 
					
						
							|  |  |  |       : null; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     token: function (stream, state) { | 
					
						
							|  |  |  |       return state.tok(stream, state); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }, 'python', 'stex'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CodeMirror.defineMIME('text/x-rst', 'rst'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }); |