| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 | CodeMirror.defineMode('rst', function(config, options) {    function setState(state, fn, ctx) {        state.fn = fn;        setCtx(state, ctx);    }    function setCtx(state, ctx) {        state.ctx = ctx || {};    }    function setNormal(state, ch) {        if (ch && (typeof ch !== 'string')) {            var str = ch.current();            ch = str[str.length-1];        }        setState(state, normal, {back: ch});    }    function hasMode(mode) {        if (mode) {            var modes = CodeMirror.listModes();            for (var i in modes) {                if (modes[i] == mode) {                    return true;                }            }        }        return false;    }    function getMode(mode) {        if (hasMode(mode)) {            return CodeMirror.getMode(config, mode);        } else {            return null;        }    }    var verbatimMode = getMode(options.verbatim);    var pythonMode = getMode('python');    var reSection = /^[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]/;    var reDirective = /^\s*\w([-:.\w]*\w)?::(\s|$)/;    var reHyperlink = /^\s*_[\w-]+:(\s|$)/;    var reFootnote = /^\s*\[(\d+|#)\](\s|$)/;    var reCitation = /^\s*\[[A-Za-z][\w-]*\](\s|$)/;    var reFootnoteRef = /^\[(\d+|#)\]_/;    var reCitationRef = /^\[[A-Za-z][\w-]*\]_/;    var reDirectiveMarker = /^\.\.(\s|$)/;    var reVerbatimMarker = /^::\s*$/;    var rePreInline = /^[-\s"([{</:]/;    var rePostInline = /^[-\s`'")\]}>/:.,;!?\\_]/;    var reEnumeratedList = /^\s*((\d+|[A-Za-z#])[.)]|\((\d+|[A-Z-a-z#])\))\s/;    var reBulletedList = /^\s*[-\+\*]\s/;    var reExamples = /^\s+(>>>|In \[\d+\]:)\s/;    function normal(stream, state) {        var ch, sol, i;        if (stream.eat(/\\/)) {            ch = stream.next();            setNormal(state, ch);            return null;        }        sol = stream.sol();        if (sol && (ch = stream.eat(reSection))) {            for (i = 0; stream.eat(ch); i++);            if (i >= 3 && stream.match(/^\s*$/)) {                setNormal(state, null);                return 'section';            } else {                stream.backUp(i + 1);            }        }        if (sol && stream.match(reDirectiveMarker)) {            if (!stream.eol()) {                setState(state, directive);            }            return 'directive-marker';        }        if (stream.match(reVerbatimMarker)) {            if (!verbatimMode) {                setState(state, verbatim);            } else {                var mode = verbatimMode;                setState(state, verbatim, {                    mode: mode,                    local: mode.startState()                });            }            return 'verbatim-marker';        }        if (sol && stream.match(reExamples, false)) {            if (!pythonMode) {                setState(state, verbatim);                return 'verbatim-marker';            } else {                var mode = pythonMode;                setState(state, verbatim, {                    mode: mode,                    local: mode.startState()                });                return null;            }        }        if (sol && (stream.match(reEnumeratedList) ||                    stream.match(reBulletedList))) {            setNormal(state, stream);            return 'list';        }        function testBackward(re) {            return sol || !state.ctx.back || re.test(state.ctx.back);        }        function testForward(re) {            return stream.eol() || stream.match(re, false);        }        function testInline(re) {            return stream.match(re) && testBackward(/\W/) && testForward(/\W/);        }        if (testInline(reFootnoteRef)) {            setNormal(state, stream);            return 'footnote';        }        if (testInline(reCitationRef)) {            setNormal(state, stream);            return 'citation';        }        ch = stream.next();        if (testBackward(rePreInline)) {            if ((ch === ':' || ch === '|') && stream.eat(/\S/)) {                var token;                if (ch === ':') {                    token = 'role';                } else {                    token = 'replacement';                }                setState(state, inline, {                    ch: ch,                    wide: false,                    prev: null,                    token: token                });                return token;            }            if (ch === '*' || ch === '`') {                var orig = ch,                    wide = false;                ch = stream.next();                if (ch == orig) {                    wide = true;                    ch = stream.next();                }                if (ch && !/\s/.test(ch)) {                    var token;                    if (orig === '*') {                        token = wide ? 'strong' : 'emphasis';                    } else {                        token = wide ? 'inline' : 'interpreted';                    }                    setState(state, inline, {                        ch: orig,               // inline() has to know what to search for                        wide: wide,             // are we looking for `ch` or `chch`                        prev: null,             // terminator must not be preceeded with whitespace                        token: token            // I don't want to recompute this all the time                    });                    return token;                }            }        }        setNormal(state, ch);        return null;    }    function inline(stream, state) {        var ch = stream.next(),            token = state.ctx.token;        function finish(ch) {            state.ctx.prev = ch;            return token;        }        if (ch != state.ctx.ch) {            return finish(ch);        }        if (/\s/.test(state.ctx.prev)) {            return finish(ch);        }        if (state.ctx.wide) {            ch = stream.next();            if (ch != state.ctx.ch) {                return finish(ch);            }        }        if (!stream.eol() && !rePostInline.test(stream.peek())) {            if (state.ctx.wide) {                stream.backUp(1);            }            return finish(ch);        }        setState(state, normal);        setNormal(state, ch);        return token;    }    function directive(stream, state) {        var token = null;        if (stream.match(reDirective)) {            token = 'directive';        } else if (stream.match(reHyperlink)) {            token = 'hyperlink';        } else if (stream.match(reFootnote)) {            token = 'footnote';        } else if (stream.match(reCitation)) {            token = 'citation';        } else {            stream.eatSpace();            if (stream.eol()) {                setNormal(state, stream);                return null;            } else {                stream.skipToEnd();                setState(state, comment);                return 'comment';            }        }        setState(state, body, {start: true});        return token;    }    function body(stream, state) {        var token = 'body';        if (!state.ctx.start || stream.sol()) {            return block(stream, state, token);        }        stream.skipToEnd();        setCtx(state);        return token;    }    function comment(stream, state) {        return block(stream, state, 'comment');    }    function verbatim(stream, state) {        if (!verbatimMode) {            return block(stream, state, 'verbatim');        } else {            if (stream.sol()) {                if (!stream.eatSpace()) {                    setNormal(state, stream);                }                return null;            }            return verbatimMode.token(stream, state.ctx.local);        }    }    function block(stream, state, token) {        if (stream.eol() || stream.eatSpace()) {            stream.skipToEnd();            return token;        } else {            setNormal(state, stream);            return null;        }    }    return {        startState: function() {            return {fn: normal, ctx: {}};        },        copyState: function(state) {            return {fn: state.fn, ctx: state.ctx};        },        token: function(stream, state) {            var token = state.fn(stream, state);            return token;        }    };});CodeMirror.defineMIME("text/x-rst", "rst");
 |