This commit is contained in:
Liang Ding 2014-10-27 15:49:58 +08:00
parent 0f4a20e261
commit c1339b946a
151 changed files with 3088 additions and 1173 deletions

View File

@ -109,7 +109,7 @@
CodeMirror.defineExtension("uncomment", function(from, to, options) { CodeMirror.defineExtension("uncomment", function(from, to, options) {
if (!options) options = noOptions; if (!options) options = noOptions;
var self = this, mode = self.getModeAt(from); var self = this, mode = self.getModeAt(from);
var end = Math.min(to.line, self.lastLine()), start = Math.min(from.line, end); var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end);
// Try finding line comments // Try finding line comments
var lineString = options.lineComment || mode.lineComment, lines = []; var lineString = options.lineComment || mode.lineComment, lines = [];

View File

@ -56,7 +56,10 @@
var inp = dialog.getElementsByTagName("input")[0], button; var inp = dialog.getElementsByTagName("input")[0], button;
if (inp) { if (inp) {
if (options.value) inp.value = options.value; if (options.value) {
inp.value = options.value;
inp.select();
}
if (options.onInput) if (options.onInput)
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
@ -129,8 +132,8 @@
CodeMirror.defineExtension("openNotification", function(template, options) { CodeMirror.defineExtension("openNotification", function(template, options) {
closeNotification(this, close); closeNotification(this, close);
var dialog = dialogDiv(this, template, options && options.bottom); var dialog = dialogDiv(this, template, options && options.bottom);
var duration = options && (options.duration === undefined ? 5000 : options.duration);
var closed = false, doneTimer; var closed = false, doneTimer;
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000;
function close() { function close() {
if (closed) return; if (closed) return;
@ -143,7 +146,10 @@
CodeMirror.e_preventDefault(e); CodeMirror.e_preventDefault(e);
close(); close();
}); });
if (duration) if (duration)
doneTimer = setTimeout(close, options.duration); doneTimer = setTimeout(close, duration);
return close;
}); });
}); });

View File

@ -78,24 +78,25 @@
for (var i = 0; i < ranges.length; i++) { for (var i = 0; i < ranges.length; i++) {
var range = ranges[i], cur = range.head, curType; var range = ranges[i], cur = range.head, curType;
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1));
if (!range.empty()) if (!range.empty()) {
curType = "surround"; curType = "surround";
else if (left == right && next == right) { } else if (left == right && next == right) {
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left) if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left)
curType = "skipThree"; curType = "skipThree";
else else
curType = "skip"; curType = "skip";
} else if (left == right && cur.ch > 1 && } else if (left == right && cur.ch > 1 &&
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left &&
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) {
curType = "addFour"; curType = "addFour";
else if (left == '"' || left == "'") { } else if (left == '"' || left == "'") {
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both"; if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both";
else return CodeMirror.Pass; else return CodeMirror.Pass;
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) } else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) {
curType = "both"; curType = "both";
else } else {
return CodeMirror.Pass; return CodeMirror.Pass;
}
if (!type) type = curType; if (!type) type = curType;
else if (type != curType) return CodeMirror.Pass; else if (type != curType) return CodeMirror.Pass;
} }

View File

@ -102,12 +102,26 @@
var pos = ranges[i].head, tok = cm.getTokenAt(pos); var pos = ranges[i].head, tok = cm.getTokenAt(pos);
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
if (tok.type == "string" || tok.string.charAt(0) != "<" || if (tok.type == "string" || tok.string.charAt(0) != "<" ||
tok.start != pos.ch - 1 || inner.mode.name != "xml" || tok.start != pos.ch - 1)
!state.context || !state.context.tagName || return CodeMirror.Pass;
// Kludge to get around the fact that we are not in XML mode
// when completing in JS/CSS snippet in htmlmixed mode. Does not
// work for other XML embedded languages (there is no general
// way to go from a mixed mode to its current XML state).
if (inner.mode.name != "xml") {
if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript")
replacements[i] = "/script>";
else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css")
replacements[i] = "/style>";
else
return CodeMirror.Pass;
} else {
if (!state.context || !state.context.tagName ||
closingTagExists(cm, state.context.tagName, pos, state)) closingTagExists(cm, state.context.tagName, pos, state))
return CodeMirror.Pass; return CodeMirror.Pass;
replacements[i] = "/" + state.context.tagName + ">"; replacements[i] = "/" + state.context.tagName + ">";
} }
}
cm.replaceSelections(replacements); cm.replaceSelections(replacements);
ranges = cm.listSelections(); ranges = cm.listSelections();
for (var i = 0; i < ranges.length; i++) for (var i = 0; i < ranges.length; i++)

View File

@ -11,7 +11,8 @@
})(function(CodeMirror) { })(function(CodeMirror) {
"use strict"; "use strict";
var listRE = /^(\s*)([*+-]|(\d+)\.)(\s+)/, var listRE = /^(\s*)([> ]+|[*+-]|(\d+)\.)(\s+)/,
emptyListRE = /^(\s*)([> ]+|[*+-]|(\d+)\.)(\s*)$/,
unorderedBullets = "*+-"; unorderedBullets = "*+-";
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) {
@ -19,19 +20,31 @@
var ranges = cm.listSelections(), replacements = []; var ranges = cm.listSelections(), replacements = [];
for (var i = 0; i < ranges.length; i++) { for (var i = 0; i < ranges.length; i++) {
var pos = ranges[i].head, match; var pos = ranges[i].head, match;
var inList = cm.getStateAfter(pos.line).list !== false; var eolState = cm.getStateAfter(pos.line);
var inList = eolState.list !== false;
var inQuote = eolState.quote !== false;
if (!ranges[i].empty() || !inList || !(match = cm.getLine(pos.line).match(listRE))) { if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) {
cm.execCommand("newlineAndIndent"); cm.execCommand("newlineAndIndent");
return; return;
} }
if (cm.getLine(pos.line).match(emptyListRE)) {
cm.replaceRange("", {
line: pos.line, ch: 0
}, {
line: pos.line, ch: pos.ch + 1
});
replacements[i] = "\n";
} else {
var indent = match[1], after = match[4]; var indent = match[1], after = match[4];
var bullet = unorderedBullets.indexOf(match[2]) >= 0 var bullet = unorderedBullets.indexOf(match[2]) >= 0 || match[2].indexOf(">") >= 0
? match[2] ? match[2]
: (parseInt(match[3], 10) + 1) + "."; : (parseInt(match[3], 10) + 1) + ".";
replacements[i] = "\n" + indent + bullet + after; replacements[i] = "\n" + indent + bullet + after;
} }
}
cm.replaceSelections(replacements); cm.replaceSelections(replacements);
}; };

View File

@ -3,9 +3,9 @@
(function(mod) { (function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("../../lib/codemirror", "./xml-hint"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["../../lib/codemirror", "./xml-hint"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function(CodeMirror) {

View File

@ -32,7 +32,7 @@
cursor: pointer; cursor: pointer;
} }
.CodeMirror-hint-active { li.CodeMirror-hint-active {
background: #08f; background: #08f;
color: white; color: white;
} }

View File

@ -12,6 +12,7 @@
"use strict"; "use strict";
var tables; var tables;
var defaultTable;
var keywords; var keywords;
var CONS = { var CONS = {
QUERY_DIV: ";", QUERY_DIV: ";",
@ -43,19 +44,56 @@
} }
} }
function columnCompletion(result, editor) { function nameCompletion(result, editor) {
var cur = editor.getCursor(); var cur = editor.getCursor();
var token = editor.getTokenAt(cur); var token = editor.getTokenAt(cur);
var useBacktick = (token.string.charAt(0) == "`");
var string = token.string.substr(1); var string = token.string.substr(1);
var prevCur = Pos(cur.line, token.start); var prevToken = editor.getTokenAt(Pos(cur.line, token.start));
var table = editor.getTokenAt(prevCur).string; if (token.string.charAt(0) == "." || prevToken.string == "."){
//Suggest colunm names
if (prevToken.string == ".") {
var prevToken = editor.getTokenAt(Pos(cur.line, token.start - 1));
}
var table = prevToken.string;
//Check if backtick is used in table name. If yes, use it for columns too.
var useBacktickTable = false;
if (table.match(/`/g)) {
useBacktickTable = true;
table = table.replace(/`/g, "");
}
//Check if table is available. If not, find table by Alias
if (!tables.hasOwnProperty(table)) if (!tables.hasOwnProperty(table))
table = findTableByAlias(table, editor); table = findTableByAlias(table, editor);
var columns = tables[table]; var columns = tables[table];
if (!columns) return; if (!columns) return;
if (useBacktick) {
addMatches(result, string, columns, function(w) {return "`" + w + "`";});
}
else if(useBacktickTable) {
addMatches(result, string, columns, function(w) {return ".`" + w + "`";});
}
else {
addMatches(result, string, columns, function(w) {return "." + w;}); addMatches(result, string, columns, function(w) {return "." + w;});
} }
}
else {
//Suggest table names or colums in defaultTable
while (token.start && string.charAt(0) == ".") {
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
string = token.string + string;
}
if (useBacktick) {
addMatches(result, string, tables, function(w) {return "`" + w + "`";});
addMatches(result, string, defaultTable, function(w) {return "`" + w + "`";});
}
else {
addMatches(result, string, tables, function(w) {return w;});
addMatches(result, string, defaultTable, function(w) {return w;});
}
}
}
function eachWord(lineText, f) { function eachWord(lineText, f) {
if (!lineText) return; if (!lineText) return;
@ -128,11 +166,14 @@
CodeMirror.registerHelper("hint", "sql", function(editor, options) { CodeMirror.registerHelper("hint", "sql", function(editor, options) {
tables = (options && options.tables) || {}; tables = (options && options.tables) || {};
var defaultTableName = options && options.defaultTable;
defaultTable = (defaultTableName && tables[defaultTableName] || []);
keywords = keywords || getKeywords(editor); keywords = keywords || getKeywords(editor);
var cur = editor.getCursor(); var cur = editor.getCursor();
var result = []; var result = [];
var token = editor.getTokenAt(cur), start, end, search; var token = editor.getTokenAt(cur), start, end, search;
if (token.string.match(/^[.\w@]\w*$/)) { if (token.string.match(/^[.`\w@]\w*$/)) {
search = token.string; search = token.string;
start = token.start; start = token.start;
end = token.end; end = token.end;
@ -140,18 +181,11 @@
start = end = cur.ch; start = end = cur.ch;
search = ""; search = "";
} }
if (search.charAt(0) == ".") { if (search.charAt(0) == "." || search.charAt(0) == "`") {
columnCompletion(result, editor); nameCompletion(result, editor);
if (!result.length) {
while (start && search.charAt(0) == ".") {
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
start = token.start;
search = token.string + search;
}
addMatches(result, search, tables, function(w) {return w;});
}
} else { } else {
addMatches(result, search, tables, function(w) {return w;}); addMatches(result, search, tables, function(w) {return w;});
addMatches(result, search, defaultTable, function(w) {return w;});
addMatches(result, search, keywords, function(w) {return w.toUpperCase();}); addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
} }

View File

@ -118,10 +118,11 @@
function startLinting(cm) { function startLinting(cm) {
var state = cm.state.lint, options = state.options; var state = cm.state.lint, options = state.options;
var passOptions = options.options || options; // Support deprecated passing of `options` property in options
if (options.async) if (options.async)
options.getAnnotations(cm, updateLinting, options); options.getAnnotations(cm.getValue(), updateLinting, passOptions, cm);
else else
updateLinting(cm, options.getAnnotations(cm.getValue(), options.options)); updateLinting(cm, options.getAnnotations(cm.getValue(), passOptions, cm));
} }
function updateLinting(cm, annotationsNotSorted) { function updateLinting(cm, annotationsNotSorted) {
@ -170,22 +171,16 @@
showTooltipFor(e, annotationTooltip(ann), target); showTooltipFor(e, annotationTooltip(ann), target);
} }
// When the mouseover fires, the cursor might not actually be over
// the character itself yet. These pairs of x,y offsets are used to
// probe a few nearby points when no suitable marked range is found.
var nearby = [0, 0, 0, 5, 0, -5, 5, 0, -5, 0];
function onMouseOver(cm, e) { function onMouseOver(cm, e) {
if (!/\bCodeMirror-lint-mark-/.test((e.target || e.srcElement).className)) return; var target = e.target || e.srcElement;
for (var i = 0; i < nearby.length; i += 2) { if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
var spans = cm.findMarksAt(cm.coordsChar({left: e.clientX + nearby[i], var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
top: e.clientY + nearby[i + 1]}, "client")); var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
for (var j = 0; j < spans.length; ++j) { for (var i = 0; i < spans.length; ++i) {
var span = spans[j], ann = span.__annotation; var ann = spans[i].__annotation;
if (ann) return popupSpanTooltip(ann, e); if (ann) return popupSpanTooltip(ann, e);
} }
} }
}
CodeMirror.defineOption("lint", false, function(cm, val, old) { CodeMirror.defineOption("lint", false, function(cm, val, old) {
if (old && old != CodeMirror.Init) { if (old && old != CodeMirror.Init) {

View File

@ -1,17 +1,17 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL // declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"), require("diff_match_patch"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror", "diff_match_patch"], mod);
else // Plain browser env
mod(CodeMirror, diff_match_patch);
})(function(CodeMirror, diff_match_patch) {
"use strict";
var Pos = CodeMirror.Pos; var Pos = CodeMirror.Pos;
var svgNS = "http://www.w3.org/2000/svg"; var svgNS = "http://www.w3.org/2000/svg";

View File

@ -0,0 +1,210 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function(CodeMirror) {
"use strict";
CodeMirror.defineSimpleMode = function(name, states, props) {
CodeMirror.defineMode(name, function(config) {
return CodeMirror.simpleMode(config, states, props);
});
};
CodeMirror.simpleMode = function(config, states) {
ensureState(states, "start");
var states_ = {}, meta = states.meta || {}, hasIndentation = false;
for (var state in states) if (state != meta && states.hasOwnProperty(state)) {
var list = states_[state] = [], orig = states[state];
for (var i = 0; i < orig.length; i++) {
var data = orig[i];
list.push(new Rule(data, states));
if (data.indent || data.dedent) hasIndentation = true;
}
}
var mode = {
startState: function() {
return {state: "start", pending: null,
local: null, localState: null,
indent: hasIndentation ? [] : null};
},
copyState: function(state) {
var s = {state: state.state, pending: state.pending,
local: state.local, localState: null,
indent: state.indent && state.indent.slice(0)};
if (state.localState)
s.localState = CodeMirror.copyState(state.local.mode, state.localState);
if (state.stack)
s.stack = state.stack.slice(0);
for (var pers = state.persistentStates; pers; pers = pers.next)
s.persistentStates = {mode: pers.mode,
spec: pers.spec,
state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state),
next: s.persistentStates};
return s;
},
token: tokenFunction(states_, config),
innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; },
indent: indentFunction(states_, meta)
};
if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop))
mode[prop] = meta[prop];
return mode;
};
function ensureState(states, name) {
if (!states.hasOwnProperty(name))
throw new Error("Undefined state " + name + "in simple mode");
}
function toRegex(val, caret) {
if (!val) return /(?:)/;
var flags = "";
if (val instanceof RegExp) {
if (val.ignoreCase) flags = "i";
val = val.source;
} else {
val = String(val);
}
return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags);
}
function asToken(val) {
if (!val) return null;
if (typeof val == "string") return val.replace(/\./g, " ");
var result = [];
for (var i = 0; i < val.length; i++)
result.push(val[i] && val[i].replace(/\./g, " "));
return result;
}
function Rule(data, states) {
if (data.next || data.push) ensureState(states, data.next || data.push);
this.regex = toRegex(data.regex);
this.token = asToken(data.token);
this.data = data;
}
function tokenFunction(states, config) {
return function(stream, state) {
if (state.pending) {
var pend = state.pending.shift();
if (state.pending.length == 0) state.pending = null;
stream.pos += pend.text.length;
return pend.token;
}
if (state.local) {
if (state.local.end && stream.match(state.local.end)) {
var tok = state.local.endToken || null;
state.local = state.localState = null;
return tok;
} else {
var tok = state.local.mode.token(stream, state.localState), m;
if (state.local.endScan && (m = state.local.endScan.exec(stream.current())))
stream.pos = stream.start + m.index;
return tok;
}
}
var curState = states[state.state];
for (var i = 0; i < curState.length; i++) {
var rule = curState[i];
var matches = stream.match(rule.regex);
if (matches) {
if (rule.data.next) {
state.state = rule.data.next;
} else if (rule.data.push) {
(state.stack || (state.stack = [])).push(state.state);
state.state = rule.data.push;
} else if (rule.data.pop && state.stack && state.stack.length) {
state.state = state.stack.pop();
}
if (rule.data.mode)
enterLocalMode(config, state, rule.data.mode, rule.token);
if (rule.data.indent)
state.indent.push(stream.indentation() + config.indentUnit);
if (rule.data.dedent)
state.indent.pop();
if (matches.length > 2) {
state.pending = [];
for (var j = 2; j < matches.length; j++)
if (matches[j])
state.pending.push({text: matches[j], token: rule.token[j - 1]});
stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0));
return rule.token[0];
} else if (rule.token && rule.token.join) {
return rule.token[0];
} else {
return rule.token;
}
}
}
stream.next();
return null;
};
}
function cmp(a, b) {
if (a === b) return true;
if (!a || typeof a != "object" || !b || typeof b != "object") return false;
var props = 0;
for (var prop in a) if (a.hasOwnProperty(prop)) {
if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false;
props++;
}
for (var prop in b) if (b.hasOwnProperty(prop)) props--;
return props == 0;
}
function enterLocalMode(config, state, spec, token) {
var pers;
if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next)
if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p;
var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec);
var lState = pers ? pers.state : CodeMirror.startState(mode);
if (spec.persistent && !pers)
state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates};
state.localState = lState;
state.local = {mode: mode,
end: spec.end && toRegex(spec.end),
endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false),
endToken: token && token.join ? token[token.length - 1] : token};
}
function indexOf(val, arr) {
for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true;
}
function indentFunction(states, meta) {
return function(state, textAfter, line) {
if (state.local && state.local.mode.indent)
return state.local.mode.indent(state.localState, textAfter, line);
if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1)
return CodeMirror.Pass;
var pos = state.indent.length - 1, rules = states[state.state];
scan: for (;;) {
for (var i = 0; i < rules.length; i++) {
var rule = rules[i], m = rule.regex.exec(textAfter);
if (m && m[0]) {
if (rule.data.dedent && rule.data.dedentIfLineStart !== false) pos--;
if (rule.next || rule.push) rules = states[rule.next || rule.push];
textAfter = textAfter.slice(m[0].length);
continue scan;
}
}
break;
}
return pos < 0 ? 0 : state.indent[pos];
};
}
});

View File

@ -74,7 +74,11 @@ CodeMirror.startState = function (mode, a1, a2) {
}; };
var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
CodeMirror.defineMode = function (name, mode) { modes[name] = mode; }; CodeMirror.defineMode = function (name, mode) {
if (arguments.length > 2)
mode.dependencies = Array.prototype.slice.call(arguments, 2);
modes[name] = mode;
};
CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; }; CodeMirror.defineMIME = function (mime, spec) { mimeModes[mime] = spec; };
CodeMirror.resolveMode = function(spec) { CodeMirror.resolveMode = function(spec) {
if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {

View File

@ -74,10 +74,8 @@ exports.startState = function(mode, a1, a2) {
var modes = exports.modes = {}, mimeModes = exports.mimeModes = {}; var modes = exports.modes = {}, mimeModes = exports.mimeModes = {};
exports.defineMode = function(name, mode) { exports.defineMode = function(name, mode) {
if (arguments.length > 2) { if (arguments.length > 2)
mode.dependencies = []; mode.dependencies = Array.prototype.slice.call(arguments, 2);
for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
}
modes[name] = mode; modes[name] = mode;
}; };
exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; }; exports.defineMIME = function(mime, spec) { mimeModes[mime] = spec; };

View File

@ -8,12 +8,15 @@
// document. // document.
// //
// The option can be set to true to simply enable it, or to a // The option can be set to true to simply enable it, or to a
// {minChars, style, showToken} object to explicitly configure it. // {minChars, style, wordsOnly, showToken, delay} object to explicitly
// minChars is the minimum amount of characters that should be // configure it. minChars is the minimum amount of characters that should be
// selected for the behavior to occur, and style is the token style to // selected for the behavior to occur, and style is the token style to
// apply to the matches. This will be prefixed by "cm-" to create an // apply to the matches. This will be prefixed by "cm-" to create an
// actual CSS class name. showToken, when enabled, will cause the // actual CSS class name. If wordsOnly is enabled, the matches will be
// current token to be highlighted when nothing is selected. // highlighted only if the selected text is a word. showToken, when enabled,
// will cause the current token to be highlighted when nothing is selected.
// delay is used to specify how much time to wait, in milliseconds, before
// highlighting the matches.
(function(mod) { (function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
@ -28,6 +31,7 @@
var DEFAULT_MIN_CHARS = 2; var DEFAULT_MIN_CHARS = 2;
var DEFAULT_TOKEN_STYLE = "matchhighlight"; var DEFAULT_TOKEN_STYLE = "matchhighlight";
var DEFAULT_DELAY = 100; var DEFAULT_DELAY = 100;
var DEFAULT_WORDS_ONLY = false;
function State(options) { function State(options) {
if (typeof options == "object") { if (typeof options == "object") {
@ -35,10 +39,12 @@
this.style = options.style; this.style = options.style;
this.showToken = options.showToken; this.showToken = options.showToken;
this.delay = options.delay; this.delay = options.delay;
this.wordsOnly = options.wordsOnly;
} }
if (this.style == null) this.style = DEFAULT_TOKEN_STYLE; if (this.style == null) this.style = DEFAULT_TOKEN_STYLE;
if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS; if (this.minChars == null) this.minChars = DEFAULT_MIN_CHARS;
if (this.delay == null) this.delay = DEFAULT_DELAY; if (this.delay == null) this.delay = DEFAULT_DELAY;
if (this.wordsOnly == null) this.wordsOnly = DEFAULT_WORDS_ONLY;
this.overlay = this.timeout = null; this.overlay = this.timeout = null;
} }
@ -81,12 +87,30 @@
} }
var from = cm.getCursor("from"), to = cm.getCursor("to"); var from = cm.getCursor("from"), to = cm.getCursor("to");
if (from.line != to.line) return; if (from.line != to.line) return;
if (state.wordsOnly && !isWord(cm, from, to)) return;
var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, ""); var selection = cm.getRange(from, to).replace(/^\s+|\s+$/g, "");
if (selection.length >= state.minChars) if (selection.length >= state.minChars)
cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style)); cm.addOverlay(state.overlay = makeOverlay(selection, false, state.style));
}); });
} }
function isWord(cm, from, to) {
var str = cm.getRange(from, to);
if (str.match(/^\w+$/) !== null) {
if (from.ch > 0) {
var pos = {line: from.line, ch: from.ch - 1};
var chr = cm.getRange(pos, from);
if (chr.match(/\W/) === null) return false;
}
if (to.ch < cm.getLine(from.line).length) {
var pos = {line: to.line, ch: to.ch + 1};
var chr = cm.getRange(to, pos);
if (chr.match(/\W/) === null) return false;
}
return true;
} else return false;
}
function boundariesAround(stream, re) { function boundariesAround(stream, re) {
return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
(stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));

View File

@ -57,6 +57,10 @@
border: 0; border: 0;
background: #7e7; background: #7e7;
} }
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-animate-fat-cursor { .cm-animate-fat-cursor {
width: auto; width: auto;
border: 0; border: 0;
@ -83,7 +87,7 @@
/* Can style cursor different in overwrite (non-insert) mode */ /* Can style cursor different in overwrite (non-insert) mode */
div.CodeMirror-overwrite div.CodeMirror-cursor {} div.CodeMirror-overwrite div.CodeMirror-cursor {}
.cm-tab { display: inline-block; } .cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-ruler { .CodeMirror-ruler {
border-left: 1px solid #ccc; border-left: 1px solid #ccc;
@ -213,6 +217,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-lines { .CodeMirror-lines {
cursor: text; cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
} }
.CodeMirror pre { .CodeMirror pre {
/* Reset some styles that the rest of the page might have set */ /* Reset some styles that the rest of the page might have set */
@ -272,7 +277,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
div.CodeMirror-cursors { div.CodeMirror-cursors {
visibility: hidden; visibility: hidden;
position: relative; position: relative;
z-index: 1; z-index: 3;
} }
.CodeMirror-focused div.CodeMirror-cursors { .CodeMirror-focused div.CodeMirror-cursors {
visibility: visible; visibility: visible;
@ -299,3 +304,6 @@ div.CodeMirror-cursors {
visibility: hidden; visibility: hidden;
} }
} }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

View File

@ -61,7 +61,7 @@
function CodeMirror(place, options) { function CodeMirror(place, options) {
if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
this.options = options = options || {}; this.options = options = options ? copyObj(options) : {};
// Determine effective options based on given values and defaults. // Determine effective options based on given values and defaults.
copyObj(defaults, options, false); copyObj(defaults, options, false);
setGuttersForLineNumbers(options); setGuttersForLineNumbers(options);
@ -96,21 +96,20 @@
registerEventHandlers(this); registerEventHandlers(this);
ensureGlobalHandlers(); ensureGlobalHandlers();
var cm = this; startOperation(this);
runInOp(this, function() { this.curOp.forceUpdate = true;
cm.curOp.forceUpdate = true; attachDoc(this, doc);
attachDoc(cm, doc);
if ((options.autofocus && !mobile) || activeElt() == display.input) if ((options.autofocus && !mobile) || activeElt() == display.input)
setTimeout(bind(onFocus, cm), 20); setTimeout(bind(onFocus, this), 20);
else else
onBlur(cm); onBlur(this);
for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt)) for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
optionHandlers[opt](cm, options[opt], Init); optionHandlers[opt](this, options[opt], Init);
maybeUpdateLineNumberWidth(cm); maybeUpdateLineNumberWidth(this);
for (var i = 0; i < initHooks.length; ++i) initHooks[i](cm); for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
}); endOperation(this);
} }
// DISPLAY CONSTRUCTOR // DISPLAY CONSTRUCTOR
@ -723,9 +722,10 @@
// view, so that we don't interleave reading and writing to the DOM. // view, so that we don't interleave reading and writing to the DOM.
function getDimensions(cm) { function getDimensions(cm) {
var d = cm.display, left = {}, width = {}; var d = cm.display, left = {}, width = {};
var gutterLeft = d.gutters.clientLeft;
for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
left[cm.options.gutters[i]] = n.offsetLeft; left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
width[cm.options.gutters[i]] = n.offsetWidth; width[cm.options.gutters[i]] = n.clientWidth;
} }
return {fixedPos: compensateForHScroll(d), return {fixedPos: compensateForHScroll(d),
gutterTotalWidth: d.gutters.offsetWidth, gutterTotalWidth: d.gutters.offsetWidth,
@ -1646,7 +1646,7 @@
var rect; var rect;
if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
for (;;) { for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start; while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;
while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end; while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;
if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) { if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {
@ -1665,6 +1665,7 @@
start = start - 1; start = start - 1;
collapse = "right"; collapse = "right";
} }
if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
} else { // If it is a widget, simply get the box for the whole widget. } else { // If it is a widget, simply get the box for the whole widget.
if (start > 0) collapse = bias = "right"; if (start > 0) collapse = bias = "right";
var rects; var rects;
@ -1681,8 +1682,6 @@
rect = nullRect; rect = nullRect;
} }
if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
var mid = (rtop + rbot) / 2; var mid = (rtop + rbot) / 2;
var heights = prepared.view.measure.heights; var heights = prepared.view.measure.heights;
@ -2090,11 +2089,11 @@
display.wheelStartX = display.wheelStartY = null; display.wheelStartX = display.wheelStartY = null;
// Propagate the scroll position to the actual DOM scroller // Propagate the scroll position to the actual DOM scroller
if (op.scrollTop != null && display.scroller.scrollTop != op.scrollTop) { if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop)); var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top; display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top;
} }
if (op.scrollLeft != null && display.scroller.scrollLeft != op.scrollLeft) { if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft)); var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));
display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left; display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left;
alignHorizontally(cm); alignHorizontally(cm);
@ -2457,16 +2456,16 @@
cm.options.smartIndent && range.head.ch < 100 && cm.options.smartIndent && range.head.ch < 100 &&
(!i || doc.sel.ranges[i - 1].head.line != range.head.line)) { (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {
var mode = cm.getModeAt(range.head); var mode = cm.getModeAt(range.head);
var end = changeEnd(changeEvent);
if (mode.electricChars) { if (mode.electricChars) {
for (var j = 0; j < mode.electricChars.length; j++) for (var j = 0; j < mode.electricChars.length; j++)
if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
indentLine(cm, range.head.line, "smart"); indentLine(cm, end.line, "smart");
break; break;
} }
} else if (mode.electricInput) { } else if (mode.electricInput) {
var end = changeEnd(changeEvent);
if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch))) if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))
indentLine(cm, range.head.line, "smart"); indentLine(cm, end.line, "smart");
} }
} }
} }
@ -2528,7 +2527,7 @@
var pos = posFromMouse(cm, e); var pos = posFromMouse(cm, e);
if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return; if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
e_preventDefault(e); e_preventDefault(e);
var word = findWordAt(cm, pos); var word = cm.findWordAt(pos);
extendSelection(cm.doc, word.anchor, word.head); extendSelection(cm.doc, word.anchor, word.head);
})); }));
else else
@ -2807,7 +2806,7 @@
start = posFromMouse(cm, e, true, true); start = posFromMouse(cm, e, true, true);
ourIndex = -1; ourIndex = -1;
} else if (type == "double") { } else if (type == "double") {
var word = findWordAt(cm, start); var word = cm.findWordAt(start);
if (cm.display.shift || doc.extend) if (cm.display.shift || doc.extend)
ourRange = extendRange(doc, ourRange, word.anchor, word.head); ourRange = extendRange(doc, ourRange, word.anchor, word.head);
else else
@ -2861,7 +2860,7 @@
var anchor = oldRange.anchor, head = pos; var anchor = oldRange.anchor, head = pos;
if (type != "single") { if (type != "single") {
if (type == "double") if (type == "double")
var range = findWordAt(cm, pos); var range = cm.findWordAt(pos);
else else
var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0))); var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
if (cmp(range.anchor, anchor) > 0) { if (cmp(range.anchor, anchor) > 0) {
@ -3721,7 +3720,7 @@
// measured, the position of something may 'drift' during drawing). // measured, the position of something may 'drift' during drawing).
function scrollPosIntoView(cm, pos, end, margin) { function scrollPosIntoView(cm, pos, end, margin) {
if (margin == null) margin = 0; if (margin == null) margin = 0;
for (;;) { for (var limit = 0; limit < 5; limit++) {
var changed = false, coords = cursorCoords(cm, pos); var changed = false, coords = cursorCoords(cm, pos);
var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left), var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
@ -3770,7 +3769,7 @@
var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth; var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth;
var tooWide = x2 - x1 > screenw; var tooWide = x2 - x1 > screenw;
if (tooWide) x2 = y1 + screen; if (tooWide) x2 = x1 + screenw;
if (x1 < 10) if (x1 < 10)
result.scrollLeft = 0; result.scrollLeft = 0;
else if (x1 < screenleft) else if (x1 < screenleft)
@ -3999,24 +3998,6 @@
return target; return target;
} }
// Find the word at the given position (as returned by coordsChar).
function findWordAt(cm, pos) {
var doc = cm.doc, line = getLine(doc, pos.line).text;
var start = pos.ch, end = pos.ch;
if (line) {
var helper = cm.getHelper(pos, "wordChars");
if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
var startChar = line.charAt(start);
var check = isWordChar(startChar, helper)
? function(ch) { return isWordChar(ch, helper); }
: /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
: function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
while (start > 0 && check(line.charAt(start - 1))) --start;
while (end < line.length && check(line.charAt(end))) ++end;
}
return new Range(Pos(pos.line, start), Pos(pos.line, end));
}
// EDITOR METHODS // EDITOR METHODS
// The publicly visible API. Note that methodOp(f) means // The publicly visible API. Note that methodOp(f) means
@ -4358,6 +4339,24 @@
doc.sel.ranges[i].goalColumn = goals[i]; doc.sel.ranges[i].goalColumn = goals[i];
}), }),
// Find the word at the given position (as returned by coordsChar).
findWordAt: function(pos) {
var doc = this.doc, line = getLine(doc, pos.line).text;
var start = pos.ch, end = pos.ch;
if (line) {
var helper = this.getHelper(pos, "wordChars");
if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
var startChar = line.charAt(start);
var check = isWordChar(startChar, helper)
? function(ch) { return isWordChar(ch, helper); }
: /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
: function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
while (start > 0 && check(line.charAt(start - 1))) --start;
while (end < line.length && check(line.charAt(end))) ++end;
}
return new Range(Pos(pos.line, start), Pos(pos.line, end));
},
toggleOverwrite: function(value) { toggleOverwrite: function(value) {
if (value != null && value == this.state.overwrite) return; if (value != null && value == this.state.overwrite) return;
if (this.state.overwrite = !this.state.overwrite) if (this.state.overwrite = !this.state.overwrite)
@ -4444,6 +4443,7 @@
clearCaches(this); clearCaches(this);
resetInput(this); resetInput(this);
this.scrollTo(doc.scrollLeft, doc.scrollTop); this.scrollTo(doc.scrollLeft, doc.scrollTop);
this.curOp.forceScroll = true;
signalLater(this, "swapDoc", this, old); signalLater(this, "swapDoc", this, old);
return old; return old;
}), }),
@ -4570,10 +4570,8 @@
// load a mode. (Preferred mechanism is the require/define calls.) // load a mode. (Preferred mechanism is the require/define calls.)
CodeMirror.defineMode = function(name, mode) { CodeMirror.defineMode = function(name, mode) {
if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
if (arguments.length > 2) { if (arguments.length > 2)
mode.dependencies = []; mode.dependencies = Array.prototype.slice.call(arguments, 2);
for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
}
modes[name] = mode; modes[name] = mode;
}; };
@ -4865,7 +4863,7 @@
// are simply ignored. // are simply ignored.
keyMap.pcDefault = { keyMap.pcDefault = {
"Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
"Ctrl-Home": "goDocStart", "Ctrl-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
"Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
"Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
"Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
@ -4880,7 +4878,7 @@
"Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
"Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
"Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
"Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
fallthrough: ["basic", "emacsy"] fallthrough: ["basic", "emacsy"]
}; };
// Very basic readline/emacs-style bindings, which are standard on Mac. // Very basic readline/emacs-style bindings, which are standard on Mac.
@ -4988,6 +4986,7 @@
cm.save = save; cm.save = save;
cm.getTextArea = function() { return textarea; }; cm.getTextArea = function() { return textarea; };
cm.toTextArea = function() { cm.toTextArea = function() {
cm.toTextArea = isNaN; // Prevent this from being ran twice
save(); save();
textarea.parentNode.removeChild(cm.getWrapperElement()); textarea.parentNode.removeChild(cm.getWrapperElement());
textarea.style.display = ""; textarea.style.display = "";
@ -7295,7 +7294,7 @@
return function(){return f.apply(null, args);}; return function(){return f.apply(null, args);};
} }
var nonASCIISingleCaseWordChar = /[\u00df\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; var nonASCIISingleCaseWordChar = /[\u00df\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
var isWordCharBasic = CodeMirror.isWordChar = function(ch) { var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
return /\w/.test(ch) || ch > "\x80" && return /\w/.test(ch) || ch > "\x80" &&
(ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
@ -7462,7 +7461,7 @@
if (badBidiRects != null) return badBidiRects; if (badBidiRects != null) return badBidiRects;
var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
var r0 = range(txt, 0, 1).getBoundingClientRect(); var r0 = range(txt, 0, 1).getBoundingClientRect();
if (r0.left == r0.right) return false; if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
var r1 = range(txt, 1, 2).getBoundingClientRect(); var r1 = range(txt, 1, 2).getBoundingClientRect();
return badBidiRects = (r1.right - r0.right < 3); return badBidiRects = (r1.right - r0.right < 3);
} }
@ -7825,7 +7824,7 @@
// THE END // THE END
CodeMirror.version = "4.5.0"; CodeMirror.version = "4.7.0";
return CodeMirror; return CodeMirror;
}); });

File diff suppressed because it is too large Load Diff

View File

@ -12,12 +12,12 @@
.CodeMirror { border: 2px inset #dee; } .CodeMirror { border: 2px inset #dee; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -12,12 +12,12 @@
.cm-s-default span.cm-arrow { color: red; } .cm-s-default span.cm-arrow { color: red; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -20,7 +20,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
blockKeywords = parserConfig.blockKeywords || {}, blockKeywords = parserConfig.blockKeywords || {},
atoms = parserConfig.atoms || {}, atoms = parserConfig.atoms || {},
hooks = parserConfig.hooks || {}, hooks = parserConfig.hooks || {},
multiLineStrings = parserConfig.multiLineStrings; multiLineStrings = parserConfig.multiLineStrings,
indentStatements = parserConfig.indentStatements !== false;
var isOperatorChar = /[+\-*&%=<>!?|\/]/; var isOperatorChar = /[+\-*&%=<>!?|\/]/;
var curPunc; var curPunc;
@ -57,7 +58,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
stream.eatWhile(isOperatorChar); stream.eatWhile(isOperatorChar);
return "operator"; return "operator";
} }
stream.eatWhile(/[\w\$_]/); stream.eatWhile(/[\w\$_\xa1-\uffff]/);
var cur = stream.current(); var cur = stream.current();
if (keywords.propertyIsEnumerable(cur)) { if (keywords.propertyIsEnumerable(cur)) {
if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";
@ -151,7 +152,9 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
while (ctx.type == "statement") ctx = popContext(state); while (ctx.type == "statement") ctx = popContext(state);
} }
else if (curPunc == ctx.type) popContext(state); else if (curPunc == ctx.type) popContext(state);
else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) else if (indentStatements &&
(((ctx.type == "}" || ctx.type == "top") && curPunc != ';') ||
(ctx.type == "statement" && curPunc == "newstatement")))
pushContext(state, stream.column(), "statement"); pushContext(state, stream.column(), "statement");
state.startOfLine = false; state.startOfLine = false;
return style; return style;
@ -298,6 +301,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
}, },
modeProps: {fold: ["brace", "include"]} modeProps: {fold: ["brace", "include"]}
}); });
def("text/x-java", { def("text/x-java", {
name: "clike", name: "clike",
keywords: words("abstract assert boolean break byte case catch char class const continue default " + keywords: words("abstract assert boolean break byte case catch char class const continue default " +
@ -315,6 +319,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
}, },
modeProps: {fold: ["brace", "import"]} modeProps: {fold: ["brace", "import"]}
}); });
def("text/x-csharp", { def("text/x-csharp", {
name: "clike", name: "clike",
keywords: words("abstract as base break case catch checked class const continue" + keywords: words("abstract as base break case catch checked class const continue" +
@ -341,6 +346,19 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
} }
} }
}); });
function tokenTripleString(stream, state) {
var escaped = false;
while (!stream.eol()) {
if (!escaped && stream.match('"""')) {
state.tokenize = null;
break;
}
escaped = stream.next() != "\\" && !escaped;
}
return "string";
}
def("text/x-scala", { def("text/x-scala", {
name: "clike", name: "clike",
keywords: words( keywords: words(
@ -366,19 +384,24 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
"Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " +
"Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " +
"StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void"
), ),
multiLineStrings: true, multiLineStrings: true,
blockKeywords: words("catch class do else finally for forSome if match switch try while"), blockKeywords: words("catch class do else finally for forSome if match switch try while"),
atoms: words("true false null"), atoms: words("true false null"),
indentStatements: false,
hooks: { hooks: {
"@": function(stream) { "@": function(stream) {
stream.eatWhile(/[\w\$_]/); stream.eatWhile(/[\w\$_]/);
return "meta"; return "meta";
},
'"': function(stream, state) {
if (!stream.match('""')) return false;
state.tokenize = tokenTripleString;
return state.tokenize(stream, state);
} }
} }
}); });
def(["x-shader/x-vertex", "x-shader/x-fragment"], { def(["x-shader/x-vertex", "x-shader/x-fragment"], {
name: "clike", name: "clike",
keywords: words("float int bool void " + keywords: words("float int bool void " +

View File

@ -12,12 +12,12 @@
<script src="clike.js"></script> <script src="clike.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style> <style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>
@ -169,6 +169,21 @@ public class Class<T, V> implements MyInterface {
member = value; member = value;
} }
} }
</textarea></div>
<h2>Scala example</h2>
<div><textarea id="scala-code">
object FilterTest extends App {
def filter(xs: List[Int], threshold: Int) = {
def process(ys: List[Int]): List[Int] =
if (ys.isEmpty) ys
else if (ys.head < threshold) ys.head :: process(ys.tail)
else process(ys.tail)
process(xs)
}
println(filter(List(1, 9, 2, 8, 3, 7, 4), 5))
}
</textarea></div> </textarea></div>
<script> <script>
@ -187,6 +202,11 @@ public class Class<T, V> implements MyInterface {
matchBrackets: true, matchBrackets: true,
mode: "text/x-java" mode: "text/x-java"
}); });
var scalaEditor = CodeMirror.fromTextArea(document.getElementById("scala-code"), {
lineNumbers: true,
matchBrackets: true,
mode: "text/x-scala"
});
var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault; var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete"; CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
</script> </script>
@ -198,7 +218,8 @@ public class Class<T, V> implements MyInterface {
directives are recognized.</p> directives are recognized.</p>
<p><strong>MIME types defined:</strong> <code>text/x-csrc</code> <p><strong>MIME types defined:</strong> <code>text/x-csrc</code>
(C code), <code>text/x-c++src</code> (C++ (C), <code>text/x-c++src</code> (C++), <code>text/x-java</code>
code), <code>text/x-java</code> (Java (Java), <code>text/x-csharp</code> (C#),
code), <code>text/x-csharp</code> (C#).</p> <code>text/x-scala</code> (Scala), <code>text/x-vertex</code>
and <code>x-shader/x-fragment</code> (shader programs).</p>
</article> </article>

View File

@ -10,12 +10,12 @@
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<script src="clike.js"></script> <script src="clike.js"></script>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -18,7 +18,7 @@
CodeMirror.defineMode("clojure", function (options) { CodeMirror.defineMode("clojure", function (options) {
var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2", var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2",
ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword"; ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword", VAR = "variable";
var INDENT_WORD_SKIP = options.indentUnit || 2; var INDENT_WORD_SKIP = options.indentUnit || 2;
var NORMAL_INDENT_UNIT = options.indentUnit || 2; var NORMAL_INDENT_UNIT = options.indentUnit || 2;
@ -59,7 +59,7 @@ CodeMirror.defineMode("clojure", function (options) {
sign: /[+-]/, sign: /[+-]/,
exponent: /e/i, exponent: /e/i,
keyword_char: /[^\s\(\[\;\)\]]/, keyword_char: /[^\s\(\[\;\)\]]/,
symbol: /[\w*+!\-\._?:<>\/]/ symbol: /[\w*+!\-\._?:<>\/\xa1-\uffff]/
}; };
function stateStack(indent, type, prev) { // represents a state stack object function stateStack(indent, type, prev) { // represents a state stack object
@ -220,7 +220,9 @@ CodeMirror.defineMode("clojure", function (options) {
returnType = BUILTIN; returnType = BUILTIN;
} else if (atoms && atoms.propertyIsEnumerable(stream.current())) { } else if (atoms && atoms.propertyIsEnumerable(stream.current())) {
returnType = ATOM; returnType = ATOM;
} else returnType = null; } else {
returnType = VAR;
}
} }
} }

View File

@ -9,12 +9,12 @@
<script src="clojure.js"></script> <script src="clojure.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -39,12 +39,12 @@
.CodeMirror-activeline-background {background: #555555 !important;} .CodeMirror-activeline-background {background: #555555 !important;}
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -22,7 +22,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
return new RegExp("^((" + words.join(")|(") + "))\\b"); return new RegExp("^((" + words.join(")|(") + "))\\b");
} }
var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?)/; var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/;
var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/;
var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/;
var properties = /^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/; var properties = /^(@|this\.)[_A-Za-z$][_A-Za-z$0-9]*/;
@ -34,7 +34,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
"switch", "try", "catch", "finally", "class"]; "switch", "try", "catch", "finally", "class"];
var commonKeywords = ["break", "by", "continue", "debugger", "delete", var commonKeywords = ["break", "by", "continue", "debugger", "delete",
"do", "in", "of", "new", "return", "then", "do", "in", "of", "new", "return", "then",
"this", "throw", "when", "until"]; "this", "@", "throw", "when", "until", "extends"];
var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); var keywords = wordRegexp(indentKeywords.concat(commonKeywords));
@ -217,7 +217,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
type = type || "coffee"; type = type || "coffee";
var offset = 0, align = false, alignOffset = null; var offset = 0, align = false, alignOffset = null;
for (var scope = state.scope; scope; scope = scope.prev) { for (var scope = state.scope; scope; scope = scope.prev) {
if (scope.type === "coffee") { if (scope.type === "coffee" || scope.type == "}") {
offset = scope.offset + conf.indentUnit; offset = scope.offset + conf.indentUnit;
break; break;
} }
@ -278,7 +278,7 @@ CodeMirror.defineMode("coffeescript", function(conf) {
// Handle scope changes. // Handle scope changes.
if (current === "return") { if (current === "return") {
state.dedent += 1; state.dedent = true;
} }
if (((current === "->" || current === "=>") && if (((current === "->" || current === "=>") &&
!state.lambda && !state.lambda &&
@ -310,9 +310,10 @@ CodeMirror.defineMode("coffeescript", function(conf) {
if (state.scope.type == current) if (state.scope.type == current)
state.scope = state.scope.prev; state.scope = state.scope.prev;
} }
if (state.dedent > 0 && stream.eol() && state.scope.type == "coffee") { if (state.dedent && stream.eol()) {
if (state.scope.prev) state.scope = state.scope.prev; if (state.scope.type == "coffee" && state.scope.prev)
state.dedent -= 1; state.scope = state.scope.prev;
state.dedent = false;
} }
return style; return style;

View File

@ -9,12 +9,12 @@
<script src="coffeescript.js"></script> <script src="coffeescript.js"></script>
<style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style> <style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="commonlisp.js"></script> <script src="commonlisp.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="css.js"></script> <script src="css.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -10,12 +10,12 @@
<script src="css.js"></script> <script src="css.js"></script>
<style>.CodeMirror {border: 1px solid #ddd; line-height: 1.2;}</style> <style>.CodeMirror {border: 1px solid #ddd; line-height: 1.2;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="css.js"></script> <script src="css.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -15,12 +15,12 @@
} }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -60,7 +60,7 @@ CodeMirror.defineMode("d", function(config, parserConfig) {
stream.eatWhile(isOperatorChar); stream.eatWhile(isOperatorChar);
return "operator"; return "operator";
} }
stream.eatWhile(/[\w\$_]/); stream.eatWhile(/[\w\$_\xa1-\uffff]/);
var cur = stream.current(); var cur = stream.current();
if (keywords.propertyIsEnumerable(cur)) { if (keywords.propertyIsEnumerable(cur)) {
if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement";

View File

@ -10,12 +10,12 @@
<script src="d.js"></script> <script src="d.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style> <style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -15,12 +15,12 @@
span.cm-error.cm-tag { background-color: #2b2; } span.cm-error.cm-tag { background-color: #2b2; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -12,12 +12,12 @@
<script src="django.js"></script> <script src="django.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -4,7 +4,7 @@
/* /*
DTD mode DTD mode
Ported to CodeMirror by Peter Kroon <plakroon@gmail.com> Ported to CodeMirror by Peter Kroon <plakroon@gmail.com>
Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues
GitHub: @peterkroon GitHub: @peterkroon
*/ */

View File

@ -9,12 +9,12 @@
<script src="dtd.js"></script> <script src="dtd.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -12,12 +12,12 @@
<script src="dylan.js"></script> <script src="dylan.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="ecl.js"></script> <script src="ecl.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
.cm-s-default span.cm-arrow { color: red; } .cm-s-default span.cm-arrow { color: red; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -11,12 +11,12 @@
<script src="erlang.js"></script> <script src="erlang.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="fortran.js"></script> <script src="fortran.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="gas.js"></script> <script src="gas.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style> <style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -16,12 +16,12 @@
<script src="../clike/clike.js"></script> <script src="../clike/clike.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -150,4 +150,15 @@
"[comment `foo]", "[comment `foo]",
"", "",
"[link http://www.example.com/]"); "[link http://www.example.com/]");
MT("headerCodeBlockGithub",
"[header&header-1 # heading]",
"",
"[comment ```]",
"[comment code]",
"[comment ```]",
"",
"Commit: [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2]",
"Issue: [link #1]",
"Link: [link http://www.example.com/]");
})(); })();

View File

@ -3,7 +3,7 @@
/* /*
Gherkin mode - http://www.cukes.info/ Gherkin mode - http://www.cukes.info/
Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues
*/ */
// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js // Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js

View File

@ -9,12 +9,12 @@
<script src="gherkin.js"></script> <script src="gherkin.js"></script>
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style> <style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -71,7 +71,7 @@ CodeMirror.defineMode("go", function(config) {
stream.eatWhile(isOperatorChar); stream.eatWhile(isOperatorChar);
return "operator"; return "operator";
} }
stream.eatWhile(/[\w\$_]/); stream.eatWhile(/[\w\$_\xa1-\uffff]/);
var cur = stream.current(); var cur = stream.current();
if (keywords.propertyIsEnumerable(cur)) { if (keywords.propertyIsEnumerable(cur)) {
if (cur == "case" || cur == "default") curPunc = "case"; if (cur == "case" || cur == "default") curPunc = "case";

View File

@ -11,12 +11,12 @@
<script src="go.js"></script> <script src="go.js"></script>
<style>.CodeMirror {border:1px solid #999; background:#ffc}</style> <style>.CodeMirror {border:1px solid #999; background:#ffc}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -10,12 +10,12 @@
<script src="groovy.js"></script> <script src="groovy.js"></script>
<style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style> <style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
<script src="haml.js"></script> <script src="haml.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <style>.CodeMirror {background: #f8f8f8;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -24,7 +24,7 @@ CodeMirror.defineMode("haskell", function(_config, modeConfig) {
var digitRE = /\d/; var digitRE = /\d/;
var hexitRE = /[0-9A-Fa-f]/; var hexitRE = /[0-9A-Fa-f]/;
var octitRE = /[0-7]/; var octitRE = /[0-7]/;
var idRE = /[a-z_A-Z0-9']/; var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/;
var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/;
var specialRE = /[(),;[\]`{}]/; var specialRE = /[(),;[\]`{}]/;
var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer

View File

@ -11,12 +11,12 @@
<script src="haskell.js"></script> <script src="haskell.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="haxe.js"></script> <script src="haxe.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
<script src="htmlembedded.js"></script> <script src="htmlembedded.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -30,6 +30,7 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
function html(stream, state) { function html(stream, state) {
var tagName = state.htmlState.tagName; var tagName = state.htmlState.tagName;
if (tagName) tagName = tagName.toLowerCase();
var style = htmlMode.token(stream, state.htmlState); var style = htmlMode.token(stream, state.htmlState);
if (tagName == "script" && /\btag\b/.test(style) && stream.current() == ">") { if (tagName == "script" && /\btag\b/.test(style) && stream.current() == ">") {
// Script block: mode to change to depends on type attribute // Script block: mode to change to depends on type attribute

View File

@ -13,12 +13,12 @@
<script src="htmlmixed.js"></script> <script src="htmlmixed.js"></script>
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="http.js"></script> <script src="http.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -5,12 +5,12 @@
<link rel=stylesheet href="../doc/docs.css"> <link rel=stylesheet href="../doc/docs.css">
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../doc/logo.png"></a>
<ul> <ul>
<li><a href="../index.html">Home</a> <li><a href="../index.html">Home</a>
<li><a href="../doc/manual.html">Manual</a> <li><a href="../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a class=active href="#">Language modes</a> <li><a class=active href="#">Language modes</a>
@ -71,6 +71,7 @@ option.</p>
<li><a href="lua/index.html">Lua</a></li> <li><a href="lua/index.html">Lua</a></li>
<li><a href="markdown/index.html">Markdown</a> (<a href="gfm/index.html">GitHub-flavour</a>)</li> <li><a href="markdown/index.html">Markdown</a> (<a href="gfm/index.html">GitHub-flavour</a>)</li>
<li><a href="mirc/index.html">mIRC</a></li> <li><a href="mirc/index.html">mIRC</a></li>
<li><a href="modelica/index.html">Modelica</a></li>
<li><a href="nginx/index.html">Nginx</a></li> <li><a href="nginx/index.html">Nginx</a></li>
<li><a href="ntriples/index.html">NTriples</a></li> <li><a href="ntriples/index.html">NTriples</a></li>
<li><a href="mllike/index.html">OCaml</a></li> <li><a href="mllike/index.html">OCaml</a></li>
@ -104,9 +105,11 @@ option.</p>
<li><a href="sparql/index.html">SPARQL</a></li> <li><a href="sparql/index.html">SPARQL</a></li>
<li><a href="stex/index.html">sTeX, LaTeX</a></li> <li><a href="stex/index.html">sTeX, LaTeX</a></li>
<li><a href="tcl/index.html">Tcl</a></li> <li><a href="tcl/index.html">Tcl</a></li>
<li><a href="textile/index.html">Textile</a></li>
<li><a href="tiddlywiki/index.html">Tiddlywiki</a></li> <li><a href="tiddlywiki/index.html">Tiddlywiki</a></li>
<li><a href="tiki/index.html">Tiki wiki</a></li> <li><a href="tiki/index.html">Tiki wiki</a></li>
<li><a href="toml/index.html">TOML</a></li> <li><a href="toml/index.html">TOML</a></li>
<li><a href="tornado/index.html">Tornado</a> (templating language)</li>
<li><a href="turtle/index.html">Turtle</a></li> <li><a href="turtle/index.html">Turtle</a></li>
<li><a href="vb/index.html">VB.NET</a></li> <li><a href="vb/index.html">VB.NET</a></li>
<li><a href="vbscript/index.html">VBScript</a></li> <li><a href="vbscript/index.html">VBScript</a></li>

View File

@ -13,12 +13,12 @@
<script src="jade.js"></script> <script src="jade.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -12,12 +12,12 @@
<script src="javascript.js"></script> <script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -19,7 +19,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
var jsonldMode = parserConfig.jsonld; var jsonldMode = parserConfig.jsonld;
var jsonMode = parserConfig.json || jsonldMode; var jsonMode = parserConfig.json || jsonldMode;
var isTS = parserConfig.typescript; var isTS = parserConfig.typescript;
var wordRE = parserConfig.wordCharacters || /[\w$]/; var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
// Tokenizer // Tokenizer
@ -391,7 +391,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
function maybeoperatorNoComma(type, value, noComma) { function maybeoperatorNoComma(type, value, noComma) {
var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
var expr = noComma == false ? expression : expressionNoComma; var expr = noComma == false ? expression : expressionNoComma;
if (value == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
if (type == "operator") { if (type == "operator") {
if (/\+\+|--/.test(value)) return cont(me); if (/\+\+|--/.test(value)) return cont(me);
if (value == "?") return cont(expression, expect(":"), expr); if (value == "?") return cont(expression, expect(":"), expr);
@ -417,13 +417,11 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
} }
function arrowBody(type) { function arrowBody(type) {
findFatArrow(cx.stream, cx.state); findFatArrow(cx.stream, cx.state);
if (type == "{") return pass(statement); return pass(type == "{" ? statement : expression);
return pass(expression);
} }
function arrowBodyNoComma(type) { function arrowBodyNoComma(type) {
findFatArrow(cx.stream, cx.state); findFatArrow(cx.stream, cx.state);
if (type == "{") return pass(statement); return pass(type == "{" ? statement : expressionNoComma);
return pass(expressionNoComma);
} }
function maybelabel(type) { function maybelabel(type) {
if (type == ":") return cont(poplex, statement); if (type == ":") return cont(poplex, statement);
@ -592,7 +590,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
} }
function maybeArrayComprehension(type) { function maybeArrayComprehension(type) {
if (type == "for") return pass(comprehension, expect("]")); if (type == "for") return pass(comprehension, expect("]"));
if (type == ",") return cont(commasep(expressionNoComma, "]")); if (type == ",") return cont(commasep(maybeexpressionNoComma, "]"));
return pass(commasep(expressionNoComma, "]")); return pass(commasep(expressionNoComma, "]"));
} }
function comprehension(type) { function comprehension(type) {
@ -658,7 +656,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
else return lexical.indented + (closing ? 0 : indentUnit); else return lexical.indented + (closing ? 0 : indentUnit);
}, },
electricChars: ":{}", electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
blockCommentStart: jsonMode ? null : "/*", blockCommentStart: jsonMode ? null : "/*",
blockCommentEnd: jsonMode ? null : "*/", blockCommentEnd: jsonMode ? null : "*/",
lineComment: jsonMode ? null : "//", lineComment: jsonMode ? null : "//",

View File

@ -12,12 +12,12 @@
<script src="javascript.js"></script> <script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id="nav"> <div id="nav">
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"/></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"/></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -147,6 +147,13 @@
MT("scary_regexp", MT("scary_regexp",
"[string-2 /foo[[/]]bar/];"); "[string-2 /foo[[/]]bar/];");
MT("indent_strange_array",
"[keyword var] [variable x] [operator =] [[",
" [number 1],,",
" [number 2],",
"]];",
"[number 10];");
var jsonld_mode = CodeMirror.getMode( var jsonld_mode = CodeMirror.getMode(
{indentUnit: 2}, {indentUnit: 2},
{name: "javascript", jsonld: true} {name: "javascript", jsonld: true}

View File

@ -9,12 +9,12 @@
<script src="javascript.js"></script> <script src="javascript.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="jinja2.js"></script> <script src="jinja2.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="julia.js"></script> <script src="julia.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>
@ -51,6 +51,14 @@ a
as123 as123
function_name! function_name!
#unicode identifiers
# a = x\ddot
a⃗ = ẍ
# a = v\dot
a⃗ = v̇
#F\vec = m \cdotp a\vec
F⃗ = m·a⃗
#literal identifier multiples #literal identifier multiples
3x 3x
4[1, 2, 3] 4[1, 2, 3]
@ -60,6 +68,7 @@ x=[1, 2, 3]
x[end-1] x[end-1]
x={"julia"=>"language of technical computing"} x={"julia"=>"language of technical computing"}
#exception handling #exception handling
try try
f() f()

View File

@ -20,7 +20,7 @@ CodeMirror.defineMode("julia", function(_conf, parserConf) {
var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b/; var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b/;
var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; var delimiters = parserConf.delimiters || /^[;,()[\]{}]/;
var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*!*/; var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*!*/;
var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"]; var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"];
var blockClosers = ["end", "else", "elseif", "catch", "finally"]; var blockClosers = ["end", "else", "elseif", "catch", "finally"];
var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype', 'ccall']; var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype', 'ccall'];

View File

@ -9,12 +9,12 @@
<script src="kotlin.js"></script> <script src="kotlin.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -10,12 +10,12 @@
<script src="livescript.js"></script> <script src="livescript.js"></script>
<style>.CodeMirror {font-size: 80%;border-top: 1px solid silver; border-bottom: 1px solid silver;}</style> <style>.CodeMirror {font-size: 80%;border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -11,12 +11,12 @@
<script src="lua.js"></script> <script src="lua.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -16,12 +16,12 @@
.cm-s-default .cm-trailing-space-new-line:before {position: absolute; content: "\21B5"; color: #777;} .cm-s-default .cm-trailing-space-new-line:before {position: absolute; content: "\21B5"; color: #777;}
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -360,15 +360,12 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
var ch = stream.next(); var ch = stream.next();
if (state.escape) {
state.escape = false;
return getType(state);
}
if (ch === '\\') { if (ch === '\\') {
if (modeCfg.highlightFormatting) state.formatting = "escape"; stream.next();
state.escape = true; if (modeCfg.highlightFormatting) {
return getType(state); var type = getType(state);
return type ? type + " formatting-escape" : "formatting-escape";
}
} }
// Matches link titles present on next line // Matches link titles present on next line
@ -650,7 +647,6 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
inline: inlineNormal, inline: inlineNormal,
text: handleText, text: handleText,
escape: false,
formatting: false, formatting: false,
linkText: false, linkText: false,
linkHref: false, linkHref: false,
@ -683,7 +679,6 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
inline: s.inline, inline: s.inline,
text: s.text, text: s.text,
escape: false,
formatting: false, formatting: false,
linkTitle: s.linkTitle, linkTitle: s.linkTitle,
em: s.em, em: s.em,
@ -705,22 +700,20 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
state.formatting = false; state.formatting = false;
if (stream.sol()) { if (stream.sol()) {
var forceBlankLine = stream.match(/^\s*$/, true) || state.header; var forceBlankLine = !!state.header;
// Reset state.header // Reset state.header
state.header = 0; state.header = 0;
if (forceBlankLine) { if (stream.match(/^\s*$/, true) || forceBlankLine) {
state.prevLineHasContent = false; state.prevLineHasContent = false;
return blankLine(state); blankLine(state);
return forceBlankLine ? this.token(stream, state) : null;
} else { } else {
state.prevLineHasContent = state.thisLineHasContent; state.prevLineHasContent = state.thisLineHasContent;
state.thisLineHasContent = true; state.thisLineHasContent = true;
} }
// Reset state.escape
state.escape = false;
// Reset state.taskList // Reset state.taskList
state.taskList = false; state.taskList = false;

View File

@ -54,7 +54,7 @@
"[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]"); "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]");
FT("formatting_escape", FT("formatting_escape",
"[formatting&formatting-escape \\]*"); "[formatting-escape \\*]");
MT("plainText", MT("plainText",
"foo"); "foo");

View File

@ -12,104 +12,133 @@
"use strict"; "use strict";
CodeMirror.modeInfo = [ CodeMirror.modeInfo = [
{name: "APL", mime: "text/apl", mode: "apl"}, {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]},
{name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk"}, {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk"},
{name: "C", mime: "text/x-csrc", mode: "clike"}, {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]},
{name: "C++", mime: "text/x-c++src", mode: "clike"}, {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "hpp", "h++"]},
{name: "Cobol", mime: "text/x-cobol", mode: "cobol"}, {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]},
{name: "Java", mime: "text/x-java", mode: "clike"}, {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"]},
{name: "C#", mime: "text/x-csharp", mode: "clike"}, {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj"]},
{name: "Scala", mime: "text/x-scala", mode: "clike"}, {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"]},
{name: "Clojure", mime: "text/x-clojure", mode: "clojure"}, {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"]},
{name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript"},
{name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp"},
{name: "Cypher", mime: "application/x-cypher-query", mode: "cypher"}, {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher"},
{name: "CSS", mime: "text/css", mode: "css"}, {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]},
{name: "D", mime: "text/x-d", mode: "d"}, {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]},
{name: "diff", mime: "text/x-diff", mode: "diff"}, {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]},
{name: "DTD", mime: "application/xml-dtd", mode: "dtd"}, {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]},
{name: "Dylan", mime: "text/x-dylan", mode: "dylan"}, {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]},
{name: "ECL", mime: "text/x-ecl", mode: "ecl"}, {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]},
{name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel"}, {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]},
{name: "Erlang", mime: "text/x-erlang", mode: "erlang"}, {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]},
{name: "Fortran", mime: "text/x-fortran", mode: "fortran"}, {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]},
{name: "F#", mime: "text/x-fsharp", mode: "mllike"}, {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]},
{name: "Gas", mime: "text/x-gas", mode: "gas"}, {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]},
{name: "Gherkin", mime: "text/x-feature", mode: "gherkin"}, {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]},
{name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"]},
{name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]},
{name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]},
{name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm"}, {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm"},
{name: "Go", mime: "text/x-go", mode: "go"}, {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]},
{name: "Groovy", mime: "text/x-groovy", mode: "groovy"}, {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy"]},
{name: "HAML", mime: "text/x-haml", mode: "haml"}, {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]},
{name: "Haskell", mime: "text/x-haskell", mode: "haskell"}, {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]},
{name: "Haxe", mime: "text/x-haxe", mode: "haxe"}, {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]},
{name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded"}, {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]},
{name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded"}, {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"]},
{name: "JavaServer Pages", mime: "application/x-jsp", mode: "htmlembedded"}, {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"]},
{name: "HTML", mime: "text/html", mode: "htmlmixed"},
{name: "HTTP", mime: "message/http", mode: "http"}, {name: "HTTP", mime: "message/http", mode: "http"},
{name: "Jade", mime: "text/x-jade", mode: "jade"}, {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]},
{name: "JavaScript", mime: "text/javascript", mode: "javascript"}, {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]},
{name: "JavaScript", mime: "application/javascript", mode: "javascript"}, {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"]},
{name: "JSON", mime: "application/x-json", mode: "javascript"}, {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"],
{name: "JSON", mime: "application/json", mode: "javascript"}, mode: "javascript", ext: ["js"]},
{name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"]},
{name: "JSON-LD", mime: "application/ld+json", mode: "javascript"}, {name: "JSON-LD", mime: "application/ld+json", mode: "javascript"},
{name: "TypeScript", mime: "application/typescript", mode: "javascript"}, {name: "Jinja2", mime: "null", mode: "jinja2"},
{name: "Jinja2", mime: null, mode: "jinja2"}, {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]},
{name: "Julia", mime: "text/x-julia", mode: "julia"}, {name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin", ext: ["kt"]},
{name: "Kotlin", mime: "text/x-kotlin", mode: "kotlin"}, {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]},
{name: "LESS", mime: "text/x-less", mode: "css"}, {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"]},
{name: "LiveScript", mime: "text/x-livescript", mode: "livescript"}, {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]},
{name: "Lua", mime: "text/x-lua", mode: "lua"}, {name: "Markdown (GitHub-flavour)", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]},
{name: "Markdown (GitHub-flavour)", mime: "text/x-markdown", mode: "markdown"},
{name: "mIRC", mime: "text/mirc", mode: "mirc"}, {name: "mIRC", mime: "text/mirc", mode: "mirc"},
{name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"},
{name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]},
{name: "MS SQL", mime: "text/x-mssql", mode: "sql"},
{name: "MySQL", mime: "text/x-mysql", mode: "sql"},
{name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx"}, {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx"},
{name: "NTriples", mime: "text/n-triples", mode: "ntriples"}, {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]},
{name: "OCaml", mime: "text/x-ocaml", mode: "mllike"}, {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]},
{name: "Octave", mime: "text/x-octave", mode: "octave"}, {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]},
{name: "Pascal", mime: "text/x-pascal", mode: "pascal"}, {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]},
{name: "PEG.js", mime: null, mode: "pegjs"}, {name: "PEG.js", mime: "null", mode: "pegjs"},
{name: "Perl", mime: "text/x-perl", mode: "perl"}, {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]},
{name: "PHP", mime: "text/x-php", mode: "php"}, {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]},
{name: "PHP(HTML)", mime: "application/x-httpd-php", mode: "php"},
{name: "Pig", mime: "text/x-pig", mode: "pig"}, {name: "Pig", mime: "text/x-pig", mode: "pig"},
{name: "Plain Text", mime: "text/plain", mode: "null"}, {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]},
{name: "Properties files", mime: "text/x-properties", mode: "properties"}, {name: "PLSQL", mime: "text/x-plsql", mode: "sql"},
{name: "Python", mime: "text/x-python", mode: "python"}, {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"]},
{name: "Puppet", mime: "text/x-puppet", mode: "puppet"}, {name: "Python", mime: "text/x-python", mode: "python", ext: ["py", "pyw"]},
{name: "Cython", mime: "text/x-cython", mode: "python"}, {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]},
{name: "R", mime: "text/x-rsrc", mode: "r"}, {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]},
{name: "reStructuredText", mime: "text/x-rst", mode: "rst"}, {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"]},
{name: "Ruby", mime: "text/x-ruby", mode: "ruby"}, {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"]},
{name: "Rust", mime: "text/x-rustsrc", mode: "rust"}, {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"]},
{name: "Sass", mime: "text/x-sass", mode: "sass"}, {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]},
{name: "Scheme", mime: "text/x-scheme", mode: "scheme"}, {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]},
{name: "SCSS", mime: "text/x-scss", mode: "css"}, {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]},
{name: "Shell", mime: "text/x-sh", mode: "shell"}, {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]},
{name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]},
{name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"]},
{name: "Sieve", mime: "application/sieve", mode: "sieve"}, {name: "Sieve", mime: "application/sieve", mode: "sieve"},
{name: "Slim", mime: "text/x-slim", mode: "slim"}, {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim"},
{name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk"}, {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]},
{name: "Smarty", mime: "text/x-smarty", mode: "smarty"}, {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]},
{name: "SmartyMixed", mime: "text/x-smarty", mode: "smartymixed"}, {name: "SmartyMixed", mime: "text/x-smarty", mode: "smartymixed"},
{name: "Solr", mime: "text/x-solr", mode: "solr"}, {name: "Solr", mime: "text/x-solr", mode: "solr"},
{name: "SPARQL", mime: "application/x-sparql-query", mode: "sparql"}, {name: "SPARQL", mime: "application/x-sparql-query", mode: "sparql", ext: ["sparql"]},
{name: "SQL", mime: "text/x-sql", mode: "sql"}, {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]},
{name: "MariaDB", mime: "text/x-mariadb", mode: "sql"}, {name: "MariaDB", mime: "text/x-mariadb", mode: "sql"},
{name: "sTeX", mime: "text/x-stex", mode: "stex"}, {name: "sTeX", mime: "text/x-stex", mode: "stex"},
{name: "LaTeX", mime: "text/x-latex", mode: "stex"}, {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"]},
{name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog"}, {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]},
{name: "Tcl", mime: "text/x-tcl", mode: "tcl"}, {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]},
{name: "Textile", mime: "text/x-textile", mode: "textile"},
{name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"},
{name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"},
{name: "TOML", mime: "text/x-toml", mode: "toml"}, {name: "TOML", mime: "text/x-toml", mode: "toml"},
{name: "Turtle", mime: "text/turtle", mode: "turtle"}, {name: "Tornado", mime: "text/x-tornado", mode: "tornado"},
{name: "VB.NET", mime: "text/x-vb", mode: "vb"}, {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]},
{name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"]},
{name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]},
{name: "VBScript", mime: "text/vbscript", mode: "vbscript"}, {name: "VBScript", mime: "text/vbscript", mode: "vbscript"},
{name: "Velocity", mime: "text/velocity", mode: "velocity"}, {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]},
{name: "Verilog", mime: "text/x-verilog", mode: "verilog"}, {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]},
{name: "XML", mime: "application/xml", mode: "xml"}, {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"]},
{name: "XQuery", mime: "application/xquery", mode: "xquery"}, {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]},
{name: "YAML", mime: "text/x-yaml", mode: "yaml"}, {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml"]},
{name: "Z80", mime: "text/x-z80", mode: "z80"} {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}
]; ];
// Ensure all modes have a mime property for backwards compatibility
for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
var info = CodeMirror.modeInfo[i];
if (info.mimes) info.mime = info.mimes[0];
}
CodeMirror.findModeByMIME = function(mime) {
for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
var info = CodeMirror.modeInfo[i];
if (info.mime == mime) return info;
if (info.mimes) for (var j = 0; j < info.mimes.length; j++)
if (info.mimes[j] == mime) return info;
}
};
CodeMirror.findModeByExtension = function(ext) {
for (var i = 0; i < CodeMirror.modeInfo.length; i++) {
var info = CodeMirror.modeInfo[i];
if (info.ext) for (var j = 0; j < info.ext.length; j++)
if (info.ext[j] == ext) return info;
}
};
}); });

View File

@ -10,12 +10,12 @@
<script src="mirc.js"></script> <script src="mirc.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <style>.CodeMirror {border: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -12,12 +12,12 @@
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;} .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -0,0 +1,67 @@
<!doctype html>
<title>CodeMirror: Modelica mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../addon/hint/show-hint.css">
<script src="../../addon/hint/show-hint.js"></script>
<script src="modelica.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
<a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Modelica</a>
</ul>
</div>
<article>
<h2>Modelica mode</h2>
<div><textarea id="modelica">
model BouncingBall
parameter Real e = 0.7;
parameter Real g = 9.81;
Real h(start=1);
Real v;
Boolean flying(start=true);
Boolean impact;
Real v_new;
equation
impact = h <= 0.0;
der(v) = if flying then -g else 0;
der(h) = v;
when {h <= 0.0 and v <= 0.0, impact} then
v_new = if edge(impact) then -e*pre(v) else 0;
flying = v_new > 0;
reinit(v, v_new);
end when;
annotation (uses(Modelica(version="3.2")));
end BouncingBall;
</textarea></div>
<script>
var modelicaEditor = CodeMirror.fromTextArea(document.getElementById("modelica"), {
lineNumbers: true,
matchBrackets: true,
mode: "text/x-modelica"
});
var mac = CodeMirror.keyMap.default == CodeMirror.keyMap.macDefault;
CodeMirror.keyMap.default[(mac ? "Cmd" : "Ctrl") + "-Space"] = "autocomplete";
</script>
<p>Simple mode that tries to handle Modelica as well as it can.</p>
<p><strong>MIME types defined:</strong> <code>text/x-modelica</code>
(Modlica code).</p>
</article>

View File

@ -0,0 +1,245 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
// Modelica support for CodeMirror, copyright (c) by Lennart Ochel
(function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})
(function(CodeMirror) {
"use strict";
CodeMirror.defineMode("modelica", function(config, parserConfig) {
var indentUnit = config.indentUnit;
var keywords = parserConfig.keywords || {};
var builtin = parserConfig.builtin || {};
var atoms = parserConfig.atoms || {};
var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/;
var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/;
var isDigit = /[0-9]/;
var isNonDigit = /[_a-zA-Z]/;
function tokenLineComment(stream, state) {
stream.skipToEnd();
state.tokenize = null;
return "comment";
}
function tokenBlockComment(stream, state) {
var maybeEnd = false, ch;
while (ch = stream.next()) {
if (maybeEnd && ch == "/") {
state.tokenize = null;
break;
}
maybeEnd = (ch == "*");
}
return "comment";
}
function tokenString(stream, state) {
var escaped = false, ch;
while ((ch = stream.next()) != null) {
if (ch == '"' && !escaped) {
state.tokenize = null;
state.sol = false;
break;
}
escaped = !escaped && ch == "\\";
}
return "string";
}
function tokenIdent(stream, state) {
stream.eatWhile(isDigit);
while (stream.eat(isDigit) || stream.eat(isNonDigit)) { }
var cur = stream.current();
if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++;
else if(state.sol && cur == "end" && state.level > 0) state.level--;
state.tokenize = null;
state.sol = false;
if (keywords.propertyIsEnumerable(cur)) return "keyword";
else if (builtin.propertyIsEnumerable(cur)) return "builtin";
else if (atoms.propertyIsEnumerable(cur)) return "atom";
else return "variable";
}
function tokenQIdent(stream, state) {
while (stream.eat(/[^']/)) { }
state.tokenize = null;
state.sol = false;
if(stream.eat("'"))
return "variable";
else
return "error";
}
function tokenUnsignedNuber(stream, state) {
stream.eatWhile(isDigit);
if (stream.eat('.')) {
stream.eatWhile(isDigit);
}
if (stream.eat('e') || stream.eat('E')) {
if (!stream.eat('-'))
stream.eat('+');
stream.eatWhile(isDigit);
}
state.tokenize = null;
state.sol = false;
return "number";
}
// Interface
return {
startState: function() {
return {
tokenize: null,
level: 0,
sol: true
};
},
token: function(stream, state) {
if(state.tokenize != null) {
return state.tokenize(stream, state);
}
if(stream.sol()) {
state.sol = true;
}
// WHITESPACE
if(stream.eatSpace()) {
state.tokenize = null;
return null;
}
var ch = stream.next();
// LINECOMMENT
if(ch == '/' && stream.eat('/')) {
state.tokenize = tokenLineComment;
}
// BLOCKCOMMENT
else if(ch == '/' && stream.eat('*')) {
state.tokenize = tokenBlockComment;
}
// TWO SYMBOL TOKENS
else if(isDoubleOperatorChar.test(ch+stream.peek())) {
stream.next();
state.tokenize = null;
return "operator";
}
// SINGLE SYMBOL TOKENS
else if(isSingleOperatorChar.test(ch)) {
state.tokenize = null;
return "operator";
}
// IDENT
else if(isNonDigit.test(ch)) {
state.tokenize = tokenIdent;
}
// Q-IDENT
else if(ch == "'" && stream.peek() && stream.peek() != "'") {
state.tokenize = tokenQIdent;
}
// STRING
else if(ch == '"') {
state.tokenize = tokenString;
}
// UNSIGNED_NUBER
else if(isDigit.test(ch)) {
state.tokenize = tokenUnsignedNuber;
}
// ERROR
else {
state.tokenize = null;
return "error";
}
return state.tokenize(stream, state);
},
indent: function(state, textAfter) {
if (state.tokenize != null) return CodeMirror.Pass;
var level = state.level;
if(/(algorithm)/.test(textAfter)) level--;
if(/(equation)/.test(textAfter)) level--;
if(/(initial algorithm)/.test(textAfter)) level--;
if(/(initial equation)/.test(textAfter)) level--;
if(/(end)/.test(textAfter)) level--;
if(level > 0)
return indentUnit*level;
else
return 0;
},
blockCommentStart: "/*",
blockCommentEnd: "*/",
lineComment: "//"
};
});
function words(str) {
var obj = {}, words = str.split(" ");
for (var i=0; i<words.length; ++i)
obj[words[i]] = true;
return obj;
}
var modelicaKeywords = "algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within";
var modelicaBuiltin = "abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh";
var modelicaAtoms = "Real Boolean Integer String";
function def(mimes, mode) {
if (typeof mimes == "string")
mimes = [mimes];
var words = [];
function add(obj) {
if (obj)
for (var prop in obj)
if (obj.hasOwnProperty(prop))
words.push(prop);
}
add(mode.keywords);
add(mode.builtin);
add(mode.atoms);
if (words.length) {
mode.helperType = mimes[0];
CodeMirror.registerHelper("hintWords", mimes[0], words);
}
for (var i=0; i<mimes.length; ++i)
CodeMirror.defineMIME(mimes[i], mode);
}
def(["text/x-modelica"], {
name: "modelica",
keywords: words(modelicaKeywords),
builtin: words(modelicaBuiltin),
atoms: words(modelicaAtoms)
});
});

View File

@ -21,12 +21,12 @@
} }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
} }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="octave.js"></script> <script src="octave.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -22,7 +22,7 @@ CodeMirror.defineMode("octave", function() {
var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))");
var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); var tripleDelimiters = new RegExp("^((>>=)|(<<=))");
var expressionEnd = new RegExp("^[\\]\\)]"); var expressionEnd = new RegExp("^[\\]\\)]");
var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*");
var builtins = wordRegexp([ var builtins = wordRegexp([
'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos',

View File

@ -9,12 +9,12 @@
<script src="pascal.js"></script> <script src="pascal.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
</head> </head>
<body> <body>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="perl.js"></script> <script src="perl.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -788,8 +788,8 @@ CodeMirror.defineMode("perl",function(){
style:null, style:null,
tail:null};}, tail:null};},
token:function(stream,state){ token:function(stream,state){
return (state.tokenize||tokenPerl)(stream,state);}, return (state.tokenize||tokenPerl)(stream,state);}
electricChars:"{}"};}); };});
CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); CodeMirror.registerHelper("wordChars", "perl", /[\w$]/);

View File

@ -15,12 +15,12 @@
<script src="php.js"></script> <script src="php.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -16,32 +16,24 @@
for (var i = 0; i < words.length; ++i) obj[words[i]] = true; for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
return obj; return obj;
} }
function heredoc(delim) {
return function(stream, state) {
if (stream.match(delim)) state.tokenize = null;
else stream.skipToEnd();
return "string";
};
}
// Helper for stringWithEscapes // Helper for stringWithEscapes
function matchSequence(list) { function matchSequence(list, end) {
if (list.length == 0) return stringWithEscapes; if (list.length == 0) return stringWithEscapes(end);
return function (stream, state) { return function (stream, state) {
var patterns = list[0]; var patterns = list[0];
for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) {
state.tokenize = matchSequence(list.slice(1)); state.tokenize = matchSequence(list.slice(1), end);
return patterns[i][1]; return patterns[i][1];
} }
state.tokenize = stringWithEscapes; state.tokenize = stringWithEscapes(end);
return "string"; return "string";
}; };
} }
function stringWithEscapes(stream, state) { function stringWithEscapes(closing) {
var escaped = false, next, end = false; return function(stream, state) { return stringWithEscapes_(stream, state, closing); };
}
if (stream.current() == '"') return "string"; function stringWithEscapes_(stream, state, closing) {
// "Complex" syntax // "Complex" syntax
if (stream.match("${", false) || stream.match("{$", false)) { if (stream.match("${", false) || stream.match("{$", false)) {
state.tokenize = null; state.tokenize = null;
@ -49,7 +41,7 @@
} }
// Simple syntax // Simple syntax
if (stream.match(/\$[a-zA-Z_][a-zA-Z0-9_]*/)) { if (stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) {
// After the variable name there may appear array or object operator. // After the variable name there may appear array or object operator.
if (stream.match("[", false)) { if (stream.match("[", false)) {
// Match array operator // Match array operator
@ -59,31 +51,29 @@
[/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"],
[/[\w\$]+/, "variable"]], [/[\w\$]+/, "variable"]],
[["]", null]] [["]", null]]
]); ], closing);
} }
if (stream.match(/\-\>\w/, false)) { if (stream.match(/\-\>\w/, false)) {
// Match object operator // Match object operator
state.tokenize = matchSequence([ state.tokenize = matchSequence([
[["->", null]], [["->", null]],
[[/[\w]+/, "variable"]] [[/[\w]+/, "variable"]]
]); ], closing);
} }
return "variable-2"; return "variable-2";
} }
var escaped = false;
// Normal string // Normal string
while ( while (!stream.eol() &&
!stream.eol() && (escaped || (!stream.match("{$", false) &&
(!stream.match("{$", false)) && !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) {
(!stream.match(/(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false) || escaped) if (!escaped && stream.match(closing)) {
) {
next = stream.next();
if (!escaped && next == '"') { end = true; break; }
escaped = !escaped && next == "\\";
}
if (end) {
state.tokenize = null; state.tokenize = null;
state.phpEncapsStack.pop(); state.tokStack.pop(); state.tokStack.pop();
break;
}
escaped = stream.next() == "\\" && !escaped;
} }
return "string"; return "string";
} }
@ -115,8 +105,12 @@
"<": function(stream, state) { "<": function(stream, state) {
if (stream.match(/<</)) { if (stream.match(/<</)) {
stream.eatWhile(/[\w\.]/); stream.eatWhile(/[\w\.]/);
state.tokenize = heredoc(stream.current().slice(3)); var delim = stream.current().slice(3);
return state.tokenize(stream, state); if (delim) {
(state.tokStack || (state.tokStack = [])).push(delim, 0);
state.tokenize = stringWithEscapes(delim);
return "string";
}
} }
return false; return false;
}, },
@ -131,22 +125,21 @@
} }
return false; return false;
}, },
'"': function(stream, state) { '"': function(_stream, state) {
if (!state.phpEncapsStack) (state.tokStack || (state.tokStack = [])).push('"', 0);
state.phpEncapsStack = []; state.tokenize = stringWithEscapes('"');
state.phpEncapsStack.push(0); return "string";
state.tokenize = stringWithEscapes;
return state.tokenize(stream, state);
}, },
"{": function(_stream, state) { "{": function(_stream, state) {
if (state.phpEncapsStack && state.phpEncapsStack.length > 0) if (state.tokStack && state.tokStack.length)
state.phpEncapsStack[state.phpEncapsStack.length - 1]++; state.tokStack[state.tokStack.length - 1]++;
return false; return false;
}, },
"}": function(_stream, state) { "}": function(_stream, state) {
if (state.phpEncapsStack && state.phpEncapsStack.length > 0) if (state.tokStack && state.tokStack.length > 0 &&
if (--state.phpEncapsStack[state.phpEncapsStack.length - 1] == 0) !--state.tokStack[state.tokStack.length - 1]) {
state.tokenize = stringWithEscapes; state.tokenize = stringWithEscapes(state.tokStack[state.tokStack.length - 2]);
}
return false; return false;
} }
} }

View File

@ -145,4 +145,10 @@
'[keyword echo] ' + m3[2] + ';', '[keyword echo] ' + m3[2] + ';',
'[keyword echo] [string "end"];', '[keyword echo] [string "end"];',
'[meta ?>]'); '[meta ?>]');
MT("variable_interpolation_heredoc",
"[meta <?php]",
"[string <<<here]",
"[string doc ][variable-2 $]{[variable yay]}[string more]",
"[string here]; [comment // normal]");
})(); })();

View File

@ -9,12 +9,12 @@
<script src="pig.js"></script> <script src="pig.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style> <style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -9,12 +9,12 @@
<script src="properties.js"></script> <script src="properties.js"></script>
<style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style> <style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -13,12 +13,12 @@
.cm-s-default span.cm-arrow { color: red; } .cm-s-default span.cm-arrow { color: red; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -10,12 +10,12 @@
<script src="python.js"></script> <script src="python.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>
@ -65,13 +65,25 @@ __a__
a.b a.b
a.b.c a.b.c
#Unicode identifiers on Python3
# a = x\ddot
a⃗ = ẍ
# a = v\dot
a⃗ = v̇
#F\vec = m \cdot a\vec
F⃗ = m•a⃗
# Operators # Operators
+ - * / % & | ^ ~ < > + - * / % & | ^ ~ < >
== != <= >= <> << >> // ** == != <= >= <> << >> // **
and or not in is and or not in is
#infix matrix multiplication operator (PEP 465)
A @ B
# Delimiters # Delimiters
() [] {} , : ` = ; @ . # Note that @ and . require the proper context. () [] {} , : ` = ; @ . # Note that @ and . require the proper context on Python 2.
+= -= *= /= %= &= |= ^= += -= *= /= %= &= |= ^=
//= >>= <<= **= //= >>= <<= **=
@ -146,7 +158,7 @@ def pairwise_cython(double[:, ::1] X):
<script> <script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), { var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: {name: "python", mode: {name: "python",
version: 2, version: 3,
singleLineStringErrors: false}, singleLineStringErrors: false},
lineNumbers: true, lineNumbers: true,
indentUnit: 4, indentUnit: 4,
@ -171,12 +183,12 @@ def pairwise_cython(double[:, ::1] X):
<h2>Advanced Configuration Options:</h2> <h2>Advanced Configuration Options:</h2>
<p>Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help</p> <p>Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help</p>
<ul> <ul>
<li>singleOperators - RegEx - Regular Expression for single operator matching, default : <pre>^[\\+\\-\\*/%&amp;|\\^~&lt;&gt;!]</pre></li> <li>singleOperators - RegEx - Regular Expression for single operator matching, default : <pre>^[\\+\\-\\*/%&amp;|\\^~&lt;&gt;!]</pre> including <pre>@</pre> on Python 3</li>
<li>singleDelimiters - RegEx - Regular Expression for single delimiter matching, default : <pre>^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]</pre></li> <li>singleDelimiters - RegEx - Regular Expression for single delimiter matching, default : <pre>^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]</pre></li>
<li>doubleOperators - RegEx - Regular Expression for double operators matching, default : <pre>^((==)|(!=)|(&lt;=)|(&gt;=)|(&lt;&gt;)|(&lt;&lt;)|(&gt;&gt;)|(//)|(\\*\\*))</pre></li> <li>doubleOperators - RegEx - Regular Expression for double operators matching, default : <pre>^((==)|(!=)|(&lt;=)|(&gt;=)|(&lt;&gt;)|(&lt;&lt;)|(&gt;&gt;)|(//)|(\\*\\*))</pre></li>
<li>doubleDelimiters - RegEx - Regular Expressoin for double delimiters matching, default : <pre>^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&amp;=)|(\\|=)|(\\^=))</pre></li> <li>doubleDelimiters - RegEx - Regular Expressoin for double delimiters matching, default : <pre>^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&amp;=)|(\\|=)|(\\^=))</pre></li>
<li>tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default : <pre>^((//=)|(&gt;&gt;=)|(&lt;&lt;=)|(\\*\\*=))</pre></li> <li>tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default : <pre>^((//=)|(&gt;&gt;=)|(&lt;&lt;=)|(\\*\\*=))</pre></li>
<li>identifiers - RegEx - Regular Expression for identifier, default : <pre>^[_A-Za-z][_A-Za-z0-9]*</pre></li> <li>identifiers - RegEx - Regular Expression for identifier, default : <pre>^[_A-Za-z][_A-Za-z0-9]*</pre> on Python 2 and <pre>^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*</pre> on Python 3.</li>
<li>extra_keywords - list of string - List of extra words ton consider as keywords</li> <li>extra_keywords - list of string - List of extra words ton consider as keywords</li>
<li>extra_builtins - list of string - List of extra words ton consider as builtins</li> <li>extra_builtins - list of string - List of extra words ton consider as builtins</li>
</ul> </ul>

View File

@ -15,12 +15,12 @@
return new RegExp("^((" + words.join(")|(") + "))\\b"); return new RegExp("^((" + words.join(")|(") + "))\\b");
} }
var wordOperators = wordRegexp(["and", "or", "not", "is", "in"]); var wordOperators = wordRegexp(["and", "or", "not", "is"]);
var commonKeywords = ["as", "assert", "break", "class", "continue", var commonKeywords = ["as", "assert", "break", "class", "continue",
"def", "del", "elif", "else", "except", "finally", "def", "del", "elif", "else", "except", "finally",
"for", "from", "global", "if", "import", "for", "from", "global", "if", "import",
"lambda", "pass", "raise", "return", "lambda", "pass", "raise", "return",
"try", "while", "with", "yield"]; "try", "while", "with", "yield", "in"];
var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr",
"classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod",
"enumerate", "eval", "filter", "float", "format", "frozenset", "enumerate", "eval", "filter", "float", "format", "frozenset",
@ -48,12 +48,20 @@
CodeMirror.defineMode("python", function(conf, parserConf) { CodeMirror.defineMode("python", function(conf, parserConf) {
var ERRORCLASS = "error"; var ERRORCLASS = "error";
var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");
var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]"); var singleDelimiters = parserConf.singleDelimiters || new RegExp("^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]");
var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); var doubleOperators = parserConf.doubleOperators || new RegExp("^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))");
var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); var doubleDelimiters = parserConf.doubleDelimiters || new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))");
var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); var tripleDelimiters = parserConf.tripleDelimiters || new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))");
if (parserConf.version && parseInt(parserConf.version, 10) == 3){
// since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator
var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!@]");
var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*");
} else {
var singleOperators = parserConf.singleOperators || new RegExp("^[\\+\\-\\*/%&|\\^~<>!]");
var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); var identifiers = parserConf.identifiers|| new RegExp("^[_A-Za-z][_A-Za-z0-9]*");
}
var hangingIndent = parserConf.hangingIndent || conf.indentUnit; var hangingIndent = parserConf.hangingIndent || conf.indentUnit;
var myKeywords = commonKeywords, myBuiltins = commonBuiltins; var myKeywords = commonKeywords, myBuiltins = commonBuiltins;
@ -252,8 +260,13 @@
} }
// Handle decorators // Handle decorators
if (current == "@") if (current == "@"){
if(parserConf.version && parseInt(parserConf.version, 10) == 3){
return stream.match(identifiers, false) ? "meta" : "operator";
} else {
return stream.match(identifiers, false) ? "meta" : ERRORCLASS; return stream.match(identifiers, false) ? "meta" : ERRORCLASS;
}
}
if ((style == "variable" || style == "builtin") if ((style == "variable" || style == "builtin")
&& state.lastStyle == "meta") && state.lastStyle == "meta")

View File

@ -10,12 +10,12 @@
<script src="q.js"></script> <script src="q.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -15,12 +15,12 @@
.cm-s-default span.cm-arg-is { color: brown; } .cm-s-default span.cm-arg-is { color: brown; }
</style> </style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

View File

@ -11,12 +11,12 @@
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../../index.html">Home</a> <li><a href="../../../index.html">Home</a>
<li><a href="../../../doc/manual.html">Manual</a> <li><a href="../../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../../index.html">Language modes</a> <li><a href="../../index.html">Language modes</a>

View File

@ -11,12 +11,12 @@
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav> <div id=nav>
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a> <a href="http://codemirror.net"><h1>CodeMirror</h1><img id=logo src="../../doc/logo.png"></a>
<ul> <ul>
<li><a href="../../index.html">Home</a> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a> <li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a> <li><a href="https://github.com/codemirror/codemirror">Code</a>
</ul> </ul>
<ul> <ul>
<li><a href="../index.html">Language modes</a> <li><a href="../index.html">Language modes</a>

Some files were not shown because too many files have changed in this diff Show More