diff --git a/40-env-update.sh b/40-env-update.sh new file mode 100755 index 000000000..fc13da397 --- /dev/null +++ b/40-env-update.sh @@ -0,0 +1,20 @@ +#! /bin/bash + +if [ -z "$API_URL" ] + +then + echo No API Environment Variable Set. Set "-e API_URL='your-server.tld'" in your Docker Config +else + if [ -f /api_set ] + then + echo API URL Already set to $API_URL + else + echo Setting API URL to: $API_URL + sed -i 's#var apiUrl = localStorageGetItem("api-url") || "https://ce.judge0.com";#var apiUrl = '"$API_URL"'#' /usr/share/nginx/html/js/ide.js + + echo Disabling messages from public Judge CE API + sed -i "s^loadMessages();^^1" /usr/share/nginx/html/js/ide.js + + touch /api_set + fi +fi diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..bd095e56d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM nginx +ADD 40-env-update.sh /docker-entrypoint.d +RUN chmod +x /docker-entrypoint.d/40-env-update.sh +COPY . /usr/share/nginx/html + diff --git a/js/ide.js b/js/ide.js index 61c3ed522..cfb020398 100755 --- a/js/ide.js +++ b/js/ide.js @@ -1,9 +1,8 @@ -var defaultUrl = localStorageGetItem("api-url") || "https://ce.judge0.com"; -var apiUrl = defaultUrl; +var apiUrl = localStorageGetItem("api-url") || "https://ce.judge0.com"; var wait = localStorageGetItem("wait") || true; var check_timeout = 300; -var blinkStatusLine = ((localStorageGetItem("blink") || "true") === "true"); +var blinkStatusLine = (localStorageGetItem("blink") || "true") === "true"; var editorMode = localStorageGetItem("editorMode") || "normal"; var editorModeObject = null; @@ -36,69 +35,76 @@ var timeEnd; var messagesData; var layoutConfig = { - settings: { - showPopoutIcon: false, - reorderEnabled: true - }, - dimensions: { - borderWidth: 3, - headerHeight: 22 + settings: { + showPopoutIcon: false, + reorderEnabled: true, + }, + dimensions: { + borderWidth: 3, + headerHeight: 22, + }, + content: [ + { + type: "column", + content: [ + { + type: "component", + height: 70, + componentName: "source", + id: "source", + title: "SOURCE", + isClosable: false, + componentState: { + readOnly: false, + }, + }, + { + type: "stack", + content: [ + { + type: "component", + componentName: "stdin", + id: "stdin", + title: "Input", + isClosable: false, + componentState: { + readOnly: false, + }, + }, + { + type: "component", + componentName: "stdout", + id: "stdout", + title: "Output", + isClosable: false, + componentState: { + readOnly: true, + }, + }, + ], + }, + ], }, - content: [{ - type: "column", - content: [{ - type: "component", - height: 70, - componentName: "source", - id: "source", - title: "SOURCE", - isClosable: false, - componentState: { - readOnly: false - } - }, { - type: "stack", - content: [{ - type: "component", - componentName: "stdin", - id: "stdin", - title: "Input", - isClosable: false, - componentState: { - readOnly: false - } - }, { - type: "component", - componentName: "stdout", - id: "stdout", - title: "Output", - isClosable: false, - componentState: { - readOnly: true - } - }] - }] - }] + ], }; function encode(str) { - return btoa(unescape(encodeURIComponent(str || ""))); + return btoa(unescape(encodeURIComponent(str || ""))); } function decode(bytes) { - var escaped = escape(atob(bytes || "")); - try { - return decodeURIComponent(escaped); - } catch { - return unescape(escaped); - } + var escaped = escape(atob(bytes || "")); + try { + return decodeURIComponent(escaped); + } catch { + return unescape(escaped); + } } function localStorageSetItem(key, value) { try { localStorage.setItem(key, value); - } catch (ignorable) { - } + } catch (ignorable) {} } function localStorageGetItem(key) { @@ -110,91 +116,100 @@ function localStorageGetItem(key) { } function showMessages() { - var width = $updates.offset().left - parseFloat($updates.css("padding-left")) - - $navigationMessage.parent().offset().left - parseFloat($navigationMessage.parent().css("padding-left")) - 5; - - if (width < 200 || messagesData === undefined) { - return; - } + var width = + $updates.offset().left - + parseFloat($updates.css("padding-left")) - + $navigationMessage.parent().offset().left - + parseFloat($navigationMessage.parent().css("padding-left")) - + 5; + + if (width < 200 || messagesData === undefined) { + return; + } - var messages = messagesData["messages"]; + var messages = messagesData["messages"]; - $navigationMessage.css("animation-duration", messagesData["duration"]); - $navigationMessage.parent().width(width - 5); + $navigationMessage.css("animation-duration", messagesData["duration"]); + $navigationMessage.parent().width(width - 5); - var combinedMessage = ""; - for (var i = 0; i < messages.length; ++i) { - combinedMessage += `${messages[i]}`; - if (i != messages.length - 1) { - combinedMessage += " ".repeat(Math.min(200, messages[i].length)); - } + var combinedMessage = ""; + for (var i = 0; i < messages.length; ++i) { + combinedMessage += `${messages[i]}`; + if (i != messages.length - 1) { + combinedMessage += " ".repeat(Math.min(200, messages[i].length)); } + } - $navigationMessage.html(combinedMessage); + $navigationMessage.html(combinedMessage); } function loadMessages() { - $.ajax({ - url: `https://minio.judge0.com/public/ide/messages.json?${Date.now()}`, - type: "GET", - headers: { - "Accept": "application/json" - }, - success: function (data, textStatus, jqXHR) { - messagesData = data; - showMessages(); - } - }); + $.ajax({ + url: `https://minio.judge0.com/public/ide/messages.json?${Date.now()}`, + type: "GET", + headers: { + Accept: "application/json", + }, + success: function (data, textStatus, jqXHR) { + messagesData = data; + showMessages(); + }, + }); } function showError(title, content) { - $("#site-modal #title").html(title); - $("#site-modal .content").html(content); - $("#site-modal").modal("show"); + $("#site-modal #title").html(title); + $("#site-modal .content").html(content); + $("#site-modal").modal("show"); } function handleError(jqXHR, textStatus, errorThrown) { - showError(`${jqXHR.statusText} (${jqXHR.status})`, `
${JSON.stringify(jqXHR, null, 4)}`); + showError( + `${jqXHR.statusText} (${jqXHR.status})`, + `
${JSON.stringify(jqXHR, null, 4)}` + ); } function handleRunError(jqXHR, textStatus, errorThrown) { - handleError(jqXHR, textStatus, errorThrown); - $runBtn.removeClass("loading"); + handleError(jqXHR, textStatus, errorThrown); + $runBtn.removeClass("loading"); } function handleResult(data) { - timeEnd = performance.now(); - console.log("It took " + (timeEnd - timeStart) + " ms to get submission result."); - - var status = data.status; - var stdout = decode(data.stdout); - var compile_output = decode(data.compile_output); - var time = (data.time === null ? "-" : data.time + "s"); - var memory = (data.memory === null ? "-" : data.memory + "KB"); - - $statusLine.html(`${status.description}, ${time}, ${memory}`); - - if (blinkStatusLine) { - $statusLine.addClass("blink"); - setTimeout(function() { - blinkStatusLine = false; - localStorageSetItem("blink", "false"); - $statusLine.removeClass("blink"); - }, 3000); - } + timeEnd = performance.now(); + console.log( + "It took " + (timeEnd - timeStart) + " ms to get submission result." + ); + + var status = data.status; + var stdout = decode(data.stdout); + var compile_output = decode(data.compile_output); + var time = data.time === null ? "-" : data.time + "s"; + var memory = data.memory === null ? "-" : data.memory + "KB"; + + $statusLine.html(`${status.description}, ${time}, ${memory}`); + + if (blinkStatusLine) { + $statusLine.addClass("blink"); + setTimeout(function () { + blinkStatusLine = false; + localStorageSetItem("blink", "false"); + $statusLine.removeClass("blink"); + }, 3000); + } - var output = [compile_output, stdout].join("\n").trim(); + var output = [compile_output, stdout].join("\n").trim(); - stdoutEditor.setValue(output); + stdoutEditor.setValue(output); - if (output !== "") { - var dot = document.getElementById("stdout-dot"); - if (!dot.parentElement.classList.contains("lm_active")) { - dot.hidden = false; - } + if (output !== "") { + var dot = document.getElementById("stdout-dot"); + if (!dot.parentElement.classList.contains("lm_active")) { + dot.hidden = false; } + } - $runBtn.removeClass("loading"); + $runBtn.removeClass("loading"); } function getIdFromURI() { @@ -203,391 +218,418 @@ function getIdFromURI() { } function downloadSource() { - var value = parseInt($selectLanguage.val()); - download(sourceEditor.getValue(), fileNames[value], "text/plain"); + var value = parseInt($selectLanguage.val()); + download(sourceEditor.getValue(), fileNames[value], "text/plain"); } function loadSavedSource() { - snippet_id = getIdFromURI(); - - if (snippet_id.length == 36) { - $.ajax({ - url: apiUrl + "/submissions/" + snippet_id + "?fields=source_code,language_id,stdin,stdout,stderr,compile_output,message,time,memory,status,compiler_options,command_line_arguments&base64_encoded=true", - type: "GET", - success: function(data, textStatus, jqXHR) { - sourceEditor.setValue(decode(data["source_code"])); - $selectLanguage.dropdown("set selected", data["language_id"]); - $compilerOptions.val(data["compiler_options"]); - $commandLineArguments.val(data["command_line_arguments"]); - stdinEditor.setValue(decode(data["stdin"])); - stdoutEditor.setValue(decode(data["stdout"])); - var time = (data.time === null ? "-" : data.time + "s"); - var memory = (data.memory === null ? "-" : data.memory + "KB"); - $statusLine.html(`${data.status.description}, ${time}, ${memory}`); - changeEditorLanguage(); - }, - error: handleRunError - }); - } else { - loadRandomLanguage(); - } + snippet_id = getIdFromURI(); + + if (snippet_id.length == 36) { + $.ajax({ + url: + apiUrl + + "/submissions/" + + snippet_id + + "?fields=source_code,language_id,stdin,stdout,stderr,compile_output,message,time,memory,status,compiler_options,command_line_arguments&base64_encoded=true", + type: "GET", + success: function (data, textStatus, jqXHR) { + sourceEditor.setValue(decode(data["source_code"])); + $selectLanguage.dropdown("set selected", data["language_id"]); + $compilerOptions.val(data["compiler_options"]); + $commandLineArguments.val(data["command_line_arguments"]); + stdinEditor.setValue(decode(data["stdin"])); + stdoutEditor.setValue(decode(data["stdout"])); + var time = data.time === null ? "-" : data.time + "s"; + var memory = data.memory === null ? "-" : data.memory + "KB"; + $statusLine.html(`${data.status.description}, ${time}, ${memory}`); + changeEditorLanguage(); + }, + error: handleRunError, + }); + } else { + loadRandomLanguage(); + } } function run() { - if (sourceEditor.getValue().trim() === "") { - showError("Error", "Source code can't be empty!"); - return; - } else { - $runBtn.addClass("loading"); - } - - document.getElementById("stdout-dot").hidden = true; + if (sourceEditor.getValue().trim() === "") { + showError("Error", "Source code can't be empty!"); + return; + } else { + $runBtn.addClass("loading"); + } - stdoutEditor.setValue(""); + document.getElementById("stdout-dot").hidden = true; - var x = layout.root.getItemsById("stdout")[0]; - x.parent.header.parent.setActiveContentItem(x); + stdoutEditor.setValue(""); - var sourceValue = encode(sourceEditor.getValue()); - var stdinValue = encode(stdinEditor.getValue()); - var languageId = resolveLanguageId($selectLanguage.val()); - var compilerOptions = $compilerOptions.val(); - var commandLineArguments = $commandLineArguments.val(); + var x = layout.root.getItemsById("stdout")[0]; + x.parent.header.parent.setActiveContentItem(x); - if (parseInt(languageId) === 44) { - sourceValue = sourceEditor.getValue(); - } + var sourceValue = encode(sourceEditor.getValue()); + var stdinValue = encode(stdinEditor.getValue()); + var languageId = resolveLanguageId($selectLanguage.val()); + var compilerOptions = $compilerOptions.val(); + var commandLineArguments = $commandLineArguments.val(); - var data = { - source_code: sourceValue, - language_id: languageId, - stdin: stdinValue, - compiler_options: compilerOptions, - command_line_arguments: commandLineArguments, - redirect_stderr_to_stdout: true - }; - - var sendRequest = function(data) { - timeStart = performance.now(); - $.ajax({ - url: apiUrl + `/submissions?base64_encoded=true&wait=${wait}`, - type: "POST", - async: true, - contentType: "application/json", - data: JSON.stringify(data), - xhrFields: { - withCredentials: apiUrl.indexOf("/secure") != -1 ? true : false - }, - success: function (data, textStatus, jqXHR) { - console.log(`Your submission token is: ${data.token}`); - if (wait == true) { - handleResult(data); - } else { - setTimeout(fetchSubmission.bind(null, data.token), check_timeout); - } - }, - error: handleRunError - }); - } + if (parseInt(languageId) === 44) { + sourceValue = sourceEditor.getValue(); + } - var fetchAdditionalFiles = false; - if (parseInt(languageId) === 82) { - if (sqliteAdditionalFiles === "") { - fetchAdditionalFiles = true; - $.ajax({ - url: `https://minio.judge0.com/public/ide/sqliteAdditionalFiles.base64.txt?${Date.now()}`, - type: "GET", - async: true, - contentType: "text/plain", - success: function (responseData, textStatus, jqXHR) { - sqliteAdditionalFiles = responseData; - data["additional_files"] = sqliteAdditionalFiles; - sendRequest(data); - }, - error: handleRunError - }); - } - else { - data["additional_files"] = sqliteAdditionalFiles; + var data = { + source_code: sourceValue, + language_id: languageId, + stdin: stdinValue, + compiler_options: compilerOptions, + command_line_arguments: commandLineArguments, + redirect_stderr_to_stdout: true, + }; + + var sendRequest = function (data) { + timeStart = performance.now(); + $.ajax({ + url: apiUrl + `/submissions?base64_encoded=true&wait=${wait}`, + type: "POST", + async: true, + contentType: "application/json", + data: JSON.stringify(data), + xhrFields: { + withCredentials: apiUrl.indexOf("/secure") != -1 ? true : false, + }, + success: function (data, textStatus, jqXHR) { + console.log(`Your submission token is: ${data.token}`); + if (wait == true) { + handleResult(data); + } else { + setTimeout(fetchSubmission.bind(null, data.token), check_timeout); } + }, + error: handleRunError, + }); + }; + + var fetchAdditionalFiles = false; + if (parseInt(languageId) === 82) { + if (sqliteAdditionalFiles === "") { + fetchAdditionalFiles = true; + $.ajax({ + url: `https://minio.judge0.com/public/ide/sqliteAdditionalFiles.base64.txt?${Date.now()}`, + type: "GET", + async: true, + contentType: "text/plain", + success: function (responseData, textStatus, jqXHR) { + sqliteAdditionalFiles = responseData; + data["additional_files"] = sqliteAdditionalFiles; + sendRequest(data); + }, + error: handleRunError, + }); + } else { + data["additional_files"] = sqliteAdditionalFiles; } + } - if (!fetchAdditionalFiles) { - sendRequest(data); - } + if (!fetchAdditionalFiles) { + sendRequest(data); + } } function fetchSubmission(submission_token) { - $.ajax({ - url: apiUrl + "/submissions/" + submission_token + "?base64_encoded=true", - type: "GET", - async: true, - success: function (data, textStatus, jqXHR) { - if (data.status.id <= 2) { // In Queue or Processing - setTimeout(fetchSubmission.bind(null, submission_token), check_timeout); - return; - } - handleResult(data); - }, - error: handleRunError - }); + $.ajax({ + url: apiUrl + "/submissions/" + submission_token + "?base64_encoded=true", + type: "GET", + async: true, + success: function (data, textStatus, jqXHR) { + if (data.status.id <= 2) { + // In Queue or Processing + setTimeout(fetchSubmission.bind(null, submission_token), check_timeout); + return; + } + handleResult(data); + }, + error: handleRunError, + }); } function changeEditorLanguage() { - monaco.editor.setModelLanguage(sourceEditor.getModel(), $selectLanguage.find(":selected").attr("mode")); - currentLanguageId = parseInt($selectLanguage.val()); - $(".lm_title")[0].innerText = fileNames[currentLanguageId]; - apiUrl = resolveApiUrl($selectLanguage.val()); + monaco.editor.setModelLanguage( + sourceEditor.getModel(), + $selectLanguage.find(":selected").attr("mode") + ); + currentLanguageId = parseInt($selectLanguage.val()); + $(".lm_title")[0].innerText = fileNames[currentLanguageId]; + apiUrl = resolveApiUrl($selectLanguage.val()); } function insertTemplate() { - currentLanguageId = parseInt($selectLanguage.val()); - sourceEditor.setValue(sources[currentLanguageId]); - stdinEditor.setValue(inputs[currentLanguageId] || ""); - $compilerOptions.val(compilerOptions[currentLanguageId] || ""); - changeEditorLanguage(); + currentLanguageId = parseInt($selectLanguage.val()); + sourceEditor.setValue(sources[currentLanguageId]); + stdinEditor.setValue(inputs[currentLanguageId] || ""); + $compilerOptions.val(compilerOptions[currentLanguageId] || ""); + changeEditorLanguage(); } function loadRandomLanguage() { - var values = []; - for (var i = 0; i < $selectLanguage[0].options.length; ++i) { - values.push($selectLanguage[0].options[i].value); - } - // $selectLanguage.dropdown("set selected", values[Math.floor(Math.random() * $selectLanguage[0].length)]); - $selectLanguage.dropdown("set selected", values[19]); - apiUrl = resolveApiUrl($selectLanguage.val()) - insertTemplate(); + var values = []; + for (var i = 0; i < $selectLanguage[0].options.length; ++i) { + values.push($selectLanguage[0].options[i].value); + } + // $selectLanguage.dropdown("set selected", values[Math.floor(Math.random() * $selectLanguage[0].length)]); + $selectLanguage.dropdown("set selected", values[19]); + apiUrl = resolveApiUrl($selectLanguage.val()); + insertTemplate(); } function resizeEditor(layoutInfo) { - if (editorMode != "normal") { - var statusLineHeight = $("#editor-status-line").height(); - layoutInfo.height -= statusLineHeight; - layoutInfo.contentHeight -= statusLineHeight; - } + if (editorMode != "normal") { + var statusLineHeight = $("#editor-status-line").height(); + layoutInfo.height -= statusLineHeight; + layoutInfo.contentHeight -= statusLineHeight; + } } function disposeEditorModeObject() { - try { - editorModeObject.dispose(); - editorModeObject = null; - } catch(ignorable) { - } + try { + editorModeObject.dispose(); + editorModeObject = null; + } catch (ignorable) {} } function changeEditorMode() { - disposeEditorModeObject(); - - if (editorMode == "vim") { - editorModeObject = MonacoVim.initVimMode(sourceEditor, $("#editor-status-line")[0]); - } else if (editorMode == "emacs") { - var statusNode = $("#editor-status-line")[0]; - editorModeObject = new MonacoEmacs.EmacsExtension(sourceEditor); - editorModeObject.onDidMarkChange(function(e) { - statusNode.textContent = e ? "Mark Set!" : "Mark Unset"; - }); - editorModeObject.onDidChangeKey(function(str) { - statusNode.textContent = str; - }); - editorModeObject.start(); - } + disposeEditorModeObject(); + + if (editorMode == "vim") { + editorModeObject = MonacoVim.initVimMode( + sourceEditor, + $("#editor-status-line")[0] + ); + } else if (editorMode == "emacs") { + var statusNode = $("#editor-status-line")[0]; + editorModeObject = new MonacoEmacs.EmacsExtension(sourceEditor); + editorModeObject.onDidMarkChange(function (e) { + statusNode.textContent = e ? "Mark Set!" : "Mark Unset"; + }); + editorModeObject.onDidChangeKey(function (str) { + statusNode.textContent = str; + }); + editorModeObject.start(); + } } function resolveLanguageId(id) { - id = parseInt(id); - return languageIdTable[id] || id; + id = parseInt(id); + return languageIdTable[id] || id; } function resolveApiUrl(id) { - id = parseInt(id); - return languageApiUrlTable[id] || defaultUrl; + id = parseInt(id); + return languageApiUrlTable[id] || apiUrl; } function editorsUpdateFontSize(fontSize) { - sourceEditor.updateOptions({fontSize: fontSize}); - stdinEditor.updateOptions({fontSize: fontSize}); - stdoutEditor.updateOptions({fontSize: fontSize}); + sourceEditor.updateOptions({ fontSize: fontSize }); + stdinEditor.updateOptions({ fontSize: fontSize }); + stdoutEditor.updateOptions({ fontSize: fontSize }); } function updateScreenElements() { - var display = window.innerWidth <= 1200 ? "none" : ""; - $(".wide.screen.only").each(function(index) { - $(this).css("display", display); - }); + var display = window.innerWidth <= 1200 ? "none" : ""; + $(".wide.screen.only").each(function (index) { + $(this).css("display", display); + }); } -$(window).resize(function() { - layout.updateSize(); - updateScreenElements(); - showMessages(); +$(window).resize(function () { + layout.updateSize(); + updateScreenElements(); + showMessages(); }); $(document).ready(function () { - updateScreenElements(); - - console.log("Hey, Judge0 IDE is open-sourced: https://github.com/judge0/ide. Have fun!"); - - $selectLanguage = $("#select-language"); - $selectLanguage.change(function (e) { - if (!isEditorDirty) { - insertTemplate(); - } else { - changeEditorLanguage(); - } - }); + updateScreenElements(); - $compilerOptions = $("#compiler-options"); - $commandLineArguments = $("#command-line-arguments"); - $commandLineArguments.attr("size", $commandLineArguments.attr("placeholder").length); + console.log( + "Hey, Judge0 IDE is open-sourced: https://github.com/judge0/ide. Have fun!" + ); - $insertTemplateBtn = $("#insert-template-btn"); - $insertTemplateBtn.click(function (e) { - if (isEditorDirty && confirm("Are you sure? Your current changes will be lost.")) { - insertTemplate(); - } - }); - - $runBtn = $("#run-btn"); - $runBtn.click(function (e) { - run(); - }); - - $navigationMessage = $("#navigation-message span"); - $updates = $("#judge0-more"); - - $(`input[name="editor-mode"][value="${editorMode}"]`).prop("checked", true); - $("input[name=\"editor-mode\"]").on("change", function(e) { - editorMode = e.target.value; - localStorageSetItem("editorMode", editorMode); + $selectLanguage = $("#select-language"); + $selectLanguage.change(function (e) { + if (!isEditorDirty) { + insertTemplate(); + } else { + changeEditorLanguage(); + } + }); + + $compilerOptions = $("#compiler-options"); + $commandLineArguments = $("#command-line-arguments"); + $commandLineArguments.attr( + "size", + $commandLineArguments.attr("placeholder").length + ); + + $insertTemplateBtn = $("#insert-template-btn"); + $insertTemplateBtn.click(function (e) { + if ( + isEditorDirty && + confirm("Are you sure? Your current changes will be lost.") + ) { + insertTemplate(); + } + }); + + $runBtn = $("#run-btn"); + $runBtn.click(function (e) { + run(); + }); + + $navigationMessage = $("#navigation-message span"); + $updates = $("#judge0-more"); + + $(`input[name="editor-mode"][value="${editorMode}"]`).prop("checked", true); + $('input[name="editor-mode"]').on("change", function (e) { + editorMode = e.target.value; + localStorageSetItem("editorMode", editorMode); + + resizeEditor(sourceEditor.getLayoutInfo()); + changeEditorMode(); + + sourceEditor.focus(); + }); + + $statusLine = $("#status-line"); + + $(document).on("keydown", "body", function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode == 120) { + // F9 + e.preventDefault(); + run(); + } else if (keyCode == 119) { + // F8 + e.preventDefault(); + var url = prompt("Enter URL of Judge0 API:", apiUrl); + if (url != null) { + url = url.trim(); + } + if (url != null && url != "") { + apiUrl = url; + localStorageSetItem("api-url", apiUrl); + } + } else if (keyCode == 118) { + // F7 + e.preventDefault(); + wait = !wait; + localStorageSetItem("wait", wait); + alert(`Submission wait is ${wait ? "ON. Enjoy" : "OFF"}.`); + } else if (event.ctrlKey && keyCode == 107) { + // Ctrl++ + e.preventDefault(); + fontSize += 1; + editorsUpdateFontSize(fontSize); + } else if (event.ctrlKey && keyCode == 109) { + // Ctrl+- + e.preventDefault(); + fontSize -= 1; + editorsUpdateFontSize(fontSize); + } + }); + + $("select.dropdown").dropdown(); + $(".ui.dropdown").dropdown(); + $(".ui.dropdown.site-links").dropdown({ action: "hide", on: "hover" }); + $(".ui.checkbox").checkbox(); + $(".message .close").on("click", function () { + $(this).closest(".message").transition("fade"); + }); + + loadMessages(); + + require([ + "vs/editor/editor.main", + "monaco-vim", + "monaco-emacs", + ], function (ignorable, MVim, MEmacs) { + layout = new GoldenLayout(layoutConfig, $("#site-content")); + + MonacoVim = MVim; + MonacoEmacs = MEmacs; + + layout.registerComponent("source", function (container, state) { + sourceEditor = monaco.editor.create(container.getElement()[0], { + automaticLayout: true, + theme: "vs-dark", + scrollBeyondLastLine: true, + readOnly: state.readOnly, + language: "cpp", + minimap: { + enabled: false, + }, + }); - resizeEditor(sourceEditor.getLayoutInfo()); - changeEditorMode(); + changeEditorMode(); - sourceEditor.focus(); - }); + sourceEditor.getModel().onDidChangeContent(function (e) { + currentLanguageId = parseInt($selectLanguage.val()); + isEditorDirty = sourceEditor.getValue() != sources[currentLanguageId]; + }); - $statusLine = $("#status-line"); - - $(document).on("keydown", "body", function (e) { - var keyCode = e.keyCode || e.which; - if (keyCode == 120) { // F9 - e.preventDefault(); - run(); - } else if (keyCode == 119) { // F8 - e.preventDefault(); - var url = prompt("Enter URL of Judge0 API:", apiUrl); - if (url != null) { - url = url.trim(); - } - if (url != null && url != "") { - apiUrl = url; - localStorageSetItem("api-url", apiUrl); - } - } else if (keyCode == 118) { // F7 - e.preventDefault(); - wait = !wait; - localStorageSetItem("wait", wait); - alert(`Submission wait is ${wait ? "ON. Enjoy" : "OFF"}.`); - } else if (event.ctrlKey && keyCode == 107) { // Ctrl++ - e.preventDefault(); - fontSize += 1; - editorsUpdateFontSize(fontSize); - } else if (event.ctrlKey && keyCode == 109) { // Ctrl+- - e.preventDefault(); - fontSize -= 1; - editorsUpdateFontSize(fontSize); - } + sourceEditor.onDidLayoutChange(resizeEditor); }); - $("select.dropdown").dropdown(); - $(".ui.dropdown").dropdown(); - $(".ui.dropdown.site-links").dropdown({action: "hide", on: "hover"}); - $(".ui.checkbox").checkbox(); - $(".message .close").on("click", function () { - $(this).closest(".message").transition("fade"); + layout.registerComponent("stdin", function (container, state) { + stdinEditor = monaco.editor.create(container.getElement()[0], { + automaticLayout: true, + theme: "vs-dark", + scrollBeyondLastLine: false, + readOnly: state.readOnly, + language: "plaintext", + minimap: { + enabled: false, + }, + }); }); - loadMessages(); - - require(["vs/editor/editor.main", "monaco-vim", "monaco-emacs"], function (ignorable, MVim, MEmacs) { - layout = new GoldenLayout(layoutConfig, $("#site-content")); - - MonacoVim = MVim; - MonacoEmacs = MEmacs; - - layout.registerComponent("source", function (container, state) { - sourceEditor = monaco.editor.create(container.getElement()[0], { - automaticLayout: true, - theme: "vs-dark", - scrollBeyondLastLine: true, - readOnly: state.readOnly, - language: "cpp", - minimap: { - enabled: false - } - }); - - changeEditorMode(); - - sourceEditor.getModel().onDidChangeContent(function (e) { - currentLanguageId = parseInt($selectLanguage.val()); - isEditorDirty = sourceEditor.getValue() != sources[currentLanguageId]; - }); - - sourceEditor.onDidLayoutChange(resizeEditor); - }); - - layout.registerComponent("stdin", function (container, state) { - stdinEditor = monaco.editor.create(container.getElement()[0], { - automaticLayout: true, - theme: "vs-dark", - scrollBeyondLastLine: false, - readOnly: state.readOnly, - language: "plaintext", - minimap: { - enabled: false - } - }); - }); - - layout.registerComponent("stdout", function (container, state) { - stdoutEditor = monaco.editor.create(container.getElement()[0], { - automaticLayout: true, - theme: "vs-dark", - scrollBeyondLastLine: false, - readOnly: state.readOnly, - language: "plaintext", - minimap: { - enabled: false - } - }); - - container.on("tab", function(tab) { - tab.element.append(""); - tab.element.on("mousedown", function(e) { - e.target.closest(".lm_tab").children[3].hidden = true; - }); - }); - }); + layout.registerComponent("stdout", function (container, state) { + stdoutEditor = monaco.editor.create(container.getElement()[0], { + automaticLayout: true, + theme: "vs-dark", + scrollBeyondLastLine: false, + readOnly: state.readOnly, + language: "plaintext", + minimap: { + enabled: false, + }, + }); - layout.on("initialised", function () { - $(".monaco-editor")[0].appendChild($("#editor-status-line")[0]); - if (getIdFromURI()) { - loadSavedSource(); - } else { - loadRandomLanguage(); - } - $("#site-navigation").css("border-bottom", "1px solid black"); - sourceEditor.focus(); - editorsUpdateFontSize(fontSize); + container.on("tab", function (tab) { + tab.element.append(''); + tab.element.on("mousedown", function (e) { + e.target.closest(".lm_tab").children[3].hidden = true; }); + }); + }); - layout.init(); + layout.on("initialised", function () { + $(".monaco-editor")[0].appendChild($("#editor-status-line")[0]); + if (getIdFromURI()) { + loadSavedSource(); + } else { + loadRandomLanguage(); + } + $("#site-navigation").css("border-bottom", "1px solid black"); + sourceEditor.focus(); + editorsUpdateFontSize(fontSize); }); + + layout.init(); + }); }); // Template Sources -var assemblySource = "\ +var assemblySource = + "\ section .text\n\ global _start\n\ \n\ @@ -610,38 +652,42 @@ msg db 'hello, world', 0xa\n\ len equ $ - msg\n\ "; -var bashSource = "echo \"hello, world\""; +var bashSource = 'echo "hello, world"'; -var basicSource = "PRINT \"hello, world\""; +var basicSource = 'PRINT "hello, world"'; -var cSource = "\ +var cSource = + '\ // Powered by Judge0\n\ #include