Merge pull request #231 from ilvalle/cm-3.18

codemirror 3.18 with enabled the fullscreen addon
This commit is contained in:
mdipierro
2013-09-26 14:37:47 -07:00
166 changed files with 3820 additions and 2321 deletions
+3
View File
@@ -55,6 +55,7 @@
'cannot create file': 'impossibile creare il file', 'cannot create file': 'impossibile creare il file',
'cannot upload file "%(filename)s"': 'impossibile caricare il file "%(filename)s"', 'cannot upload file "%(filename)s"': 'impossibile caricare il file "%(filename)s"',
'Change admin password': 'change admin password', 'Change admin password': 'change admin password',
'change editor settings': 'change editor settings',
'change password': 'cambia password', 'change password': 'cambia password',
'check all': 'controlla tutto', 'check all': 'controlla tutto',
'Check for upgrades': 'check for upgrades', 'Check for upgrades': 'check for upgrades',
@@ -125,12 +126,14 @@
'Editing italo': 'Editing italo', 'Editing italo': 'Editing italo',
'Editing italo3': 'Editing italo3', 'Editing italo3': 'Editing italo3',
'Editing Language file': 'Modifica file linguaggio', 'Editing Language file': 'Modifica file linguaggio',
'Editing welcome': 'Editing welcome',
'Enterprise Web Framework': 'Enterprise Web Framework', 'Enterprise Web Framework': 'Enterprise Web Framework',
'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"', 'Error logs for "%(app)s"': 'Log degli errori per "%(app)s"',
'Error snapshot': 'Error snapshot', 'Error snapshot': 'Error snapshot',
'Error ticket': 'Error ticket', 'Error ticket': 'Error ticket',
'Errors': 'errori', 'Errors': 'errori',
'Exception instance attributes': 'Exception instance attributes', 'Exception instance attributes': 'Exception instance attributes',
'Exit Fullscreen': 'Exit Fullscreen',
'Expand Abbreviation': 'Expand Abbreviation', 'Expand Abbreviation': 'Expand Abbreviation',
'export as csv file': 'esporta come file CSV', 'export as csv file': 'esporta come file CSV',
'exposes': 'espone', 'exposes': 'espone',
@@ -4,12 +4,12 @@
- [Submitting bug reports](#submitting-bug-reports-) - [Submitting bug reports](#submitting-bug-reports-)
- [Contributing code](#contributing-code-) - [Contributing code](#contributing-code-)
## Getting help [^](#how-to-contribute) ## Getting help
Community discussion, questions, and informal bug reporting is done on the Community discussion, questions, and informal bug reporting is done on the
[CodeMirror Google group](http://groups.google.com/group/codemirror). [CodeMirror Google group](http://groups.google.com/group/codemirror).
## Submitting bug reports [^](#how-to-contribute) ## Submitting bug reports
The preferred way to report bugs is to use the The preferred way to report bugs is to use the
[GitHub issue tracker](http://github.com/marijnh/CodeMirror/issues). Before [GitHub issue tracker](http://github.com/marijnh/CodeMirror/issues). Before
@@ -45,7 +45,7 @@ should be asked on the
[jsbin.com](http://jsbin.com/ihunin/edit), enter it there, press save, and [jsbin.com](http://jsbin.com/ihunin/edit), enter it there, press save, and
include the resulting link in your bug report. include the resulting link in your bug report.
## Contributing code [^](#how-to-contribute) ## Contributing code
- Make sure you have a [GitHub Account](https://github.com/signup/free) - Make sure you have a [GitHub Account](https://github.com/signup/free)
- Fork [CodeMirror](https://github.com/marijnh/CodeMirror/) - Fork [CodeMirror](https://github.com/marijnh/CodeMirror/)
+1 -5
View File
@@ -1,4 +1,4 @@
Copyright (C) 2013 by Marijn Haverbeke <marijnh@gmail.com> Copyright (C) 2013 by Marijn Haverbeke <marijnh@gmail.com> and others
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@@ -17,7 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
Please note that some subdirectories of the CodeMirror distribution
include their own LICENSE files, and are released under different
licences.
@@ -17,7 +17,7 @@
CodeMirror.defineExtension("lineComment", function(from, to, options) { CodeMirror.defineExtension("lineComment", function(from, to, options) {
if (!options) options = noOptions; if (!options) options = noOptions;
var self = this, mode = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode; var self = this, mode = self.getModeAt(from);
var commentString = options.lineComment || mode.lineComment; var commentString = options.lineComment || mode.lineComment;
if (!commentString) { if (!commentString) {
if (options.blockCommentStart || mode.blockCommentStart) { if (options.blockCommentStart || mode.blockCommentStart) {
@@ -52,7 +52,7 @@
CodeMirror.defineExtension("blockComment", function(from, to, options) { CodeMirror.defineExtension("blockComment", function(from, to, options) {
if (!options) options = noOptions; if (!options) options = noOptions;
var self = this, mode = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode; var self = this, mode = self.getModeAt(from);
var startString = options.blockCommentStart || mode.blockCommentStart; var startString = options.blockCommentStart || mode.blockCommentStart;
var endString = options.blockCommentEnd || mode.blockCommentEnd; var endString = options.blockCommentEnd || mode.blockCommentEnd;
if (!startString || !endString) { if (!startString || !endString) {
@@ -85,7 +85,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 = CodeMirror.innerMode(self.getMode(), self.getTokenAt(from).state).mode; 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.line, self.lastLine()), start = Math.min(from.line, end);
// Try finding line comments // Try finding line comments
@@ -0,0 +1,6 @@
.CodeMirror-fullscreen {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
height: auto;
z-index: 9;
}
@@ -0,0 +1,30 @@
(function() {
"use strict";
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
if (old == CodeMirror.Init) old = false;
if (!old == !val) return;
if (val) setFullscreen(cm);
else setNormal(cm);
});
function setFullscreen(cm) {
var wrap = cm.getWrapperElement();
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
width: wrap.style.width, height: wrap.style.height};
wrap.style.width = wrap.style.height = "";
wrap.className += " CodeMirror-fullscreen";
document.documentElement.style.overflow = "hidden";
cm.refresh();
}
function setNormal(cm) {
var wrap = cm.getWrapperElement();
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
document.documentElement.style.overflow = "";
var info = cm.state.fullScreenRestore;
wrap.style.width = info.width; wrap.style.height = info.height;
window.scrollTo(info.scrollLeft, info.scrollTop);
cm.refresh();
}
})();
@@ -54,7 +54,9 @@
if (cm.somethingSelected()) return surround(cm); if (cm.somethingSelected()) return surround(cm);
if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return; if (left == right && maybeOverwrite(cm) != CodeMirror.Pass) return;
var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1); var cur = cm.getCursor(), ahead = CodeMirror.Pos(cur.line, cur.ch + 1);
var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch); var line = cm.getLine(cur.line), nextChar = line.charAt(cur.ch), curChar = cur.ch > 0 ? line.charAt(cur.ch - 1) : "";
if (left == right && CodeMirror.isWordChar(curChar))
return CodeMirror.Pass;
if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar)) if (line.length == cur.ch || closingBrackets.indexOf(nextChar) >= 0 || SPACE_CHAR_REGEX.test(nextChar))
cm.replaceSelection(left + right, {head: ahead, anchor: ahead}); cm.replaceSelection(left + right, {head: ahead, anchor: ahead});
else else
+28 -27
View File
@@ -27,9 +27,9 @@
if (val && (old == CodeMirror.Init || !old)) { if (val && (old == CodeMirror.Init || !old)) {
var map = {name: "autoCloseTags"}; var map = {name: "autoCloseTags"};
if (typeof val != "object" || val.whenClosing) if (typeof val != "object" || val.whenClosing)
map["'/'"] = function(cm) { return autoCloseTag(cm, '/'); }; map["'/'"] = function(cm) { return autoCloseSlash(cm); };
if (typeof val != "object" || val.whenOpening) if (typeof val != "object" || val.whenOpening)
map["'>'"] = function(cm) { return autoCloseTag(cm, '>'); }; map["'>'"] = function(cm) { return autoCloseGT(cm); };
cm.addKeyMap(map); cm.addKeyMap(map);
} else if (!val && (old != CodeMirror.Init && old)) { } else if (!val && (old != CodeMirror.Init && old)) {
cm.removeKeyMap("autoCloseTags"); cm.removeKeyMap("autoCloseTags");
@@ -41,40 +41,41 @@
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4",
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"];
function autoCloseTag(cm, ch) { function autoCloseGT(cm) {
var pos = cm.getCursor(), tok = cm.getTokenAt(pos); var pos = cm.getCursor(), 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 (inner.mode.name != "xml") return CodeMirror.Pass; if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass;
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html";
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose);
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent);
if (ch == ">" && state.tagName) { var tagName = state.tagName;
var tagName = state.tagName; if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch);
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); var lowerTagName = tagName.toLowerCase();
var lowerTagName = tagName.toLowerCase(); // Don't process the '>' at the end of an end-tag or self-closing tag
// Don't process the '>' at the end of an end-tag or self-closing tag if (tok.type == "tag" && state.type == "closeTag" ||
if (tok.type == "tag" && state.type == "closeTag" || tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName /> dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1)
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1) return CodeMirror.Pass;
return CodeMirror.Pass;
var doIndent = indentTags && indexOf(indentTags, lowerTagName) > -1; var doIndent = indentTags && indexOf(indentTags, lowerTagName) > -1;
var curPos = doIndent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1); var curPos = doIndent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1);
cm.replaceSelection(">" + (doIndent ? "\n\n" : "") + "</" + tagName + ">", cm.replaceSelection(">" + (doIndent ? "\n\n" : "") + "</" + tagName + ">",
{head: curPos, anchor: curPos}); {head: curPos, anchor: curPos});
if (doIndent) { if (doIndent) {
cm.indentLine(pos.line + 1); cm.indentLine(pos.line + 1);
cm.indentLine(pos.line + 2); cm.indentLine(pos.line + 2);
}
return;
} else if (ch == "/" && tok.string == "<") {
var tagName = state.context && state.context.tagName;
if (tagName) cm.replaceSelection("/" + tagName + ">", "end");
return;
} }
return CodeMirror.Pass; }
function autoCloseSlash(cm) {
var pos = cm.getCursor(), tok = cm.getTokenAt(pos);
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state;
if (tok.string.charAt(0) != "<" || inner.mode.name != "xml") return CodeMirror.Pass;
var tagName = state.context && state.context.tagName;
if (tagName) cm.replaceSelection("/" + tagName + ">", "end");
} }
function indexOf(collection, elt) { function indexOf(collection, elt) {
@@ -1,44 +0,0 @@
(function() {
var modes = ["clike", "css", "javascript"];
for (var i = 0; i < modes.length; ++i)
CodeMirror.extendMode(modes[i], {blockCommentStart: "/*",
blockCommentEnd: "*/",
blockCommentContinue: " * "});
function continueComment(cm) {
var pos = cm.getCursor(), token = cm.getTokenAt(pos);
var mode = CodeMirror.innerMode(cm.getMode(), token.state).mode;
var space;
if (token.type == "comment" && mode.blockCommentStart) {
var end = token.string.indexOf(mode.blockCommentEnd);
var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found;
if (end != -1 && end == token.string.length - mode.blockCommentEnd.length) {
// Comment ended, don't continue it
} else if (token.string.indexOf(mode.blockCommentStart) == 0) {
space = full.slice(0, token.start);
if (!/^\s*$/.test(space)) {
space = "";
for (var i = 0; i < token.start; ++i) space += " ";
}
} else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 &&
found + mode.blockCommentContinue.length > token.start &&
/^\s*$/.test(full.slice(0, found))) {
space = full.slice(0, found);
}
}
if (space != null)
cm.replaceSelection("\n" + space + mode.blockCommentContinue, "end");
else
return CodeMirror.Pass;
}
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) {
if (prev && prev != CodeMirror.Init)
cm.removeKeyMap("continueComment");
var map = {name: "continueComment"};
map[typeof val == "string" ? val : "Enter"] = continueComment;
cm.addKeyMap(map);
});
})();
@@ -1,10 +1,10 @@
CodeMirror.braceRangeFinder = function(cm, start) { CodeMirror.registerHelper("fold", "brace", function(cm, start) {
var line = start.line, lineText = cm.getLine(line); var line = start.line, lineText = cm.getLine(line);
var startCh, tokenType; var startCh, tokenType;
function findOpening(openCh) { function findOpening(openCh) {
for (var at = start.ch, pass = 0;;) { for (var at = start.ch, pass = 0;;) {
var found = lineText.lastIndexOf(openCh, at - 1); var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1);
if (found == -1) { if (found == -1) {
if (pass == 1) break; if (pass == 1) break;
pass = 1; pass = 1;
@@ -12,7 +12,7 @@ CodeMirror.braceRangeFinder = function(cm, start) {
continue; continue;
} }
if (pass == 1 && found < start.ch) break; if (pass == 1 && found < start.ch) break;
tokenType = cm.getTokenAt(CodeMirror.Pos(line, found + 1)).type; tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1));
if (!/^(comment|string)/.test(tokenType)) return found + 1; if (!/^(comment|string)/.test(tokenType)) return found + 1;
at = found - 1; at = found - 1;
} }
@@ -34,7 +34,7 @@ CodeMirror.braceRangeFinder = function(cm, start) {
if (nextClose < 0) nextClose = text.length; if (nextClose < 0) nextClose = text.length;
pos = Math.min(nextOpen, nextClose); pos = Math.min(nextOpen, nextClose);
if (pos == text.length) break; if (pos == text.length) break;
if (cm.getTokenAt(CodeMirror.Pos(i, pos + 1)).type == tokenType) { if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) {
if (pos == nextOpen) ++count; if (pos == nextOpen) ++count;
else if (!--count) { end = i; endCh = pos; break outer; } else if (!--count) { end = i; endCh = pos; break outer; }
} }
@@ -44,9 +44,10 @@ CodeMirror.braceRangeFinder = function(cm, start) {
if (end == null || line == end && endCh == startCh) return; if (end == null || line == end && endCh == startCh) return;
return {from: CodeMirror.Pos(line, startCh), return {from: CodeMirror.Pos(line, startCh),
to: CodeMirror.Pos(end, endCh)}; to: CodeMirror.Pos(end, endCh)};
}; });
CodeMirror.braceRangeFinder = CodeMirror.fold.brace; // deprecated
CodeMirror.importRangeFinder = function(cm, start) { CodeMirror.registerHelper("fold", "import", function(cm, start) {
function hasImport(line) { function hasImport(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null; if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
@@ -68,9 +69,10 @@ CodeMirror.importRangeFinder = function(cm, start) {
end = next.end; end = next.end;
} }
return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end}; return {from: cm.clipPos(CodeMirror.Pos(start, has.startCh + 1)), to: end};
}; });
CodeMirror.importRangeFinder = CodeMirror.fold["import"]; // deprecated
CodeMirror.includeRangeFinder = function(cm, start) { CodeMirror.registerHelper("fold", "include", function(cm, start) {
function hasInclude(line) { function hasInclude(line) {
if (line < cm.firstLine() || line > cm.lastLine()) return null; if (line < cm.firstLine() || line > cm.lastLine()) return null;
var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); var start = cm.getTokenAt(CodeMirror.Pos(line, 1));
@@ -87,4 +89,5 @@ CodeMirror.includeRangeFinder = function(cm, start) {
} }
return {from: CodeMirror.Pos(start, has + 1), return {from: CodeMirror.Pos(start, has + 1),
to: cm.clipPos(CodeMirror.Pos(end))}; to: cm.clipPos(CodeMirror.Pos(end))};
}; });
CodeMirror.includeRangeFinder = CodeMirror.fold.include; // deprecated
@@ -2,7 +2,8 @@
"use strict"; "use strict";
function doFold(cm, pos, options) { function doFold(cm, pos, options) {
var finder = options.call ? options : (options && options.rangeFinder); var finder = options && (options.call ? options : options.rangeFinder);
if (!finder) finder = cm.getHelper(pos, "fold");
if (!finder) return; if (!finder) return;
if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
var minSize = options && options.minFoldSize || 0; var minSize = options && options.minFoldSize || 0;
@@ -29,12 +30,16 @@
if (!range || range.cleared) return; if (!range || range.cleared) return;
var myWidget = makeWidget(options); var myWidget = makeWidget(options);
CodeMirror.on(myWidget, "mousedown", function() {myRange.clear();}); CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); });
var myRange = cm.markText(range.from, range.to, { var myRange = cm.markText(range.from, range.to, {
replacedWith: myWidget, replacedWith: myWidget,
clearOnEnter: true, clearOnEnter: true,
__isFold: true __isFold: true
}); });
myRange.on("clear", function(from, to) {
CodeMirror.signal(cm, "unfold", cm, from, to);
});
CodeMirror.signal(cm, "fold", cm, range.from, range.to);
} }
function makeWidget(options) { function makeWidget(options) {
@@ -56,7 +61,7 @@
// New-style interface // New-style interface
CodeMirror.defineExtension("foldCode", function(pos, options) { doFold(this, pos, options); }); CodeMirror.defineExtension("foldCode", function(pos, options) { doFold(this, pos, options); });
CodeMirror.combineRangeFinders = function() { CodeMirror.registerHelper("fold", "combine", function() {
var funcs = Array.prototype.slice.call(arguments, 0); var funcs = Array.prototype.slice.call(arguments, 0);
return function(cm, start) { return function(cm, start) {
for (var i = 0; i < funcs.length; ++i) { for (var i = 0; i < funcs.length; ++i) {
@@ -64,5 +69,5 @@
if (found) return found; if (found) return found;
} }
}; };
}; });
})(); })();
@@ -1,4 +1,4 @@
CodeMirror.indentRangeFinder = function(cm, start) { CodeMirror.registerHelper("fold", "indent", function(cm, start) {
var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line); var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line);
var myIndent = CodeMirror.countColumn(firstLine, null, tabSize); var myIndent = CodeMirror.countColumn(firstLine, null, tabSize);
for (var i = start.line + 1, end = cm.lineCount(); i < end; ++i) { for (var i = start.line + 1, end = cm.lineCount(); i < end; ++i) {
@@ -8,4 +8,5 @@ CodeMirror.indentRangeFinder = function(cm, start) {
return {from: CodeMirror.Pos(start.line, firstLine.length), return {from: CodeMirror.Pos(start.line, firstLine.length),
to: CodeMirror.Pos(i, curLine.length)}; to: CodeMirror.Pos(i, curLine.length)};
} }
}; });
CodeMirror.indentRangeFinder = CodeMirror.fold.indent; // deprecated
+24 -17
View File
@@ -2,14 +2,17 @@
"use strict"; "use strict";
var Pos = CodeMirror.Pos; var Pos = CodeMirror.Pos;
function cmp(a, b) { return a.line - b.line || a.ch - b.ch; }
var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g");
function Iter(cm, line, ch) { function Iter(cm, line, ch, range) {
this.line = line; this.ch = ch; this.line = line; this.ch = ch;
this.cm = cm; this.text = cm.getLine(line); this.cm = cm; this.text = cm.getLine(line);
this.min = range ? range.from : cm.firstLine();
this.max = range ? range.to - 1 : cm.lastLine();
} }
function tagAt(iter, ch) { function tagAt(iter, ch) {
@@ -18,13 +21,13 @@
} }
function nextLine(iter) { function nextLine(iter) {
if (iter.line >= iter.cm.lastLine()) return; if (iter.line >= iter.max) return;
iter.ch = 0; iter.ch = 0;
iter.text = iter.cm.getLine(++iter.line); iter.text = iter.cm.getLine(++iter.line);
return true; return true;
} }
function prevLine(iter) { function prevLine(iter) {
if (iter.line <= iter.cm.firstLine()) return; if (iter.line <= iter.min) return;
iter.text = iter.cm.getLine(--iter.line); iter.text = iter.cm.getLine(--iter.line);
iter.ch = iter.text.length; iter.ch = iter.text.length;
return true; return true;
@@ -43,7 +46,7 @@
} }
function toTagStart(iter) { function toTagStart(iter) {
for (;;) { for (;;) {
var lt = iter.text.lastIndexOf("<", iter.ch - 1); var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1;
if (lt == -1) { if (prevLine(iter)) continue; else return; } if (lt == -1) { if (prevLine(iter)) continue; else return; }
if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; }
xmlTagStart.lastIndex = lt; xmlTagStart.lastIndex = lt;
@@ -65,7 +68,7 @@
} }
function toPrevTag(iter) { function toPrevTag(iter) {
for (;;) { for (;;) {
var gt = iter.text.lastIndexOf(">", iter.ch - 1); var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1;
if (gt == -1) { if (prevLine(iter)) continue; else return; } if (gt == -1) { if (prevLine(iter)) continue; else return; }
if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; }
var lastSlash = iter.text.lastIndexOf("/", gt); var lastSlash = iter.text.lastIndexOf("/", gt);
@@ -121,7 +124,7 @@
} }
} }
CodeMirror.tagRangeFinder = function(cm, start) { CodeMirror.registerHelper("fold", "xml", function(cm, start) {
var iter = new Iter(cm, start.line, 0); var iter = new Iter(cm, start.line, 0);
for (;;) { for (;;) {
var openTag = toNextTag(iter), end; var openTag = toNextTag(iter), end;
@@ -132,27 +135,31 @@
return close && {from: start, to: close.from}; return close && {from: start, to: close.from};
} }
} }
}; });
CodeMirror.tagRangeFinder = CodeMirror.fold.xml; // deprecated
CodeMirror.findMatchingTag = function(cm, pos) { CodeMirror.findMatchingTag = function(cm, pos, range) {
var iter = new Iter(cm, pos.line, pos.ch); var iter = new Iter(cm, pos.line, pos.ch, range);
var end = toTagEnd(iter), start = toTagStart(iter); if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
if (!end || end == "selfClose" || !start) return; var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
var start = end && toTagStart(iter);
if (!end || end == "selfClose" || !start || cmp(iter, pos) > 0) return;
var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
if (start[1]) { // closing tag if (start[1]) { // closing tag
return findMatchingOpen(iter, start[2]); return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
} else { // opening tag } else { // opening tag
toTagEnd(iter); iter = new Iter(cm, to.line, to.ch, range);
return findMatchingClose(iter, start[2]); return {open: here, close: findMatchingClose(iter, start[2]), at: "open"};
} }
}; };
CodeMirror.findEnclosingTag = function(cm, pos) { CodeMirror.findEnclosingTag = function(cm, pos, range) {
var iter = new Iter(cm, pos.line, pos.ch); var iter = new Iter(cm, pos.line, pos.ch, range);
for (;;) { for (;;) {
var open = findMatchingOpen(iter); var open = findMatchingOpen(iter);
if (!open) break; if (!open) break;
var forward = new Iter(cm, pos.line, pos.ch); var forward = new Iter(cm, pos.line, pos.ch, range);
var close = findMatchingClose(forward, open.tag); var close = findMatchingClose(forward, open.tag);
if (close) return {open: open, close: close}; if (close) return {open: open, close: close};
} }
@@ -327,9 +327,11 @@
populate(data[tag]); populate(data[tag]);
CodeMirror.htmlSchema = data; CodeMirror.htmlSchema = data;
CodeMirror.htmlHint = function(cm, options) { function htmlHint(cm, options) {
var local = {schemaInfo: data}; var local = {schemaInfo: data};
if (options) for (var opt in options) local[opt] = options[opt]; if (options) for (var opt in options) local[opt] = options[opt];
return CodeMirror.xmlHint(cm, local); return CodeMirror.hint.xml(cm, local);
}; }
CodeMirror.htmlHint = htmlHint; // deprecated
CodeMirror.registerHelper("hint", "html", htmlHint);
})(); })();
@@ -56,11 +56,13 @@
to: Pos(cur.line, token.end)}; to: Pos(cur.line, token.end)};
} }
CodeMirror.javascriptHint = function(editor, options) { function javascriptHint(editor, options) {
return scriptHint(editor, javascriptKeywords, return scriptHint(editor, javascriptKeywords,
function (e, cur) {return e.getTokenAt(cur);}, function (e, cur) {return e.getTokenAt(cur);},
options); options);
}; };
CodeMirror.javascriptHint = javascriptHint; // deprecated
CodeMirror.registerHelper("hint", "javascript", javascriptHint);
function getCoffeeScriptToken(editor, cur) { function getCoffeeScriptToken(editor, cur) {
// This getToken, it is for coffeescript, imitates the behavior of // This getToken, it is for coffeescript, imitates the behavior of
@@ -80,9 +82,11 @@
return token; return token;
} }
CodeMirror.coffeescriptHint = function(editor, options) { function coffeescriptHint(editor, options) {
return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
}; }
CodeMirror.coffeescriptHint = coffeescriptHint; // deprecated
CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint);
var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
"toUpperCase toLowerCase split concat match replace search").split(" "); "toUpperCase toLowerCase split concat match replace search").split(" ");
@@ -1,4 +1,6 @@
(function () { (function () {
"use strict";
function forEach(arr, f) { function forEach(arr, f) {
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
} }
@@ -41,9 +43,11 @@
to: CodeMirror.Pos(cur.line, token.end)}; to: CodeMirror.Pos(cur.line, token.end)};
} }
CodeMirror.pigHint = function(editor) { function pigHint(editor) {
return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);}); return scriptHint(editor, pigKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
}; }
CodeMirror.pigHint = pigHint; // deprecated
CodeMirror.registerHelper("hint", "pig", pigHint);
var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " var pigKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP "
+ "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL "
@@ -41,9 +41,11 @@
to: CodeMirror.Pos(cur.line, token.end)}; to: CodeMirror.Pos(cur.line, token.end)};
} }
CodeMirror.pythonHint = function(editor) { function pythonHint(editor) {
return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);}); return scriptHint(editor, pythonKeywordsU, function (e, cur) {return e.getTokenAt(cur);});
}; }
CodeMirror.pythonHint = pythonHint; // deprecated
CodeMirror.registerHelper("hint", "python", pythonHint);
var pythonKeywords = "and del from not while as elif global or with assert else if pass yield" var pythonKeywords = "and del from not while as elif global or with assert else if pass yield"
+ "break except import print class exec in raise continue finally is return def for lambda try"; + "break except import print class exec in raise continue finally is return def for lambda try";
+23 -19
View File
@@ -4,6 +4,8 @@
CodeMirror.showHint = function(cm, getHints, options) { CodeMirror.showHint = function(cm, getHints, options) {
// We want a single cursor position. // We want a single cursor position.
if (cm.somethingSelected()) return; if (cm.somethingSelected()) return;
if (getHints == null) getHints = cm.getHelper(cm.getCursor(), "hint");
if (getHints == null) return;
if (cm.state.completionActive) cm.state.completionActive.close(); if (cm.state.completionActive) cm.state.completionActive.close();
@@ -25,10 +27,10 @@
Completion.prototype = { Completion.prototype = {
close: function() { close: function() {
if (!this.active()) return; if (!this.active()) return;
this.cm.state.completionActive = null;
if (this.widget) this.widget.close(); if (this.widget) this.widget.close();
if (this.onClose) this.onClose(); if (this.onClose) this.onClose();
this.cm.state.completionActive = null;
CodeMirror.signal(this.cm, "endCompletion", this.cm); CodeMirror.signal(this.cm, "endCompletion", this.cm);
}, },
@@ -65,24 +67,21 @@
finished = true; finished = true;
completion.close(); completion.close();
completion.cm.off("cursorActivity", activity); completion.cm.off("cursorActivity", activity);
CodeMirror.signal(data, "close"); if (data) CodeMirror.signal(data, "close");
}
function isDone() {
if (finished) return true;
if (!completion.widget) { done(); return true; }
} }
function update() { function update() {
if (isDone()) return; if (finished) return;
CodeMirror.signal(data, "update");
if (completion.options.async) if (completion.options.async)
completion.getHints(completion.cm, finishUpdate, completion.options); completion.getHints(completion.cm, finishUpdate, completion.options);
else else
finishUpdate(completion.getHints(completion.cm, completion.options)); finishUpdate(completion.getHints(completion.cm, completion.options));
} }
function finishUpdate(data) { function finishUpdate(data_) {
if (isDone()) return; data = data_;
if (finished) return;
if (!data || !data.list.length) return done(); if (!data || !data.list.length) return done();
completion.widget.close();
completion.widget = new Widget(completion, data); completion.widget = new Widget(completion, data);
} }
@@ -91,10 +90,12 @@
var pos = completion.cm.getCursor(), line = completion.cm.getLine(pos.line); var pos = completion.cm.getCursor(), line = completion.cm.getLine(pos.line);
if (pos.line != startPos.line || line.length - pos.ch != startLen - startPos.ch || if (pos.line != startPos.line || line.length - pos.ch != startLen - startPos.ch ||
pos.ch < startPos.ch || completion.cm.somethingSelected() || pos.ch < startPos.ch || completion.cm.somethingSelected() ||
(pos.ch && closeOn.test(line.charAt(pos.ch - 1)))) (pos.ch && closeOn.test(line.charAt(pos.ch - 1)))) {
completion.close(); completion.close();
else } else {
debounce = setTimeout(update, 170); debounce = setTimeout(update, 170);
if (completion.widget) completion.widget.close();
}
} }
this.cm.on("cursorActivity", activity); this.cm.on("cursorActivity", activity);
this.onClose = done; this.onClose = done;
@@ -110,10 +111,10 @@
var baseMap = { var baseMap = {
Up: function() {handle.moveFocus(-1);}, Up: function() {handle.moveFocus(-1);},
Down: function() {handle.moveFocus(1);}, Down: function() {handle.moveFocus(1);},
PageUp: function() {handle.moveFocus(-handle.menuSize());}, PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
PageDown: function() {handle.moveFocus(handle.menuSize());}, PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
Home: function() {handle.setFocus(0);}, Home: function() {handle.setFocus(0);},
End: function() {handle.setFocus(handle.length);}, End: function() {handle.setFocus(handle.length - 1);},
Enter: handle.pick, Enter: handle.pick,
Tab: handle.pick, Tab: handle.pick,
Esc: handle.close Esc: handle.close
@@ -166,6 +167,7 @@
// If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth);
var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
(options.container || document.body).appendChild(hints);
var box = hints.getBoundingClientRect(); var box = hints.getBoundingClientRect();
var overlapX = box.right - winW, overlapY = box.bottom - winH; var overlapX = box.right - winW, overlapY = box.bottom - winH;
if (overlapX > 0) { if (overlapX > 0) {
@@ -186,10 +188,9 @@
} }
hints.style.top = (top = pos.bottom - overlapY) + "px"; hints.style.top = (top = pos.bottom - overlapY) + "px";
} }
(options.container || document.body).appendChild(hints);
cm.addKeyMap(this.keyMap = buildKeyMap(options, { cm.addKeyMap(this.keyMap = buildKeyMap(options, {
moveFocus: function(n) { widget.changeActive(widget.selectedHint + n); }, moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
setFocus: function(n) { widget.changeActive(n); }, setFocus: function(n) { widget.changeActive(n); },
menuSize: function() { return widget.screenAmount(); }, menuSize: function() { return widget.screenAmount(); },
length: completions.length, length: completions.length,
@@ -249,8 +250,11 @@
this.completion.pick(this.data, this.selectedHint); this.completion.pick(this.data, this.selectedHint);
}, },
changeActive: function(i) { changeActive: function(i, avoidWrap) {
i = Math.max(0, Math.min(i, this.data.list.length - 1)); if (i >= this.data.list.length)
i = avoidWrap ? this.data.list.length - 1 : 0;
else if (i < 0)
i = avoidWrap ? 0 : this.data.list.length - 1;
if (this.selectedHint == i) return; if (this.selectedHint == i) return;
var node = this.hints.childNodes[this.selectedHint]; var node = this.hints.childNodes[this.selectedHint];
node.className = node.className.replace(" CodeMirror-hint-active", ""); node.className = node.className.replace(" CodeMirror-hint-active", "");
@@ -3,7 +3,7 @@
var Pos = CodeMirror.Pos; var Pos = CodeMirror.Pos;
CodeMirror.xmlHint = function(cm, options) { function getHints(cm, options) {
var tags = options && options.schemaInfo; var tags = options && options.schemaInfo;
var quote = (options && options.quoteChar) || '"'; var quote = (options && options.quoteChar) || '"';
if (!tags) return; if (!tags) return;
@@ -61,5 +61,8 @@
from: replaceToken ? Pos(cur.line, token.start) : cur, from: replaceToken ? Pos(cur.line, token.start) : cur,
to: replaceToken ? Pos(cur.line, token.end) : cur to: replaceToken ? Pos(cur.line, token.end) : cur
}; };
}; }
CodeMirror.xmlHint = getHints; // deprecated
CodeMirror.registerHelper("hint", "xml", getHints);
})(); })();
@@ -1,6 +1,8 @@
// Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js // Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js
CodeMirror.coffeeValidator = function(text) { // declare global: coffeelint
CodeMirror.registerHelper("lint", "coffeescript", function(text) {
var found = []; var found = [];
var parseError = function(err) { var parseError = function(err) {
var loc = err.lineNumber; var loc = err.lineNumber;
@@ -21,4 +23,5 @@ CodeMirror.coffeeValidator = function(text) {
message: e.message}); message: e.message});
} }
return found; return found;
}; });
CodeMirror.coffeeValidator = CodeMirror.lint.coffeescript; // deprecated
@@ -1,4 +1,6 @@
(function() { (function() {
"use strict";
// declare global: JSHINT
var bogus = [ "Dangerous comment" ]; var bogus = [ "Dangerous comment" ];
@@ -9,18 +11,15 @@
"Unmatched ", " and instead saw", " is not defined", "Unmatched ", " and instead saw", " is not defined",
"Unclosed string", "Stopping, unable to continue" ]; "Unclosed string", "Stopping, unable to continue" ];
function validator(options, text) { function validator(text, options) {
JSHINT(text, options); JSHINT(text, options);
var errors = JSHINT.data().errors, result = []; var errors = JSHINT.data().errors, result = [];
if (errors) parseErrors(errors, result); if (errors) parseErrors(errors, result);
return result; return result;
} }
CodeMirror.javascriptValidatorWithOptions = function(options) { CodeMirror.registerHelper("lint", "javascript", validator);
return function(text) { return validator(options, text); }; CodeMirror.javascriptValidator = CodeMirror.lint.javascript; // deprecated
};
CodeMirror.javascriptValidator = CodeMirror.javascriptValidatorWithOptions(null);
function cleanup(error) { function cleanup(error) {
// All problems are warnings by default // All problems are warnings by default
@@ -1,6 +1,8 @@
// Depends on jsonlint.js from https://github.com/zaach/jsonlint // Depends on jsonlint.js from https://github.com/zaach/jsonlint
CodeMirror.jsonValidator = function(text) { // declare global: jsonlint
CodeMirror.registerHelper("lint", "json", function(text) {
var found = []; var found = [];
jsonlint.parseError = function(str, hash) { jsonlint.parseError = function(str, hash) {
var loc = hash.loc; var loc = hash.loc;
@@ -11,4 +13,5 @@ CodeMirror.jsonValidator = function(text) {
try { jsonlint.parse(text); } try { jsonlint.parse(text); }
catch(e) {} catch(e) {}
return found; return found;
}; });
CodeMirror.jsonValidator = CodeMirror.lint.json; // deprecated
+3 -27
View File
@@ -57,40 +57,16 @@
} }
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { .CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
background-image: url("data:image/gif;base64,R0lGODlhEAAQANUAAPVvcvWHiPVucvRuc+ttcfV6f91KVN5LU99PV/FZY/JhaM4oN84pONE4Rd1ATfJLWutVYPRgbdxpcsgWKMgZKs4lNfE/UvE/U+artcpdSc5uXveimslHPuBhW/eJhfV5efaCgO2CgP+/v+PExP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACUALAAAAAAQABAAAAZ+wJJwSCwaScgkySgkjTQZTkYzWhadnE5oE+pwqkSshwQqkzxfa4kkQXxEpA9J9EFI1KQGQQBAigYCBA14ExEWF0gXihETeA0QD3AkD5QQg0NsDnAJmwkOd5gYFSQKpXAFDBhqaxgLBwQBBAapq00YEg0UDRKqTGtKSL7Cw8JBADs="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
} }
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { .CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
background-image: url("data:image/gif;base64,R0lGODlhEAAQANUAAP7bc//egf/ij/7ijv/jl/7kl//mnv7lnv/uwf7CTP7DTf7DT/7IW//Na/7Na//NbP7QdP/dmbltAIJNAF03AMSAJMSCLKqASa2DS6uBSquCSrGHTq6ETbCHT7WKUrKIUcCVXL+UXMOYX8GWXsSZYMiib6+ETbOIUcOXX86uhd3Muf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACsALAAAAAAQABAAAAZowJVwSCwaj0ihikRSJYcoBEL0XKlGkcjImQQhJBREKFnyICoThKeE/AAW6AXgdPyUAgrLJBEo0YsbAQyDhAEdRRwDDw8OaA4NDQImRBgFEJdglxAEGEQZKQcHBqOkKRpFF6mqq1WtrUEAOw=="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
} }
.CodeMirror-lint-marker-multiple { .CodeMirror-lint-marker-multiple {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJEAQvB2JVdrAAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAD1JREFUCNdtjkESADAEAzemf69f66HMqGlOIhYiFRFRtSQBWAY7mzx+EDTL6sSgb1jTk7Q87rxyqe37fXsAa78gLyZnRgEAAAAASUVORK5CYII="); background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: right bottom; background-position: right bottom;
width: 100%; height: 100%; width: 100%; height: 100%;
} }
/* Styles for the overview ruler
.annotationOverview {
cursor: pointer;
border-radius: 2px;
left: 2px;
width: 8px;
}
.annotationOverview.error {
background-color: lightcoral;
border: 1px solid darkred;
}
.annotationOverview.warning {
background-color: Gold;
border: 1px solid black;
}
.annotationHTML.overlay {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAAXNSR0IArs4c6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJEAQvB2JVdrAAAAAdaVRYdENvbW1lbnQAAAAAAENyZWF0ZWQgd2l0aCBHSU1QZC5lBwAAAD1JREFUCNdtjkESADAEAzemf69f66HMqGlOIhYiFRFRtSQBWAY7mzx+EDTL6sSgb1jTk7Q87rxyqe37fXsAa78gLyZnRgEAAAAASUVORK5CYII=");
background-position: right bottom;
position: relative;
top: -16px;
}
*/
+13 -7
View File
@@ -1,4 +1,5 @@
CodeMirror.validate = (function() { (function() {
"use strict";
var GUTTER_ID = "CodeMirror-lint-markers"; var GUTTER_ID = "CodeMirror-lint-markers";
var SEVERITIES = /^(?:error|warning)$/; var SEVERITIES = /^(?:error|warning)$/;
@@ -52,9 +53,11 @@ CodeMirror.validate = (function() {
this.onMouseOver = function(e) { onMouseOver(cm, e); }; this.onMouseOver = function(e) { onMouseOver(cm, e); };
} }
function parseOptions(options) { function parseOptions(cm, options) {
if (options instanceof Function) return {getAnnotations: options}; if (options instanceof Function) return {getAnnotations: options};
else if (!options || !options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)"); if (!options || options === true) options = {};
if (!options.getAnnotations) options.getAnnotations = cm.getHelper(CodeMirror.Pos(0, 0), "lint");
if (!options.getAnnotations) throw new Error("Required option 'getAnnotations' missing (lint addon)");
return options; return options;
} }
@@ -109,7 +112,7 @@ CodeMirror.validate = (function() {
if (options.async) if (options.async)
options.getAnnotations(cm, updateLinting, options); options.getAnnotations(cm, updateLinting, options);
else else
updateLinting(cm, options.getAnnotations(cm.getValue())); updateLinting(cm, options.getAnnotations(cm.getValue(), options));
} }
function updateLinting(cm, annotationsNotSorted) { function updateLinting(cm, annotationsNotSorted) {
@@ -175,7 +178,7 @@ CodeMirror.validate = (function() {
} }
} }
CodeMirror.defineOption("lintWith", false, function(cm, val, old) { function optionHandler(cm, val, old) {
if (old && old != CodeMirror.Init) { if (old && old != CodeMirror.Init) {
clearMarks(cm); clearMarks(cm);
cm.off("change", onChange); cm.off("change", onChange);
@@ -186,12 +189,15 @@ CodeMirror.validate = (function() {
if (val) { if (val) {
var gutters = cm.getOption("gutters"), hasLintGutter = false; var gutters = cm.getOption("gutters"), hasLintGutter = false;
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
var state = cm.state.lint = new LintState(cm, parseOptions(val), hasLintGutter); var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter);
cm.on("change", onChange); cm.on("change", onChange);
if (state.options.tooltips != false) if (state.options.tooltips != false)
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
startLinting(cm); startLinting(cm);
} }
}); }
CodeMirror.defineOption("lintWith", false, optionHandler); // deprecated
CodeMirror.defineOption("lint", false, optionHandler); // deprecated
})(); })();
+39 -29
View File
@@ -1,24 +1,34 @@
.CodeMirror-diff { .CodeMirror-merge {
position: relative; position: relative;
border: 1px solid #ddd; border: 1px solid #ddd;
white-space: pre;
} }
.CodeMirror-diff, .CodeMirror-diff .CodeMirror { .CodeMirror-merge, .CodeMirror-merge .CodeMirror {
height: 350px; height: 350px;
} }
.CodeMirror-diff-2pane .CodeMirror-diff-pane { width: 47%; } .CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; }
.CodeMirror-diff-2pane .CodeMirror-diff-gap { width: 6%; } .CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; }
.CodeMirror-diff-3pane .CodeMirror-diff-pane { width: 31%; } .CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; }
.CodeMirror-diff-3pane .CodeMirror-diff-gap { width: 3.5%; } .CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; }
.CodeMirror-diff-pane { .CodeMirror-merge-pane {
float: left; display: inline-block;
white-space: normal;
vertical-align: top;
}
.CodeMirror-merge-pane-rightmost {
position: absolute;
right: 0px;
z-index: 1;
} }
.CodeMirror-diff-gap { .CodeMirror-merge-gap {
float: left; z-index: 2;
display: inline-block;
height: 100%; height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
border-left: 1px solid #ddd; border-left: 1px solid #ddd;
@@ -27,11 +37,11 @@
background: #f8f8f8; background: #f8f8f8;
} }
.CodeMirror-diff-scrolllock-wrap { .CodeMirror-merge-scrolllock-wrap {
position: absolute; position: absolute;
bottom: 0; left: 50%; bottom: 0; left: 50%;
} }
.CodeMirror-diff-scrolllock { .CodeMirror-merge-scrolllock {
position: relative; position: relative;
left: -50%; left: -50%;
cursor: pointer; cursor: pointer;
@@ -39,44 +49,44 @@
line-height: 1; line-height: 1;
} }
.CodeMirror-diff-copybuttons-left, .CodeMirror-diff-copybuttons-right { .CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right {
position: absolute; position: absolute;
left: 0; top: 0; left: 0; top: 0;
right: 0; bottom: 0; right: 0; bottom: 0;
line-height: 1; line-height: 1;
} }
.CodeMirror-diff-copy { .CodeMirror-merge-copy {
position: absolute; position: absolute;
cursor: pointer; cursor: pointer;
color: #44c; color: #44c;
} }
.CodeMirror-diff-copybuttons-left .CodeMirror-diff-copy { left: 2px; } .CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
.CodeMirror-diff-copybuttons-right .CodeMirror-diff-copy { right: 2px; } .CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }
.CodeMirror-diff-r-inserted, .CodeMirror-diff-l-inserted { .CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);
background-position: bottom left; background-position: bottom left;
background-repeat: repeat-x; background-repeat: repeat-x;
} }
.CodeMirror-diff-r-deleted, .CodeMirror-diff-l-deleted { .CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);
background-position: bottom left; background-position: bottom left;
background-repeat: repeat-x; background-repeat: repeat-x;
} }
.CodeMirror-diff-r-chunk { background: #ffffe0; } .CodeMirror-merge-r-chunk { background: #ffffe0; }
.CodeMirror-diff-r-chunk-start { border-top: 1px solid #ee8; } .CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; }
.CodeMirror-diff-r-chunk-end { border-bottom: 1px solid #ee8; } .CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; }
.CodeMirror-diff-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } .CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; }
.CodeMirror-diff-l-chunk { background: #eef; } .CodeMirror-merge-l-chunk { background: #eef; }
.CodeMirror-diff-l-chunk-start { border-top: 1px solid #88e; } .CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; }
.CodeMirror-diff-l-chunk-end { border-bottom: 1px solid #88e; } .CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; }
.CodeMirror-diff-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } .CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; }
.CodeMirror-diff-l-chunk.CodeMirror-diff-r-chunk { background: #dfd; } .CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; }
.CodeMirror-diff-l-chunk-start.CodeMirror-diff-r-chunk-start { border-top: 1px solid #4e4; } .CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; }
.CodeMirror-diff-l-chunk-end.CodeMirror-diff-r-chunk-end { border-bottom: 1px solid #4e4; } .CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; }
+73 -30
View File
@@ -1,5 +1,6 @@
(function() { (function() {
"use strict"; "use strict";
// declare global: diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL
var Pos = CodeMirror.Pos; var Pos = CodeMirror.Pos;
var svgNS = "http://www.w3.org/2000/svg"; var svgNS = "http://www.w3.org/2000/svg";
@@ -8,18 +9,18 @@
this.mv = mv; this.mv = mv;
this.type = type; this.type = type;
this.classes = type == "left" this.classes = type == "left"
? {chunk: "CodeMirror-diff-l-chunk", ? {chunk: "CodeMirror-merge-l-chunk",
start: "CodeMirror-diff-l-chunk-start", start: "CodeMirror-merge-l-chunk-start",
end: "CodeMirror-diff-l-chunk-end", end: "CodeMirror-merge-l-chunk-end",
insert: "CodeMirror-diff-l-inserted", insert: "CodeMirror-merge-l-inserted",
del: "CodeMirror-diff-l-deleted", del: "CodeMirror-merge-l-deleted",
connect: "CodeMirror-diff-l-connect"} connect: "CodeMirror-merge-l-connect"}
: {chunk: "CodeMirror-diff-r-chunk", : {chunk: "CodeMirror-merge-r-chunk",
start: "CodeMirror-diff-r-chunk-start", start: "CodeMirror-merge-r-chunk-start",
end: "CodeMirror-diff-r-chunk-end", end: "CodeMirror-merge-r-chunk-end",
insert: "CodeMirror-diff-r-inserted", insert: "CodeMirror-merge-r-inserted",
del: "CodeMirror-diff-r-deleted", del: "CodeMirror-merge-r-deleted",
connect: "CodeMirror-diff-r-connect"}; connect: "CodeMirror-merge-r-connect"};
} }
DiffView.prototype = { DiffView.prototype = {
@@ -31,9 +32,17 @@
this.diff = getDiff(orig, options.value); this.diff = getDiff(orig, options.value);
this.diffOutOfDate = false; this.diffOutOfDate = false;
this.showDifferences = options.showDifferences !== false;
this.forceUpdate = registerUpdate(this); this.forceUpdate = registerUpdate(this);
setScrollLock(this, true, false); setScrollLock(this, true, false);
registerScroll(this); registerScroll(this);
},
setShowDifferences: function(val) {
val = val !== false;
if (val != this.showDifferences) {
this.showDifferences = val;
this.forceUpdate("full");
}
} }
}; };
@@ -41,26 +50,38 @@
var edit = {from: 0, to: 0, marked: []}; var edit = {from: 0, to: 0, marked: []};
var orig = {from: 0, to: 0, marked: []}; var orig = {from: 0, to: 0, marked: []};
var debounceChange; var debounceChange;
function update() { function update(mode) {
if (mode == "full") {
if (dv.svg) clear(dv.svg);
clear(dv.copyButtons);
clearMarks(dv.edit, edit.marked, dv.classes);
clearMarks(dv.orig, orig.marked, dv.classes);
edit.from = edit.to = orig.from = orig.to = 0;
}
if (dv.diffOutOfDate) { if (dv.diffOutOfDate) {
dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue()); dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue());
dv.diffOutOfDate = false; dv.diffOutOfDate = false;
CodeMirror.signal(dv.edit, "updateDiff", dv.diff);
}
if (dv.showDifferences) {
updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
} }
updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes);
updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes);
drawConnectors(dv); drawConnectors(dv);
} }
function set(slow) { function set(slow) {
clearTimeout(debounceChange); clearTimeout(debounceChange);
debounceChange = setTimeout(update, slow == true ? 250 : 100); debounceChange = setTimeout(update, slow == true ? 250 : 100);
} }
dv.edit.on("change", function() { function change() {
if (!dv.diffOutOfDate) { if (!dv.diffOutOfDate) {
dv.diffOutOfDate = true; dv.diffOutOfDate = true;
edit.from = edit.to = orig.from = orig.to = 0; edit.from = edit.to = orig.from = orig.to = 0;
} }
set(true); set(true);
}); }
dv.edit.on("change", change);
dv.orig.on("change", change);
dv.edit.on("viewportChange", set); dv.edit.on("viewportChange", set);
dv.orig.on("viewportChange", set); dv.orig.on("viewportChange", set);
update(); update();
@@ -93,7 +114,21 @@
var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig); var off = getOffsets(editor, type == DIFF_INSERT ? around.edit : around.orig);
var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit); var offOther = getOffsets(other, type == DIFF_INSERT ? around.orig : around.edit);
var ratio = (midY - off.top) / (off.bot - off.top); var ratio = (midY - off.top) / (off.bot - off.top);
other.scrollTo(null, (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top)); var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top);
var botDist, mix;
// Some careful tweaking to make sure no space is left out of view
// when scrolling to top or bottom.
if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) {
targetPos = targetPos * mix + sInfo.top * (1 - mix);
} else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) {
var otherInfo = other.getScrollInfo();
var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos;
if (botDistOther > botDist && (mix = botDist / halfScreen) < 1)
targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix);
}
other.scrollTo(sInfo.left, targetPos);
other.state.scrollSetAt = now; other.state.scrollSetAt = now;
other.state.scrollSetBy = dv; other.state.scrollSetBy = dv;
return true; return true;
@@ -197,6 +232,8 @@
// Updating the gap between editor and original // Updating the gap between editor and original
function drawConnectors(dv) { function drawConnectors(dv) {
if (!dv.showDifferences) return;
if (dv.svg) { if (dv.svg) {
clear(dv.svg); clear(dv.svg);
var w = dv.gap.offsetWidth; var w = dv.gap.offsetWidth;
@@ -208,8 +245,8 @@
var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport(); var vpEdit = dv.edit.getViewport(), vpOrig = dv.orig.getViewport();
var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top; var sTopEdit = dv.edit.getScrollInfo().top, sTopOrig = dv.orig.getScrollInfo().top;
iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) { iterateChunks(dv.diff, function(topOrig, botOrig, topEdit, botEdit) {
if (topEdit >= vpEdit.to || botEdit < vpEdit.from || if (topEdit > vpEdit.to || botEdit < vpEdit.from ||
topOrig >= vpOrig.to || botOrig < vpOrig.from) topOrig > vpOrig.to || botOrig < vpOrig.from)
return; return;
var topLpx = dv.orig.heightAtLine(topOrig, "local") - sTopOrig, top = topLpx; var topLpx = dv.orig.heightAtLine(topOrig, "local") - sTopOrig, top = topLpx;
if (dv.svg) { if (dv.svg) {
@@ -225,7 +262,7 @@
"class", dv.classes.connect); "class", dv.classes.connect);
} }
var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc",
"CodeMirror-diff-copy")); "CodeMirror-merge-copy"));
copy.title = "Revert chunk"; copy.title = "Revert chunk";
copy.chunk = {topEdit: topEdit, botEdit: botEdit, topOrig: topOrig, botOrig: botOrig}; copy.chunk = {topEdit: topEdit, botEdit: botEdit, topOrig: topOrig, botOrig: botOrig};
copy.style.top = top + "px"; copy.style.top = top + "px";
@@ -250,23 +287,25 @@
if (hasLeft) { if (hasLeft) {
left = this.left = new DiffView(this, "left"); left = this.left = new DiffView(this, "left");
var leftPane = elt("div", null, "CodeMirror-diff-pane"); var leftPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(leftPane); wrap.push(leftPane);
wrap.push(buildGap(left)); wrap.push(buildGap(left));
} }
var editPane = elt("div", null, "CodeMirror-diff-pane"); var editPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(editPane); wrap.push(editPane);
if (hasRight) { if (hasRight) {
right = this.right = new DiffView(this, "right"); right = this.right = new DiffView(this, "right");
wrap.push(buildGap(right)); wrap.push(buildGap(right));
var rightPane = elt("div", null, "CodeMirror-diff-pane"); var rightPane = elt("div", null, "CodeMirror-merge-pane");
wrap.push(rightPane); wrap.push(rightPane);
} }
(hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost";
wrap.push(elt("div", null, null, "height: 0; clear: both;")); wrap.push(elt("div", null, null, "height: 0; clear: both;"));
var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-diff CodeMirror-diff-" + panes + "pane")); var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane"));
this.edit = CodeMirror(editPane, copyObj(options)); this.edit = CodeMirror(editPane, copyObj(options));
if (left) left.init(leftPane, origLeft, options); if (left) left.init(leftPane, origLeft, options);
@@ -284,11 +323,11 @@
}; };
function buildGap(dv) { function buildGap(dv) {
var lock = dv.lockButton = elt("div", null, "CodeMirror-diff-scrolllock"); var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock");
lock.title = "Toggle locked scrolling"; lock.title = "Toggle locked scrolling";
var lockWrap = elt("div", [lock], "CodeMirror-diff-scrolllock-wrap"); var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap");
CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); }); CodeMirror.on(lock, "click", function() { setScrollLock(dv, !dv.lockScroll); });
dv.copyButtons = elt("div", null, "CodeMirror-diff-copybuttons-" + dv.type); dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type);
CodeMirror.on(dv.copyButtons, "click", function(e) { CodeMirror.on(dv.copyButtons, "click", function(e) {
var node = e.target || e.srcElement; var node = e.target || e.srcElement;
if (node.chunk) copyChunk(dv, node.chunk); if (node.chunk) copyChunk(dv, node.chunk);
@@ -299,14 +338,18 @@
dv.svg = svg; dv.svg = svg;
if (svg) gapElts.push(svg); if (svg) gapElts.push(svg);
return dv.gap = elt("div", gapElts, "CodeMirror-diff-gap"); return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap");
} }
MergeView.prototype = { MergeView.prototype = {
constuctor: MergeView, constuctor: MergeView,
editor: function() { return this.edit; }, editor: function() { return this.edit; },
rightOriginal: function() { return this.right && this.right.orig; }, rightOriginal: function() { return this.right && this.right.orig; },
leftOriginal: function() { return this.left && this.left.orig; } leftOriginal: function() { return this.left && this.left.orig; },
setShowDifferences: function(val) {
if (this.right) this.right.setShowDifferences(val);
if (this.left) this.left.setShowDifferences(val);
}
}; };
// Operations on diffs // Operations on diffs
@@ -2,6 +2,9 @@
window.CodeMirror = {}; window.CodeMirror = {};
(function() {
"use strict";
function splitLines(string){ return string.split(/\r?\n|\r/); }; function splitLines(string){ return string.split(/\r?\n|\r/); };
function StringStream(string) { function StringStream(string) {
@@ -43,12 +46,14 @@ StringStream.prototype = {
match: function(pattern, consume, caseInsensitive) { match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") { if (typeof pattern == "string") {
var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { var substr = this.string.substr(this.pos, pattern.length);
if (cased(substr) == cased(pattern)) {
if (consume !== false) this.pos += pattern.length; if (consume !== false) this.pos += pattern.length;
return true; return true;
} }
} else { } else {
var match = this.string.slice(this.pos).match(pattern); var match = this.string.slice(this.pos).match(pattern);
if (match && match.index > 0) return null;
if (match && consume !== false) this.pos += match[0].length; if (match && consume !== false) this.pos += match[0].length;
return match; return match;
} }
@@ -123,8 +128,9 @@ CodeMirror.runMode = function (string, modespec, callback, options) {
var stream = new CodeMirror.StringStream(lines[i]); var stream = new CodeMirror.StringStream(lines[i]);
while (!stream.eol()) { while (!stream.eol()) {
var style = mode.token(stream, state); var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start); callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos; stream.start = stream.pos;
} }
} }
}; };
})();
@@ -49,7 +49,7 @@ CodeMirror.runMode = function(string, modespec, callback, options) {
var stream = new CodeMirror.StringStream(lines[i]); var stream = new CodeMirror.StringStream(lines[i]);
while (!stream.eol()) { while (!stream.eol()) {
var style = mode.token(stream, state); var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start); callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos; stream.start = stream.pos;
} }
} }
@@ -41,12 +41,14 @@ StringStream.prototype = {
match: function(pattern, consume, caseInsensitive) { match: function(pattern, consume, caseInsensitive) {
if (typeof pattern == "string") { if (typeof pattern == "string") {
var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { var substr = this.string.substr(this.pos, pattern.length);
if (cased(substr) == cased(pattern)) {
if (consume !== false) this.pos += pattern.length; if (consume !== false) this.pos += pattern.length;
return true; return true;
} }
} else { } else {
var match = this.string.slice(this.pos).match(pattern); var match = this.string.slice(this.pos).match(pattern);
if (match && match.index > 0) return null;
if (match && consume !== false) this.pos += match[0].length; if (match && consume !== false) this.pos += match[0].length;
return match; return match;
} }
@@ -94,7 +96,7 @@ exports.runMode = function(string, modespec, callback) {
var stream = new exports.StringStream(lines[i]); var stream = new exports.StringStream(lines[i]);
while (!stream.eol()) { while (!stream.eol()) {
var style = mode.token(stream, state); var style = mode.token(stream, state);
callback(stream.current(), style, i, stream.start); callback(stream.current(), style, i, stream.start, state);
stream.start = stream.pos; stream.start = stream.pos;
} }
} }
@@ -15,15 +15,18 @@
(function() { (function() {
var DEFAULT_MIN_CHARS = 2; var DEFAULT_MIN_CHARS = 2;
var DEFAULT_TOKEN_STYLE = "matchhighlight"; var DEFAULT_TOKEN_STYLE = "matchhighlight";
var DEFAULT_DELAY = 100;
function State(options) { function State(options) {
if (typeof options == "object") { if (typeof options == "object") {
this.minChars = options.minChars; this.minChars = options.minChars;
this.style = options.style; this.style = options.style;
this.showToken = options.showToken; this.showToken = options.showToken;
this.delay = options.delay;
} }
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;
this.overlay = this.timeout = null; this.overlay = this.timeout = null;
} }
@@ -45,7 +48,7 @@
function cursorActivity(cm) { function cursorActivity(cm) {
var state = cm.state.matchHighlighter; var state = cm.state.matchHighlighter;
clearTimeout(state.timeout); clearTimeout(state.timeout);
state.timeout = setTimeout(function() {highlightMatches(cm);}, 100); state.timeout = setTimeout(function() {highlightMatches(cm);}, state.delay);
} }
function highlightMatches(cm) { function highlightMatches(cm) {
@@ -55,11 +58,13 @@
cm.removeOverlay(state.overlay); cm.removeOverlay(state.overlay);
state.overlay = null; state.overlay = null;
} }
if (!cm.somethingSelected() && state.showToken) { if (!cm.somethingSelected() && state.showToken) {
var tok = cm.getTokenAt(cm.getCursor()).string; var re = state.showToken === true ? /[\w$]/ : state.showToken;
if (/\w/.test(tok)) var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start;
cm.addOverlay(state.overlay = makeOverlay(tok, true, state.style)); while (start && re.test(line.charAt(start - 1))) --start;
while (end < line.length && re.test(line.charAt(end))) ++end;
if (start < end)
cm.addOverlay(state.overlay = makeOverlay(line.slice(start, end), re, state.style));
return; return;
} }
if (cm.getCursor("head").line != cm.getCursor("anchor").line) return; if (cm.getCursor("head").line != cm.getCursor("anchor").line) return;
@@ -69,15 +74,15 @@
}); });
} }
function boundariesAround(stream) { function boundariesAround(stream, re) {
return (stream.start || /.\b./.test(stream.string.slice(stream.start - 1, stream.start + 1))) && return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) &&
(stream.pos == stream.string.length || /.\b./.test(stream.string.slice(stream.pos - 1, stream.pos + 1))); (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos)));
} }
function makeOverlay(query, wordBoundaries, style) { function makeOverlay(query, hasBoundary, style) {
return {token: function(stream) { return {token: function(stream) {
if (stream.match(query) && if (stream.match(query) &&
(!wordBoundaries || boundariesAround(stream))) (!hasBoundary || boundariesAround(stream, hasBoundary)))
return style; return style;
stream.next(); stream.next();
stream.skipTo(query.charAt(0)) || stream.skipToEnd(); stream.skipTo(query.charAt(0)) || stream.skipToEnd();
@@ -69,8 +69,8 @@
this.matches = function(reverse, pos) { this.matches = function(reverse, pos) {
var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(doc.getLine(ln)); var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(doc.getLine(ln));
var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match)); var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
if (reverse ? offsetA >= pos.ch || offsetA != match.length if (reverse ? offsetA > pos.ch || offsetA != match.length
: offsetA <= pos.ch || offsetA != line.length - match.length) : offsetA < pos.ch || offsetA != line.length - match.length)
return; return;
for (;;) { for (;;) {
if (reverse ? !ln : ln == doc.lineCount() - 1) return; if (reverse ? !ln : ln == doc.lineCount() - 1) return;
@@ -29,7 +29,7 @@
} }
function updateActiveLine(cm) { function updateActiveLine(cm) {
var line = cm.getLineHandle(cm.getCursor().line); var line = cm.getLineHandleVisualStart(cm.getCursor().line);
if (cm.state.activeLine == line) return; if (cm.state.activeLine == line) return;
clearActiveLine(cm); clearActiveLine(cm);
cm.addLineClass(line, "wrap", WRAP_CLASS); cm.addLineClass(line, "wrap", WRAP_CLASS);
@@ -1,11 +1,12 @@
#!/usr/bin/env node #!/usr/bin/env node
var lint = require("../test/lint/lint"); var lint = require("../test/lint/lint"),
path = require("path");
if (process.argv.length > 2) { if (process.argv.length > 2) {
lint.checkDir(process.argv[2]); lint.checkDir(process.argv[2]);
} else { } else {
process.chdir(__dirname.slice(0, __dirname.lastIndexOf("/"))); process.chdir(path.resolve(__dirname, ".."));
lint.checkDir("lib"); lint.checkDir("lib");
lint.checkDir("mode"); lint.checkDir("mode");
lint.checkDir("addon"); lint.checkDir("addon");
+1 -1
View File
@@ -353,7 +353,7 @@
}, },
"Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": repeated("undo"), "K": "close", "Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": repeated("undo"), "K": "close",
"Delete": function(cm) { kill(cm, cm.getCursor(), sentenceEnd(cm, 1), true); }, "Delete": function(cm) { kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), true); },
auto: "emacs", nofallthrough: true, disableInput: true auto: "emacs", nofallthrough: true, disableInput: true
}; };
+138 -101
View File
@@ -40,6 +40,10 @@
* TODO: Implement the remaining special marks. They have more complex * TODO: Implement the remaining special marks. They have more complex
* behavior. * behavior.
* *
* Events:
* 'vim-mode-change' - raised on the editor anytime the current mode changes,
* Event object: {mode: "visual", subMode: "linewise"}
*
* Code structure: * Code structure:
* 1. Default keymap * 1. Default keymap
* 2. Variable declarations and short basic helpers * 2. Variable declarations and short basic helpers
@@ -206,8 +210,7 @@
// Operators // Operators
{ keys: ['d'], type: 'operator', operator: 'delete' }, { keys: ['d'], type: 'operator', operator: 'delete' },
{ keys: ['y'], type: 'operator', operator: 'yank' }, { keys: ['y'], type: 'operator', operator: 'yank' },
{ keys: ['c'], type: 'operator', operator: 'change', { keys: ['c'], type: 'operator', operator: 'change' },
operatorArgs: { enterInsertMode: true } },
{ keys: ['>'], type: 'operator', operator: 'indent', { keys: ['>'], type: 'operator', operator: 'indent',
operatorArgs: { indentRight: true }}, operatorArgs: { indentRight: true }},
{ keys: ['<'], type: 'operator', operator: 'indent', { keys: ['<'], type: 'operator', operator: 'indent',
@@ -231,10 +234,11 @@
motion: 'moveToEol', motionArgs: { inclusive: true }, motion: 'moveToEol', motionArgs: { inclusive: true },
operatorMotionArgs: { visualLine: true }}, operatorMotionArgs: { visualLine: true }},
{ keys: ['C'], type: 'operatorMotion', { keys: ['C'], type: 'operatorMotion',
operator: 'change', operatorArgs: { enterInsertMode: true }, operator: 'change',
motion: 'moveToEol', motionArgs: { inclusive: true }, motion: 'moveToEol', motionArgs: { inclusive: true },
operatorMotionArgs: { visualLine: true }}, operatorMotionArgs: { visualLine: true }},
{ keys: ['~'], type: 'operatorMotion', operator: 'swapcase', { keys: ['~'], type: 'operatorMotion',
operator: 'swapcase', operatorArgs: { shouldMoveCursor: true },
motion: 'moveByCharacters', motionArgs: { forward: true }}, motion: 'moveByCharacters', motionArgs: { forward: true }},
// Actions // Actions
{ keys: ['<C-i>'], type: 'action', action: 'jumpListWalk', { keys: ['<C-i>'], type: 'action', action: 'jumpListWalk',
@@ -315,6 +319,28 @@
]; ];
var Vim = function() { var Vim = function() {
CodeMirror.defineOption('vimMode', false, function(cm, val) {
if (val) {
cm.setOption('keyMap', 'vim');
CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
cm.on('beforeSelectionChange', beforeSelectionChange);
maybeInitVimState(cm);
} else if (cm.state.vim) {
cm.setOption('keyMap', 'default');
cm.off('beforeSelectionChange', beforeSelectionChange);
cm.state.vim = null;
}
});
function beforeSelectionChange(cm, cur) {
var vim = cm.state.vim;
if (vim.insertMode || vim.exMode) return;
var head = cur.head;
if (head.ch && head.ch == cm.doc.getLine(head.line).length) {
head.ch--;
}
}
var numberRegex = /[\d]/; var numberRegex = /[\d]/;
var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)]; var wordRegexp = [(/\w/), (/[^\w\s]/)], bigWordRegexp = [(/\S/)];
function makeKeyRange(start, size) { function makeKeyRange(start, size) {
@@ -450,28 +476,11 @@
}; };
}; };
// Global Vim state. Call getVimGlobalState to get and initialize.
var vimGlobalState; function maybeInitVimState(cm) {
function getVimGlobalState() { if (!cm.state.vim) {
if (!vimGlobalState) {
vimGlobalState = {
// The current search query.
searchQuery: null,
// Whether we are searching backwards.
searchIsReversed: false,
jumpList: createCircularJumpList(),
macroModeState: createMacroState(),
// Recording latest f, t, F or T motion command.
lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
registerController: new RegisterController({})
};
}
return vimGlobalState;
}
function getVimState(cm) {
if (!cm.vimState) {
// Store instance state in the CodeMirror object. // Store instance state in the CodeMirror object.
cm.vimState = { cm.state.vim = {
inputState: new InputState(), inputState: new InputState(),
// Vim's input state that triggered the last edit, used to repeat // Vim's input state that triggered the last edit, used to repeat
// motions and operators with '.'. // motions and operators with '.'.
@@ -500,7 +509,21 @@
visualLine: false visualLine: false
}; };
} }
return cm.vimState; return cm.state.vim;
}
var vimGlobalState;
function resetVimGlobalState() {
vimGlobalState = {
// The current search query.
searchQuery: null,
// Whether we are searching backwards.
searchIsReversed: false,
jumpList: createCircularJumpList(),
macroModeState: createMacroState(),
// Recording latest f, t, F or T motion command.
lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},
registerController: new RegisterController({})
};
} }
var vimApi= { var vimApi= {
@@ -510,16 +533,19 @@
// Testing hook, though it might be useful to expose the register // Testing hook, though it might be useful to expose the register
// controller anyways. // controller anyways.
getRegisterController: function() { getRegisterController: function() {
return getVimGlobalState().registerController; return vimGlobalState.registerController;
}, },
// Testing hook. // Testing hook.
clearVimGlobalState_: function() { resetVimGlobalState_: resetVimGlobalState,
vimGlobalState = null;
},
// Testing hook. // Testing hook.
getVimGlobalState_: function() { getVimGlobalState_: function() {
return vimGlobalState; return vimGlobalState;
}, },
// Testing hook.
maybeInitVimState_: maybeInitVimState,
InsertModeKey: InsertModeKey, InsertModeKey: InsertModeKey,
map: function(lhs, rhs) { map: function(lhs, rhs) {
// Add user defined key bindings. // Add user defined key bindings.
@@ -532,17 +558,12 @@
exCommands[name]=func; exCommands[name]=func;
exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};
}, },
// Initializes vim state variable on the CodeMirror object. Should only be
// called lazily by handleKey or for testing.
maybeInitState: function(cm) {
getVimState(cm);
},
// This is the outermost function called by CodeMirror, after keys have // This is the outermost function called by CodeMirror, after keys have
// been mapped to their Vim equivalents. // been mapped to their Vim equivalents.
handleKey: function(cm, key) { handleKey: function(cm, key) {
var command; var command;
var vim = getVimState(cm); var vim = maybeInitVimState(cm);
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
if (macroModeState.enteredMacroMode) { if (macroModeState.enteredMacroMode) {
if (key == 'q') { if (key == 'q') {
actions.exitMacroRecordMode(); actions.exitMacroRecordMode();
@@ -554,19 +575,17 @@
// Clear input state and get back to normal mode. // Clear input state and get back to normal mode.
vim.inputState = new InputState(); vim.inputState = new InputState();
if (vim.visualMode) { if (vim.visualMode) {
exitVisualMode(cm, vim); exitVisualMode(cm);
} }
return; return;
} }
if (vim.visualMode && // Enter visual mode when the mouse selects text.
cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
// The selection was cleared. Exit visual mode.
exitVisualMode(cm, vim);
}
if (!vim.visualMode && if (!vim.visualMode &&
!cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) { !cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
vim.visualMode = true; vim.visualMode = true;
vim.visualLine = false; vim.visualLine = false;
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"});
cm.on('mousedown', exitVisualMode);
} }
if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) { if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) {
// Have to special case 0 since it's both a motion and a number. // Have to special case 0 since it's both a motion and a number.
@@ -970,7 +989,7 @@
// cachedCursor is used to save the old position of the cursor // cachedCursor is used to save the old position of the cursor
// when * or # causes vim to seek for the nearest word and shift // when * or # causes vim to seek for the nearest word and shift
// the cursor before entering the motion. // the cursor before entering the motion.
getVimGlobalState().jumpList.cachedCursor = cm.getCursor(); vimGlobalState.jumpList.cachedCursor = cm.getCursor();
cm.setCursor(word.start); cm.setCursor(word.start);
handleQuery(query, true /** ignoreCase */, false /** smartCase */); handleQuery(query, true /** ignoreCase */, false /** smartCase */);
@@ -1052,7 +1071,7 @@
return; return;
} }
if (motionArgs.toJumplist) { if (motionArgs.toJumplist) {
var jumpList = getVimGlobalState().jumpList; var jumpList = vimGlobalState.jumpList;
// if the current motion is # or *, use cachedCursor // if the current motion is # or *, use cachedCursor
var cachedCursor = jumpList.cachedCursor; var cachedCursor = jumpList.cachedCursor;
if (cachedCursor) { if (cachedCursor) {
@@ -1091,6 +1110,11 @@
if (vim.visualLine) { if (vim.visualLine) {
if (cursorIsBefore(selectionStart, selectionEnd)) { if (cursorIsBefore(selectionStart, selectionEnd)) {
selectionStart.ch = 0; selectionStart.ch = 0;
var lastLine = cm.lastLine();
if (selectionEnd.line > lastLine) {
selectionEnd.line = lastLine;
}
selectionEnd.ch = lineLength(cm, selectionEnd.line); selectionEnd.ch = lineLength(cm, selectionEnd.line);
} else { } else {
selectionEnd.ch = 0; selectionEnd.ch = 0;
@@ -1146,15 +1170,12 @@
operators[operator](cm, operatorArgs, vim, curStart, operators[operator](cm, operatorArgs, vim, curStart,
curEnd, curOriginal); curEnd, curOriginal);
if (vim.visualMode) { if (vim.visualMode) {
exitVisualMode(cm, vim); exitVisualMode(cm);
}
if (operatorArgs.enterInsertMode) {
actions.enterInsertMode(cm, {}, vim);
} }
} }
}, },
recordLastEdit: function(vim, inputState, actionCommand) { recordLastEdit: function(vim, inputState, actionCommand) {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
if (macroModeState.inReplay) { return; } if (macroModeState.inReplay) { return; }
vim.lastEditInputState = inputState; vim.lastEditInputState = inputState;
vim.lastEditActionCommand = actionCommand; vim.lastEditActionCommand = actionCommand;
@@ -1272,8 +1293,13 @@
} }
var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);
var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;
if (line < cm.firstLine() || line > cm.lastLine() ) { var first = cm.firstLine();
return null; var last = cm.lastLine();
// Vim cancels linewise motions that start on an edge and move beyond
// that edge. It does not cancel motions that do not start on an edge.
if ((line < first && cur.line == first) ||
(line > last && cur.line == last)) {
return;
} }
if(motionArgs.toFirstChar){ if(motionArgs.toFirstChar){
endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));
@@ -1456,7 +1482,7 @@
return [start, end]; return [start, end];
}, },
repeatLastCharacterSearch: function(cm, motionArgs) { repeatLastCharacterSearch: function(cm, motionArgs) {
var lastSearch = getVimGlobalState().lastChararacterSearch; var lastSearch = vimGlobalState.lastChararacterSearch;
var repeat = motionArgs.repeat; var repeat = motionArgs.repeat;
var forward = motionArgs.forward === lastSearch.forward; var forward = motionArgs.forward === lastSearch.forward;
var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);
@@ -1474,22 +1500,16 @@
var operators = { var operators = {
change: function(cm, operatorArgs, _vim, curStart, curEnd) { change: function(cm, operatorArgs, _vim, curStart, curEnd) {
getVimGlobalState().registerController.pushText( vimGlobalState.registerController.pushText(
operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd), operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd),
operatorArgs.linewise); operatorArgs.linewise);
if (operatorArgs.linewise) { if (operatorArgs.linewise) {
// Delete starting at the first nonwhitespace character of the first // Push the next line back down, if there is a next line.
// line, instead of from the start of the first line. This way we get var replacement = curEnd.line > cm.lastLine() ? '' : '\n';
// an indent when we get into insert mode. This behavior isn't quite cm.replaceRange(replacement, curStart, curEnd);
// correct because we should treat this as a completely new line, and cm.indentLine(curStart.line, 'smart');
// indent should be whatever codemirror thinks is the right indent. // null ch so setCursor moves to end of line.
// But cm.indentLine doesn't seem work on empty lines. curStart.ch = null;
// TODO: Fix the above.
curStart.ch =
findFirstNonWhiteSpaceCharacter(cm.getLine(curStart.line));
// Insert an additional newline so that insert mode can start there.
// curEnd should be on the first character of the new line.
cm.replaceRange('\n', curStart, curEnd);
} else { } else {
// Exclude trailing whitespace if the range is not all whitespace. // Exclude trailing whitespace if the range is not all whitespace.
var text = cm.getRange(curStart, curEnd); var text = cm.getRange(curStart, curEnd);
@@ -1501,6 +1521,7 @@
} }
cm.replaceRange('', curStart, curEnd); cm.replaceRange('', curStart, curEnd);
} }
actions.enterInsertMode(cm, {}, cm.state.vim);
cm.setCursor(curStart); cm.setCursor(curStart);
}, },
// delete is a javascript keyword. // delete is a javascript keyword.
@@ -1512,7 +1533,7 @@
curStart.line--; curStart.line--;
curStart.ch = lineLength(cm, curStart.line); curStart.ch = lineLength(cm, curStart.line);
} }
getVimGlobalState().registerController.pushText( vimGlobalState.registerController.pushText(
operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd), operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd),
operatorArgs.linewise); operatorArgs.linewise);
cm.replaceRange('', curStart, curEnd); cm.replaceRange('', curStart, curEnd);
@@ -1542,7 +1563,7 @@
cm.setCursor(curStart); cm.setCursor(curStart);
cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm)); cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));
}, },
swapcase: function(cm, _operatorArgs, _vim, curStart, curEnd, curOriginal) { swapcase: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {
var toSwap = cm.getRange(curStart, curEnd); var toSwap = cm.getRange(curStart, curEnd);
var swapped = ''; var swapped = '';
for (var i = 0; i < toSwap.length; i++) { for (var i = 0; i < toSwap.length; i++) {
@@ -1551,10 +1572,12 @@
character.toUpperCase(); character.toUpperCase();
} }
cm.replaceRange(swapped, curStart, curEnd); cm.replaceRange(swapped, curStart, curEnd);
cm.setCursor(curOriginal); if (!operatorArgs.shouldMoveCursor) {
cm.setCursor(curOriginal);
}
}, },
yank: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) { yank: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {
getVimGlobalState().registerController.pushText( vimGlobalState.registerController.pushText(
operatorArgs.registerName, 'yank', operatorArgs.registerName, 'yank',
cm.getRange(curStart, curEnd), operatorArgs.linewise); cm.getRange(curStart, curEnd), operatorArgs.linewise);
cm.setCursor(curOriginal); cm.setCursor(curOriginal);
@@ -1568,7 +1591,7 @@
} }
var repeat = actionArgs.repeat; var repeat = actionArgs.repeat;
var forward = actionArgs.forward; var forward = actionArgs.forward;
var jumpList = getVimGlobalState().jumpList; var jumpList = vimGlobalState.jumpList;
var mark = jumpList.move(cm, forward ? repeat : -repeat); var mark = jumpList.move(cm, forward ? repeat : -repeat);
var markPos = mark ? mark.find() : undefined; var markPos = mark ? mark.find() : undefined;
@@ -1594,7 +1617,7 @@
replayMacro: function(cm, actionArgs) { replayMacro: function(cm, actionArgs) {
var registerName = actionArgs.selectedCharacter; var registerName = actionArgs.selectedCharacter;
var repeat = actionArgs.repeat; var repeat = actionArgs.repeat;
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
if (registerName == '@') { if (registerName == '@') {
registerName = macroModeState.latestRegister; registerName = macroModeState.latestRegister;
} }
@@ -1604,18 +1627,19 @@
} }
}, },
exitMacroRecordMode: function() { exitMacroRecordMode: function() {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
macroModeState.toggle(); macroModeState.toggle();
parseKeyBufferToRegister(macroModeState.latestRegister, parseKeyBufferToRegister(macroModeState.latestRegister,
macroModeState.macroKeyBuffer); macroModeState.macroKeyBuffer);
}, },
enterMacroRecordMode: function(cm, actionArgs) { enterMacroRecordMode: function(cm, actionArgs) {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
var registerName = actionArgs.selectedCharacter; var registerName = actionArgs.selectedCharacter;
macroModeState.toggle(cm, registerName); macroModeState.toggle(cm, registerName);
emptyMacroKeyBuffer(macroModeState); emptyMacroKeyBuffer(macroModeState);
}, },
enterInsertMode: function(cm, actionArgs, vim) { enterInsertMode: function(cm, actionArgs, vim) {
if (cm.getOption('readOnly')) { return; }
vim.insertMode = true; vim.insertMode = true;
vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;
var insertAt = (actionArgs) ? actionArgs.insertAt : null; var insertAt = (actionArgs) ? actionArgs.insertAt : null;
@@ -1633,10 +1657,12 @@
// Handle Replace-mode as a special case of insert mode. // Handle Replace-mode as a special case of insert mode.
cm.toggleOverwrite(true); cm.toggleOverwrite(true);
cm.setOption('keyMap', 'vim-replace'); cm.setOption('keyMap', 'vim-replace');
CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"});
} else { } else {
cm.setOption('keyMap', 'vim-insert'); cm.setOption('keyMap', 'vim-insert');
CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"});
} }
if (!getVimGlobalState().macroModeState.inReplay) { if (!vimGlobalState.macroModeState.inReplay) {
// Only record if not replaying. // Only record if not replaying.
cm.on('change', onChange); cm.on('change', onChange);
cm.on('cursorActivity', onCursorActivity); cm.on('cursorActivity', onCursorActivity);
@@ -1651,6 +1677,7 @@
// equal to the repeat times the size of the previous visual // equal to the repeat times the size of the previous visual
// operation. // operation.
if (!vim.visualMode) { if (!vim.visualMode) {
cm.on('mousedown', exitVisualMode);
vim.visualMode = true; vim.visualMode = true;
vim.visualLine = !!actionArgs.linewise; vim.visualLine = !!actionArgs.linewise;
if (vim.visualLine) { if (vim.visualLine) {
@@ -1675,6 +1702,7 @@
} else { } else {
cm.setSelection(curStart, curEnd); cm.setSelection(curStart, curEnd);
} }
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : ""});
} else { } else {
curStart = cm.getCursor('anchor'); curStart = cm.getCursor('anchor');
curEnd = cm.getCursor('head'); curEnd = cm.getCursor('head');
@@ -1687,12 +1715,14 @@
curEnd.ch = cursorIsBefore(curStart, curEnd) ? curEnd.ch = cursorIsBefore(curStart, curEnd) ?
lineLength(cm, curEnd.line) : 0; lineLength(cm, curEnd.line) : 0;
cm.setSelection(curStart, curEnd); cm.setSelection(curStart, curEnd);
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: "linewise"});
} else if (vim.visualLine && !actionArgs.linewise) { } else if (vim.visualLine && !actionArgs.linewise) {
// v pressed in linewise visual mode. Switch to characterwise visual // v pressed in linewise visual mode. Switch to characterwise visual
// mode instead of exiting visual mode. // mode instead of exiting visual mode.
vim.visualLine = false; vim.visualLine = false;
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"});
} else { } else {
exitVisualMode(cm, vim); exitVisualMode(cm);
} }
} }
updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart
@@ -1728,6 +1758,7 @@
}); });
}, },
newLineAndEnterInsertMode: function(cm, actionArgs, vim) { newLineAndEnterInsertMode: function(cm, actionArgs, vim) {
vim.insertMode = true;
var insertAt = cm.getCursor(); var insertAt = cm.getCursor();
if (insertAt.line === cm.firstLine() && !actionArgs.after) { if (insertAt.line === cm.firstLine() && !actionArgs.after) {
// Special case for inserting newline before start of document. // Special case for inserting newline before start of document.
@@ -1746,7 +1777,7 @@
}, },
paste: function(cm, actionArgs) { paste: function(cm, actionArgs) {
var cur = cm.getCursor(); var cur = cm.getCursor();
var register = getVimGlobalState().registerController.getRegister( var register = vimGlobalState.registerController.getRegister(
actionArgs.registerName); actionArgs.registerName);
if (!register.text) { if (!register.text) {
return; return;
@@ -1832,7 +1863,7 @@
cm.replaceRange(replaceWithStr, curStart, curEnd); cm.replaceRange(replaceWithStr, curStart, curEnd);
if(vim.visualMode){ if(vim.visualMode){
cm.setCursor(curStart); cm.setCursor(curStart);
exitVisualMode(cm,vim); exitVisualMode(cm);
}else{ }else{
cm.setCursor(offsetCursor(curEnd, 0, -1)); cm.setCursor(offsetCursor(curEnd, 0, -1));
} }
@@ -1989,7 +2020,9 @@
return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1');
} }
function exitVisualMode(cm, vim) { function exitVisualMode(cm) {
cm.off('mousedown', exitVisualMode);
var vim = cm.state.vim;
vim.visualMode = false; vim.visualMode = false;
vim.visualLine = false; vim.visualLine = false;
var selectionStart = cm.getCursor('anchor'); var selectionStart = cm.getCursor('anchor');
@@ -2000,6 +2033,7 @@
// it's not supposed to be. // it's not supposed to be.
cm.setCursor(clipCursorToContent(cm, selectionEnd)); cm.setCursor(clipCursorToContent(cm, selectionEnd));
} }
CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
} }
// Remove any trailing newlines from the selection. For // Remove any trailing newlines from the selection. For
@@ -2113,12 +2147,11 @@
function recordJumpPosition(cm, oldCur, newCur) { function recordJumpPosition(cm, oldCur, newCur) {
if(!cursorEqual(oldCur, newCur)) { if(!cursorEqual(oldCur, newCur)) {
getVimGlobalState().jumpList.add(cm, oldCur, newCur); vimGlobalState.jumpList.add(cm, oldCur, newCur);
} }
} }
function recordLastCharacterSearch(increment, args) { function recordLastCharacterSearch(increment, args) {
var vimGlobalState = getVimGlobalState();
vimGlobalState.lastChararacterSearch.increment = increment; vimGlobalState.lastChararacterSearch.increment = increment;
vimGlobalState.lastChararacterSearch.forward = args.forward; vimGlobalState.lastChararacterSearch.forward = args.forward;
vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter; vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;
@@ -2572,10 +2605,10 @@
function SearchState() {} function SearchState() {}
SearchState.prototype = { SearchState.prototype = {
getQuery: function() { getQuery: function() {
return getVimGlobalState().query; return vimGlobalState.query;
}, },
setQuery: function(query) { setQuery: function(query) {
getVimGlobalState().query = query; vimGlobalState.query = query;
}, },
getOverlay: function() { getOverlay: function() {
return this.searchOverlay; return this.searchOverlay;
@@ -2584,14 +2617,14 @@
this.searchOverlay = overlay; this.searchOverlay = overlay;
}, },
isReversed: function() { isReversed: function() {
return getVimGlobalState().isReversed; return vimGlobalState.isReversed;
}, },
setReversed: function(reversed) { setReversed: function(reversed) {
getVimGlobalState().isReversed = reversed; vimGlobalState.isReversed = reversed;
} }
}; };
function getSearchState(cm) { function getSearchState(cm) {
var vim = getVimState(cm); var vim = cm.state.vim;
return vim.searchState_ || (vim.searchState_ = new SearchState()); return vim.searchState_ || (vim.searchState_ = new SearchState());
} }
function dialog(cm, template, shortText, onClose, options) { function dialog(cm, template, shortText, onClose, options) {
@@ -2840,9 +2873,9 @@
}; };
Vim.ExCommandDispatcher.prototype = { Vim.ExCommandDispatcher.prototype = {
processCommand: function(cm, input) { processCommand: function(cm, input) {
var vim = getVimState(cm); var vim = cm.state.vim;
if (vim.visualMode) { if (vim.visualMode) {
exitVisualMode(cm, vim); exitVisualMode(cm);
} }
var inputStream = new CodeMirror.StringStream(input); var inputStream = new CodeMirror.StringStream(input);
var params = {}; var params = {};
@@ -2921,7 +2954,7 @@
case '$': case '$':
return cm.lastLine(); return cm.lastLine();
case '\'': case '\'':
var mark = getVimState(cm).marks[inputStream.next()]; var mark = cm.state.vim.marks[inputStream.next()];
if (mark && mark.find()) { if (mark && mark.find()) {
return mark.find().line; return mark.find().line;
} }
@@ -3031,7 +3064,7 @@
exCommandDispatcher.map(mapArgs[0], mapArgs[1], cm); exCommandDispatcher.map(mapArgs[0], mapArgs[1], cm);
}, },
move: function(cm, params) { move: function(cm, params) {
commandDispatcher.processCommand(cm, getVimState(cm), { commandDispatcher.processCommand(cm, cm.state.vim, {
type: 'motion', type: 'motion',
motion: 'moveToLineOrEdgeOfDocument', motion: 'moveToLineOrEdgeOfDocument',
motionArgs: { forward: false, explicitRepeat: true, motionArgs: { forward: false, explicitRepeat: true,
@@ -3186,7 +3219,7 @@
return; return;
} }
var state = getVimState(cm); var state = cm.state.vim;
var stream = new CodeMirror.StringStream(params.argString.trim()); var stream = new CodeMirror.StringStream(params.argString.trim());
while (!stream.eol()) { while (!stream.eol()) {
stream.eatSpace(); stream.eatSpace();
@@ -3257,6 +3290,7 @@
function doReplace(cm, confirm, lineStart, lineEnd, searchCursor, query, function doReplace(cm, confirm, lineStart, lineEnd, searchCursor, query,
replaceWith) { replaceWith) {
// Set up all the functions. // Set up all the functions.
cm.state.vim.exMode = true;
var done = false; var done = false;
var lastPos = searchCursor.from(); var lastPos = searchCursor.from();
function replaceAll() { function replaceAll() {
@@ -3291,7 +3325,8 @@
cm.focus(); cm.focus();
if (lastPos) { if (lastPos) {
cm.setCursor(lastPos); cm.setCursor(lastPos);
var vim = getVimState(cm); var vim = cm.state.vim;
vim.exMode = false;
vim.lastHPos = vim.lastHSPos = lastPos.ch; vim.lastHPos = vim.lastHSPos = lastPos.ch;
} }
} }
@@ -3403,9 +3438,8 @@
CodeMirror.keyMap.vim = buildVimKeyMap(); CodeMirror.keyMap.vim = buildVimKeyMap();
function exitInsertMode(cm) { function exitInsertMode(cm) {
var vim = getVimState(cm); var vim = cm.state.vim;
vim.insertMode = false; var inReplay = vimGlobalState.macroModeState.inReplay;
var inReplay = getVimGlobalState().macroModeState.inReplay;
if (!inReplay) { if (!inReplay) {
cm.off('change', onChange); cm.off('change', onChange);
cm.off('cursorActivity', onCursorActivity); cm.off('cursorActivity', onCursorActivity);
@@ -3419,8 +3453,10 @@
} }
delete vim.insertModeRepeat; delete vim.insertModeRepeat;
cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true); cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
vim.insertMode = false;
cm.setOption('keyMap', 'vim'); cm.setOption('keyMap', 'vim');
cm.toggleOverwrite(false); // exit replace mode if we were in it. cm.toggleOverwrite(false); // exit replace mode if we were in it.
CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"});
} }
CodeMirror.keyMap['vim-insert'] = { CodeMirror.keyMap['vim-insert'] = {
@@ -3446,7 +3482,7 @@
function parseRegisterToKeyBuffer(macroModeState, registerName) { function parseRegisterToKeyBuffer(macroModeState, registerName) {
var match, key; var match, key;
var register = getVimGlobalState().registerController.getRegister(registerName); var register = vimGlobalState.registerController.getRegister(registerName);
var text = register.toString(); var text = register.toString();
var macroKeyBuffer = macroModeState.macroKeyBuffer; var macroKeyBuffer = macroModeState.macroKeyBuffer;
emptyMacroKeyBuffer(macroModeState); emptyMacroKeyBuffer(macroModeState);
@@ -3462,7 +3498,7 @@
function parseKeyBufferToRegister(registerName, keyBuffer) { function parseKeyBufferToRegister(registerName, keyBuffer) {
var text = keyBuffer.join(''); var text = keyBuffer.join('');
getVimGlobalState().registerController.setRegisterText(registerName, text); vimGlobalState.registerController.setRegisterText(registerName, text);
} }
function emptyMacroKeyBuffer(macroModeState) { function emptyMacroKeyBuffer(macroModeState) {
@@ -3490,7 +3526,7 @@
* Should only be active in insert mode. * Should only be active in insert mode.
*/ */
function onChange(_cm, changeObj) { function onChange(_cm, changeObj) {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
var lastChange = macroModeState.lastInsertModeChanges; var lastChange = macroModeState.lastInsertModeChanges;
while (changeObj) { while (changeObj) {
lastChange.expectCursorActivityForChange = true; lastChange.expectCursorActivityForChange = true;
@@ -3510,7 +3546,7 @@
* - Should only be active in insert mode. * - Should only be active in insert mode.
*/ */
function onCursorActivity() { function onCursorActivity() {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
var lastChange = macroModeState.lastInsertModeChanges; var lastChange = macroModeState.lastInsertModeChanges;
if (lastChange.expectCursorActivityForChange) { if (lastChange.expectCursorActivityForChange) {
lastChange.expectCursorActivityForChange = false; lastChange.expectCursorActivityForChange = false;
@@ -3531,7 +3567,7 @@
* - For recording deletes in insert mode. * - For recording deletes in insert mode.
*/ */
function onKeyEventTargetKeyDown(e) { function onKeyEventTargetKeyDown(e) {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
var lastChange = macroModeState.lastInsertModeChanges; var lastChange = macroModeState.lastInsertModeChanges;
var keyName = CodeMirror.keyName(e); var keyName = CodeMirror.keyName(e);
function onKeyFound() { function onKeyFound() {
@@ -3553,7 +3589,7 @@
* corresponding enterInsertMode call was made with a count. * corresponding enterInsertMode call was made with a count.
*/ */
function repeatLastEdit(cm, vim, repeat, repeatForInsert) { function repeatLastEdit(cm, vim, repeat, repeatForInsert) {
var macroModeState = getVimGlobalState().macroModeState; var macroModeState = vimGlobalState.macroModeState;
macroModeState.inReplay = true; macroModeState.inReplay = true;
var isAction = !!vim.lastEditActionCommand; var isAction = !!vim.lastEditActionCommand;
var cachedInputState = vim.inputState; var cachedInputState = vim.inputState;
@@ -3621,6 +3657,7 @@
} }
} }
resetVimGlobalState();
return vimApi; return vimApi;
}; };
// Initialize Vim and make it available as an API. // Initialize Vim and make it available as an API.
+18 -3
View File
@@ -95,6 +95,7 @@
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */ /* STOP */
@@ -117,6 +118,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
height: 100%; height: 100%;
outline: none; /* Prevent dragging from highlighting the element */ outline: none; /* Prevent dragging from highlighting the element */
position: relative; position: relative;
-moz-box-sizing: content-box;
box-sizing: content-box;
} }
.CodeMirror-sizer { .CodeMirror-sizer {
position: relative; position: relative;
@@ -155,6 +158,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-gutter { .CodeMirror-gutter {
white-space: normal; white-space: normal;
height: 100%; height: 100%;
-moz-box-sizing: content-box;
box-sizing: content-box;
padding-bottom: 30px; padding-bottom: 30px;
margin-bottom: -32px; margin-bottom: -32px;
display: inline-block; display: inline-block;
@@ -192,6 +197,16 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
white-space: pre-wrap; white-space: pre-wrap;
word-break: normal; word-break: normal;
} }
.CodeMirror-code pre {
border-right: 30px solid transparent;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
}
.CodeMirror-wrap .CodeMirror-code pre {
border-right: none;
width: auto;
}
.CodeMirror-linebackground { .CodeMirror-linebackground {
position: absolute; position: absolute;
left: 0; right: 0; top: 0; bottom: 0; left: 0; right: 0; top: 0; bottom: 0;
@@ -204,8 +219,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
overflow: auto; overflow: auto;
} }
.CodeMirror-widget { .CodeMirror-widget {}
}
.CodeMirror-wrap .CodeMirror-scroll { .CodeMirror-wrap .CodeMirror-scroll {
overflow-x: hidden; overflow-x: hidden;
@@ -213,7 +227,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-measure { .CodeMirror-measure {
position: absolute; position: absolute;
width: 100%; height: 0px; width: 100%;
height: 0;
overflow: hidden; overflow: hidden;
visibility: hidden; visibility: hidden;
} }
File diff suppressed because it is too large Load Diff
+26 -15
View File
@@ -1,20 +1,32 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: APL mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: APL mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css"> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<script src="./apl.js"></script> <script src="./apl.js"></script>
<style> <style>
.CodeMirror { border: 2px inset #dee; } .CodeMirror { border: 2px inset #dee; }
</style> </style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: APL mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">APL</a>
</ul>
</div>
<article>
<h2>APL mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
⍝ Conway's game of life ⍝ Conway's game of life
@@ -57,5 +69,4 @@ gen ← {' #'[(life ⍣ ⍵) board]}
have popups etc.</p> have popups etc.</p>
<p><strong>MIME types defined:</strong> <code>text/apl</code> (APL code)</p> <p><strong>MIME types defined:</strong> <code>text/apl</code> (APL code)</p>
</body> </article>
</html>
+27 -15
View File
@@ -1,20 +1,33 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Asterisk dialplan mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Asterisk dialplan mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="asterisk.js"></script> <script src="../../lib/codemirror.js"></script>
<style> <script src="asterisk.js"></script>
<style>
.CodeMirror {border: 1px solid #999;} .CodeMirror {border: 1px solid #999;}
.cm-s-default span.cm-arrow { color: red; } .cm-s-default span.cm-arrow { color: red; }
</style> </style>
<link rel="stylesheet" href="../../doc/docs.css"> <div id=nav>
</head> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<body>
<h1>CodeMirror: Asterisk dialplan mode</h1> <ul>
<form><textarea id="code" name="code"> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Asterisk dialplan</a>
</ul>
</div>
<article>
<h2>Asterisk dialplan mode</h2>
<form><textarea id="code" name="code">
; extensions.conf - the Asterisk dial plan ; extensions.conf - the Asterisk dial plan
; ;
@@ -138,5 +151,4 @@ exten => 8500,n,Goto(s,6)
<p><strong>MIME types defined:</strong> <code>text/x-asterisk</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-asterisk</code>.</p>
</body> </article>
</html>
+2 -1
View File
@@ -158,7 +158,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
electricChars: "{}", electricChars: "{}",
blockCommentStart: "/*", blockCommentStart: "/*",
blockCommentEnd: "*/", blockCommentEnd: "*/",
lineComment: "//" lineComment: "//",
fold: "brace"
}; };
}); });
+110 -18
View File
@@ -1,19 +1,32 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: C-like mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="clike.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border: 2px inset #dee;}</style>
</head>
<body>
<h1>CodeMirror: C-like mode</h1>
<form><textarea id="code" name="code"> <title>CodeMirror: C-like 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>
<script src="clike.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">C-like</a>
</ul>
</div>
<article>
<h2>C-like mode</h2>
<div><textarea id="c-code">
/* C demo code */ /* C demo code */
#include <zmq.h> #include <zmq.h>
@@ -79,14 +92,94 @@ void* zmq_thread_init(void* zmq_context, int signal_fd) {
pthread_detach(thread); pthread_detach(thread);
return context; return context;
} }
</textarea></form> </textarea></div>
<h2>C++ example</h2>
<div><textarea id="cpp-code">
#include <iostream>
#include "mystuff/util.h"
namespace {
enum Enum {
VAL1, VAL2, VAL3
};
int Helper(const MyType& param) {
return 0;
}
} // namespace
class ForwardDec;
template <class T, class V>
class Class : public BaseClass {
const MyType<T, V> member_;
public:
const MyType<T, V>& Method() const {
return member_;
}
void Method2(MyType<T, V>* value);
}
template <class T, class V>
void Class::Method2(MyType<T, V>* value) {
std::out << 1 >> method();
value->Method3(member_);
member_ = value;
}
</textarea></div>
<h2>Java example</h2>
<div><textarea id="java-code">
import com.demo.util.MyType;
import com.demo.util.MyInterface;
public enum Enum {
VAL1, VAL2, VAL3
}
public class Class<T, V> implements MyInterface {
public static final MyType<T, V> member;
private class InnerClass {
public int zero() {
return 0;
}
}
@Override
public MyType method() {
return member;
}
public void method2(MyType<T, V> value) {
method();
value.method3();
member = value;
}
}
</textarea></div>
<script> <script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), { var editor = CodeMirror.fromTextArea(document.getElementById("c-code"), {
lineNumbers: true, lineNumbers: true,
matchBrackets: true, matchBrackets: true,
mode: "text/x-csrc" mode: "text/x-csrc"
}); });
var editor = CodeMirror.fromTextArea(document.getElementById("cpp-code"), {
lineNumbers: true,
matchBrackets: true,
mode: "text/x-c++src"
});
var javaEditor = CodeMirror.fromTextArea(document.getElementById("java-code"), {
lineNumbers: true,
matchBrackets: true,
mode: "text/x-java"
});
</script> </script>
<p>Simple mode that tries to handle C-like languages as well as it <p>Simple mode that tries to handle C-like languages as well as it
@@ -99,5 +192,4 @@ void* zmq_thread_init(void* zmq_context, int signal_fd) {
(C code), <code>text/x-c++src</code> (C++ (C code), <code>text/x-c++src</code> (C++
code), <code>text/x-java</code> (Java code), <code>text/x-java</code> (Java
code), <code>text/x-csharp</code> (C#).</p> code), <code>text/x-csharp</code> (C#).</p>
</body> </article>
</html>
+27 -27
View File
@@ -1,29 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Scala mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: C-like mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/ambiance.css"> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../theme/ambiance.css">
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="clike.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <script src="clike.js"></script>
<style> <div id=nav>
body <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
{
margin: 0; <ul>
padding: 0; <li><a href="../../index.html">Home</a>
max-width:inherit; <li><a href="../../doc/manual.html">Manual</a>
height: 100%; <li><a href="https://github.com/marijnh/codemirror">Code</a>
} </ul>
html, form, .CodeMirror, .CodeMirror-scroll <ul>
{ <li><a href="../index.html">Language modes</a>
height: 100%; <li><a class=active href="#">Scala</a>
} </ul>
</style> </div>
</head>
<body> <article>
<h2>Scala mode</h2>
<form> <form>
<textarea id="code" name="code"> <textarea id="code" name="code">
@@ -763,5 +764,4 @@
mode: "text/x-scala" mode: "text/x-scala"
}); });
</script> </script>
</body> </article>
</html>
+27 -15
View File
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Clojure mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Clojure mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="clojure.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <script src="clojure.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {background: #f8f8f8;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Clojure mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Clojure</a>
</ul>
</div>
<article>
<h2>Clojure mode</h2>
<form><textarea id="code" name="code">
; Conway's Game of Life, based on the work of: ; Conway's Game of Life, based on the work of:
;; Laurent Petit https://gist.github.com/1200343 ;; Laurent Petit https://gist.github.com/1200343
;; Christophe Grand http://clj-me.cgrand.net/2011/08/19/conways-game-of-life ;; Christophe Grand http://clj-me.cgrand.net/2011/08/19/conways-game-of-life
@@ -72,5 +85,4 @@
<p><strong>MIME types defined:</strong> <code>text/x-clojure</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-clojure</code>.</p>
</body> </article>
</html>
+50 -35
View File
@@ -1,35 +1,36 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: COBOL mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: COBOL mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <link rel="stylesheet" href="../../theme/neat.css">
<script src="cobol.js"></script> <link rel="stylesheet" href="../../theme/elegant.css">
<link rel="stylesheet" href="../../theme/neat.css"> <link rel="stylesheet" href="../../theme/erlang-dark.css">
<link rel="stylesheet" href="../../theme/elegant.css"> <link rel="stylesheet" href="../../theme/night.css">
<link rel="stylesheet" href="../../theme/erlang-dark.css"> <link rel="stylesheet" href="../../theme/monokai.css">
<link rel="stylesheet" href="../../theme/night.css"> <link rel="stylesheet" href="../../theme/cobalt.css">
<link rel="stylesheet" href="../../theme/monokai.css"> <link rel="stylesheet" href="../../theme/eclipse.css">
<link rel="stylesheet" href="../../theme/cobalt.css"> <link rel="stylesheet" href="../../theme/rubyblue.css">
<link rel="stylesheet" href="../../theme/eclipse.css"> <link rel="stylesheet" href="../../theme/lesser-dark.css">
<link rel="stylesheet" href="../../theme/rubyblue.css"> <link rel="stylesheet" href="../../theme/xq-dark.css">
<link rel="stylesheet" href="../../theme/lesser-dark.css"> <link rel="stylesheet" href="../../theme/xq-light.css">
<link rel="stylesheet" href="../../theme/xq-dark.css"> <link rel="stylesheet" href="../../theme/ambiance.css">
<link rel="stylesheet" href="../../theme/xq-light.css"> <link rel="stylesheet" href="../../theme/blackboard.css">
<link rel="stylesheet" href="../../theme/ambiance.css"> <link rel="stylesheet" href="../../theme/vibrant-ink.css">
<link rel="stylesheet" href="../../theme/blackboard.css"> <link rel="stylesheet" href="../../theme/solarized.css">
<link rel="stylesheet" href="../../theme/vibrant-ink.css"> <link rel="stylesheet" href="../../theme/twilight.css">
<link rel="stylesheet" href="../../theme/solarized.css"> <link rel="stylesheet" href="../../theme/midnight.css">
<link rel="stylesheet" href="../../theme/twilight.css"> <link rel="stylesheet" href="../../addon/dialog/dialog.css">
<link rel="stylesheet" href="../../theme/midnight.css"> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../addon/dialog/dialog.css"> <script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../addon/selection/active-line.js"></script> <script src="cobol.js"></script>
<script src="../../addon/search/search.js"></script> <script src="../../addon/selection/active-line.js"></script>
<script src="../../addon/dialog/dialog.js"></script> <script src="../../addon/search/search.js"></script>
<script src="../../addon/search/searchcursor.js"></script> <script src="../../addon/dialog/dialog.js"></script>
<style> <script src="../../addon/search/searchcursor.js"></script>
<style>
.CodeMirror { .CodeMirror {
border: 1px solid #eee; border: 1px solid #eee;
font-size : 20px; font-size : 20px;
@@ -37,8 +38,23 @@
} }
.CodeMirror-activeline-background {background: #555555 !important;} .CodeMirror-activeline-background {background: #555555 !important;}
</style> </style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">COBOL</a>
</ul>
</div>
<article>
<h2>COBOL mode</h2>
<p> Select Theme <select onchange="selectTheme()" id="selectTheme"> <p> Select Theme <select onchange="selectTheme()" id="selectTheme">
<option>default</option> <option>default</option>
<option>ambiance</option> <option>ambiance</option>
@@ -191,5 +207,4 @@
} }
} }
</script> </script>
</body> </article>
</html>
@@ -1,22 +0,0 @@
The MIT License
Copyright (c) 2011 Jeff Pickhardt
Modified from the Python CodeMirror mode, Copyright (c) 2010 Timothy Farrell
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -259,7 +259,7 @@ CodeMirror.defineMode('coffeescript', function(conf) {
if (current === '.') { if (current === '.') {
style = state.tokenize(stream, state); style = state.tokenize(stream, state);
current = stream.current(); current = stream.current();
if (style === 'variable') { if (/^\.[\w$]+$/.test(current)) {
return 'variable'; return 'variable';
} else { } else {
return ERRORCLASS; return ERRORCLASS;
@@ -339,7 +339,8 @@ CodeMirror.defineMode('coffeescript', function(conf) {
return state.scopes[0].offset; return state.scopes[0].offset;
}, },
lineComment: "#" lineComment: "#",
fold: "indent"
}; };
return external; return external;
}); });
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: CoffeeScript mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: CoffeeScript mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="coffeescript.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style> <script src="coffeescript.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: CoffeeScript mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">CoffeeScript</a>
</ul>
</div>
<article>
<h2>CoffeeScript mode</h2>
<form><textarea id="code" name="code">
# CoffeeScript mode for CodeMirror # CoffeeScript mode for CodeMirror
# Copyright (c) 2011 Jeff Pickhardt, released under # Copyright (c) 2011 Jeff Pickhardt, released under
# the MIT License. # the MIT License.
@@ -724,5 +737,4 @@ wrapper::value = -> this._wrapped
<p>The CoffeeScript mode was written by Jeff Pickhardt (<a href="LICENSE">license</a>).</p> <p>The CoffeeScript mode was written by Jeff Pickhardt (<a href="LICENSE">license</a>).</p>
</body> </article>
</html>
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Common Lisp mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Common Lisp mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="commonlisp.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <script src="commonlisp.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {background: #f8f8f8;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Common Lisp mode</h1>
<form><textarea id="code" name="code">(in-package :cl-postgres) <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Common Lisp</a>
</ul>
</div>
<article>
<h2>Common Lisp mode</h2>
<form><textarea id="code" name="code">(in-package :cl-postgres)
;; These are used to synthesize reader and writer names for integer ;; These are used to synthesize reader and writer names for integer
;; reading/writing functions when the amount of bytes and the ;; reading/writing functions when the amount of bytes and the
@@ -161,5 +174,4 @@ when UTF-8 support is enabled."
<p><strong>MIME types defined:</strong> <code>text/x-common-lisp</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-common-lisp</code>.</p>
</body> </article>
</html>
+64 -43
View File
@@ -1,10 +1,8 @@
CodeMirror.defineMode("css", function(config) { CodeMirror.defineMode("css", function(config, parserConfig) {
return CodeMirror.getMode(config, "text/css");
});
CodeMirror.defineMode("css-base", function(config, parserConfig) {
"use strict"; "use strict";
if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
var indentUnit = config.indentUnit, var indentUnit = config.indentUnit,
hooks = parserConfig.hooks || {}, hooks = parserConfig.hooks || {},
atMediaTypes = parserConfig.atMediaTypes || {}, atMediaTypes = parserConfig.atMediaTypes || {},
@@ -39,7 +37,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
stream.match(/^\s*\w*/); stream.match(/^\s*\w*/);
return ret("keyword", "important"); return ret("keyword", "important");
} }
else if (/\d/.test(ch)) { else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
stream.eatWhile(/[\w.%]/); stream.eatWhile(/[\w.%]/);
return ret("number", "unit"); return ret("number", "unit");
} }
@@ -103,7 +101,8 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
startState: function(base) { startState: function(base) {
return {tokenize: tokenBase, return {tokenize: tokenBase,
baseIndent: base || 0, baseIndent: base || 0,
stack: []}; stack: [],
lastToken: null};
}, },
token: function(stream, state) { token: function(stream, state) {
@@ -163,7 +162,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
var context = state.stack[state.stack.length-1]; var context = state.stack[state.stack.length-1];
if (style == "variable") { if (style == "variable") {
if (type == "variable-definition") state.stack.push("propertyValue"); if (type == "variable-definition") state.stack.push("propertyValue");
return "variable-2"; return state.lastToken = "variable-2";
} else if (style == "property") { } else if (style == "property") {
var word = stream.current().toLowerCase(); var word = stream.current().toLowerCase();
if (context == "propertyValue") { if (context == "propertyValue") {
@@ -251,7 +250,6 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
// Push/pop context stack // Push/pop context stack
if (type == "{") { if (type == "{") {
if (context == "@media" || context == "@mediaType") { if (context == "@media" || context == "@mediaType") {
state.stack.pop();
state.stack[state.stack.length-1] = "@media{"; state.stack[state.stack.length-1] = "@media{";
} }
else { else {
@@ -260,8 +258,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
} }
} }
else if (type == "}") { else if (type == "}") {
var lastState = state.stack[state.stack.length - 1]; if (context == "interpolation") style = "operator";
if (lastState == "interpolation") style = "operator";
state.stack.pop(); state.stack.pop();
if (context == "propertyValue") state.stack.pop(); if (context == "propertyValue") state.stack.pop();
} }
@@ -269,26 +266,42 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
else if (type == "@media") state.stack.push("@media"); else if (type == "@media") state.stack.push("@media");
else if (type == "@import") state.stack.push("@import"); else if (type == "@import") state.stack.push("@import");
else if (context == "@media" && /\b(keyword|attribute)\b/.test(style)) else if (context == "@media" && /\b(keyword|attribute)\b/.test(style))
state.stack.push("@mediaType"); state.stack[state.stack.length-1] = "@mediaType";
else if (context == "@mediaType" && stream.current() == ",") state.stack.pop(); else if (context == "@mediaType" && stream.current() == ",")
else if (context == "@mediaType" && type == "(") state.stack.push("@mediaType("); state.stack[state.stack.length-1] = "@media";
else if (context == "@mediaType(" && type == ")") state.stack.pop(); else if (type == "(") {
else if ((context == "rule" || context == "block") && type == ":") state.stack.push("propertyValue"); if (context == "@media" || context == "@mediaType") {
// Make sure @mediaType is used to avoid error on {
state.stack[state.stack.length-1] = "@mediaType";
state.stack.push("@mediaType(");
}
else state.stack.push("(");
}
else if (type == ")") {
if (context == "propertyValue") {
// In @mediaType( without closing ; after propertyValue
state.stack.pop();
}
state.stack.pop();
}
else if (type == ":" && state.lastToken == "property") state.stack.push("propertyValue");
else if (context == "propertyValue" && type == ";") state.stack.pop(); else if (context == "propertyValue" && type == ";") state.stack.pop();
else if (context == "@import" && type == ";") state.stack.pop(); else if (context == "@import" && type == ";") state.stack.pop();
return style;
return state.lastToken = style;
}, },
indent: function(state, textAfter) { indent: function(state, textAfter) {
var n = state.stack.length; var n = state.stack.length;
if (/^\}/.test(textAfter)) if (/^\}/.test(textAfter))
n -= state.stack[state.stack.length-1] == "propertyValue" ? 2 : 1; n -= state.stack[n-1] == "propertyValue" ? 2 : 1;
return state.baseIndent + n * indentUnit; return state.baseIndent + n * indentUnit;
}, },
electricChars: "}", electricChars: "}",
blockCommentStart: "/*", blockCommentStart: "/*",
blockCommentEnd: "*/" blockCommentEnd: "*/",
fold: "brace"
}; };
}); });
@@ -349,8 +362,8 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"drop-initial-before-align", "drop-initial-size", "drop-initial-value", "drop-initial-before-align", "drop-initial-size", "drop-initial-value",
"elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
"flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
"float", "float-offset", "font", "font-feature-settings", "font-family", "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
"font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
"font-stretch", "font-style", "font-synthesis", "font-variant", "font-stretch", "font-style", "font-synthesis", "font-variant",
"font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
"font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-variant-ligatures", "font-variant-numeric", "font-variant-position",
@@ -374,25 +387,27 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"page", "page-break-after", "page-break-before", "page-break-inside", "page", "page-break-after", "page-break-before", "page-break-inside",
"page-policy", "pause", "pause-after", "pause-before", "perspective", "page-policy", "pause", "pause-after", "pause-before", "perspective",
"perspective-origin", "pitch", "pitch-range", "play-during", "position", "perspective-origin", "pitch", "pitch-range", "play-during", "position",
"presentation-level", "punctuation-trim", "quotes", "rendering-intent", "presentation-level", "punctuation-trim", "quotes", "region-break-after",
"resize", "rest", "rest-after", "rest-before", "richness", "right", "region-break-before", "region-break-inside", "region-fragment",
"rotation", "rotation-point", "ruby-align", "ruby-overhang", "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
"ruby-position", "ruby-span", "size", "speak", "speak-as", "speak-header", "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
"ruby-position", "ruby-span", "shape-inside", "shape-outside", "size",
"speak", "speak-as", "speak-header",
"speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
"tab-size", "table-layout", "target", "target-name", "target-new", "tab-size", "table-layout", "target", "target-name", "target-new",
"target-position", "text-align", "text-align-last", "text-decoration", "target-position", "text-align", "text-align-last", "text-decoration",
"text-decoration-color", "text-decoration-line", "text-decoration-skip", "text-decoration-color", "text-decoration-line", "text-decoration-skip",
"text-decoration-style", "text-emphasis", "text-emphasis-color", "text-decoration-style", "text-emphasis", "text-emphasis-color",
"text-emphasis-position", "text-emphasis-style", "text-height", "text-emphasis-position", "text-emphasis-style", "text-height",
"text-indent", "text-justify", "text-outline", "text-shadow", "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
"text-space-collapse", "text-transform", "text-underline-position", "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
"text-wrap", "top", "transform", "transform-origin", "transform-style", "text-wrap", "top", "transform", "transform-origin", "transform-style",
"transition", "transition-delay", "transition-duration", "transition", "transition-delay", "transition-duration",
"transition-property", "transition-timing-function", "unicode-bidi", "transition-property", "transition-timing-function", "unicode-bidi",
"vertical-align", "visibility", "voice-balance", "voice-duration", "vertical-align", "visibility", "voice-balance", "voice-duration",
"voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
"voice-volume", "volume", "white-space", "widows", "width", "word-break", "voice-volume", "volume", "white-space", "widows", "width", "word-break",
"word-spacing", "word-wrap", "z-index", "word-spacing", "word-wrap", "z-index", "zoom",
// SVG-specific // SVG-specific
"clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
"flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
@@ -415,7 +430,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"darkslateblue", "darkslategray", "darkturquoise", "darkviolet", "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
"deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
"floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
"gold", "goldenrod", "gray", "green", "greenyellow", "honeydew", "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
"hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
"lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
"lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
@@ -438,22 +453,22 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"above", "absolute", "activeborder", "activecaption", "afar", "above", "absolute", "activeborder", "activecaption", "afar",
"after-white-space", "ahead", "alias", "all", "all-scroll", "alternate", "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
"always", "amharic", "amharic-abegede", "antialiased", "appworkspace", "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
"arabic-indic", "armenian", "asterisks", "auto", "avoid", "background", "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page",
"backwards", "baseline", "below", "bidi-override", "binary", "bengali", "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
"blink", "block", "block-axis", "bold", "bolder", "border", "border-box", "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
"both", "bottom", "break-all", "break-word", "button", "button-bevel", "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel",
"buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian", "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
"capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
"cell", "center", "checkbox", "circle", "cjk-earthly-branch", "cell", "center", "checkbox", "circle", "cjk-earthly-branch",
"cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
"col-resize", "collapse", "compact", "condensed", "contain", "content", "col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
"content-box", "context-menu", "continuous", "copy", "cover", "crop", "content-box", "context-menu", "continuous", "copy", "cover", "crop",
"cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal", "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
"decimal-leading-zero", "default", "default-button", "destination-atop", "decimal-leading-zero", "default", "default-button", "destination-atop",
"destination-in", "destination-out", "destination-over", "devanagari", "destination-in", "destination-out", "destination-over", "devanagari",
"disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted", "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
"double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
"element", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
"ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
"ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
"ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
@@ -469,7 +484,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
"infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
"inline-block", "inline-table", "inset", "inside", "intrinsic", "invert", "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert",
"italic", "justify", "kannada", "katakana", "katakana-iroha", "khmer", "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer",
"landscape", "lao", "large", "larger", "left", "level", "lighter", "landscape", "lao", "large", "larger", "left", "level", "lighter",
"line-through", "linear", "lines", "list-item", "listbox", "listitem", "line-through", "linear", "lines", "list-item", "listbox", "listitem",
"local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
@@ -488,11 +503,11 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
"no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
"ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
"optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
"outside", "overlay", "overline", "padding", "padding-box", "painted", "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
"paused", "persian", "plus-darker", "plus-lighter", "pointer", "portrait", "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer",
"pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
"radio", "read-only", "read-write", "read-write-plaintext-only", "relative", "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region",
"repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba", "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
"ridge", "right", "round", "row-resize", "rtl", "run-in", "running", "ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
"s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield", "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
"searchfield-cancel-button", "searchfield-decoration", "searchfield-cancel-button", "searchfield-decoration",
@@ -563,7 +578,7 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
return false; return false;
} }
}, },
name: "css-base" name: "css"
}); });
CodeMirror.defineMIME("text/x-scss", { CodeMirror.defineMIME("text/x-scss", {
@@ -574,6 +589,12 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
valueKeywords: valueKeywords, valueKeywords: valueKeywords,
allowNested: true, allowNested: true,
hooks: { hooks: {
":": function(stream) {
if (stream.match(/\s*{/)) {
return [null, "{"];
}
return false;
},
"$": function(stream) { "$": function(stream) {
stream.match(/^[\w-]+/); stream.match(/^[\w-]+/);
if (stream.peek() == ":") { if (stream.peek() == ":") {
@@ -601,6 +622,6 @@ CodeMirror.defineMode("css-base", function(config, parserConfig) {
} }
} }
}, },
name: "css-base" name: "css"
}); });
})(); })();
+27 -15
View File
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: CSS mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: CSS mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="css.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <script src="css.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {background: #f8f8f8;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: CSS mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">CSS</a>
</ul>
</div>
<article>
<h2>CSS mode</h2>
<form><textarea id="code" name="code">
/* Some example CSS */ /* Some example CSS */
@import url("something.css"); @import url("something.css");
@@ -54,5 +67,4 @@ code {
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>, <a href="../../test/index.html#verbose,css_*">verbose</a>.</p> <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#css_*">normal</a>, <a href="../../test/index.html#verbose,css_*">verbose</a>.</p>
</body> </article>
</html>
+27 -15
View File
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: SCSS mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: SCSS mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="css.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <script src="css.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {background: #f8f8f8;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: SCSS mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">SCSS</a>
</ul>
</div>
<article>
<h2>SCSS mode</h2>
<form><textarea id="code" name="code">
/* Some example SCSS */ /* Some example SCSS */
@import "compass/css3"; @import "compass/css3";
@@ -141,5 +154,4 @@ code {
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#scss_*">normal</a>, <a href="../../test/index.html#verbose,scss_*">verbose</a>.</p> <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#scss_*">normal</a>, <a href="../../test/index.html#verbose,scss_*">verbose</a>.</p>
</body> </article>
</html>
+1 -1
View File
@@ -64,7 +64,7 @@
"[tag p] { [tag a] { [property color][operator :][atom #000]; } }"); "[tag p] { [tag a] { [property color][operator :][atom #000]; } }");
MT('interpolation_in_property', MT('interpolation_in_property',
"[tag foo] { [operator #{][variable-2 $hello][operator }:][atom #000]; }"); "[tag foo] { [operator #{][variable-2 $hello][operator }:][number 2]; }");
MT('interpolation_in_selector', MT('interpolation_in_selector',
"[tag foo][operator #{][variable-2 $hello][operator }] { [property color][operator :][atom #000]; }"); "[tag foo][operator #{][variable-2 $hello][operator }] { [property color][operator :][atom #000]; }");
+13
View File
@@ -15,6 +15,12 @@
MT("atMediaCheckStack", MT("atMediaCheckStack",
"[def @media] [attribute screen] ([property color]) { } [tag foo] { }"); "[def @media] [attribute screen] ([property color]) { } [tag foo] { }");
MT("atMediaPropertyOnly",
"[def @media] ([property color]) { } [tag foo] { }");
MT("atMediaCheckStackInvalidAttribute",
"[def @media] [attribute&error foobarhello] { [tag foo] { } }");
MT("atMediaCheckStackInvalidAttribute", MT("atMediaCheckStackInvalidAttribute",
"[def @media] [attribute&error foobarhello] { } [tag foo] { }"); "[def @media] [attribute&error foobarhello] { } [tag foo] { }");
@@ -53,6 +59,10 @@
MT("atMediaUnknownProperty", MT("atMediaUnknownProperty",
"[def @media] [attribute screen] [operator and] ([property&error foobarhello]) { }"); "[def @media] [attribute screen] [operator and] ([property&error foobarhello]) { }");
// Make sure nesting works with media queries
MT("atMediaMaxWidthNested",
"[def @media] [attribute screen] [operator and] ([property max-width][operator :] [number 25px]) { [tag foo] { } }");
MT("tagSelector", MT("tagSelector",
"[tag foo] { }"); "[tag foo] { }");
@@ -108,6 +118,9 @@
MT("tagTwoProperties", MT("tagTwoProperties",
"[tag foo] { [property margin][operator :] [number 0]; [property padding][operator :] [number 0]; }"); "[tag foo] { [property margin][operator :] [number 0]; [property padding][operator :] [number 0]; }");
MT("tagTwoPropertiesURL",
"[tag foo] { [property background][operator :] [string-2 url]([string //example.com/foo.png]); [property padding][operator :] [number 0]; }");
MT("commentSGML", MT("commentSGML",
"[comment <!--comment-->]"); "[comment <!--comment-->]");
})(); })();
View File
+26 -15
View File
@@ -1,18 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: D mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="d.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border: 2px inset #dee;}</style>
</head>
<body>
<h1>CodeMirror: D mode</h1>
<title>CodeMirror: D 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>
<script src="d.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">D</a>
</ul>
</div>
<article>
<h2>D mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
/* D demo code // copied from phobos/sd/metastrings.d */ /* D demo code // copied from phobos/sd/metastrings.d */
// Written in the D programming language. // Written in the D programming language.
@@ -258,5 +270,4 @@ deprecated alias parseUinteger ParseInteger;
<p><strong>MIME types defined:</strong> <code>text/x-d</code> <p><strong>MIME types defined:</strong> <code>text/x-d</code>
.</p> .</p>
</body> </article>
</html>
+27 -15
View File
@@ -1,23 +1,36 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Diff mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Diff mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="diff.js"></script> <script src="../../lib/codemirror.js"></script>
<style> <script src="diff.js"></script>
<style>
.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;} .CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}
span.cm-meta {color: #a0b !important;} span.cm-meta {color: #a0b !important;}
span.cm-error { background-color: black; opacity: 0.4;} span.cm-error { background-color: black; opacity: 0.4;}
span.cm-error.cm-string { background-color: red; } span.cm-error.cm-string { background-color: red; }
span.cm-error.cm-tag { background-color: #2b2; } span.cm-error.cm-tag { background-color: #2b2; }
</style> </style>
<link rel="stylesheet" href="../../doc/docs.css"> <div id=nav>
</head> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<body>
<h1>CodeMirror: Diff mode</h1> <ul>
<form><textarea id="code" name="code"> <li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Diff</a>
</ul>
</div>
<article>
<h2>Diff mode</h2>
<form><textarea id="code" name="code">
diff --git a/index.html b/index.html diff --git a/index.html b/index.html
index c1d9156..7764744 100644 index c1d9156..7764744 100644
--- a/index.html --- a/index.html
@@ -101,5 +114,4 @@ index 04646a9..9a39cc7 100644
<p><strong>MIME types defined:</strong> <code>text/x-diff</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-diff</code>.</p>
</body> </article>
</html>
+28 -15
View File
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: ECL mode</title>
<title>CodeMirror: ECL mode</title> <meta charset="utf-8"/>
<link rel="stylesheet" href="../../lib/codemirror.css"> <link rel=stylesheet href="../../doc/docs.css">
<script src="../../lib/codemirror.js"></script>
<script src="ecl.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../doc/docs.css"> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <script src="ecl.js"></script>
</head> <style>.CodeMirror {border: 1px solid black;}</style>
<body> <div id=nav>
<h1>CodeMirror: ECL mode</h1> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<form><textarea id="code" name="code">
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">ECL</a>
</ul>
</div>
<article>
<h2>ECL mode</h2>
<form><textarea id="code" name="code">
/* /*
sample useless code to demonstrate ecl syntax highlighting sample useless code to demonstrate ecl syntax highlighting
this is a multiline comment! this is a multiline comment!
@@ -35,5 +49,4 @@ output(d);
<p>Based on CodeMirror's clike mode. For more information see <a href="http://hpccsystems.com">HPCC Systems</a> web site.</p> <p>Based on CodeMirror's clike mode. For more information see <a href="http://hpccsystems.com">HPCC Systems</a> web site.</p>
<p><strong>MIME types defined:</strong> <code>text/x-ecl</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-ecl</code>.</p>
</body> </article>
</html>
+125 -105
View File
@@ -11,22 +11,15 @@ CodeMirror.defineMIME("text/x-erlang", "erlang");
CodeMirror.defineMode("erlang", function(cmCfg) { CodeMirror.defineMode("erlang", function(cmCfg) {
function rval(state,stream,type) { function rval(state,_stream,type) {
// distinguish between "." as terminator and record field operator // distinguish between "." as terminator and record field operator
if (type == "record") { state.in_record = (type == "record");
state.context = "record";
}else{
state.context = false;
}
// remember last significant bit on last line for indenting
if (type != "whitespace" && type != "comment") {
state.lastToken = stream.current();
}
// erlang -> CodeMirror tag // erlang -> CodeMirror tag
switch (type) { switch (type) {
case "atom": return "atom"; case "atom": return "atom";
case "attribute": return "attribute"; case "attribute": return "attribute";
case "boolean": return "special";
case "builtin": return "builtin"; case "builtin": return "builtin";
case "comment": return "comment"; case "comment": return "comment";
case "fun": return "meta"; case "fun": return "meta";
@@ -55,6 +48,7 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
"after","begin","catch","case","cond","end","fun","if", "after","begin","catch","case","cond","end","fun","if",
"let","of","query","receive","try","when"]; "let","of","query","receive","try","when"];
var separatorRE = /[\->\.,:;]/;
var separatorWords = [ var separatorWords = [
"->",";",":",".",","]; "->",";",":",".",","];
@@ -62,12 +56,15 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
"and","andalso","band","bnot","bor","bsl","bsr","bxor", "and","andalso","band","bnot","bor","bsl","bsr","bxor",
"div","not","or","orelse","rem","xor"]; "div","not","or","orelse","rem","xor"];
var symbolRE = /[\+\-\*\/<>=\|:!]/;
var symbolWords = [ var symbolWords = [
"+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-"]; "+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"];
var openParenRE = /[<\(\[\{]/;
var openParenWords = [ var openParenWords = [
"<<","(","[","{"]; "<<","(","[","{"];
var closeParenRE = /[>\)\]\}]/;
var closeParenWords = [ var closeParenWords = [
"}","]",")",">>"]; "}","]",")",">>"];
@@ -102,53 +99,39 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
"term_to_binary","time","throw","tl","trunc","tuple_size", "term_to_binary","time","throw","tl","trunc","tuple_size",
"tuple_to_list","unlink","unregister","whereis"]; "tuple_to_list","unlink","unregister","whereis"];
// ignored for indenting purposes // [Ø-Þ] [À-Ö]
var ignoreWords = [ // [ß-ö] [ø-ÿ]
",", ":", "catch", "after", "of", "cond", "let", "query"]; var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/;
var escapesRE =
/[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;
var smallRE = /[a-z_]/;
var largeRE = /[A-Z_]/;
var digitRE = /[0-9]/;
var octitRE = /[0-7]/;
var anumRE = /[a-z_A-Z0-9]/;
var symbolRE = /[\+\-\*\/<>=\|:]/;
var openParenRE = /[<\(\[\{]/;
var closeParenRE = /[>\)\]\}]/;
var sepRE = /[\->\.,:;]/;
function isMember(element,list) {
return (-1 < list.indexOf(element));
}
function isPrev(stream,string) {
var start = stream.start;
var len = string.length;
if (len <= start) {
var word = stream.string.slice(start-len,start);
return word == string;
}else{
return false;
}
}
function tokenize(stream, state) { function tokenize(stream, state) {
// in multi-line string
if (state.in_string) {
state.in_string = (!doubleQuote(stream));
return rval(state,stream,"string");
}
// in multi-line atom
if (state.in_atom) {
state.in_atom = (!singleQuote(stream));
return rval(state,stream,"atom");
}
// whitespace
if (stream.eatSpace()) { if (stream.eatSpace()) {
return rval(state,stream,"whitespace"); return rval(state,stream,"whitespace");
} }
// attributes and type specs // attributes and type specs
if ((peekToken(state).token == "" || peekToken(state).token == ".") && if ((peekToken(state).token == "") &&
stream.peek() == '-') { stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) {
stream.next(); if (isMember(stream.current(),typeWords)) {
if (stream.eat(smallRE) && stream.eatWhile(anumRE)) { return rval(state,stream,"type");
if (isMember(stream.current(),typeWords)) { }else{
return rval(state,stream,"type"); return rval(state,stream,"attribute");
}else{
return rval(state,stream,"attribute");
}
} }
stream.backUp(1);
} }
var ch = stream.next(); var ch = stream.next();
@@ -166,57 +149,54 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
} }
// record // record
if ( ch == "#") { if (ch == "#") {
stream.eatWhile(anumRE); stream.eatWhile(anumRE);
return rval(state,stream,"record"); return rval(state,stream,"record");
} }
// char // dollar escape
if ( ch == "$") { if ( ch == "$" ) {
if (stream.next() == "\\") { if (stream.next() == "\\" && !stream.match(escapesRE)) {
if (!stream.eatWhile(octitRE)) { return rval(state,stream,"error");
stream.next();
}
} }
return rval(state,stream,"string"); return rval(state,stream,"number");
} }
// quoted atom // quoted atom
if (ch == '\'') { if (ch == '\'') {
if (singleQuote(stream)) { if (!(state.in_atom = (!singleQuote(stream)))) {
return rval(state,stream,"atom"); if (stream.match(/\s*\/\s*[0-9]/,false)) {
}else{ stream.match(/\s*\/\s*[0-9]/,true);
return rval(state,stream,"error"); popToken(state);
return rval(state,stream,"fun"); // 'f'/0 style fun
}
if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) {
return rval(state,stream,"function");
}
} }
return rval(state,stream,"atom");
} }
// string // string
if (ch == '"') { if (ch == '"') {
if (doubleQuote(stream)) { state.in_string = (!doubleQuote(stream));
return rval(state,stream,"string"); return rval(state,stream,"string");
}else{
return rval(state,stream,"error");
}
} }
// variable // variable
if (largeRE.test(ch)) { if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) {
stream.eatWhile(anumRE); stream.eatWhile(anumRE);
return rval(state,stream,"variable"); return rval(state,stream,"variable");
} }
// atom/keyword/BIF/function // atom/keyword/BIF/function
if (smallRE.test(ch)) { if (/[a-z_ß-öø-ÿ]/.test(ch)) {
stream.eatWhile(anumRE); stream.eatWhile(anumRE);
if (stream.peek() == "/") { if (stream.match(/\s*\/\s*[0-9]/,false)) {
stream.next(); stream.match(/\s*\/\s*[0-9]/,true);
if (stream.eatWhile(digitRE)) { popToken(state);
return rval(state,stream,"fun"); // f/0 style fun return rval(state,stream,"fun"); // f/0 style fun
}else{
stream.backUp(1);
return rval(state,stream,"atom");
}
} }
var w = stream.current(); var w = stream.current();
@@ -224,37 +204,38 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
if (isMember(w,keywordWords)) { if (isMember(w,keywordWords)) {
pushToken(state,stream); pushToken(state,stream);
return rval(state,stream,"keyword"); return rval(state,stream,"keyword");
} }else if (stream.match(/\s*\(/,false)) {
if (stream.peek() == "(") {
// 'put' and 'erlang:put' are bifs, 'foo:put' is not // 'put' and 'erlang:put' are bifs, 'foo:put' is not
if (isMember(w,bifWords) && if (isMember(w,bifWords) &&
(!isPrev(stream,":") || isPrev(stream,"erlang:"))) { (!isPrev(stream,":") || isPrev(stream,"erlang:"))) {
return rval(state,stream,"builtin"); return rval(state,stream,"builtin");
}else if (isMember(w,guardWords)) {
return rval(state,stream,"guard");
}else{ }else{
return rval(state,stream,"function"); return rval(state,stream,"function");
} }
} }else if (isMember(w,operatorWords)) {
if (isMember(w,guardWords)) {
return rval(state,stream,"guard");
}
if (isMember(w,operatorWords)) {
return rval(state,stream,"operator"); return rval(state,stream,"operator");
} }else if (stream.match(/\s*:/,false)) {
if (stream.peek() == ":") {
if (w == "erlang") { if (w == "erlang") {
return rval(state,stream,"builtin"); return rval(state,stream,"builtin");
} else { } else {
return rval(state,stream,"function"); return rval(state,stream,"function");
} }
}else if (isMember(w,["true","false"])) {
return rval(state,stream,"boolean");
}else{
return rval(state,stream,"atom");
} }
return rval(state,stream,"atom");
} }
// number // number
var digitRE = /[0-9]/;
var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int
if (digitRE.test(ch)) { if (digitRE.test(ch)) {
stream.eatWhile(digitRE); stream.eatWhile(digitRE);
if (stream.eat('#')) { if (stream.eat('#')) {
stream.eatWhile(digitRE); // 16#10 style integer stream.eatWhile(radixRE); // 36#aZ style integer
} else { } else {
if (stream.eat('.')) { // float if (stream.eat('.')) { // float
stream.eatWhile(digitRE); stream.eatWhile(digitRE);
@@ -280,9 +261,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
} }
// separators // separators
if (greedy(stream,sepRE,separatorWords)) { if (greedy(stream,separatorRE,separatorWords)) {
// distinguish between "." as terminator and record field operator // distinguish between "." as terminator and record field operator
if (state.context == false) { if (!state.in_record) {
pushToken(state,stream); pushToken(state,stream);
} }
return rval(state,stream,"separator"); return rval(state,stream,"separator");
@@ -296,6 +277,17 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
return rval(state,stream,null); return rval(state,stream,null);
} }
function isPrev(stream,string) {
var start = stream.start;
var len = string.length;
if (len <= start) {
var word = stream.string.slice(start-len,start);
return word == string;
}else{
return false;
}
}
function nongreedy(stream,re,words) { function nongreedy(stream,re,words) {
if (stream.current().length == 1 && re.test(stream.current())) { if (stream.current().length == 1 && re.test(stream.current())) {
stream.backUp(1); stream.backUp(1);
@@ -347,31 +339,37 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
return false; return false;
} }
function Token(stream) { function isMember(element,list) {
this.token = stream ? stream.current() : ""; return (-1 < list.indexOf(element));
this.column = stream ? stream.column() : 0;
this.indent = stream ? stream.indentation() : 0;
} }
/////////////////////////////////////////////////////////////////////////////
function myIndent(state,textAfter) { function myIndent(state,textAfter) {
var indent = cmCfg.indentUnit; var indent = cmCfg.indentUnit;
var outdentWords = ["after","catch"];
var token = (peekToken(state)).token; var token = (peekToken(state)).token;
var wordAfter = takewhile(textAfter,/[^a-z]/); var wordAfter = takewhile(textAfter,/[^a-z]/);
if (isMember(token,openParenWords)) { if (state.in_string || state.in_atom) {
return (peekToken(state)).column+token.length; return CodeMirror.Pass;
}else if (token == "." || token == ""){ }else if (token == "") {
return 0; return 0;
}else if (isMember(token,openParenWords)) {
return (peekToken(state)).column+token.length;
}else if (token == "when") {
return (peekToken(state)).column+token.length+1;
}else if (token == "fun" && wordAfter == "") {
return (peekToken(state)).column+token.length;
}else if (token == "->") { }else if (token == "->") {
if (wordAfter == "end") { if (isMember(wordAfter,["end","after","catch"])) {
return peekToken(state,2).column; return peekToken(state,2).column;
}else if (peekToken(state,2).token == "fun") { }else if (peekToken(state,2).token == "fun") {
return peekToken(state,2).column+indent; return peekToken(state,2).column+indent;
}else if (peekToken(state,2).token == "") {
return indent;
}else{ }else{
return (peekToken(state)).indent+indent; return (peekToken(state)).indent+indent;
} }
}else if (isMember(wordAfter,outdentWords)) { }else if (isMember(wordAfter,["after","catch","of"])) {
return (peekToken(state)).indent; return (peekToken(state)).indent;
}else{ }else{
return (peekToken(state)).column+indent; return (peekToken(state)).column+indent;
@@ -383,6 +381,12 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
return m ? str.slice(0,m.index) : str; return m ? str.slice(0,m.index) : str;
} }
function Token(stream) {
this.token = stream ? stream.current() : "";
this.column = stream ? stream.column() : 0;
this.indent = stream ? stream.indentation() : 0;
}
function popToken(state) { function popToken(state) {
return state.tokenStack.pop(); return state.tokenStack.pop();
} }
@@ -400,7 +404,13 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
function pushToken(state,stream) { function pushToken(state,stream) {
var token = stream.current(); var token = stream.current();
var prev_token = peekToken(state).token; var prev_token = peekToken(state).token;
if (isMember(token,ignoreWords)) {
if (token == ".") {
state.tokenStack = [];
return false;
}else if(isMember(token,[",", ":", "of", "cond", "let", "query"])) {
return false;
}else if (drop_last(prev_token,token)) {
return false; return false;
}else if (drop_both(prev_token,token)) { }else if (drop_both(prev_token,token)) {
popToken(state); popToken(state);
@@ -408,18 +418,25 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
}else if (drop_first(prev_token,token)) { }else if (drop_first(prev_token,token)) {
popToken(state); popToken(state);
return pushToken(state,stream); return pushToken(state,stream);
}else if (isMember(token,["after","catch"])) {
return false;
}else{ }else{
state.tokenStack.push(new Token(stream)); state.tokenStack.push(new Token(stream));
return true; return true;
} }
} }
function drop_last(open, close) {
switch(open+" "+close) {
case "when ;": return true;
default: return false;
}
}
function drop_first(open, close) { function drop_first(open, close) {
switch (open+" "+close) { switch (open+" "+close) {
case "when ->": return true; case "when ->": return true;
case "-> end": return true; case "-> end": return true;
case "-> .": return true;
case ". .": return true;
default: return false; default: return false;
} }
} }
@@ -436,6 +453,8 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
case "if end": return true; case "if end": return true;
case "receive end": return true; case "receive end": return true;
case "try end": return true; case "try end": return true;
case "-> catch": return true;
case "-> after": return true;
case "-> ;": return true; case "-> ;": return true;
default: return false; default: return false;
} }
@@ -445,8 +464,9 @@ CodeMirror.defineMode("erlang", function(cmCfg) {
startState: startState:
function() { function() {
return {tokenStack: [], return {tokenStack: [],
context: false, in_record: false,
lastToken: null}; in_string: false,
in_atom: false};
}, },
token: token:
+28 -17
View File
@@ -1,19 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Erlang mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="erlang.js"></script>
<link rel="stylesheet" href="../../theme/erlang-dark.css">
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: Erlang mode</h1>
<title>CodeMirror: Erlang mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/erlang-dark.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="erlang.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Erlang</a>
</ul>
</div>
<article>
<h2>Erlang mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
%% -*- mode: erlang; erlang-indent-level: 2 -*- %% -*- mode: erlang; erlang-indent-level: 2 -*-
%%% Created : 7 May 2012 by mats cronqvist <masse@klarna.com> %%% Created : 7 May 2012 by mats cronqvist <masse@klarna.com>
@@ -32,7 +44,7 @@
rec_info(demo) -> record_info(fields,demo). rec_info(demo) -> record_info(fields,demo).
demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}). demo() -> expand_recs(?MODULE,#demo{a="A",b="BB"}).
expand_recs(M,List) when is_list(List) -> expand_recs(M,List) when is_list(List) ->
[expand_recs(M,L)||L<-List]; [expand_recs(M,L)||L<-List];
expand_recs(M,Tup) when is_tuple(Tup) -> expand_recs(M,Tup) when is_tuple(Tup) ->
@@ -60,5 +72,4 @@ expand_recs(_,Term) ->
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-erlang</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-erlang</code>.</p>
</body> </article>
</html>
+26 -15
View File
@@ -1,18 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Gas mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="gas.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border: 2px inset #dee;}</style>
</head>
<body>
<h1>CodeMirror: Gas mode</h1>
<form> <title>CodeMirror: Gas 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="gas.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Gas</a>
</ul>
</div>
<article>
<h2>Gas mode</h2>
<form>
<textarea id="code" name="code"> <textarea id="code" name="code">
.syntax unified .syntax unified
.global main .global main
@@ -53,5 +65,4 @@ message:
directives for the supplied architecture. directives for the supplied architecture.
<p><strong>MIME types defined:</strong> <code>text/x-gas</code></p> <p><strong>MIME types defined:</strong> <code>text/x-gas</code></p>
</body> </article>
</html>
+32 -24
View File
@@ -1,27 +1,36 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: GFM mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/mode/overlay.js"></script>
<script src="../xml/xml.js"></script>
<script src="../markdown/markdown.js"></script>
<script src="gfm.js"></script>
<!-- Code block highlighting modes -->
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../clike/clike.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: GFM mode</h1>
<title>CodeMirror: GFM 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/mode/overlay.js"></script>
<script src="../xml/xml.js"></script>
<script src="../markdown/markdown.js"></script>
<script src="gfm.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../clike/clike.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">GFM</a>
</ul>
</div>
<article>
<h2>GFM mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
GitHub Flavored Markdown GitHub Flavored Markdown
======================== ========================
@@ -70,5 +79,4 @@ See http://github.github.com/github-flavored-markdown/.
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#gfm_*">normal</a>, <a href="../../test/index.html#verbose,gfm_*">verbose</a>.</p> <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#gfm_*">normal</a>, <a href="../../test/index.html#verbose,gfm_*">verbose</a>.</p>
</body> </article>
</html>
+27 -16
View File
@@ -1,19 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Go mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="go.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border:1px solid #999; background:#ffc}</style>
</head>
<body>
<h1>CodeMirror: Go mode</h1>
<title>CodeMirror: Go mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="go.js"></script>
<style>.CodeMirror {border:1px solid #999; background:#ffc}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Go</a>
</ul>
</div>
<article>
<h2>Go mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
// Prime Sieve in Go. // Prime Sieve in Go.
// Taken from the Go specification. // Taken from the Go specification.
@@ -70,5 +82,4 @@ func main() {
</script> </script>
<p><strong>MIME type:</strong> <code>text/x-go</code></p> <p><strong>MIME type:</strong> <code>text/x-go</code></p>
</body> </article>
</html>
+2 -1
View File
@@ -203,7 +203,8 @@ CodeMirror.defineMode("groovy", function(config) {
else return ctx.indented + (closing ? 0 : config.indentUnit); else return ctx.indented + (closing ? 0 : config.indentUnit);
}, },
electricChars: "{}" electricChars: "{}",
fold: "brace"
}; };
}); });
+26 -15
View File
@@ -1,18 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Groovy mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="groovy.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style>
</head>
<body>
<h1>CodeMirror: Groovy mode</h1>
<title>CodeMirror: Groovy 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>
<script src="groovy.js"></script>
<style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Groovy</a>
</ul>
</div>
<article>
<h2>Groovy mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
//Pattern for groovy script //Pattern for groovy script
def p = ~/.*\.groovy/ def p = ~/.*\.groovy/
@@ -69,5 +81,4 @@ def change(currency, amount) {
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-groovy</code></p> <p><strong>MIME types defined:</strong> <code>text/x-groovy</code></p>
</body> </article>
</html>
+31 -19
View File
@@ -1,21 +1,34 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: HAML mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: HAML mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../xml/xml.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script> <script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script> <script src="../htmlmixed/htmlmixed.js"></script>
<script src="../ruby/ruby.js"></script> <script src="../javascript/javascript.js"></script>
<script src="haml.js"></script> <script src="../ruby/ruby.js"></script>
<style>.CodeMirror {background: #f8f8f8;}</style> <script src="haml.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {background: #f8f8f8;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: HAML mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">HAML</a>
</ul>
</div>
<article>
<h2>HAML mode</h2>
<form><textarea id="code" name="code">
!!! !!!
#content #content
.left.column(title="title"){:href => "/hello", :test => "#{hello}_#{world}"} .left.column(title="title"){:href => "/hello", :test => "#{hello}_#{world}"}
@@ -63,5 +76,4 @@
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#haml_*">normal</a>, <a href="../../test/index.html#verbose,haml_*">verbose</a>.</p> <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#haml_*">normal</a>, <a href="../../test/index.html#verbose,haml_*">verbose</a>.</p>
</body> </article>
</html>
@@ -1,4 +1,4 @@
CodeMirror.defineMode("haskell", function() { CodeMirror.defineMode("haskell", function(_config, modeConfig) {
function switchState(source, setState, f) { function switchState(source, setState, f) {
setState(f); setState(f);
@@ -221,6 +221,10 @@ CodeMirror.defineMode("haskell", function() {
"unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip",
"zip3", "zipWith", "zipWith3"); "zip3", "zipWith", "zipWith3");
var override = modeConfig.overrideKeywords;
if (override) for (var word in override) if (override.hasOwnProperty(word))
wkw[word] = override[word];
return wkw; return wkw;
})(); })();
+27 -16
View File
@@ -1,19 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Haskell mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="haskell.js"></script>
<link rel="stylesheet" href="../../theme/elegant.css">
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: Haskell mode</h1>
<title>CodeMirror: Haskell mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<link rel="stylesheet" href="../../theme/elegant.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="haskell.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Haskell</a>
</ul>
</div>
<article>
<h2>Haskell mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
module UniquePerms ( module UniquePerms (
uniquePerms uniquePerms
@@ -58,5 +70,4 @@ permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p>
</body> </article>
</html>
+1 -1
View File
@@ -297,7 +297,7 @@ CodeMirror.defineMode("haxe", function(config, parserConfig) {
function metadef(type) { function metadef(type) {
if(type == ":") return cont(metadef); if(type == ":") return cont(metadef);
if(type == "variable") return cont(metadef); if(type == "variable") return cont(metadef);
if(type == "(") return cont(pushlex(")"), comasep(metaargs, ")"), poplex, statement); if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement);
} }
function metaargs(type) { function metaargs(type) {
if(type == "variable") return cont(); if(type == "variable") return cont();
+27 -14
View File
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Haxe mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Haxe mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="haxe.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Haxe mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Haxe</a>
</ul>
</div>
<article>
<h2>Haxe mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
import one.two.Three; import one.two.Three;
@@ -86,5 +100,4 @@ enum Color
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-haxe</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-haxe</code>.</p>
</body> </article>
</html>
@@ -1,21 +1,33 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Html Embedded Scripts mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="htmlembedded.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: Html Embedded Scripts mode</h1>
<title>CodeMirror: Html Embedded Scripts 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="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="htmlembedded.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Html Embedded Scripts</a>
</ul>
</div>
<article>
<h2>Html Embedded Scripts mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
<% <%
function hello(who) { function hello(who) {
@@ -45,5 +57,4 @@ This is an example of EJS (embedded javascript)
<p><strong>MIME types defined:</strong> <code>application/x-aspx</code> (ASP.NET), <p><strong>MIME types defined:</strong> <code>application/x-aspx</code> (ASP.NET),
<code>application/x-ejs</code> (Embedded Javascript), <code>application/x-jsp</code> (JavaServer Pages)</p> <code>application/x-ejs</code> (Embedded Javascript), <code>application/x-jsp</code> (JavaServer Pages)</p>
</body> </article>
</html>
@@ -1,21 +1,34 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: HTML mixed mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: HTML mixed mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../xml/xml.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="../javascript/javascript.js"></script> <script src="../xml/xml.js"></script>
<script src="../css/css.js"></script> <script src="../javascript/javascript.js"></script>
<script src="../vbscript/vbscript.js"></script> <script src="../css/css.js"></script>
<script src="htmlmixed.js"></script> <script src="../vbscript/vbscript.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: HTML mixed mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">HTML mixed</a>
</ul>
</div>
<article>
<h2>HTML mixed mode</h2>
<form><textarea id="code" name="code">
<html style="color: green"> <html style="color: green">
<!-- this is a comment --> <!-- this is a comment -->
<head> <head>
@@ -69,5 +82,4 @@
(redefined, only takes effect if you load this parser after the (redefined, only takes effect if you load this parser after the
XML parser).</p> XML parser).</p>
</body> </article>
</html>
+27 -14
View File
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: HTTP mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: HTTP mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="http.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: HTTP mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">HTTP</a>
</ul>
</div>
<article>
<h2>HTTP mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
POST /somewhere HTTP/1.1 POST /somewhere HTTP/1.1
@@ -28,5 +42,4 @@ This is the request body!
</script> </script>
<p><strong>MIME types defined:</strong> <code>message/http</code>.</p> <p><strong>MIME types defined:</strong> <code>message/http</code>.</p>
</body> </article>
</html>
@@ -1,19 +1,33 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: JavaScript mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: JavaScript mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/continuecomment.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<script src="../../addon/comment/comment.js"></script> <script src="../../addon/comment/continuecomment.js"></script>
<script src="javascript.js"></script> <script src="../../addon/comment/comment.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: JavaScript mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">JavaScript</a>
</ul>
</div>
<article>
<h2>JavaScript mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
// Demo code (the actual new parser character stream implementation) // Demo code (the actual new parser character stream implementation)
@@ -90,5 +104,4 @@ StringStream.prototype = {
</p> </p>
<p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p> <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>, <code>text/typescript</code>, <code>application/typescript</code>.</p>
</body> </article>
</html>
@@ -78,18 +78,19 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
type = tp; content = cont; type = tp; content = cont;
return style; return style;
} }
function jsTokenBase(stream, state) { function jsTokenBase(stream, state) {
var ch = stream.next(); var ch = stream.next();
if (ch == '"' || ch == "'") if (ch == '"' || ch == "'")
return chain(stream, state, jsTokenString(ch)); return chain(stream, state, jsTokenString(ch));
else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/))
return ret("number", "number");
else if (/[\[\]{}\(\),;\:\.]/.test(ch)) else if (/[\[\]{}\(\),;\:\.]/.test(ch))
return ret(ch); return ret(ch);
else if (ch == "0" && stream.eat(/x/i)) { else if (ch == "0" && stream.eat(/x/i)) {
stream.eatWhile(/[\da-f]/i); stream.eatWhile(/[\da-f]/i);
return ret("number", "number"); return ret("number", "number");
} }
else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { else if (/\d/.test(ch)) {
stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
return ret("number", "number"); return ret("number", "number");
} }
@@ -258,17 +259,17 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
if (type == "keyword b") return cont(pushlex("form"), statement, poplex); if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
if (type == "{") return cont(pushlex("}"), block, poplex); if (type == "{") return cont(pushlex("}"), block, poplex);
if (type == ";") return cont(); if (type == ";") return cont();
if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse(cx.state.indented)); if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse);
if (type == "function") return cont(functiondef); if (type == "function") return cont(functiondef);
if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
poplex, statement, poplex); poplex, statement, poplex);
if (type == "variable") return cont(pushlex("stat"), maybelabel); if (type == "variable") return cont(pushlex("stat"), maybelabel);
if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
block, poplex, poplex); block, poplex, poplex);
if (type == "case") return cont(expression, expect(":")); if (type == "case") return cont(expression, expect(":"));
if (type == "default") return cont(expect(":")); if (type == "default") return cont(expect(":"));
if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
statement, poplex, popcontext); statement, poplex, popcontext);
return pass(pushlex("stat"), expression, expect(";"), poplex); return pass(pushlex("stat"), expression, expect(";"), poplex);
} }
function expression(type) { function expression(type) {
@@ -299,19 +300,20 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
function maybeoperatorComma(type, value) { function maybeoperatorComma(type, value) {
if (type == ",") return cont(expression); if (type == ",") return cont(expression);
return maybeoperatorNoComma(type, value, maybeoperatorComma); return maybeoperatorNoComma(type, value, false);
} }
function maybeoperatorNoComma(type, value, me) { function maybeoperatorNoComma(type, value, noComma) {
if (!me) me = maybeoperatorNoComma; var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
var expr = noComma == false ? expression : expressionNoComma;
if (type == "operator") { if (type == "operator") {
if (/\+\+|--/.test(value)) return cont(me); if (/\+\+|--/.test(value)) return cont(me);
if (value == "?") return cont(expression, expect(":"), expression); if (value == "?") return cont(expression, expect(":"), expr);
return cont(expression); return cont(expr);
} }
if (type == ";") return; if (type == ";") return;
if (type == "(") return cont(pushlex(")", "call"), commasep(expressionNoComma, ")"), poplex, me); if (type == "(") return cont(pushlex(")", "call"), commasep(expressionNoComma, ")"), poplex, me);
if (type == ".") return cont(property, me); if (type == ".") return cont(property, me);
if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, me); if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
} }
function maybelabel(type) { function maybelabel(type) {
if (type == ":") return cont(poplex, statement); if (type == ":") return cont(poplex, statement);
@@ -373,14 +375,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
if (value == "=") return cont(expressionNoComma, vardef2); if (value == "=") return cont(expressionNoComma, vardef2);
if (type == ",") return cont(vardef1); if (type == ",") return cont(vardef1);
} }
function maybeelse(indent) { function maybeelse(type, value) {
return function(type, value) { if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex);
if (type == "keyword b" && value == "else") {
cx.state.lexical = new JSLexical(indent, 0, "form", null, cx.state.lexical);
return cont(statement, poplex);
}
return pass();
};
} }
function forspec1(type) { function forspec1(type) {
if (type == "var") return cont(vardef1, expect(";"), forspec2); if (type == "var") return cont(vardef1, expect(";"), forspec2);
@@ -441,6 +437,12 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
if (state.tokenize == jsTokenComment) return CodeMirror.Pass; if (state.tokenize == jsTokenComment) return CodeMirror.Pass;
if (state.tokenize != jsTokenBase) return 0; if (state.tokenize != jsTokenBase) return 0;
var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
// Kludge to prevent 'maybelse' from blocking lexical scope pops
for (var i = state.cc.length - 1; i >= 0; --i) {
var c = state.cc[i];
if (c == poplex) lexical = lexical.prev;
else if (c != maybeelse || /^else\b/.test(textAfter)) break;
}
if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
lexical = lexical.prev; lexical = lexical.prev;
@@ -461,7 +463,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
blockCommentStart: jsonMode ? null : "/*", blockCommentStart: jsonMode ? null : "/*",
blockCommentEnd: jsonMode ? null : "*/", blockCommentEnd: jsonMode ? null : "*/",
lineComment: jsonMode ? null : "//", lineComment: jsonMode ? null : "//",
fold: "brace",
helperType: jsonMode ? "json" : "javascript",
jsonMode: jsonMode jsonMode: jsonMode
}; };
}); });
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: TypeScript mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: TypeScript mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="javascript.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: TypeScript mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">TypeScript</a>
</ul>
</div>
<article>
<h2>TypeScript mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
class Greeter { class Greeter {
@@ -44,5 +58,4 @@ document.body.appendChild(button)
</script> </script>
<p>This is a specialization of the <a href="index.html">JavaScript mode</a>.</p> <p>This is a specialization of the <a href="index.html">JavaScript mode</a>.</p>
</body> </article>
</html>
+27 -15
View File
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Jinja2 mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Jinja2 mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="jinja2.js"></script> <script src="../../lib/codemirror.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style> <script src="jinja2.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Jinja2 mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Jinja2</a>
</ul>
</div>
<article>
<h2>Jinja2 mode</h2>
<form><textarea id="code" name="code">
&lt;html style="color: green"&gt; &lt;html style="color: green"&gt;
&lt;!-- this is a comment --&gt; &lt;!-- this is a comment --&gt;
&lt;head&gt; &lt;head&gt;
@@ -34,5 +47,4 @@
CodeMirror.fromTextArea(document.getElementById("code"), {mode: CodeMirror.fromTextArea(document.getElementById("code"), {mode:
{name: "jinja2", htmlMode: true}}); {name: "jinja2", htmlMode: true}});
</script> </script>
</body> </article>
</html>
+29 -17
View File
@@ -1,19 +1,32 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: LESS mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: LESS mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <link rel="stylesheet" href="../../theme/lesser-dark.css">
<script src="less.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {background: #f8f8f8; border: 1px solid #ddd; font-size:12px; height: 400px}</style> <script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <script src="less.js"></script>
<link rel="stylesheet" href="../../theme/lesser-dark.css"> <style>.CodeMirror {background: #f8f8f8; border: 1px solid #ddd; font-size:12px; height: 400px}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: LESS mode</h1>
<form><textarea id="code" name="code">@media screen and (device-aspect-ratio: 16/9) { … } <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">LESS</a>
</ul>
</div>
<article>
<h2>LESS mode</h2>
<form><textarea id="code" name="code">@media screen and (device-aspect-ratio: 16/9) { … }
@media screen and (device-aspect-ratio: 32/18) { … } @media screen and (device-aspect-ratio: 32/18) { … }
@media screen and (device-aspect-ratio: 1280/720) { … } @media screen and (device-aspect-ratio: 1280/720) { … }
@media screen and (device-aspect-ratio: 2560/1440) { … } @media screen and (device-aspect-ratio: 2560/1440) { … }
@@ -737,5 +750,4 @@ td {
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-less</code>, <code>text/css</code> (if not previously defined).</p> <p><strong>MIME types defined:</strong> <code>text/x-less</code>, <code>text/css</code> (if not previously defined).</p>
</body> </article>
</html>
+47 -49
View File
@@ -1,7 +1,8 @@
/* /*
LESS mode - http://www.lesscss.org/ LESS mode - http://www.lesscss.org/
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 GitHub: @peterkroon Report bugs/issues here: https://github.com/marijnh/CodeMirror/issues
GitHub: @peterkroon
*/ */
CodeMirror.defineMode("less", function(config) { CodeMirror.defineMode("less", function(config) {
@@ -17,68 +18,60 @@ CodeMirror.defineMode("less", function(config) {
else if (ch == "/" && stream.eat("*")) { else if (ch == "/" && stream.eat("*")) {
state.tokenize = tokenCComment; state.tokenize = tokenCComment;
return tokenCComment(stream, state); return tokenCComment(stream, state);
} } else if (ch == "<" && stream.eat("!")) {
else if (ch == "<" && stream.eat("!")) {
state.tokenize = tokenSGMLComment; state.tokenize = tokenSGMLComment;
return tokenSGMLComment(stream, state); return tokenSGMLComment(stream, state);
} } else if (ch == "=") ret(null, "compare");
else if (ch == "=") ret(null, "compare");
else if (ch == "|" && stream.eat("=")) return ret(null, "compare"); else if (ch == "|" && stream.eat("=")) return ret(null, "compare");
else if (ch == "\"" || ch == "'") { else if (ch == "\"" || ch == "'") {
state.tokenize = tokenString(ch); state.tokenize = tokenString(ch);
return state.tokenize(stream, state); return state.tokenize(stream, state);
} } else if (ch == "/") { // e.g.: .png will not be parsed as a class
else if (ch == "/") { // e.g.: .png will not be parsed as a class
if(stream.eat("/")){ if(stream.eat("/")){
state.tokenize = tokenSComment; state.tokenize = tokenSComment;
return tokenSComment(stream, state); return tokenSComment(stream, state);
}else{ } else {
if(type == "string" || type == "(")return ret("string", "string"); if(type == "string" || type == "(") return ret("string", "string");
if(state.stack[state.stack.length-1] != undefined)return ret(null, ch); if(state.stack[state.stack.length-1] != undefined) return ret(null, ch);
stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/); stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
if( /\/|\)|#/.test(stream.peek() || (stream.eatSpace() && stream.peek() == ")")) || stream.eol() )return ret("string", "string"); // let url(/images/logo.png) without quotes return as string if( /\/|\)|#/.test(stream.peek() || (stream.eatSpace() && stream.peek() == ")")) || stream.eol() )return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
} }
} } else if (ch == "!") {
else if (ch == "!") {
stream.match(/^\s*\w*/); stream.match(/^\s*\w*/);
return ret("keyword", "important"); return ret("keyword", "important");
} } else if (/\d/.test(ch)) {
else if (/\d/.test(ch)) {
stream.eatWhile(/[\w.%]/); stream.eatWhile(/[\w.%]/);
return ret("number", "unit"); return ret("number", "unit");
} } else if (/[,+<>*\/]/.test(ch)) {
else if (/[,+<>*\/]/.test(ch)) {
if(stream.peek() == "=" || type == "a")return ret("string", "string"); if(stream.peek() == "=" || type == "a")return ret("string", "string");
if(ch === ",")return ret(null, ch);
return ret(null, "select-op"); return ret(null, "select-op");
} } else if (/[;{}:\[\]()~\|]/.test(ch)) {
else if (/[;{}:\[\]()~\|]/.test(ch)) {
if(ch == ":"){ if(ch == ":"){
stream.eatWhile(/[a-z\\\-]/); stream.eatWhile(/[a-z\\\-]/);
if( selectors.test(stream.current()) ){ if( selectors.test(stream.current()) ){
return ret("tag", "tag"); return ret("tag", "tag");
}else if(stream.peek() == ":"){//::-webkit-search-decoration } else if(stream.peek() == ":"){//::-webkit-search-decoration
stream.next(); stream.next();
stream.eatWhile(/[a-z\\\-]/); stream.eatWhile(/[a-z\\\-]/);
if(stream.current().match(/\:\:\-(o|ms|moz|webkit)\-/))return ret("string", "string"); if(stream.current().match(/\:\:\-(o|ms|moz|webkit)\-/))return ret("string", "string");
if( selectors.test(stream.current().substring(1)) )return ret("tag", "tag"); if( selectors.test(stream.current().substring(1)) )return ret("tag", "tag");
return ret(null, ch); return ret(null, ch);
}else{ } else {
return ret(null, ch); return ret(null, ch);
} }
}else if(ch == "~"){ } else if(ch == "~"){
if(type == "r")return ret("string", "string"); if(type == "r")return ret("string", "string");
}else{ } else {
return ret(null, ch); return ret(null, ch);
} }
} } else if (ch == ".") {
else if (ch == ".") {
if(type == "(" || type == "string")return ret("string", "string"); // allow url(../image.png) if(type == "(" || type == "string")return ret("string", "string"); // allow url(../image.png)
stream.eatWhile(/[\a-zA-Z0-9\-_]/); stream.eatWhile(/[\a-zA-Z0-9\-_]/);
if(stream.peek() == " ")stream.eatSpace(); if(stream.peek() == " ")stream.eatSpace();
if(stream.peek() == ")")return ret("number", "unit");//rgba(0,0,0,.25); if(stream.peek() == ")")return ret("number", "unit");//rgba(0,0,0,.25);
return ret("tag", "tag"); return ret("tag", "tag");
} } else if (ch == "#") {
else if (ch == "#") {
//we don't eat white-space, we want the hex color and or id only //we don't eat white-space, we want the hex color and or id only
stream.eatWhile(/[A-Za-z0-9]/); stream.eatWhile(/[A-Za-z0-9]/);
//check if there is a proper hex color length e.g. #eee || #eeeEEE //check if there is a proper hex color length e.g. #eee || #eeeEEE
@@ -93,43 +86,41 @@ CodeMirror.defineMode("less", function(config) {
//#time { color: #aaa } //#time { color: #aaa }
else if(stream.peek() == "}" )return ret("number", "unit"); else if(stream.peek() == "}" )return ret("number", "unit");
//we have a valid hex color value, parse as id whenever an element/class is defined after the hex(id) value e.g. #eee aaa || #eee .aaa //we have a valid hex color value, parse as id whenever an element/class is defined after the hex(id) value e.g. #eee aaa || #eee .aaa
else if( /[a-zA-Z\\]/.test(stream.peek()) )return ret("atom", "tag"); else if( /[a-zA-Z\\]/.test(stream.peek()) )return ret("atom", "tag");
//when a hex value is on the end of a line, parse as id //when a hex value is on the end of a line, parse as id
else if(stream.eol())return ret("atom", "tag"); else if(stream.eol())return ret("atom", "tag");
//default //default
else return ret("number", "unit"); else return ret("number", "unit");
}else{//when not a valid hexvalue in the current stream e.g. #footer } else {//when not a valid hexvalue in the current stream e.g. #footer
stream.eatWhile(/[\w\\\-]/); stream.eatWhile(/[\w\\\-]/);
return ret("atom", "tag"); return ret("atom", "tag");
} }
}else{//when not a valid hexvalue length } else {//when not a valid hexvalue length
stream.eatWhile(/[\w\\\-]/); stream.eatWhile(/[\w\\\-]/);
return ret("atom", "tag"); return ret("atom", "tag");
} }
} } else if (ch == "&") {
else if (ch == "&") {
stream.eatWhile(/[\w\-]/); stream.eatWhile(/[\w\-]/);
return ret(null, ch); return ret(null, ch);
} } else {
else {
stream.eatWhile(/[\w\\\-_%.{]/); stream.eatWhile(/[\w\\\-_%.{]/);
if(type == "string"){ if(type == "string"){
return ret("string", "string"); return ret("string", "string");
}else if(stream.current().match(/(^http$|^https$)/) != null){ } else if(stream.current().match(/(^http$|^https$)/) != null){
stream.eatWhile(/[\w\\\-_%.{:\/]/); stream.eatWhile(/[\w\\\-_%.{:\/]/);
return ret("string", "string"); return ret("string", "string");
}else if(stream.peek() == "<" || stream.peek() == ">"){ } else if(stream.peek() == "<" || stream.peek() == ">" || stream.peek() == "+"){
return ret("tag", "tag"); return ret("tag", "tag");
}else if( /\(/.test(stream.peek()) ){ } else if( /\(/.test(stream.peek()) ){
return ret(null, ch); return ret(null, ch);
}else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png) } else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
return ret("string", "string"); return ret("string", "string");
}else if( stream.current().match(/\-\d|\-.\d/) ){ // match e.g.: -5px -0.4 etc... only colorize the minus sign } else if( stream.current().match(/\-\d|\-.\d/) ){ // match e.g.: -5px -0.4 etc... only colorize the minus sign
//commment out these 2 comment if you want the minus sign to be parsed as null -500px //commment out these 2 comment if you want the minus sign to be parsed as null -500px
//stream.backUp(stream.current().length-1); //stream.backUp(stream.current().length-1);
//return ret(null, ch); //console.log( stream.current() ); //return ret(null, ch);
return ret("number", "unit"); return ret("number", "unit");
}else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){ } else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
stream.backUp(1); stream.backUp(1);
return ret("tag", "tag"); return ret("tag", "tag");
@@ -137,14 +128,15 @@ CodeMirror.defineMode("less", function(config) {
stream.eatSpace(); stream.eatSpace();
if( /[{<>.a-zA-Z\/]/.test(stream.peek()) || stream.eol() )return ret("tag", "tag"); // e.g. button.icon-plus if( /[{<>.a-zA-Z\/]/.test(stream.peek()) || stream.eol() )return ret("tag", "tag"); // e.g. button.icon-plus
return ret("string", "string"); // let url(/images/logo.png) without quotes return as string return ret("string", "string"); // let url(/images/logo.png) without quotes return as string
}else if( stream.eol() || stream.peek() == "[" || stream.peek() == "#" || type == "tag" ){ } else if( stream.eol() || stream.peek() == "[" || stream.peek() == "#" || type == "tag" ){
if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1); if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
return ret("tag", "tag"); return ret("tag", "tag");
}else if(type == "compare" || type == "a" || type == "("){ } else if(type == "compare" || type == "a" || type == "("){
return ret("string", "string"); return ret("string", "string");
}else if(type == "|" || stream.current() == "-" || type == "["){ } else if(type == "|" || stream.current() == "-" || type == "["){
if(type == "|" )return ret("tag", "tag");
return ret(null, ch); return ret(null, ch);
}else if(stream.peek() == ":") { } else if(stream.peek() == ":") {
stream.next(); stream.next();
var t_v = stream.peek() == ":" ? true : false; var t_v = stream.peek() == ":" ? true : false;
if(!t_v){ if(!t_v){
@@ -156,11 +148,14 @@ CodeMirror.defineMode("less", function(config) {
stream.backUp(new_pos-(old_pos-1)); stream.backUp(new_pos-(old_pos-1));
return ret("tag", "tag"); return ret("tag", "tag");
} else stream.backUp(new_pos-(old_pos-1)); } else stream.backUp(new_pos-(old_pos-1));
}else{ } else {
stream.backUp(1); stream.backUp(1);
} }
if(t_v)return ret("tag", "tag"); else return ret("variable", "variable"); if(t_v)return ret("tag", "tag"); else return ret("variable", "variable");
}else{ } else if(state.stack[state.stack.length-1] === "font-family"){
return ret(null, null);
} else {
if(state.stack[state.stack.length-1] === "{" || type === "select-op" || (state.stack[state.stack.length-1] === "rule" && type === ",") )return ret("tag", "tag");
return ret("variable", "variable"); return ret("variable", "variable");
} }
} }
@@ -238,12 +233,15 @@ CodeMirror.defineMode("less", function(config) {
} }
else if (type == "}") state.stack.pop(); else if (type == "}") state.stack.pop();
else if (type == "@media") state.stack.push("@media"); else if (type == "@media") state.stack.push("@media");
else if (context == "{" && type != "comment") state.stack.push("rule"); else if (stream.current() === "font-family") state.stack[state.stack.length-1] = "font-family";
else if (context == "{" && type != "comment" && type !== "tag") state.stack.push("rule");
else if (stream.peek() === ":" && stream.current().match(/@|#/) === null) style = type;
return style; return style;
}, },
indent: function(state, textAfter) { indent: function(state, textAfter) {
var n = state.stack.length; var n = state.stack.length;
if (/^\}/.test(textAfter)) if (/^\}/.test(textAfter))
n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
return state.baseIndent + n * indentUnit; return state.baseIndent + n * indentUnit;
@@ -1,23 +0,0 @@
The MIT License
Copyright (c) 2013 Kenneth Bentley
Modified from the CoffeeScript CodeMirror mode, Copyright (c) 2011 Jeff Pickhardt
Modified from the Python CodeMirror mode, Copyright (c) 2010 Timothy Farrell
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -1,17 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: LiveScript mode</title>
<title>CodeMirror: LiveScript mode</title> <meta charset="utf-8"/>
<link rel="stylesheet" href="../../lib/codemirror.css"> <link rel=stylesheet href="../../doc/docs.css">
<script src="../../lib/codemirror.js"></script>
<script src="livescript.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<style>.CodeMirror {font-size: 80%;border-top: 1px solid silver; border-bottom: 1px solid silver;}</style> <link rel="stylesheet" href="../../theme/solarized.css">
<link rel="stylesheet" href="../../doc/docs.css"> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../theme/solarized.css"> <script src="livescript.js"></script>
</head> <style>.CodeMirror {font-size: 80%;border-top: 1px solid silver; border-bottom: 1px solid silver;}</style>
<body> <div id=nav>
<h1>CodeMirror: LiveScript mode</h1> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<form><textarea id="code" name="code">
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">LiveScript</a>
</ul>
</div>
<article>
<h2>LiveScript mode</h2>
<form><textarea id="code" name="code">
# LiveScript mode for CodeMirror # LiveScript mode for CodeMirror
# The following script, prelude.ls, is used to # The following script, prelude.ls, is used to
# demonstrate LiveScript mode for CodeMirror. # demonstrate LiveScript mode for CodeMirror.
@@ -442,5 +456,4 @@ export prelude = out$
<p>The LiveScript mode was written by Kenneth Bentley (<a href="LICENSE">license</a>).</p> <p>The LiveScript mode was written by Kenneth Bentley (<a href="LICENSE">license</a>).</p>
</body> </article>
</html>
+29 -17
View File
@@ -1,19 +1,32 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Lua mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Lua mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../theme/neat.css">
<script src="lua.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../theme/neat.css"> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <script src="lua.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {border: 1px solid black;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Lua mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Lua</a>
</ul>
</div>
<article>
<h2>Lua mode</h2>
<form><textarea id="code" name="code">
--[[ --[[
example useless code to show lua syntax highlighting example useless code to show lua syntax highlighting
this is multiline comment this is multiline comment
@@ -70,5 +83,4 @@ end
the <code>lua-special</code> style.</p> the <code>lua-special</code> style.</p>
<p><strong>MIME types defined:</strong> <code>text/x-lua</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-lua</code>.</p>
</body> </article>
</html>
+32 -17
View File
@@ -1,20 +1,36 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Markdown mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/continuelist.js"></script>
<script src="../xml/xml.js"></script>
<script src="markdown.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: Markdown mode</h1>
<!-- source: http://daringfireball.net/projects/markdown/basics.text --> <title>CodeMirror: Markdown 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/continuelist.js"></script>
<script src="../xml/xml.js"></script>
<script src="markdown.js"></script>
<style type="text/css">
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
.cm-s-default .cm-trailing-space-a:before,
.cm-s-default .cm-trailing-space-b:before {position: absolute; content: "\00B7"; color: #777;}
.cm-s-default .cm-trailing-space-new-line:before {position: absolute; content: "\21B5"; color: #777;}
</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Markdown</a>
</ul>
</div>
<article>
<h2>Markdown mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
Markdown: Basics Markdown: Basics
================ ================
@@ -340,5 +356,4 @@ Output:
<p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#markdown_*">normal</a>, <a href="../../test/index.html#verbose,markdown_*">verbose</a>.</p> <p><strong>Parsing/Highlighting Tests:</strong> <a href="../../test/index.html#markdown_*">normal</a>, <a href="../../test/index.html#verbose,markdown_*">verbose</a>.</p>
</body> </article>
</html>
@@ -103,6 +103,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
state.f = inlineNormal; state.f = inlineNormal;
state.block = blockNormal; state.block = blockNormal;
} }
// Reset state.trailingSpace
state.trailingSpace = 0;
state.trailingSpaceNewLine = false;
// Mark this line as blank // Mark this line as blank
state.thisLineHasContent = false; state.thisLineHasContent = false;
return null; return null;
@@ -217,6 +220,12 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
} }
} }
if (state.trailingSpaceNewLine) {
styles.push("trailing-space-new-line");
} else if (state.trailingSpace) {
styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b"));
}
return styles.length ? styles.join(' ') : null; return styles.length ? styles.join(' ') : null;
} }
@@ -369,6 +378,14 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
} }
} }
if (ch === ' ') {
if (stream.match(/ +$/, false)) {
state.trailingSpace++;
} else if (state.trailingSpace) {
state.trailingSpaceNewLine = true;
}
}
return getType(state); return getType(state);
} }
@@ -453,7 +470,9 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
taskList: false, taskList: false,
list: false, list: false,
listDepth: 0, listDepth: 0,
quote: 0 quote: 0,
trailingSpace: 0,
trailingSpaceNewLine: false
}; };
}, },
@@ -481,6 +500,8 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
list: s.list, list: s.list,
listDepth: s.listDepth, listDepth: s.listDepth,
quote: s.quote, quote: s.quote,
trailingSpace: s.trailingSpace,
trailingSpaceNewLine: s.trailingSpaceNewLine,
md_inside: s.md_inside md_inside: s.md_inside
}; };
}, },
@@ -504,6 +525,10 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) {
// Reset state.code // Reset state.code
state.code = false; state.code = false;
// Reset state.trailingSpace
state.trailingSpace = 0;
state.trailingSpaceNewLine = false;
state.f = state.block; state.f = state.block;
var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length;
var difference = Math.floor((indentation - state.indentation) / 4) * 4; var difference = Math.floor((indentation - state.indentation) / 4) * 4;
@@ -5,6 +5,20 @@
MT("plainText", MT("plainText",
"foo"); "foo");
// Don't style single trailing space
MT("trailingSpace1",
"foo ");
// Two or more trailing spaces should be styled with line break character
MT("trailingSpace2",
"foo[trailing-space-a ][trailing-space-new-line ]");
MT("trailingSpace3",
"foo[trailing-space-a ][trailing-space-b ][trailing-space-new-line ]");
MT("trailingSpace4",
"foo[trailing-space-a ][trailing-space-b ][trailing-space-a ][trailing-space-new-line ]");
// Code blocks using 4 spaces (regardless of CodeMirror.tabSize value) // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value)
MT("codeBlocksUsing4Spaces", MT("codeBlocksUsing4Spaces",
" [comment foo]"); " [comment foo]");
+12 -2
View File
@@ -13,12 +13,15 @@ CodeMirror.modeInfo = [
{name: 'CSS', mime: 'text/css', mode: 'css'}, {name: 'CSS', mime: 'text/css', mode: 'css'},
{name: 'D', mime: 'text/x-d', mode: 'd'}, {name: 'D', mime: 'text/x-d', mode: 'd'},
{name: 'diff', mime: 'text/x-diff', mode: 'diff'}, {name: 'diff', mime: 'text/x-diff', mode: 'diff'},
{name: 'DTD', mime: 'application/xml-dtd', mode: 'dtd'},
{name: 'ECL', mime: 'text/x-ecl', mode: 'ecl'}, {name: 'ECL', mime: 'text/x-ecl', mode: 'ecl'},
{name: 'Erlang', mime: 'text/x-erlang', mode: 'erlang'}, {name: 'Erlang', mime: 'text/x-erlang', mode: 'erlang'},
{name: 'Fortran', mime: 'text/x-fortran', mode: 'fortran'},
{name: 'Gas', mime: 'text/x-gas', mode: 'gas'}, {name: 'Gas', mime: 'text/x-gas', mode: 'gas'},
{name: 'GitHub Flavored Markdown', 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'},
{name: 'Groovy', mime: 'text/x-groovy', mode: 'groovy'}, {name: 'Groovy', mime: 'text/x-groovy', mode: 'groovy'},
{name: 'HAML', mime: 'text/x-haml', mode: 'haml'},
{name: 'Haskell', mime: 'text/x-haskell', mode: 'haskell'}, {name: 'Haskell', mime: 'text/x-haskell', mode: 'haskell'},
{name: 'Haxe', mime: 'text/x-haxe', mode: 'haxe'}, {name: 'Haxe', mime: 'text/x-haxe', mode: 'haxe'},
{name: 'ASP.NET', mime: 'application/x-aspx', mode: 'htmlembedded'}, {name: 'ASP.NET', mime: 'application/x-aspx', mode: 'htmlembedded'},
@@ -26,6 +29,7 @@ CodeMirror.modeInfo = [
{name: 'JavaServer Pages', mime: 'application/x-jsp', mode: 'htmlembedded'}, {name: 'JavaServer Pages', mime: 'application/x-jsp', mode: 'htmlembedded'},
{name: 'HTML', mime: 'text/html', mode: 'htmlmixed'}, {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: 'JavaScript', mime: 'text/javascript', mode: 'javascript'}, {name: 'JavaScript', mime: 'text/javascript', mode: 'javascript'},
{name: 'JSON', mime: 'application/x-json', mode: 'javascript'}, {name: 'JSON', mime: 'application/x-json', mode: 'javascript'},
{name: 'JSON', mime: 'application/json', mode: 'javascript'}, {name: 'JSON', mime: 'application/json', mode: 'javascript'},
@@ -36,16 +40,19 @@ CodeMirror.modeInfo = [
{name: 'Lua', mime: 'text/x-lua', mode: 'lua'}, {name: 'Lua', mime: 'text/x-lua', mode: 'lua'},
{name: 'Markdown (GitHub-flavour)', mime: 'text/x-markdown', mode: 'markdown'}, {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: 'Nginx', mime: 'text/x-nginx-conf', mode: 'nginx'},
{name: 'NTriples', mime: 'text/n-triples', mode: 'ntriples'}, {name: 'NTriples', mime: 'text/n-triples', mode: 'ntriples'},
{name: 'OCaml', mime: 'text/x-ocaml', mode: 'ocaml'}, {name: 'OCaml', mime: 'text/x-ocaml', mode: 'ocaml'},
{name: 'Octave', mime: 'text/x-octave', mode: 'octave'},
{name: 'Pascal', mime: 'text/x-pascal', mode: 'pascal'}, {name: 'Pascal', mime: 'text/x-pascal', mode: 'pascal'},
{name: 'Perl', mime: 'text/x-perl', mode: 'perl'}, {name: 'Perl', mime: 'text/x-perl', mode: 'perl'},
{name: 'PHP', mime: 'text/x-php', mode: 'php'}, {name: 'PHP', mime: 'text/x-php', mode: 'php'},
{name: 'PHP(HTML)', mime: 'application/x-httpd-php', mode: 'php'}, {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'},
{name: 'Properties files', mime: 'text/x-properties', mode: 'clike'}, {name: 'Properties files', mime: 'text/x-properties', mode: 'properties'},
{name: 'Python', mime: 'text/x-python', mode: 'python'}, {name: 'Python', mime: 'text/x-python', mode: 'python'},
{name: 'Cython', mime: 'text/x-cython', mode: 'python'},
{name: 'R', mime: 'text/x-rsrc', mode: 'r'}, {name: 'R', mime: 'text/x-rsrc', mode: 'r'},
{name: 'reStructuredText', mime: 'text/x-rst', mode: 'rst'}, {name: 'reStructuredText', mime: 'text/x-rst', mode: 'rst'},
{name: 'Ruby', mime: 'text/x-ruby', mode: 'ruby'}, {name: 'Ruby', mime: 'text/x-ruby', mode: 'ruby'},
@@ -57,6 +64,7 @@ CodeMirror.modeInfo = [
{name: 'Sieve', mime: 'application/sieve', mode: 'sieve'}, {name: 'Sieve', mime: 'application/sieve', mode: 'sieve'},
{name: 'Smalltalk', mime: 'text/x-stsrc', mode: 'smalltalk'}, {name: 'Smalltalk', mime: 'text/x-stsrc', mode: 'smalltalk'},
{name: 'Smarty', mime: 'text/x-smarty', mode: 'smarty'}, {name: 'Smarty', mime: 'text/x-smarty', mode: 'smarty'},
{name: 'SmartyMixed', mime: 'text/x-smarty', mode: 'smartymixed'},
{name: 'SPARQL', mime: 'application/x-sparql-query', mode: 'sparql'}, {name: 'SPARQL', mime: 'application/x-sparql-query', mode: 'sparql'},
{name: 'SQL', mime: 'text/x-sql', mode: 'sql'}, {name: 'SQL', mime: 'text/x-sql', mode: 'sql'},
{name: 'MariaDB', mime: 'text/x-mariadb', mode: 'sql'}, {name: 'MariaDB', mime: 'text/x-mariadb', mode: 'sql'},
@@ -65,6 +73,8 @@ CodeMirror.modeInfo = [
{name: 'Tcl', mime: 'text/x-tcl', mode: 'tcl'}, {name: 'Tcl', mime: 'text/x-tcl', mode: 'tcl'},
{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: 'Turtle', mime: 'text/turtle', mode: 'turtle'},
{name: 'VB.NET', mime: 'text/x-vb', mode: 'vb'}, {name: 'VB.NET', mime: 'text/x-vb', mode: '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'},
+28 -16
View File
@@ -1,18 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: mIRC mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: mIRC mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="mirc.js"></script> <link rel="stylesheet" href="../../theme/twilight.css">
<link rel="stylesheet" href="../../theme/twilight.css"> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {border: 1px solid black;}</style> <script src="mirc.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {border: 1px solid black;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: mIRC mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">mIRC</a>
</ul>
</div>
<article>
<h2>mIRC mode</h2>
<form><textarea id="code" name="code">
;AKA Nick Tracker by Ford_Lawnmower irc.GeekShed.net #Script-Help ;AKA Nick Tracker by Ford_Lawnmower irc.GeekShed.net #Script-Help
;*****************************************************************************; ;*****************************************************************************;
;**Start Setup ;**Start Setup
@@ -145,5 +158,4 @@ Raw 315:*: {
<p><strong>MIME types defined:</strong> <code>text/mirc</code>.</p> <p><strong>MIME types defined:</strong> <code>text/mirc</code>.</p>
</body> </article>
</html>
+27 -15
View File
@@ -1,20 +1,33 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: NTriples mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: NTriples mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="ntriples.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <script src="ntriples.js"></script>
<style type="text/css"> <style type="text/css">
.CodeMirror { .CodeMirror {
border: 1px solid #eee; border: 1px solid #eee;
} }
</style> </style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: NTriples mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">NTriples</a>
</ul>
</div>
<article>
<h2>NTriples mode</h2>
<form> <form>
<textarea id="ntriples" name="ntriples"> <textarea id="ntriples" name="ntriples">
<http://Sub1> <http://pred1> <http://obj> . <http://Sub1> <http://pred1> <http://obj> .
@@ -29,5 +42,4 @@ _:bnode5 <http://pred5> "literal 3"^^<http://type> .
var editor = CodeMirror.fromTextArea(document.getElementById("ntriples"), {}); var editor = CodeMirror.fromTextArea(document.getElementById("ntriples"), {});
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/n-triples</code>.</p> <p><strong>MIME types defined:</strong> <code>text/n-triples</code>.</p>
</body> </article>
</html>
+23 -8
View File
@@ -1,19 +1,33 @@
<!doctype html> <!doctype html>
<meta charset=utf-8>
<title>CodeMirror: OCaml mode</title> <title>CodeMirror: OCaml mode</title>
<meta charset="utf-8"/>
<link rel=stylesheet href="../../doc/docs.css">
<link rel=stylesheet href=../../lib/codemirror.css> <link rel=stylesheet href=../../lib/codemirror.css>
<link rel=stylesheet href=../../doc/docs.css>
<style type=text/css>
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<script src=../../lib/codemirror.js></script> <script src=../../lib/codemirror.js></script>
<script src=../../addon/edit/matchbrackets.js></script> <script src=../../addon/edit/matchbrackets.js></script>
<script src=ocaml.js></script> <script src=ocaml.js></script>
<style type=text/css>
.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">OCaml</a>
</ul>
</div>
<article>
<h2>OCaml mode</h2>
<h1>CodeMirror: OCaml mode</h1>
<textarea id=code> <textarea id=code>
(* Summing a list of integers *) (* Summing a list of integers *)
@@ -129,3 +143,4 @@ let () =
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-ocaml</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-ocaml</code>.</p>
</article>
@@ -1,7 +0,0 @@
Copyright (c) 2011 souceLair <support@sourcelair.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+27 -14
View File
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Pascal mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Pascal mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="pascal.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Pascal mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Pascal</a>
</ul>
</div>
<article>
<h2>Pascal mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
(* Example Pascal code *) (* Example Pascal code *)
@@ -44,5 +58,4 @@ end;
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-pascal</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-pascal</code>.</p>
</body> </article>
</html>
-19
View File
@@ -1,19 +0,0 @@
Copyright (C) 2011 by Sabaca <mail@sabaca.com> under the MIT license.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+27 -14
View File
@@ -1,16 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Perl mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Perl mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="perl.js"></script> <script src="../../lib/codemirror.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Perl mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Perl</a>
</ul>
</div>
<article>
<h2>Perl mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
#!/usr/bin/perl #!/usr/bin/perl
@@ -58,5 +72,4 @@ something...
</script> </script>
<p><strong>MIME types defined:</strong> <code>text/x-perl</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-perl</code>.</p>
</body> </article>
</html>
+31 -20
View File
@@ -1,23 +1,35 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: PHP mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../addon/edit/matchbrackets.js"></script>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../clike/clike.js"></script>
<script src="php.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<link rel="stylesheet" href="../../doc/docs.css">
</head>
<body>
<h1>CodeMirror: PHP mode</h1>
<title>CodeMirror: PHP 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>
<script src="../htmlmixed/htmlmixed.js"></script>
<script src="../xml/xml.js"></script>
<script src="../javascript/javascript.js"></script>
<script src="../css/css.js"></script>
<script src="../clike/clike.js"></script>
<script src="php.js"></script>
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">PHP</a>
</ul>
</div>
<article>
<h2>PHP mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
<?php <?php
function hello($who) { function hello($who) {
@@ -47,5 +59,4 @@ function hello($who) {
JavaScript, CSS, HTMLMixed, and C-like modes.</p> JavaScript, CSS, HTMLMixed, and C-like modes.</p>
<p><strong>MIME types defined:</strong> <code>application/x-httpd-php</code> (HTML with PHP code), <code>text/x-php</code> (plain, non-wrapped PHP code).</p> <p><strong>MIME types defined:</strong> <code>application/x-httpd-php</code> (HTML with PHP code), <code>text/x-php</code> (plain, non-wrapped PHP code).</p>
</body> </article>
</html>
+25 -12
View File
@@ -1,17 +1,29 @@
<!doctype html> <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Pig Latin mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="pig.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<style>.CodeMirror {border: 2px inset #dee;}</style>
</head>
<body>
<h1>CodeMirror: Pig Latin mode</h1>
<title>CodeMirror: Pig Latin 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="pig.js"></script>
<style>.CodeMirror {border: 2px inset #dee;}</style>
<div id=nav>
<a href="http://codemirror.net"><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/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Pig Latin</a>
</ul>
</div>
<article>
<h2>Pig Latin mode</h2>
<form><textarea id="code" name="code"> <form><textarea id="code" name="code">
-- Apache Pig (Pig Latin Language) Demo -- Apache Pig (Pig Latin Language) Demo
/* /*
@@ -40,3 +52,4 @@ STORE c INTO "\path\to\output";
<p><strong>MIME type defined:</strong> <code>text/x-pig</code> <p><strong>MIME type defined:</strong> <code>text/x-pig</code>
(PIG code) (PIG code)
</html> </html>
</article>
@@ -1,17 +1,30 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Properties files mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Properties files mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="properties.js"></script> <script src="../../lib/codemirror.js"></script>
<style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style> <script src="properties.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Properties files mode</h1>
<form><textarea id="code" name="code"> <ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Properties files</a>
</ul>
</div>
<article>
<h2>Properties files mode</h2>
<form><textarea id="code" name="code">
# This is a properties file # This is a properties file
a.key = A value a.key = A value
another.key = http://example.com another.key = http://example.com
@@ -37,5 +50,4 @@ spaces\ in\ keys=Not very common...
<p><strong>MIME types defined:</strong> <code>text/x-properties</code>, <p><strong>MIME types defined:</strong> <code>text/x-properties</code>,
<code>text/x-ini</code>.</p> <code>text/x-ini</code>.</p>
</body> </article>
</html>
@@ -1,21 +0,0 @@
The MIT License
Copyright (c) 2010 Timothy Farrell
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+70 -18
View File
@@ -1,18 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Python mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Python mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="python.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Python mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Python</a>
</ul>
</div>
<article>
<h2>Python mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
# Literals # Literals
1234 1234
@@ -102,6 +115,34 @@ class ExampleClass(ParentClass):
self.mixin = mixin self.mixin = mixin
</textarea></div> </textarea></div>
<h2>Cython mode</h2>
<div><textarea id="code-cython" name="code-cython">
import numpy as np
cimport cython
from libc.math cimport sqrt
@cython.boundscheck(False)
@cython.wraparound(False)
def pairwise_cython(double[:, ::1] X):
cdef int M = X.shape[0]
cdef int N = X.shape[1]
cdef double tmp, d
cdef double[:, ::1] D = np.empty((M, M), dtype=np.float64)
for i in range(M):
for j in range(M):
d = 0.0
for k in range(N):
tmp = X[i, k] - X[j, k]
d += tmp * tmp
D[i, j] = sqrt(d)
return np.asarray(D)
</textarea></div>
<script> <script>
var editor = CodeMirror.fromTextArea(document.getElementById("code"), { var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
mode: {name: "python", mode: {name: "python",
@@ -111,9 +152,19 @@ class ExampleClass(ParentClass):
indentUnit: 4, indentUnit: 4,
tabMode: "shift", tabMode: "shift",
matchBrackets: true matchBrackets: true
});
CodeMirror.fromTextArea(document.getElementById("code-cython"), {
mode: {name: "text/x-cython",
version: 2,
singleLineStringErrors: false},
lineNumbers: true,
indentUnit: 4,
tabMode: "shift",
matchBrackets: true
}); });
</script> </script>
<h2>Configuration Options:</h2> <h2>Configuration Options for Python mode:</h2>
<ul> <ul>
<li>version - 2/3 - The version of Python to recognize. Default is 2.</li> <li>version - 2/3 - The version of Python to recognize. Default is 2.</li>
<li>singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.</li> <li>singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.</li>
@@ -127,9 +178,10 @@ class ExampleClass(ParentClass):
<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></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>
</ul> </ul>
<p><strong>MIME types defined:</strong> <code>text/x-python</code>.</p> <p><strong>MIME types defined:</strong> <code>text/x-python</code> and <code>text/x-cython</code>.</p>
</body> </article>
</html>
+33 -6
View File
@@ -36,6 +36,12 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
var py3 = {'builtins': ['ascii', 'bytes', 'exec', 'print'], var py3 = {'builtins': ['ascii', 'bytes', 'exec', 'print'],
'keywords': ['nonlocal', 'False', 'True', 'None']}; 'keywords': ['nonlocal', 'False', 'True', 'None']};
if(parserConf.extra_keywords != undefined){
commonkeywords = commonkeywords.concat(parserConf.extra_keywords);
}
if(parserConf.extra_builtins != undefined){
commonBuiltins = commonBuiltins.concat(parserConf.extra_builtins);
}
if (!!parserConf.version && parseInt(parserConf.version, 10) === 3) { if (!!parserConf.version && parseInt(parserConf.version, 10) === 3) {
commonkeywords = commonkeywords.concat(py3.keywords); commonkeywords = commonkeywords.concat(py3.keywords);
commonBuiltins = commonBuiltins.concat(py3.builtins); commonBuiltins = commonBuiltins.concat(py3.builtins);
@@ -145,6 +151,9 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
} }
if (stream.match(identifiers)) { if (stream.match(identifiers)) {
if (state.lastToken == 'def' || state.lastToken == 'class') {
return 'def';
}
return 'variable'; return 'variable';
} }
@@ -252,7 +261,7 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
// Handle '.' connected identifiers // Handle '.' connected identifiers
if (current === '.') { if (current === '.') {
style = stream.match(identifiers, false) ? null : ERRORCLASS; style = stream.match(identifiers, false) ? null : ERRORCLASS;
if (style === null && state.lastToken === 'meta') { if (style === null && state.lastStyle === 'meta') {
// Apply 'meta' style to '.' connected identifiers when // Apply 'meta' style to '.' connected identifiers when
// appropriate. // appropriate.
style = 'meta'; style = 'meta';
@@ -266,7 +275,7 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
} }
if ((style === 'variable' || style === 'builtin') if ((style === 'variable' || style === 'builtin')
&& state.lastToken === 'meta') { && state.lastStyle === 'meta') {
style = 'meta'; style = 'meta';
} }
@@ -307,6 +316,7 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
return { return {
tokenize: tokenBase, tokenize: tokenBase,
scopes: [{offset:basecolumn || 0, type:'py'}], scopes: [{offset:basecolumn || 0, type:'py'}],
lastStyle: null,
lastToken: null, lastToken: null,
lambda: false, lambda: false,
dedent: 0 dedent: 0
@@ -316,12 +326,16 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
token: function(stream, state) { token: function(stream, state) {
var style = tokenLexer(stream, state); var style = tokenLexer(stream, state);
state.lastToken = style; state.lastStyle = style;
if (stream.eol() && stream.lambda) { var current = stream.current();
state.lambda = false; if (current && style) {
state.lastToken = current;
} }
if (stream.eol() && state.lambda) {
state.lambda = false;
}
return style; return style;
}, },
@@ -333,9 +347,22 @@ CodeMirror.defineMode("python", function(conf, parserConf) {
return state.scopes[0].offset; return state.scopes[0].offset;
}, },
lineComment: "#" lineComment: "#",
fold: "indent"
}; };
return external; return external;
}); });
CodeMirror.defineMIME("text/x-python", "python"); CodeMirror.defineMIME("text/x-python", "python");
(function() {
"use strict";
var words = function(str){return str.split(' ');};
CodeMirror.defineMIME("text/x-cython", {
name: "python",
extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+
"extern gil include nogil property public"+
"readonly struct union DEF IF ELIF ELSE")
});
})();
+28 -15
View File
@@ -1,17 +1,31 @@
<!doctype html> <!doctype html>
<html>
<head> <title>CodeMirror: Q mode</title>
<meta charset="utf-8"> <meta charset="utf-8"/>
<title>CodeMirror: Q mode</title> <link rel=stylesheet href="../../doc/docs.css">
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script> <link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../addon/edit/matchbrackets.js"></script> <script src="../../lib/codemirror.js"></script>
<script src="q.js"></script> <script src="../../addon/edit/matchbrackets.js"></script>
<link rel="stylesheet" href="../../doc/docs.css"> <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>
</head> <div id=nav>
<body> <a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
<h1>CodeMirror: Q mode</h1>
<ul>
<li><a href="../../index.html">Home</a>
<li><a href="../../doc/manual.html">Manual</a>
<li><a href="https://github.com/marijnh/codemirror">Code</a>
</ul>
<ul>
<li><a href="../index.html">Language modes</a>
<li><a class=active href="#">Q</a>
</ul>
</div>
<article>
<h2>Q mode</h2>
<div><textarea id="code" name="code"> <div><textarea id="code" name="code">
/ utilities to quickly load a csv file - for more exhaustive analysis of the csv contents see csvguess.q / utilities to quickly load a csv file - for more exhaustive analysis of the csv contents see csvguess.q
@@ -127,5 +141,4 @@ bulkload:{[file;info]
</script> </script>
<p><strong>MIME type defined:</strong> <code>text/x-q</code>.</p> <p><strong>MIME type defined:</strong> <code>text/x-q</code>.</p>
</body> </article>
</html>
-24
View File
@@ -1,24 +0,0 @@
Copyright (c) 2011, Ubalo, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Ubalo, Inc nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL UBALO, INC BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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