NDOJ/django_ace/static/django_ace/widget.js
2022-06-12 14:57:46 +07:00

184 lines
5.8 KiB
JavaScript

(function () {
function getDocHeight() {
var D = document;
return Math.max(
Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
Math.max(D.body.clientHeight, D.documentElement.clientHeight)
);
}
function getDocWidth() {
var D = document;
return Math.max(
Math.max(D.body.scrollWidth, D.documentElement.scrollWidth),
Math.max(D.body.offsetWidth, D.documentElement.offsetWidth),
Math.max(D.body.clientWidth, D.documentElement.clientWidth)
);
}
function next(elem) {
// Credit to John Resig for this function
// taken from Pro JavaScript techniques
do {
elem = elem.nextSibling;
} while (elem && elem.nodeType != 1);
return elem;
}
function prev(elem) {
// Credit to John Resig for this function
// taken from Pro JavaScript techniques
do {
elem = elem.previousSibling;
} while (elem && elem.nodeType != 1);
return elem;
}
function redraw(element) {
element = $(element);
var n = document.createTextNode(' ');
element.appendChild(n);
(function () {
n.parentNode.removeChild(n)
}).defer();
return element;
}
function minimizeMaximize(widget, main_block, editor) {
if (window.fullscreen == true) {
main_block.className = 'django-ace-editor';
widget.style.width = window.ace_widget.width + 'px';
widget.style.height = window.ace_widget.height + 'px';
window.fullscreen = false;
}
else {
window.ace_widget = {
'width': widget.offsetWidth,
'height': widget.offsetHeight
};
main_block.className = 'django-ace-editor-fullscreen';
widget.style.height = getDocHeight() + 'px';
widget.style.width = getDocWidth() + 'px';
window.scrollTo(0, 0);
window.fullscreen = true;
}
editor.resize();
}
function apply_widget(widget) {
var div = widget.firstChild,
textarea = next(widget),
editor = ace.edit(div),
mode = widget.getAttribute('data-mode'),
theme = widget.getAttribute('data-theme'),
wordwrap = widget.getAttribute('data-wordwrap'),
toolbar = prev(widget);
var main_block = div.parentNode.parentNode;
if (toolbar != null) {
// Toolbar maximize/minimize button
var min_max = toolbar.getElementsByClassName('django-ace-max_min');
min_max[0].onclick = function () {
minimizeMaximize(widget, main_block, editor);
return false;
};
}
editor.getSession().setValue(textarea.value);
// the editor is initially absolute positioned
textarea.style.display = "none";
// options
if (mode) {
editor.getSession().setMode('ace/mode/' + mode);
}
if (theme) {
editor.setTheme("ace/theme/" + theme);
}
if (wordwrap == "true") {
editor.getSession().setUseWrapMode(true);
}
editor.getSession().on('change', function () {
textarea.value = editor.getSession().getValue();
});
editor.commands.addCommands([
{
name: 'Full screen',
bindKey: {win: 'Ctrl-F11', mac: 'Command-F11'},
exec: function (editor) {
minimizeMaximize(widget, main_block, editor);
},
readOnly: true // false if this command should not apply in readOnly mode
},
{
name: 'submit',
bindKey: "Ctrl+Enter",
exec: function (editor) {
$('form#problem_submit').submit();
},
readOnly: true
},
{
name: "showKeyboardShortcuts",
bindKey: {win: "Ctrl-Shift-/", mac: "Command-Shift-/"},
exec: function (editor) {
ace.config.loadModule("ace/ext/keybinding_menu", function (module) {
module.init(editor);
editor.showKeyboardShortcuts();
});
}
},
{
name: "increaseFontSize",
bindKey: "Ctrl-+",
exec: function (editor) {
var size = parseInt(editor.getFontSize(), 10) || 12;
editor.setFontSize(size + 1);
}
},
{
name: "decreaseFontSize",
bindKey: "Ctrl+-",
exec: function (editor) {
var size = parseInt(editor.getFontSize(), 10) || 12;
editor.setFontSize(Math.max(size - 1 || 1));
}
},
{
name: "resetFontSize",
bindKey: "Ctrl+0",
exec: function (editor) {
editor.setFontSize(12);
}
}
]);
window[widget.id] = editor;
$(widget).trigger('ace_load', [editor]);
}
function init() {
var widgets = document.getElementsByClassName('django-ace-widget');
for (var i = 0; i < widgets.length; i++) {
var widget = widgets[i];
widget.className = "django-ace-widget"; // remove `loading` class
apply_widget(widget);
}
}
if (window.addEventListener) { // W3C
window.addEventListener('load', init);
} else if (window.attachEvent) { // Microsoft
window.attachEvent('onload', init);
}
})();