mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-02 17:22:28 -05:00
129 lines
4.8 KiB
JavaScript
129 lines
4.8 KiB
JavaScript
|
/* ***** BEGIN LICENSE BLOCK *****
|
||
|
* Distributed under the BSD license:
|
||
|
*
|
||
|
* Copyright (c) 2012, Ajax.org B.V.
|
||
|
* 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 Ajax.org B.V. 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 AJAX.ORG B.V. 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.
|
||
|
*
|
||
|
* ***** END LICENSE BLOCK ***** */
|
||
|
|
||
|
define(function(require, exports, module) {
|
||
|
"use strict";
|
||
|
|
||
|
var snippetManager = require("../snippets").snippetManager;
|
||
|
var Autocomplete = require("../autocomplete").Autocomplete;
|
||
|
var config = require("../config");
|
||
|
|
||
|
var textCompleter = require("../autocomplete/text_completer");
|
||
|
var keyWordCompleter = {
|
||
|
getCompletions: function(editor, session, pos, prefix, callback) {
|
||
|
var state = editor.session.getState(pos.row);
|
||
|
var completions = session.$mode.getCompletions(state, session, pos, prefix);
|
||
|
callback(null, completions);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var snippetCompleter = {
|
||
|
getCompletions: function(editor, session, pos, prefix, callback) {
|
||
|
var scope = snippetManager.$getScope(editor);
|
||
|
var snippetMap = snippetManager.snippetMap;
|
||
|
var completions = [];
|
||
|
[scope, "_"].forEach(function(scope) {
|
||
|
var snippets = snippetMap[scope] || [];
|
||
|
for (var i = snippets.length; i--;) {
|
||
|
var s = snippets[i];
|
||
|
var caption = s.name || s.tabTrigger;
|
||
|
if (!caption)
|
||
|
continue;
|
||
|
completions.push({
|
||
|
caption: caption,
|
||
|
snippet: s.content,
|
||
|
meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet"
|
||
|
});
|
||
|
}
|
||
|
}, this);
|
||
|
callback(null, completions);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var completers = [snippetCompleter, textCompleter, keyWordCompleter];
|
||
|
exports.addCompleter = function(completer) {
|
||
|
completers.push(completer);
|
||
|
};
|
||
|
|
||
|
var expandSnippet = {
|
||
|
name: "expandSnippet",
|
||
|
exec: function(editor) {
|
||
|
var success = snippetManager.expandWithTab(editor);
|
||
|
if (!success)
|
||
|
editor.execCommand("indent");
|
||
|
},
|
||
|
bindKey: "tab"
|
||
|
}
|
||
|
|
||
|
var onChangeMode = function(e, editor) {
|
||
|
var mode = editor.session.$mode;
|
||
|
var id = mode.$id
|
||
|
if (!snippetManager.files) snippetManager.files = {};
|
||
|
if (id && !snippetManager.files[id]) {
|
||
|
var snippetFilePath = id.replace("mode", "snippets");
|
||
|
config.loadModule(snippetFilePath, function(m) {
|
||
|
if (m) {
|
||
|
snippetManager.files[id] = m;
|
||
|
m.snippets = snippetManager.parseSnippetFile(m.snippetText);
|
||
|
snippetManager.register(m.snippets, m.scope);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var Editor = require("../editor").Editor;
|
||
|
require("../config").defineOptions(Editor.prototype, "editor", {
|
||
|
enableBasicAutocompletion: {
|
||
|
set: function(val) {
|
||
|
if (val) {
|
||
|
this.completers = completers
|
||
|
this.commands.addCommand(Autocomplete.startCommand);
|
||
|
} else {
|
||
|
this.commands.removeCommand(Autocomplete.startCommand);
|
||
|
}
|
||
|
},
|
||
|
value: false
|
||
|
},
|
||
|
enableSnippets: {
|
||
|
set: function(val) {
|
||
|
if (val) {
|
||
|
this.commands.addCommand(expandSnippet);
|
||
|
this.on("changeMode", onChangeMode);
|
||
|
onChangeMode(null, this)
|
||
|
} else {
|
||
|
this.commands.removeCommand(expandSnippet);
|
||
|
this.off("changeMode", onChangeMode);
|
||
|
}
|
||
|
},
|
||
|
value: false
|
||
|
}
|
||
|
});
|
||
|
|
||
|
});
|