mirror of
https://github.com/retspen/webvirtcloud
synced 2024-12-25 15:45:23 +00:00
Added buttons and actions on create page
This commit is contained in:
parent
be9487e42f
commit
00b4d751ad
6 changed files with 19683 additions and 3 deletions
|
@ -128,9 +128,9 @@ def create_instance(request, compute_id):
|
||||||
try:
|
try:
|
||||||
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
conn.create_instance(data['name'], data['memory'], data['vcpu'], data['host_model'],
|
||||||
uuid, volumes, data['networks'], data['virtio'], data['mac'])
|
uuid, volumes, data['networks'], data['virtio'], data['mac'])
|
||||||
create_instance = Instance(compute_id=host_id, name=data['name'], uuid=uuid)
|
create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid)
|
||||||
create_instance.save()
|
create_instance.save()
|
||||||
return HttpResponseRedirect(reverse('instance', args=[host_id, data['name']]))
|
return HttpResponseRedirect(reverse('instance', args=[compute_id, data['name']]))
|
||||||
except libvirtError as lib_err:
|
except libvirtError as lib_err:
|
||||||
if data['hdd_size']:
|
if data['hdd_size']:
|
||||||
conn.delete_volume(volumes.keys()[0])
|
conn.delete_volume(volumes.keys()[0])
|
||||||
|
|
|
@ -63,3 +63,19 @@ body {
|
||||||
.page-header {
|
.page-header {
|
||||||
margin: 5px 5px 20px 20px;
|
margin: 5px 5px 20px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#editor {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#xmlheight {
|
||||||
|
height: 364px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ace_editor {
|
||||||
|
height: 350px;
|
||||||
|
}
|
18204
static/js/ace.js
Executable file
18204
static/js/ace.js
Executable file
File diff suppressed because it is too large
Load diff
632
static/js/ext-textarea.js
Executable file
632
static/js/ext-textarea.js
Executable file
|
@ -0,0 +1,632 @@
|
||||||
|
ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.isDark = false;
|
||||||
|
exports.cssClass = "ace-tm";
|
||||||
|
exports.cssText = ".ace-tm .ace_gutter {\
|
||||||
|
background: #f0f0f0;\
|
||||||
|
color: #333;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_print-margin {\
|
||||||
|
width: 1px;\
|
||||||
|
background: #e8e8e8;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_fold {\
|
||||||
|
background-color: #6B72E6;\
|
||||||
|
}\
|
||||||
|
.ace-tm {\
|
||||||
|
background-color: #FFFFFF;\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_cursor {\
|
||||||
|
color: black;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_invisible {\
|
||||||
|
color: rgb(191, 191, 191);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_storage,\
|
||||||
|
.ace-tm .ace_keyword {\
|
||||||
|
color: blue;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_constant {\
|
||||||
|
color: rgb(197, 6, 11);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_constant.ace_buildin {\
|
||||||
|
color: rgb(88, 72, 246);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_constant.ace_language {\
|
||||||
|
color: rgb(88, 92, 246);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_constant.ace_library {\
|
||||||
|
color: rgb(6, 150, 14);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_invalid {\
|
||||||
|
background-color: rgba(255, 0, 0, 0.1);\
|
||||||
|
color: red;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_support.ace_function {\
|
||||||
|
color: rgb(60, 76, 114);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_support.ace_constant {\
|
||||||
|
color: rgb(6, 150, 14);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_support.ace_type,\
|
||||||
|
.ace-tm .ace_support.ace_class {\
|
||||||
|
color: rgb(109, 121, 222);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_keyword.ace_operator {\
|
||||||
|
color: rgb(104, 118, 135);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_string {\
|
||||||
|
color: rgb(3, 106, 7);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_comment {\
|
||||||
|
color: rgb(76, 136, 107);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_comment.ace_doc {\
|
||||||
|
color: rgb(0, 102, 255);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_comment.ace_doc.ace_tag {\
|
||||||
|
color: rgb(128, 159, 191);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_constant.ace_numeric {\
|
||||||
|
color: rgb(0, 0, 205);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_variable {\
|
||||||
|
color: rgb(49, 132, 149);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_xml-pe {\
|
||||||
|
color: rgb(104, 104, 91);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_entity.ace_name.ace_function {\
|
||||||
|
color: #0000A2;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_heading {\
|
||||||
|
color: rgb(12, 7, 255);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_list {\
|
||||||
|
color:rgb(185, 6, 144);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_meta.ace_tag {\
|
||||||
|
color:rgb(0, 22, 142);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_string.ace_regex {\
|
||||||
|
color: rgb(255, 0, 0)\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_selection {\
|
||||||
|
background: rgb(181, 213, 255);\
|
||||||
|
}\
|
||||||
|
.ace-tm.ace_multiselect .ace_selection.ace_start {\
|
||||||
|
box-shadow: 0 0 3px 0px white;\
|
||||||
|
border-radius: 2px;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_step {\
|
||||||
|
background: rgb(252, 255, 0);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_stack {\
|
||||||
|
background: rgb(164, 229, 101);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_bracket {\
|
||||||
|
margin: -1px 0 0 -1px;\
|
||||||
|
border: 1px solid rgb(192, 192, 192);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_active-line {\
|
||||||
|
background: rgba(0, 0, 0, 0.07);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_gutter-active-line {\
|
||||||
|
background-color : #dcdcdc;\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_marker-layer .ace_selected-word {\
|
||||||
|
background: rgb(250, 250, 255);\
|
||||||
|
border: 1px solid rgb(200, 200, 250);\
|
||||||
|
}\
|
||||||
|
.ace-tm .ace_indent-guide {\
|
||||||
|
background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
|
||||||
|
}\
|
||||||
|
";
|
||||||
|
|
||||||
|
var dom = require("../lib/dom");
|
||||||
|
dom.importCssString(exports.cssText, exports.cssClass);
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
require("./lib/fixoldbrowsers");
|
||||||
|
|
||||||
|
var dom = require("./lib/dom");
|
||||||
|
var event = require("./lib/event");
|
||||||
|
|
||||||
|
var Editor = require("./editor").Editor;
|
||||||
|
var EditSession = require("./edit_session").EditSession;
|
||||||
|
var UndoManager = require("./undomanager").UndoManager;
|
||||||
|
var Renderer = require("./virtual_renderer").VirtualRenderer;
|
||||||
|
require("./worker/worker_client");
|
||||||
|
require("./keyboard/hash_handler");
|
||||||
|
require("./placeholder");
|
||||||
|
require("./multi_select");
|
||||||
|
require("./mode/folding/fold_mode");
|
||||||
|
require("./theme/textmate");
|
||||||
|
require("./ext/error_marker");
|
||||||
|
|
||||||
|
exports.config = require("./config");
|
||||||
|
exports.require = require;
|
||||||
|
exports.edit = function(el) {
|
||||||
|
if (typeof(el) == "string") {
|
||||||
|
var _id = el;
|
||||||
|
el = document.getElementById(_id);
|
||||||
|
if (!el)
|
||||||
|
throw new Error("ace.edit can't find div #" + _id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (el && el.env && el.env.editor instanceof Editor)
|
||||||
|
return el.env.editor;
|
||||||
|
|
||||||
|
var value = "";
|
||||||
|
if (el && /input|textarea/i.test(el.tagName)) {
|
||||||
|
var oldNode = el;
|
||||||
|
value = oldNode.value;
|
||||||
|
el = dom.createElement("pre");
|
||||||
|
oldNode.parentNode.replaceChild(el, oldNode);
|
||||||
|
} else {
|
||||||
|
value = dom.getInnerText(el);
|
||||||
|
el.innerHTML = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
var doc = exports.createEditSession(value);
|
||||||
|
|
||||||
|
var editor = new Editor(new Renderer(el));
|
||||||
|
editor.setSession(doc);
|
||||||
|
|
||||||
|
var env = {
|
||||||
|
document: doc,
|
||||||
|
editor: editor,
|
||||||
|
onResize: editor.resize.bind(editor, null)
|
||||||
|
};
|
||||||
|
if (oldNode) env.textarea = oldNode;
|
||||||
|
event.addListener(window, "resize", env.onResize);
|
||||||
|
editor.on("destroy", function() {
|
||||||
|
event.removeListener(window, "resize", env.onResize);
|
||||||
|
env.editor.container.env = null; // prevent memory leak on old ie
|
||||||
|
});
|
||||||
|
editor.container.env = editor.env = env;
|
||||||
|
return editor;
|
||||||
|
};
|
||||||
|
exports.createEditSession = function(text, mode) {
|
||||||
|
var doc = new EditSession(text, mode);
|
||||||
|
doc.setUndoManager(new UndoManager());
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
exports.EditSession = EditSession;
|
||||||
|
exports.UndoManager = UndoManager;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var event = require("../lib/event");
|
||||||
|
var UA = require("../lib/useragent");
|
||||||
|
var net = require("../lib/net");
|
||||||
|
var ace = require("../ace");
|
||||||
|
|
||||||
|
require("../theme/textmate");
|
||||||
|
|
||||||
|
module.exports = exports = ace;
|
||||||
|
var getCSSProperty = function(element, container, property) {
|
||||||
|
var ret = element.style[property];
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
if (window.getComputedStyle) {
|
||||||
|
ret = window.getComputedStyle(element, '').getPropertyValue(property);
|
||||||
|
} else {
|
||||||
|
ret = element.currentStyle[property];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret || ret == 'auto' || ret == 'intrinsic') {
|
||||||
|
ret = container.style[property];
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
function applyStyles(elm, styles) {
|
||||||
|
for (var style in styles) {
|
||||||
|
elm.style[style] = styles[style];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupContainer(element, getValue) {
|
||||||
|
if (element.type != 'textarea') {
|
||||||
|
throw new Error("Textarea required!");
|
||||||
|
}
|
||||||
|
|
||||||
|
var parentNode = element.parentNode;
|
||||||
|
var container = document.createElement('div');
|
||||||
|
var resizeEvent = function() {
|
||||||
|
var style = 'position:relative;';
|
||||||
|
[
|
||||||
|
'margin-top', 'margin-left', 'margin-right', 'margin-bottom'
|
||||||
|
].forEach(function(item) {
|
||||||
|
style += item + ':' +
|
||||||
|
getCSSProperty(element, container, item) + ';';
|
||||||
|
});
|
||||||
|
var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px");
|
||||||
|
var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px");
|
||||||
|
style += 'height:' + height + ';width:' + width + ';';
|
||||||
|
style += 'display:inline-block;';
|
||||||
|
container.setAttribute('style', style);
|
||||||
|
};
|
||||||
|
event.addListener(window, 'resize', resizeEvent);
|
||||||
|
resizeEvent();
|
||||||
|
parentNode.insertBefore(container, element.nextSibling);
|
||||||
|
while (parentNode !== document) {
|
||||||
|
if (parentNode.tagName.toUpperCase() === 'FORM') {
|
||||||
|
var oldSumit = parentNode.onsubmit;
|
||||||
|
parentNode.onsubmit = function(evt) {
|
||||||
|
element.value = getValue();
|
||||||
|
if (oldSumit) {
|
||||||
|
oldSumit.call(this, evt);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
parentNode = parentNode.parentNode;
|
||||||
|
}
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.transformTextarea = function(element, options) {
|
||||||
|
var session;
|
||||||
|
var container = setupContainer(element, function() {
|
||||||
|
return session.getValue();
|
||||||
|
});
|
||||||
|
element.style.display = 'none';
|
||||||
|
container.style.background = 'white';
|
||||||
|
var editorDiv = document.createElement("div");
|
||||||
|
applyStyles(editorDiv, {
|
||||||
|
top: "0px",
|
||||||
|
left: "0px",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
border: "1px solid gray",
|
||||||
|
position: "absolute"
|
||||||
|
});
|
||||||
|
container.appendChild(editorDiv);
|
||||||
|
|
||||||
|
var settingOpener = document.createElement("div");
|
||||||
|
applyStyles(settingOpener, {
|
||||||
|
position: "absolute",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
background: "red",
|
||||||
|
cursor: "nw-resize",
|
||||||
|
borderStyle: "solid",
|
||||||
|
borderWidth: "9px 8px 10px 9px",
|
||||||
|
width: "2px",
|
||||||
|
borderColor: "lightblue gray gray lightblue",
|
||||||
|
zIndex: 101
|
||||||
|
});
|
||||||
|
|
||||||
|
var settingDiv = document.createElement("div");
|
||||||
|
var settingDivStyles = {
|
||||||
|
top: "0px",
|
||||||
|
left: "20%",
|
||||||
|
right: "0px",
|
||||||
|
bottom: "0px",
|
||||||
|
position: "absolute",
|
||||||
|
padding: "5px",
|
||||||
|
zIndex: 100,
|
||||||
|
color: "white",
|
||||||
|
display: "none",
|
||||||
|
overflow: "auto",
|
||||||
|
fontSize: "14px",
|
||||||
|
boxShadow: "-5px 2px 3px gray"
|
||||||
|
};
|
||||||
|
if (!UA.isOldIE) {
|
||||||
|
settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)";
|
||||||
|
} else {
|
||||||
|
settingDivStyles.backgroundColor = "#333";
|
||||||
|
}
|
||||||
|
|
||||||
|
applyStyles(settingDiv, settingDivStyles);
|
||||||
|
container.appendChild(settingDiv);
|
||||||
|
|
||||||
|
options = options || exports.defaultOptions;
|
||||||
|
var editor = ace.edit(editorDiv);
|
||||||
|
session = editor.getSession();
|
||||||
|
|
||||||
|
session.setValue(element.value || element.innerHTML);
|
||||||
|
editor.focus();
|
||||||
|
container.appendChild(settingOpener);
|
||||||
|
setupApi(editor, editorDiv, settingDiv, ace, options, load);
|
||||||
|
setupSettingPanel(settingDiv, settingOpener, editor);
|
||||||
|
|
||||||
|
var state = "";
|
||||||
|
event.addListener(settingOpener, "mousemove", function(e) {
|
||||||
|
var rect = this.getBoundingClientRect();
|
||||||
|
var x = e.clientX - rect.left, y = e.clientY - rect.top;
|
||||||
|
if (x + y < (rect.width + rect.height)/2) {
|
||||||
|
this.style.cursor = "pointer";
|
||||||
|
state = "toggle";
|
||||||
|
} else {
|
||||||
|
state = "resize";
|
||||||
|
this.style.cursor = "nw-resize";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
event.addListener(settingOpener, "mousedown", function(e) {
|
||||||
|
if (state == "toggle") {
|
||||||
|
editor.setDisplaySettings();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
container.style.zIndex = 100000;
|
||||||
|
var rect = container.getBoundingClientRect();
|
||||||
|
var startX = rect.width + rect.left - e.clientX;
|
||||||
|
var startY = rect.height + rect.top - e.clientY;
|
||||||
|
event.capture(settingOpener, function(e) {
|
||||||
|
container.style.width = e.clientX - rect.left + startX + "px";
|
||||||
|
container.style.height = e.clientY - rect.top + startY + "px";
|
||||||
|
editor.resize();
|
||||||
|
}, function() {});
|
||||||
|
});
|
||||||
|
|
||||||
|
return editor;
|
||||||
|
};
|
||||||
|
|
||||||
|
function load(url, module, callback) {
|
||||||
|
net.loadScript(url, function() {
|
||||||
|
require([module], callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupApi(editor, editorDiv, settingDiv, ace, options, loader) {
|
||||||
|
var session = editor.getSession();
|
||||||
|
var renderer = editor.renderer;
|
||||||
|
loader = loader || load;
|
||||||
|
|
||||||
|
function toBool(value) {
|
||||||
|
return value === "true" || value == true;
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.setDisplaySettings = function(display) {
|
||||||
|
if (display == null)
|
||||||
|
display = settingDiv.style.display == "none";
|
||||||
|
if (display) {
|
||||||
|
settingDiv.style.display = "block";
|
||||||
|
settingDiv.hideButton.focus();
|
||||||
|
editor.on("focus", function onFocus() {
|
||||||
|
editor.removeListener("focus", onFocus);
|
||||||
|
settingDiv.style.display = "none";
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
editor.focus();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.$setOption = editor.setOption;
|
||||||
|
editor.$getOption = editor.getOption;
|
||||||
|
editor.setOption = function(key, value) {
|
||||||
|
switch (key) {
|
||||||
|
case "mode":
|
||||||
|
editor.$setOption("mode", "ace/mode/" + value)
|
||||||
|
break;
|
||||||
|
case "theme":
|
||||||
|
editor.$setOption("theme", "ace/theme/" + value)
|
||||||
|
break;
|
||||||
|
case "keybindings":
|
||||||
|
switch (value) {
|
||||||
|
case "vim":
|
||||||
|
editor.setKeyboardHandler("ace/keyboard/vim");
|
||||||
|
break;
|
||||||
|
case "emacs":
|
||||||
|
editor.setKeyboardHandler("ace/keyboard/emacs");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
editor.setKeyboardHandler(null);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "softWrap":
|
||||||
|
case "fontSize":
|
||||||
|
editor.$setOption(key, value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
editor.$setOption(key, toBool(value));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.getOption = function(key) {
|
||||||
|
switch (key) {
|
||||||
|
case "mode":
|
||||||
|
return editor.$getOption("mode").substr("ace/mode/".length)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "theme":
|
||||||
|
return editor.$getOption("theme").substr("ace/theme/".length)
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "keybindings":
|
||||||
|
var value = editor.getKeyboardHandler()
|
||||||
|
switch (value && value.$id) {
|
||||||
|
case "ace/keyboard/vim":
|
||||||
|
return "vim";
|
||||||
|
case "ace/keyboard/emacs":
|
||||||
|
return "emacs";
|
||||||
|
default:
|
||||||
|
return "ace";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return editor.$getOption(key);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.setOptions(options);
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupSettingPanel(settingDiv, settingOpener, editor) {
|
||||||
|
var BOOL = null;
|
||||||
|
|
||||||
|
var desc = {
|
||||||
|
mode: "Mode:",
|
||||||
|
wrap: "Soft Wrap:",
|
||||||
|
theme: "Theme:",
|
||||||
|
fontSize: "Font Size:",
|
||||||
|
showGutter: "Display Gutter:",
|
||||||
|
keybindings: "Keyboard",
|
||||||
|
showPrintMargin: "Show Print Margin:",
|
||||||
|
useSoftTabs: "Use Soft Tabs:",
|
||||||
|
showInvisibles: "Show Invisibles"
|
||||||
|
};
|
||||||
|
|
||||||
|
var optionValues = {
|
||||||
|
mode: {
|
||||||
|
text: "Plain",
|
||||||
|
javascript: "JavaScript",
|
||||||
|
xml: "XML",
|
||||||
|
html: "HTML",
|
||||||
|
css: "CSS",
|
||||||
|
scss: "SCSS",
|
||||||
|
python: "Python",
|
||||||
|
php: "PHP",
|
||||||
|
java: "Java",
|
||||||
|
ruby: "Ruby",
|
||||||
|
c_cpp: "C/C++",
|
||||||
|
coffee: "CoffeeScript",
|
||||||
|
json: "json",
|
||||||
|
perl: "Perl",
|
||||||
|
clojure: "Clojure",
|
||||||
|
ocaml: "OCaml",
|
||||||
|
csharp: "C#",
|
||||||
|
haxe: "haXe",
|
||||||
|
svg: "SVG",
|
||||||
|
textile: "Textile",
|
||||||
|
groovy: "Groovy",
|
||||||
|
liquid: "Liquid",
|
||||||
|
Scala: "Scala"
|
||||||
|
},
|
||||||
|
theme: {
|
||||||
|
clouds: "Clouds",
|
||||||
|
clouds_midnight: "Clouds Midnight",
|
||||||
|
cobalt: "Cobalt",
|
||||||
|
crimson_editor: "Crimson Editor",
|
||||||
|
dawn: "Dawn",
|
||||||
|
eclipse: "Eclipse",
|
||||||
|
idle_fingers: "Idle Fingers",
|
||||||
|
kr_theme: "Kr Theme",
|
||||||
|
merbivore: "Merbivore",
|
||||||
|
merbivore_soft: "Merbivore Soft",
|
||||||
|
mono_industrial: "Mono Industrial",
|
||||||
|
monokai: "Monokai",
|
||||||
|
pastel_on_dark: "Pastel On Dark",
|
||||||
|
solarized_dark: "Solarized Dark",
|
||||||
|
solarized_light: "Solarized Light",
|
||||||
|
textmate: "Textmate",
|
||||||
|
twilight: "Twilight",
|
||||||
|
vibrant_ink: "Vibrant Ink"
|
||||||
|
},
|
||||||
|
showGutter: BOOL,
|
||||||
|
fontSize: {
|
||||||
|
"10px": "10px",
|
||||||
|
"11px": "11px",
|
||||||
|
"12px": "12px",
|
||||||
|
"14px": "14px",
|
||||||
|
"16px": "16px"
|
||||||
|
},
|
||||||
|
wrap: {
|
||||||
|
off: "Off",
|
||||||
|
40: "40",
|
||||||
|
80: "80",
|
||||||
|
free: "Free"
|
||||||
|
},
|
||||||
|
keybindings: {
|
||||||
|
ace: "ace",
|
||||||
|
vim: "vim",
|
||||||
|
emacs: "emacs"
|
||||||
|
},
|
||||||
|
showPrintMargin: BOOL,
|
||||||
|
useSoftTabs: BOOL,
|
||||||
|
showInvisibles: BOOL
|
||||||
|
};
|
||||||
|
|
||||||
|
var table = [];
|
||||||
|
table.push("<table><tr><th>Setting</th><th>Value</th></tr>");
|
||||||
|
|
||||||
|
function renderOption(builder, option, obj, cValue) {
|
||||||
|
if (!obj) {
|
||||||
|
builder.push(
|
||||||
|
"<input type='checkbox' title='", option, "' ",
|
||||||
|
cValue + "" == "true" ? "checked='true'" : "",
|
||||||
|
"'></input>"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
builder.push("<select title='" + option + "'>");
|
||||||
|
for (var value in obj) {
|
||||||
|
builder.push("<option value='" + value + "' ");
|
||||||
|
|
||||||
|
if (cValue == value) {
|
||||||
|
builder.push(" selected ");
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.push(">",
|
||||||
|
obj[value],
|
||||||
|
"</option>");
|
||||||
|
}
|
||||||
|
builder.push("</select>");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var option in exports.defaultOptions) {
|
||||||
|
table.push("<tr><td>", desc[option], "</td>");
|
||||||
|
table.push("<td>");
|
||||||
|
renderOption(table, option, optionValues[option], editor.getOption(option));
|
||||||
|
table.push("</td></tr>");
|
||||||
|
}
|
||||||
|
table.push("</table>");
|
||||||
|
settingDiv.innerHTML = table.join("");
|
||||||
|
|
||||||
|
var onChange = function(e) {
|
||||||
|
var select = e.currentTarget;
|
||||||
|
editor.setOption(select.title, select.value);
|
||||||
|
};
|
||||||
|
var onClick = function(e) {
|
||||||
|
var cb = e.currentTarget;
|
||||||
|
editor.setOption(cb.title, cb.checked);
|
||||||
|
};
|
||||||
|
var selects = settingDiv.getElementsByTagName("select");
|
||||||
|
for (var i = 0; i < selects.length; i++)
|
||||||
|
selects[i].onchange = onChange;
|
||||||
|
var cbs = settingDiv.getElementsByTagName("input");
|
||||||
|
for (var i = 0; i < cbs.length; i++)
|
||||||
|
cbs[i].onclick = onClick;
|
||||||
|
|
||||||
|
|
||||||
|
var button = document.createElement("input");
|
||||||
|
button.type = "button";
|
||||||
|
button.value = "Hide";
|
||||||
|
event.addListener(button, "click", function() {
|
||||||
|
editor.setDisplaySettings(false);
|
||||||
|
});
|
||||||
|
settingDiv.appendChild(button);
|
||||||
|
settingDiv.hideButton = button;
|
||||||
|
}
|
||||||
|
exports.defaultOptions = {
|
||||||
|
mode: "javascript",
|
||||||
|
theme: "textmate",
|
||||||
|
wrap: "off",
|
||||||
|
fontSize: "12px",
|
||||||
|
showGutter: "false",
|
||||||
|
keybindings: "ace",
|
||||||
|
showPrintMargin: "false",
|
||||||
|
useSoftTabs: "true",
|
||||||
|
showInvisibles: "false"
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
(function() {
|
||||||
|
ace.require(["ace/ext/textarea"], function() {});
|
||||||
|
})();
|
||||||
|
|
640
static/js/mode-xml.js
Executable file
640
static/js/mode-xml.js
Executable file
|
@ -0,0 +1,640 @@
|
||||||
|
ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||||
|
|
||||||
|
var XmlHighlightRules = function(normalize) {
|
||||||
|
this.$rules = {
|
||||||
|
start : [
|
||||||
|
{token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"},
|
||||||
|
{
|
||||||
|
token : ["punctuation.xml-decl.xml", "keyword.xml-decl.xml"],
|
||||||
|
regex : "(<\\?)(xml)(?=[\\s])", next : "xml_decl", caseInsensitive: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : ["punctuation.instruction.xml", "keyword.instruction.xml"],
|
||||||
|
regex : "(<\\?)([-_a-zA-Z0-9]+)", next : "processing_instruction",
|
||||||
|
},
|
||||||
|
{token : "comment.xml", regex : "<\\!--", next : "comment"},
|
||||||
|
{
|
||||||
|
token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"],
|
||||||
|
regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true
|
||||||
|
},
|
||||||
|
{include : "tag"},
|
||||||
|
{token : "text.end-tag-open.xml", regex: "</"},
|
||||||
|
{token : "text.tag-open.xml", regex: "<"},
|
||||||
|
{include : "reference"},
|
||||||
|
{defaultToken : "text.xml"}
|
||||||
|
],
|
||||||
|
|
||||||
|
xml_decl : [{
|
||||||
|
token : "entity.other.attribute-name.decl-attribute-name.xml",
|
||||||
|
regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator.decl-attribute-equals.xml",
|
||||||
|
regex : "="
|
||||||
|
}, {
|
||||||
|
include: "whitespace"
|
||||||
|
}, {
|
||||||
|
include: "string"
|
||||||
|
}, {
|
||||||
|
token : "punctuation.xml-decl.xml",
|
||||||
|
regex : "\\?>",
|
||||||
|
next : "start"
|
||||||
|
}],
|
||||||
|
|
||||||
|
processing_instruction : [
|
||||||
|
{token : "punctuation.instruction.xml", regex : "\\?>", next : "start"},
|
||||||
|
{defaultToken : "instruction.xml"}
|
||||||
|
],
|
||||||
|
|
||||||
|
doctype : [
|
||||||
|
{include : "whitespace"},
|
||||||
|
{include : "string"},
|
||||||
|
{token : "xml-pe.doctype.xml", regex : ">", next : "start"},
|
||||||
|
{token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"},
|
||||||
|
{token : "punctuation.int-subset", regex : "\\[", push : "int_subset"}
|
||||||
|
],
|
||||||
|
|
||||||
|
int_subset : [{
|
||||||
|
token : "text.xml",
|
||||||
|
regex : "\\s+"
|
||||||
|
}, {
|
||||||
|
token: "punctuation.int-subset.xml",
|
||||||
|
regex: "]",
|
||||||
|
next: "pop"
|
||||||
|
}, {
|
||||||
|
token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"],
|
||||||
|
regex : "(<\\!)([-_a-zA-Z0-9]+)",
|
||||||
|
push : [{
|
||||||
|
token : "text",
|
||||||
|
regex : "\\s+"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token : "punctuation.markup-decl.xml",
|
||||||
|
regex : ">",
|
||||||
|
next : "pop"
|
||||||
|
},
|
||||||
|
{include : "string"}]
|
||||||
|
}],
|
||||||
|
|
||||||
|
cdata : [
|
||||||
|
{token : "string.cdata.xml", regex : "\\]\\]>", next : "start"},
|
||||||
|
{token : "text.xml", regex : "\\s+"},
|
||||||
|
{token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"}
|
||||||
|
],
|
||||||
|
|
||||||
|
comment : [
|
||||||
|
{token : "comment.xml", regex : "-->", next : "start"},
|
||||||
|
{defaultToken : "comment.xml"}
|
||||||
|
],
|
||||||
|
|
||||||
|
reference : [{
|
||||||
|
token : "constant.language.escape.reference.xml",
|
||||||
|
regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
|
||||||
|
}],
|
||||||
|
|
||||||
|
attr_reference : [{
|
||||||
|
token : "constant.language.escape.reference.attribute-value.xml",
|
||||||
|
regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
|
||||||
|
}],
|
||||||
|
|
||||||
|
tag : [{
|
||||||
|
token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"],
|
||||||
|
regex : "(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",
|
||||||
|
next: [
|
||||||
|
{include : "attributes"},
|
||||||
|
{token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : "start"}
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
|
||||||
|
tag_whitespace : [
|
||||||
|
{token : "text.tag-whitespace.xml", regex : "\\s+"}
|
||||||
|
],
|
||||||
|
whitespace : [
|
||||||
|
{token : "text.whitespace.xml", regex : "\\s+"}
|
||||||
|
],
|
||||||
|
string: [{
|
||||||
|
token : "string.xml",
|
||||||
|
regex : "'",
|
||||||
|
push : [
|
||||||
|
{token : "string.xml", regex: "'", next: "pop"},
|
||||||
|
{defaultToken : "string.xml"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
token : "string.xml",
|
||||||
|
regex : '"',
|
||||||
|
push : [
|
||||||
|
{token : "string.xml", regex: '"', next: "pop"},
|
||||||
|
{defaultToken : "string.xml"}
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
|
||||||
|
attributes: [{
|
||||||
|
token : "entity.other.attribute-name.xml",
|
||||||
|
regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"
|
||||||
|
}, {
|
||||||
|
token : "keyword.operator.attribute-equals.xml",
|
||||||
|
regex : "="
|
||||||
|
}, {
|
||||||
|
include: "tag_whitespace"
|
||||||
|
}, {
|
||||||
|
include: "attribute_value"
|
||||||
|
}],
|
||||||
|
|
||||||
|
attribute_value: [{
|
||||||
|
token : "string.attribute-value.xml",
|
||||||
|
regex : "'",
|
||||||
|
push : [
|
||||||
|
{token : "string.attribute-value.xml", regex: "'", next: "pop"},
|
||||||
|
{include : "attr_reference"},
|
||||||
|
{defaultToken : "string.attribute-value.xml"}
|
||||||
|
]
|
||||||
|
}, {
|
||||||
|
token : "string.attribute-value.xml",
|
||||||
|
regex : '"',
|
||||||
|
push : [
|
||||||
|
{token : "string.attribute-value.xml", regex: '"', next: "pop"},
|
||||||
|
{include : "attr_reference"},
|
||||||
|
{defaultToken : "string.attribute-value.xml"}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this.constructor === XmlHighlightRules)
|
||||||
|
this.normalizeRules();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.embedTagRules = function(HighlightRules, prefix, tag){
|
||||||
|
this.$rules.tag.unshift({
|
||||||
|
token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
|
||||||
|
regex : "(<)(" + tag + "(?=\\s|>|$))",
|
||||||
|
next: [
|
||||||
|
{include : "attributes"},
|
||||||
|
{token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$rules[tag + "-end"] = [
|
||||||
|
{include : "attributes"},
|
||||||
|
{token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start",
|
||||||
|
onMatch : function(value, currentState, stack) {
|
||||||
|
stack.splice(0);
|
||||||
|
return this.token;
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
|
||||||
|
this.embedRules(HighlightRules, prefix, [{
|
||||||
|
token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"],
|
||||||
|
regex : "(</)(" + tag + "(?=\\s|>|$))",
|
||||||
|
next: tag + "-end"
|
||||||
|
}, {
|
||||||
|
token: "string.cdata.xml",
|
||||||
|
regex : "<\\!\\[CDATA\\["
|
||||||
|
}, {
|
||||||
|
token: "string.cdata.xml",
|
||||||
|
regex : "\\]\\]>"
|
||||||
|
}]);
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(TextHighlightRules.prototype);
|
||||||
|
|
||||||
|
oop.inherits(XmlHighlightRules, TextHighlightRules);
|
||||||
|
|
||||||
|
exports.XmlHighlightRules = XmlHighlightRules;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var Behaviour = require("../behaviour").Behaviour;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
|
||||||
|
function is(token, type) {
|
||||||
|
return token.type.lastIndexOf(type + ".xml") > -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var XmlBehaviour = function () {
|
||||||
|
|
||||||
|
this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
|
||||||
|
if (text == '"' || text == "'") {
|
||||||
|
var quote = text;
|
||||||
|
var selected = session.doc.getTextRange(editor.getSelectionRange());
|
||||||
|
if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) {
|
||||||
|
return {
|
||||||
|
text: quote + selected + quote,
|
||||||
|
selection: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.doc.getLine(cursor.row);
|
||||||
|
var rightChar = line.substring(cursor.column, cursor.column + 1);
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
|
||||||
|
if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) {
|
||||||
|
return {
|
||||||
|
text: "",
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!token)
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
|
||||||
|
if (!token)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (is(token, "tag-whitespace") || is(token, "whitespace")) {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
}
|
||||||
|
var rightSpace = !rightChar || rightChar.match(/\s/);
|
||||||
|
if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) {
|
||||||
|
return {
|
||||||
|
text: quote + quote,
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function(state, action, editor, session, range) {
|
||||||
|
var selected = session.doc.getTextRange(range);
|
||||||
|
if (!range.isMultiLine() && (selected == '"' || selected == "'")) {
|
||||||
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
var rightChar = line.substring(range.start.column + 1, range.start.column + 2);
|
||||||
|
if (rightChar == selected) {
|
||||||
|
range.end.column++;
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("autoclosing", "insertion", function (state, action, editor, session, text) {
|
||||||
|
if (text == '>') {
|
||||||
|
var position = editor.getCursorPosition();
|
||||||
|
var iterator = new TokenIterator(session, position.row, position.column);
|
||||||
|
var token = iterator.getCurrentToken() || iterator.stepBackward();
|
||||||
|
if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value")))
|
||||||
|
return;
|
||||||
|
if (is(token, "reference.attribute-value"))
|
||||||
|
return;
|
||||||
|
if (is(token, "attribute-value")) {
|
||||||
|
var firstChar = token.value.charAt(0);
|
||||||
|
if (firstChar == '"' || firstChar == "'") {
|
||||||
|
var lastChar = token.value.charAt(token.value.length - 1);
|
||||||
|
var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;
|
||||||
|
if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!is(token, "tag-name")) {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
}
|
||||||
|
|
||||||
|
var tokenRow = iterator.getCurrentTokenRow();
|
||||||
|
var tokenColumn = iterator.getCurrentTokenColumn();
|
||||||
|
if (is(iterator.stepBackward(), "end-tag-open"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var element = token.value;
|
||||||
|
if (tokenRow == position.row)
|
||||||
|
element = element.substring(0, position.column - tokenColumn);
|
||||||
|
|
||||||
|
if (this.voidElements.hasOwnProperty(element.toLowerCase()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
return {
|
||||||
|
text: ">" + "</" + element + ">",
|
||||||
|
selection: [1, 1]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.add("autoindent", "insertion", function (state, action, editor, session, text) {
|
||||||
|
if (text == "\n") {
|
||||||
|
var cursor = editor.getCursorPosition();
|
||||||
|
var line = session.getLine(cursor.row);
|
||||||
|
var iterator = new TokenIterator(session, cursor.row, cursor.column);
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
|
||||||
|
if (token && token.type.indexOf("tag-close") !== -1) {
|
||||||
|
while (token && token.type.indexOf("tag-name") === -1) {
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tag = token.value;
|
||||||
|
var row = iterator.getCurrentTokenRow();
|
||||||
|
token = iterator.stepBackward();
|
||||||
|
if (!token || token.type.indexOf("end-tag") !== -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.voidElements && !this.voidElements[tag]) {
|
||||||
|
var nextToken = session.getTokenAt(cursor.row, cursor.column+1);
|
||||||
|
var line = session.getLine(row);
|
||||||
|
var nextIndent = this.$getIndent(line);
|
||||||
|
var indent = nextIndent + session.getTabString();
|
||||||
|
|
||||||
|
if (nextToken && nextToken.value === "</") {
|
||||||
|
return {
|
||||||
|
text: "\n" + indent + "\n" + nextIndent,
|
||||||
|
selection: [1, indent.length, 1, indent.length]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
text: "\n" + indent
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(XmlBehaviour, Behaviour);
|
||||||
|
|
||||||
|
exports.XmlBehaviour = XmlBehaviour;
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define("ace/mode/folding/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../../lib/oop");
|
||||||
|
var lang = require("../../lib/lang");
|
||||||
|
var Range = require("../../range").Range;
|
||||||
|
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||||
|
var TokenIterator = require("../../token_iterator").TokenIterator;
|
||||||
|
|
||||||
|
var FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {
|
||||||
|
BaseFoldMode.call(this);
|
||||||
|
this.voidElements = voidElements || {};
|
||||||
|
this.optionalEndTags = oop.mixin({}, this.voidElements);
|
||||||
|
if (optionalEndTags)
|
||||||
|
oop.mixin(this.optionalEndTags, optionalEndTags);
|
||||||
|
|
||||||
|
};
|
||||||
|
oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
|
var Tag = function() {
|
||||||
|
this.tagName = "";
|
||||||
|
this.closing = false;
|
||||||
|
this.selfClosing = false;
|
||||||
|
this.start = {row: 0, column: 0};
|
||||||
|
this.end = {row: 0, column: 0};
|
||||||
|
};
|
||||||
|
|
||||||
|
function is(token, type) {
|
||||||
|
return token.type.lastIndexOf(type + ".xml") > -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
|
var tag = this._getFirstTagInLine(session, row);
|
||||||
|
|
||||||
|
if (!tag)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
if (tag.closing || (!tag.tagName && tag.selfClosing))
|
||||||
|
return foldStyle == "markbeginend" ? "end" : "";
|
||||||
|
|
||||||
|
if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))
|
||||||
|
return "";
|
||||||
|
|
||||||
|
if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return "start";
|
||||||
|
};
|
||||||
|
this._getFirstTagInLine = function(session, row) {
|
||||||
|
var tokens = session.getTokens(row);
|
||||||
|
var tag = new Tag();
|
||||||
|
|
||||||
|
for (var i = 0; i < tokens.length; i++) {
|
||||||
|
var token = tokens[i];
|
||||||
|
if (is(token, "tag-open")) {
|
||||||
|
tag.end.column = tag.start.column + token.value.length;
|
||||||
|
tag.closing = is(token, "end-tag-open");
|
||||||
|
token = tokens[++i];
|
||||||
|
if (!token)
|
||||||
|
return null;
|
||||||
|
tag.tagName = token.value;
|
||||||
|
tag.end.column += token.value.length;
|
||||||
|
for (i++; i < tokens.length; i++) {
|
||||||
|
token = tokens[i];
|
||||||
|
tag.end.column += token.value.length;
|
||||||
|
if (is(token, "tag-close")) {
|
||||||
|
tag.selfClosing = token.value == '/>';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tag;
|
||||||
|
} else if (is(token, "tag-close")) {
|
||||||
|
tag.selfClosing = token.value == '/>';
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
tag.start.column += token.value.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this._findEndTagInLine = function(session, row, tagName, startColumn) {
|
||||||
|
var tokens = session.getTokens(row);
|
||||||
|
var column = 0;
|
||||||
|
for (var i = 0; i < tokens.length; i++) {
|
||||||
|
var token = tokens[i];
|
||||||
|
column += token.value.length;
|
||||||
|
if (column < startColumn)
|
||||||
|
continue;
|
||||||
|
if (is(token, "end-tag-open")) {
|
||||||
|
token = tokens[i + 1];
|
||||||
|
if (token && token.value == tagName)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
this._readTagForward = function(iterator) {
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var tag = new Tag();
|
||||||
|
do {
|
||||||
|
if (is(token, "tag-open")) {
|
||||||
|
tag.closing = is(token, "end-tag-open");
|
||||||
|
tag.start.row = iterator.getCurrentTokenRow();
|
||||||
|
tag.start.column = iterator.getCurrentTokenColumn();
|
||||||
|
} else if (is(token, "tag-name")) {
|
||||||
|
tag.tagName = token.value;
|
||||||
|
} else if (is(token, "tag-close")) {
|
||||||
|
tag.selfClosing = token.value == "/>";
|
||||||
|
tag.end.row = iterator.getCurrentTokenRow();
|
||||||
|
tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;
|
||||||
|
iterator.stepForward();
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
} while(token = iterator.stepForward());
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this._readTagBackward = function(iterator) {
|
||||||
|
var token = iterator.getCurrentToken();
|
||||||
|
if (!token)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var tag = new Tag();
|
||||||
|
do {
|
||||||
|
if (is(token, "tag-open")) {
|
||||||
|
tag.closing = is(token, "end-tag-open");
|
||||||
|
tag.start.row = iterator.getCurrentTokenRow();
|
||||||
|
tag.start.column = iterator.getCurrentTokenColumn();
|
||||||
|
iterator.stepBackward();
|
||||||
|
return tag;
|
||||||
|
} else if (is(token, "tag-name")) {
|
||||||
|
tag.tagName = token.value;
|
||||||
|
} else if (is(token, "tag-close")) {
|
||||||
|
tag.selfClosing = token.value == "/>";
|
||||||
|
tag.end.row = iterator.getCurrentTokenRow();
|
||||||
|
tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;
|
||||||
|
}
|
||||||
|
} while(token = iterator.stepBackward());
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
this._pop = function(stack, tag) {
|
||||||
|
while (stack.length) {
|
||||||
|
|
||||||
|
var top = stack[stack.length-1];
|
||||||
|
if (!tag || top.tagName == tag.tagName) {
|
||||||
|
return stack.pop();
|
||||||
|
}
|
||||||
|
else if (this.optionalEndTags.hasOwnProperty(tag.tagName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {
|
||||||
|
stack.pop();
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
|
var firstTag = this._getFirstTagInLine(session, row);
|
||||||
|
|
||||||
|
if (!firstTag)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var isBackward = firstTag.closing || firstTag.selfClosing;
|
||||||
|
var stack = [];
|
||||||
|
var tag;
|
||||||
|
|
||||||
|
if (!isBackward) {
|
||||||
|
var iterator = new TokenIterator(session, row, firstTag.start.column);
|
||||||
|
var start = {
|
||||||
|
row: row,
|
||||||
|
column: firstTag.start.column + firstTag.tagName.length + 2
|
||||||
|
};
|
||||||
|
while (tag = this._readTagForward(iterator)) {
|
||||||
|
if (tag.selfClosing) {
|
||||||
|
if (!stack.length) {
|
||||||
|
tag.start.column += tag.tagName.length + 2;
|
||||||
|
tag.end.column -= 2;
|
||||||
|
return Range.fromPoints(tag.start, tag.end);
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag.closing) {
|
||||||
|
this._pop(stack, tag);
|
||||||
|
if (stack.length == 0)
|
||||||
|
return Range.fromPoints(start, tag.start);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stack.push(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var iterator = new TokenIterator(session, row, firstTag.end.column);
|
||||||
|
var end = {
|
||||||
|
row: row,
|
||||||
|
column: firstTag.start.column
|
||||||
|
};
|
||||||
|
|
||||||
|
while (tag = this._readTagBackward(iterator)) {
|
||||||
|
if (tag.selfClosing) {
|
||||||
|
if (!stack.length) {
|
||||||
|
tag.start.column += tag.tagName.length + 2;
|
||||||
|
tag.end.column -= 2;
|
||||||
|
return Range.fromPoints(tag.start, tag.end);
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tag.closing) {
|
||||||
|
this._pop(stack, tag);
|
||||||
|
if (stack.length == 0) {
|
||||||
|
tag.start.column += tag.tagName.length + 2;
|
||||||
|
return Range.fromPoints(tag.start, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
stack.push(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(FoldMode.prototype);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
ace.define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml"], function(require, exports, module) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var oop = require("../lib/oop");
|
||||||
|
var lang = require("../lib/lang");
|
||||||
|
var TextMode = require("./text").Mode;
|
||||||
|
var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;
|
||||||
|
var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;
|
||||||
|
var XmlFoldMode = require("./folding/xml").FoldMode;
|
||||||
|
|
||||||
|
var Mode = function() {
|
||||||
|
this.HighlightRules = XmlHighlightRules;
|
||||||
|
this.$behaviour = new XmlBehaviour();
|
||||||
|
this.foldingRules = new XmlFoldMode();
|
||||||
|
};
|
||||||
|
|
||||||
|
oop.inherits(Mode, TextMode);
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
|
||||||
|
this.voidElements = lang.arrayToMap([]);
|
||||||
|
|
||||||
|
this.blockComment = {start: "<!--", end: "-->"};
|
||||||
|
|
||||||
|
this.$id = "ace/mode/xml";
|
||||||
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
|
exports.Mode = Mode;
|
||||||
|
});
|
|
@ -18,7 +18,191 @@
|
||||||
{% include 'errors_block.html' %}
|
{% include 'errors_block.html' %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<p>
|
||||||
|
<a class="btn btn-success" data-toggle="collapse" href="#addCustom" aria-expanded="false" aria-controls="addCustom">
|
||||||
|
{% trans "Custom" %}
|
||||||
|
</a>
|
||||||
|
<a class="btn btn-success" data-toggle="collapse" href="#addFromTemp" aria-expanded="false" aria-controls="addFromTemp">
|
||||||
|
{% trans "Template" %}
|
||||||
|
</a>
|
||||||
|
<a class="btn btn-success" data-toggle="collapse" href="#addFromXML" aria-expanded="false" aria-controls="addFromXML">
|
||||||
|
{% trans "XML" %}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<div class="collapse" id="addCustom">
|
||||||
|
<div class="well">
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="name" placeholder="{% trans "Name" %}" maxlength="14" required pattern="[a-zA-Z0-9\.\-_]+">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "VCPU" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="vcpu" value="1" maxlength="1" required pattern="[0-9]">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Host-Model" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="checkbox" name="host_model" value="true" checked>
|
||||||
|
</div>
|
||||||
|
<label class="col-sm-1 control-label">{% trans "CPU" %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "RAM" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="memory" value="512" maxlength="5" required pattern="[0-9]+">
|
||||||
|
</div>
|
||||||
|
<label class="col-sm-1 control-label">{% trans "MB" %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<ul id="img-list">
|
||||||
|
<!-- populated from javascript -->
|
||||||
|
</ul>
|
||||||
|
<input id="images" name="images" type="hidden" value=""/>
|
||||||
|
<select id="image-control" name="image-control" class="form-control" multiple="multiple">
|
||||||
|
{% if get_images %}
|
||||||
|
{% for name in get_images %}
|
||||||
|
<option value="{{ name }}">{{ name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<option value="">{% trans "None" %}</option>
|
||||||
|
{% endif %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<ul id="net-list">
|
||||||
|
<!-- populated from javascript -->
|
||||||
|
</ul>
|
||||||
|
<input id="networks" type="hidden" name="networks" value=""/>
|
||||||
|
<select id="network-control" name="network-control" class="form-control" multiple="multiple">
|
||||||
|
{% for network in networks %}
|
||||||
|
<option value="{{ network }}">{{ network }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "VirtIO" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="checkbox" name="virtio" value="true" checked>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if storages %}
|
||||||
|
<button type="submit" class="btn btn-primary" name="create" value="1">
|
||||||
|
{% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-primary disabled">
|
||||||
|
{% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="collapse" id="addFromTemp">
|
||||||
|
<div class="well">
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="name" placeholder="{% trans "Name" %}" maxlength="14" required pattern="[a-zA-Z0-9\.\-_]+">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "VCPU" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="vcpu" value="1" maxlength="1" required pattern="[0-9]">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Host-Model" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="checkbox" name="host_model" value="true" checked>
|
||||||
|
</div>
|
||||||
|
<label class="col-sm-1 control-label">{% trans "CPU" %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "RAM" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="text" class="form-control" name="memory" value="512" maxlength="5" required pattern="[0-9]+">
|
||||||
|
</div>
|
||||||
|
<label class="col-sm-1 control-label">{% trans "MB" %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "HDD" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<select name="template" class="form-control">
|
||||||
|
{% if get_images %}
|
||||||
|
{% for name in get_images %}
|
||||||
|
<option value="{{ name }}">{{ name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<option value="">{% trans "None" %}</option>
|
||||||
|
{% endif %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group meta-prealloc">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Metadata" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="checkbox" name="meta_prealloc" title="Metadata preallocation" value="true">
|
||||||
|
</div>
|
||||||
|
<label class="col-lg-1 control-label">{% trans "Image" %}</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "Network" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<select name="networks" class="form-control">
|
||||||
|
{% for network in networks %}
|
||||||
|
<option value="{{ network }}">{{ network }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">{% trans "VirtIO" %}</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<input type="checkbox" name="virtio" value="true" checked>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if storages %}
|
||||||
|
<button type="submit" class="btn btn-primary" name="create" value="1">
|
||||||
|
{% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-primary disabled">
|
||||||
|
{% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="collapse" id="addFromXML">
|
||||||
|
<div class="well">
|
||||||
|
<form class="form-horizontal" method="post" role="form">{% csrf_token %}
|
||||||
|
<div class="col-sm-12" id="xmlheight">
|
||||||
|
<textarea id="editor" name="from_xml""></textarea>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary" name="create_xml">
|
||||||
|
{% trans "Create" %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
{% if not flavors %}
|
{% if not flavors %}
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<div class="alert alert-warning alert-dismissable">
|
<div class="alert alert-warning alert-dismissable">
|
||||||
|
@ -152,7 +336,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block script %}
|
{% block script %}
|
||||||
|
@ -226,4 +409,9 @@
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<script src="{{ STATIC_URL }}/js/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script>
|
||||||
|
var editor = ace.edit("editor");
|
||||||
|
editor.getSession().setMode("ace/mode/xml");
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in a new issue