Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Customize the CodeMirror Tern text to manage 'this' for Mongo Map case.
- Loading branch information
1 parent
1b5910a
commit 508b202
Showing
8 changed files
with
5,710 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
(function() { | ||
|
||
CodeMirror.extendMode("css", { | ||
commentStart: "/*", | ||
commentEnd: "*/", | ||
newlineAfterToken: function(_type, content) { | ||
return /^[;{}]$/.test(content); | ||
} | ||
}); | ||
|
||
CodeMirror.extendMode("javascript", { | ||
commentStart: "/*", | ||
commentEnd: "*/", | ||
// FIXME semicolons inside of for | ||
newlineAfterToken: function(_type, content, textAfter, state) { | ||
if (this.jsonMode) { | ||
return /^[\[,{]$/.test(content) || /^}/.test(textAfter); | ||
} else { | ||
if (content == ";" && state.lexical && state.lexical.type == ")") return false; | ||
return /^[;{}]$/.test(content) && !/^;/.test(textAfter); | ||
} | ||
} | ||
}); | ||
|
||
var inlineElements = /^(a|abbr|acronym|area|base|bdo|big|br|button|caption|cite|code|col|colgroup|dd|del|dfn|em|frame|hr|iframe|img|input|ins|kbd|label|legend|link|map|object|optgroup|option|param|q|samp|script|select|small|span|strong|sub|sup|textarea|tt|var)$/; | ||
|
||
CodeMirror.extendMode("xml", { | ||
commentStart: "<!--", | ||
commentEnd: "-->", | ||
newlineAfterToken: function(type, content, textAfter, state) { | ||
var inline = false; | ||
if (this.configuration == "html") | ||
inline = state.context ? inlineElements.test(state.context.tagName) : false; | ||
return !inline && ((type == "tag" && />$/.test(content) && state.context) || | ||
/^</.test(textAfter)); | ||
} | ||
}); | ||
|
||
// Comment/uncomment the specified range | ||
CodeMirror.defineExtension("commentRange", function (isComment, from, to) { | ||
var cm = this, curMode = CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(from).state).mode; | ||
cm.operation(function() { | ||
if (isComment) { // Comment range | ||
cm.replaceRange(curMode.commentEnd, to); | ||
cm.replaceRange(curMode.commentStart, from); | ||
if (from.line == to.line && from.ch == to.ch) // An empty comment inserted - put cursor inside | ||
cm.setCursor(from.line, from.ch + curMode.commentStart.length); | ||
} else { // Uncomment range | ||
var selText = cm.getRange(from, to); | ||
var startIndex = selText.indexOf(curMode.commentStart); | ||
var endIndex = selText.lastIndexOf(curMode.commentEnd); | ||
if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) { | ||
// Take string till comment start | ||
selText = selText.substr(0, startIndex) | ||
// From comment start till comment end | ||
+ selText.substring(startIndex + curMode.commentStart.length, endIndex) | ||
// From comment end till string end | ||
+ selText.substr(endIndex + curMode.commentEnd.length); | ||
} | ||
cm.replaceRange(selText, from, to); | ||
} | ||
}); | ||
}); | ||
|
||
// Applies automatic mode-aware indentation to the specified range | ||
CodeMirror.defineExtension("autoIndentRange", function (from, to) { | ||
var cmInstance = this; | ||
this.operation(function () { | ||
for (var i = from.line; i <= to.line; i++) { | ||
cmInstance.indentLine(i, "smart"); | ||
} | ||
}); | ||
}); | ||
|
||
// Applies automatic formatting to the specified range | ||
CodeMirror.defineExtension("autoFormatRange", function (from, to) { | ||
var cm = this; | ||
var outer = cm.getMode(), text = cm.getRange(from, to).split("\n"); | ||
var state = CodeMirror.copyState(outer, cm.getTokenAt(from).state); | ||
var tabSize = cm.getOption("tabSize"); | ||
|
||
var out = "", lines = 0, atSol = from.ch == 0; | ||
function newline() { | ||
out += "\n"; | ||
atSol = true; | ||
++lines; | ||
} | ||
|
||
for (var i = 0; i < text.length; ++i) { | ||
var stream = new CodeMirror.StringStream(text[i], tabSize); | ||
while (!stream.eol()) { | ||
var inner = CodeMirror.innerMode(outer, state); | ||
var style = outer.token(stream, state), cur = stream.current(); | ||
stream.start = stream.pos; | ||
if (!atSol || /\S/.test(cur)) { | ||
out += cur; | ||
atSol = false; | ||
} | ||
if (!atSol && inner.mode.newlineAfterToken && | ||
inner.mode.newlineAfterToken(style, cur, stream.string.slice(stream.pos) || text[i+1] || "", inner.state)) | ||
newline(); | ||
} | ||
if (!stream.pos && outer.blankLine) outer.blankLine(state); | ||
if (!atSol && i < text.length - 1) newline(); | ||
} | ||
|
||
cm.operation(function () { | ||
cm.replaceRange(out, from, to); | ||
for (var cur = from.line + 1, end = from.line + lines; cur <= end; ++cur) | ||
cm.indentLine(cur, "smart"); | ||
cm.setSelection(from, cm.getCursor(false)); | ||
}); | ||
}); | ||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.