summaryrefslogtreecommitdiffstats
path: root/devtools/shared/gcli/source/lib/gcli/languages/languages.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/gcli/source/lib/gcli/languages/languages.js')
-rw-r--r--devtools/shared/gcli/source/lib/gcli/languages/languages.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/devtools/shared/gcli/source/lib/gcli/languages/languages.js b/devtools/shared/gcli/source/lib/gcli/languages/languages.js
new file mode 100644
index 000000000..3444c9a8f
--- /dev/null
+++ b/devtools/shared/gcli/source/lib/gcli/languages/languages.js
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2012, Mozilla Foundation and contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+var util = require('../util/util');
+
+var RESOLVED = Promise.resolve(true);
+
+/**
+ * This is the base implementation for all languages
+ */
+var baseLanguage = {
+ item: 'language',
+ name: undefined,
+
+ constructor: function(terminal) {
+ },
+
+ destroy: function() {
+ },
+
+ updateHints: function() {
+ util.clearElement(this.terminal.tooltipElement);
+ },
+
+ description: '',
+ message: '',
+ caretMoved: function() {},
+
+ handleUpArrow: function() {
+ return Promise.resolve(false);
+ },
+
+ handleDownArrow: function() {
+ return Promise.resolve(false);
+ },
+
+ handleTab: function() {
+ return this.terminal.unsetChoice().then(function() {
+ return RESOLVED;
+ }, util.errorHandler);
+ },
+
+ handleInput: function(input) {
+ if (input === ':') {
+ return this.terminal.setInput('').then(function() {
+ return this.terminal.pushLanguage('commands');
+ }.bind(this));
+ }
+
+ return this.terminal.unsetChoice().then(function() {
+ return RESOLVED;
+ }, util.errorHandler);
+ },
+
+ handleReturn: function(input) {
+ var rowoutEle = this.document.createElement('pre');
+ rowoutEle.classList.add('gcli-row-out');
+ rowoutEle.classList.add('gcli-row-script');
+ rowoutEle.setAttribute('aria-live', 'assertive');
+
+ return this.exec(input).then(function(line) {
+ rowoutEle.innerHTML = line;
+
+ this.terminal.addElement(rowoutEle);
+ this.terminal.scrollToBottom();
+
+ this.focusManager.outputted();
+
+ this.terminal.unsetChoice().catch(util.errorHandler);
+ this.terminal.inputElement.value = '';
+ }.bind(this));
+ },
+
+ setCursor: function(cursor) {
+ this.terminal.inputElement.selectionStart = cursor.start;
+ this.terminal.inputElement.selectionEnd = cursor.end;
+ },
+
+ getCompleterTemplateData: function() {
+ return Promise.resolve({
+ statusMarkup: [
+ {
+ string: this.terminal.inputElement.value.replace(/ /g, '\u00a0'), // i.e.  
+ className: 'gcli-in-valid'
+ }
+ ],
+ unclosedJs: false,
+ directTabText: '',
+ arrowTabText: '',
+ emptyParameters: ''
+ });
+ },
+
+ showIntro: function() {
+ },
+
+ exec: function(input) {
+ throw new Error('Missing implementation of handleReturn() or exec() ' + this.name);
+ }
+};
+
+/**
+ * A manager for the registered Languages
+ */
+function Languages() {
+ // This is where we cache the languages that we know about
+ this._registered = {};
+}
+
+/**
+ * Add a new language to the cache
+ */
+Languages.prototype.add = function(language) {
+ this._registered[language.name] = language;
+};
+
+/**
+ * Remove an existing language from the cache
+ */
+Languages.prototype.remove = function(language) {
+ var name = typeof language === 'string' ? language : language.name;
+ delete this._registered[name];
+};
+
+/**
+ * Get access to the list of known languages
+ */
+Languages.prototype.getAll = function() {
+ return Object.keys(this._registered).map(function(name) {
+ return this._registered[name];
+ }.bind(this));
+};
+
+/**
+ * Find a previously registered language
+ */
+Languages.prototype.createLanguage = function(name, terminal) {
+ if (name == null) {
+ name = Object.keys(this._registered)[0];
+ }
+
+ var language = (typeof name === 'string') ? this._registered[name] : name;
+ if (!language) {
+ console.error('Known languages: ' + Object.keys(this._registered).join(', '));
+ throw new Error('Unknown language: \'' + name + '\'');
+ }
+
+ // clone 'type'
+ var newInstance = {};
+ util.copyProperties(baseLanguage, newInstance);
+ util.copyProperties(language, newInstance);
+
+ if (typeof newInstance.constructor === 'function') {
+ var reply = newInstance.constructor(terminal);
+ return Promise.resolve(reply).then(function() {
+ return newInstance;
+ });
+ }
+ else {
+ return Promise.resolve(newInstance);
+ }
+};
+
+exports.Languages = Languages;