Spaces:
Running
Running
(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)); | |
}); | |
}); | |
})(); | |