function _handleSnippet(props) { var editor = EditorManager.getCurrentFullEditor(); var document = DocumentManager.getCurrentDocument(); var pos = editor.getCursorPos(); var line = document.getLine(pos.line); if (!props) { props = $.trim(line).split(" "); } //we don't need to see the trigger text CommandManager.execute(Commands.EDIT_DELETE_LINES); function completeInsert(editor, pos, output) { var s, x, cursorPos, lines = output.split("\n"); //figure out cursor pos, remove cursor marker for (s = 0; s < lines.length; s++) { if (lines[s].indexOf('!!{cursor}') >= 0) { cursorPos = s; output = output.replace('!!{cursor}', ''); break; } } //do insertion document.replaceRange(output + "\n", {line: pos.line, ch: 0}, {line: pos.line, ch: 0}); //set curosr if (cursorPos) { editor._codeMirror.setCursor(pos.line + cursorPos, pos.ch); } //indent lines for (x = 0; x < lines.length; x++) { editor._codeMirror.indentLine(pos.line + x); } //give focus back EditorManager.focusEditor(); } function startInsert(output) { //find variables var tmp = output.match(/\$\$\{[0-9A-Z_a-z]{1,32}\}/g); //remove duplicate variables var snippetVariables = [], j; if (tmp && tmp.length > 0) { for (j = 0; j < tmp.length; j++) { if ($.inArray(tmp[j], snippetVariables) === -1) { snippetVariables.push(tmp[j]); } } } //if the same number of variables if (props.length - 1 >= snippetVariables.length) { var x; for (x = 0; x < snippetVariables.length; x++) { //even my escapes have escapes var re = new RegExp(snippetVariables[x].replace('$${', '\\$\\$\\{').replace('}', '\\}'), 'g'); output = output.replace(re, props[x + 1]); } completeInsert(editor, pos, output); } else { var snippetPromise, result = new $.Deferred(); snippetPromise = inlineSnippetFormProvider(editor, snippetVariables, output); snippetPromise.done(function (inlineWidget) { var newPos = {line: pos.line - 1, ch: pos.ch}; editor.addInlineWidget(newPos, inlineWidget); var inlineComplete = function () { var z; for (z = 0; z < snippetVariables.length; z++) { //even my escapes have escapes var re = new RegExp(snippetVariables[z].replace('$${', '\\$\\$\\{').replace('}', '\\}'), 'g'); output = output.replace(re, inlineWidget.$form.find('.snipvar-' + snippetVariables[z].replace('$${', '').replace('}', '')).val()); } completeInsert(editor, pos, output); }; inlineWidget.$form.on('complete', function () { inlineComplete(); inlineWidget.close(); }); }).fail(function () { result.reject(); console.log("Can't create inline snippet form"); }); } } function readSnippetFromFile(fieName) { var snippetFile = new NativeFileSystem.FileEntry(directory + '/snippets/' + fieName); FileUtils.readAsText(snippetFile) .done(function (text, readTimestamp) { startInsert(SnippetPresets.execute(text)); }).fail(function (error) { FileUtils.showFileOpenError(error.code, snippetFile); }); } if (props.length) { //try to find the snippet, given the trigger text var i; for (i = 0; i < snippets.length; i++) { if (snippets[i].trigger === props[0]) { var output = snippets[i].template; if (output.indexOf('.snippet') === output.length - 8) { readSnippetFromFile(output); } else { startInsert(SnippetPresets.execute(output)); } break; } } } }
.done(function (text, readTimestamp) { startInsert(SnippetPresets.execute(text)); }).fail(function (error) {