in public/src/autocomplete.js [97:192]
function applyTerm(term) {
var session = editor.getSession();
var context = term.context;
// make sure we get up to date replacement info.
addReplacementInfoToContext(context, editor.getCursorPosition(), term.insert_value);
var termAsString;
if (context.autoCompleteType == "body") {
termAsString = typeof term.insert_value == "string" ? '"' + term.insert_value + '"' : term.insert_value + "";
if (term.insert_value === "[" || term.insert_value === "{") {
termAsString = "";
}
}
else {
termAsString = term.insert_value + "";
}
var valueToInsert = termAsString;
var templateInserted = false;
if (context.addTemplate && !_.isUndefined(term.template) && !_.isNull(term.template)) {
var indentedTemplateLines = utils.jsonToString(term.template, true).split("\n");
var currentIndentation = session.getLine(context.rangeToReplace.start.row);
currentIndentation = currentIndentation.match(/^\s*/)[0];
for (var i = 1; i < indentedTemplateLines.length; i++) // skip first line
indentedTemplateLines[i] = currentIndentation + indentedTemplateLines[i];
valueToInsert += ": " + indentedTemplateLines.join("\n");
templateInserted = true;
}
else {
templateInserted = true;
if (term.value === "[") {
valueToInsert += "[]";
}
else if (term.value == "{") {
valueToInsert += "{}";
}
else {
templateInserted = false;
}
}
valueToInsert = context.prefixToAdd + valueToInsert + context.suffixToAdd;
// disable listening to the changes we are making.
removeChangeListener();
if (context.rangeToReplace.start.column != context.rangeToReplace.end.column) {
session.replace(context.rangeToReplace, valueToInsert);
}
else {
editor.insert(valueToInsert);
}
editor.clearSelection(); // for some reason the above changes selection
// go back to see whether we have one of ( : { & [ do not require a comma. All the rest do.
var newPos = {
row: context.rangeToReplace.start.row,
column: context.rangeToReplace.start.column + termAsString.length + context.prefixToAdd.length
+ (templateInserted ? 0 : context.suffixToAdd.length)
};
var tokenIter = editor.iterForPosition(newPos.row, newPos.column);
if (context.autoCompleteType === "body") {
// look for the next place stand, just after a comma, {
var nonEmptyToken = editor.parser.nextNonEmptyToken(tokenIter);
switch (nonEmptyToken ? nonEmptyToken.type : "NOTOKEN") {
case "paren.rparen":
newPos = {row: tokenIter.getCurrentTokenRow(), column: tokenIter.getCurrentTokenColumn()};
break;
case "punctuation.colon":
nonEmptyToken = editor.parser.nextNonEmptyToken(tokenIter);
if ((nonEmptyToken || {}).type == "paren.lparen") {
nonEmptyToken = editor.parser.nextNonEmptyToken(tokenIter);
newPos = {row: tokenIter.getCurrentTokenRow(), column: tokenIter.getCurrentTokenColumn()};
if (nonEmptyToken && nonEmptyToken.value.indexOf('"') === 0) {
newPos.column++;
} // don't stand on "
}
break;
case "paren.lparen":
case "punctuation.comma":
tokenIter.stepForward();
newPos = {row: tokenIter.getCurrentTokenRow(), column: tokenIter.getCurrentTokenColumn()};
break;
}
editor.moveCursorToPosition(newPos);
}
// re-enable listening to typing
addChangeListener();
}