##// END OF EJS Templates
Clean code, retab and minor fix...
Clean code, retab and minor fix remove unused code, convert some tab to space, and correct some semicolon according to jslint jlint fixes

File last commit:

r5970:b6bb1663
r7170:e0eb36bc
Show More
rst.js
326 lines | 8.2 KiB | application/javascript | JavascriptLexer
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 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);
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 return 'header';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else {
stream.backUp(i + 1);
}
}
if (sol && stream.match(reDirectiveMarker)) {
if (!stream.eol()) {
setState(state, directive);
}
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 return 'meta';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 }
if (stream.match(reVerbatimMarker)) {
if (!verbatimMode) {
setState(state, verbatim);
} else {
var mode = verbatimMode;
setState(state, verbatim, {
mode: mode,
local: mode.startState()
});
}
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 return 'meta';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 }
if (sol && stream.match(reExamples, false)) {
if (!pythonMode) {
setState(state, verbatim);
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 return 'meta';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else {
var mode = pythonMode;
setState(state, verbatim, {
mode: mode,
local: mode.startState()
});
return null;
}
}
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 === ':') {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'builtin';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'atom';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 }
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 === '*') {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = wide ? 'strong' : 'em';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = wide ? 'string' : 'string-2';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 }
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)) {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'attribute';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else if (stream.match(reHyperlink)) {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'link';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else if (stream.match(reFootnote)) {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'quote';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else if (stream.match(reCitation)) {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 token = 'quote';
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } else {
stream.eatSpace();
if (stream.eol()) {
setNormal(state, stream);
return null;
} else {
stream.skipToEnd();
setState(state, comment);
return 'comment';
}
}
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 // FIXME this is unreachable
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 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) {
Brian Granger
Updating to CodeMirror 2.2, latest stable release.
r5941 return block(stream, state, 'meta');
Brian E. Granger
Updating CodeMirror to v 2.12....
r4504 } 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");