From 34fc1c450486ec2c786e6054c082d47eb30bb69b Mon Sep 17 00:00:00 2001 From: Ralf Teusner Date: Mon, 4 Jul 2016 17:36:26 +0200 Subject: [PATCH] On exit, augment the stacktrace and link it to the editors --- app/assets/javascripts/editor.js.erb | 60 +++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/editor.js.erb b/app/assets/javascripts/editor.js.erb index 1e64195e..51d61031 100644 --- a/app/assets/javascripts/editor.js.erb +++ b/app/assets/javascripts/editor.js.erb @@ -19,6 +19,15 @@ $(function() { var SERVER_SEND_EVENT = 2; var editors = []; + var editor_for_file = new Map(); + + var tracepositions_regexes = { + python: /File "(.+?)", line (\d+)/g, + java: /(.*\.java):(\d):/g + }; + + var tracepositions_regex; + var active_file = undefined; var active_frame = undefined; var running = false; @@ -404,12 +413,23 @@ $(function() { editor.setTheme(THEME); editor.commands.bindKey("ctrl+alt+0", null); editors.push(editor); + editor_for_file.set($(element).parent().data('filename'), editor); var session = editor.getSession(); session.setMode($(element).data('mode')); session.setTabSize($(element).data('indent-size')); session.setUseSoftTabs(true); session.setUseWrapMode(true); + // set regex for parsing error traces based on the mode of the main file. + if( $(element).parent().data('role') == "main_file"){ + var mode = $(element).data('mode'); + if(mode == "ace/mode/python"){ + tracepositions_regex = tracepositions_regexes.python; + } else if (mode = "ace/mode/java"){ + tracepositions_regex = tracepositions_regexes.java; + } + } + var file_id = $(element).data('id'); /* @@ -876,7 +896,9 @@ $(function() { } var showWorkspaceTab = function(event) { - event.preventDefault(); + if(event){ + event.preventDefault(); + } showTab(0); }; @@ -1036,6 +1058,7 @@ $(function() { case 'exit': killWebsocketAndContainer(); handleStderrOutputForFlowr(); + augmentStacktraceInOutput(); break; case 'timeout': // just show the timeout message here. Another exit command is sent by the rails backend when the socket to the docker container closes. @@ -1047,6 +1070,41 @@ $(function() { } }; + + var jumpToSourceLine = function(event){ + var file = $(event.target).data('file'); + var line = $(event.target).data('line'); + + showWorkspaceTab(null); + // set active file ?!?! + + var frame = $('div.frame[data-filename="' + file + '"]'); + showFrame(frame); + + var editor = editor_for_file.get(file); + editor.gotoLine(line, 0); + + }; + + var augmentStacktraceInOutput = function() { + if(tracepositions_regex){ + var element = $('#output>pre'); + var text = element.text(); + element.on( "click", "a", jumpToSourceLine); + + var matches; + + while(matches = tracepositions_regex.exec(text)){ + var frame = $('div.frame[data-filename="' + matches[1] + '"]') + + if(frame.length > 0){ + element.html(text.replace(matches[0], "" + matches[0] + "")); + } + } + } + + }; + var renderWebsocketOutput = function(msg){ var element = findOrCreateRenderElement(0); element.append(msg.data);