From 826db75df3093827fd14009e508774e3fda740e5 Mon Sep 17 00:00:00 2001
From: Robert Zorko <robertz@gurucue.com>
Date: Fri, 18 Sep 2015 10:03:02 +0200
Subject: updated for the recent changes in hte prolog and python.js files

---
 js/codeq/prolog.js | 171 ++++++----------------------------------------------
 js/codeq/python.js | 174 +++++++----------------------------------------------
 js/prolog.js       |   8 +--
 js/python.js       |   4 +-
 4 files changed, 44 insertions(+), 313 deletions(-)

(limited to 'js')

diff --git a/js/codeq/prolog.js b/js/codeq/prolog.js
index 7c9ebb7..682b81e 100644
--- a/js/codeq/prolog.js
+++ b/js/codeq/prolog.js
@@ -269,7 +269,7 @@
      * @param {PrologTaskDef} info
      * @returns {{destroy: Function, processServerHints: Function}}
      */
-    var createPrologHandler = function (info) {
+    createPrologHandler = function (info) {
         var problem = info.problem,
             jqDescription = $('#description'),
             jqEditor = $('#code_editor'),
@@ -278,83 +278,8 @@
             editor = CodeMirror(jqEditor[0], { cursorHeight: 0.85, lineNumbers: true, matchBrackets: true }),
             activityHandler = makeActivityHandler(editor, problem.id),
             terminal = makePrologTerminalHandler(jqConsole, editor, problem.id, activityHandler),
-            hintDefs = problem.hint,
-            hintCounter = 0, // for generating unique class-names
-            hintCleaners = [],
-            clearHints = function () {
-                var i;
-                for (i = hintCleaners.length - 1; i >= 0; i--) {
-                    hintCleaners[i]();
-                }
-                hintCleaners.length = 0;
-                hintCounter = 0;
-            },
-            addMark = function (start, end) {
-                var posStart = editor.posFromIndex(start),
-                    posEnd = editor.posFromIndex(end),
-                    doc = editor.getDoc(),
-                    mark = doc.markText(posStart, posEnd, {className: 'editor-mark _emark_' + hintCounter}),
-                    result = {start: posStart, end: posEnd, mark: mark, className: '_emark_' + hintCounter};
-                hintCleaners.push(function () { mark.clear(); mark = null; doc = null; result.mark = null; });
-                hintCounter++;
-                return result;
-            },
-            processTemplate = function (template, args) {
-                if (!args)
-                    return template;
-                return template.replace(/\[%=(\w+)%\]/g, function(match, name) {
-                    return args[name];
-                });
-            },
-            hintHandlers = {
-                'static': function (type, template, serverHint) {
-                    codeq.log.debug('Processing static hint');
-                    var message = processTemplate(template, serverHint.args);
-                    jqHints.append('<div class="hint-static">' + message + '</div>');
-                    // no hint cleaner here, a static hint remains on the screen
-                },
-                'popup': function (type, template, serverHint) {
-                    codeq.log.debug('Processing popup hint');
-                    var message = processTemplate(template, serverHint.args),
-                        mark = addMark(serverHint.start, serverHint.end), // add the mark
-                        jqMark = jqEditor.find('.' + mark.className);
-
-                    jqMark.popover({content: message, html: true, placement: 'auto bottom', trigger: 'hover focus click', container: 'body'});
-                    hintCleaners.push(function () { if (jqMark) { jqMark.popover('destroy'); jqMark = null; } });
+            hinter = codeq.makeHinter(jqHints, jqEditor, editor, problem.hint);
 
-                    mark.mark.on('', function () {});
-                },
-                'dropdown': function (type, template, serverHint) {
-                    codeq.log.debug('Processing dropdown hint');
-                    var completion = null, // the completion object, created in showHint()
-                        close = function () {
-                            if (completion) {
-                                completion.close();
-                                completion = null;
-                            }
-                        };
-
-                    if ((editor.listSelections().length > 1) || editor.somethingSelected()) {
-                        // showHint() doesn't work if a selection is activeparts
-                    }
-
-                    editor.showHint({
-                        hint: function () {
-                            var hints = {
-                                list: serverHint.choices,
-                                from: editor.posFromIndex(serverHint.start),
-                                to: editor.posFromIndex(serverHint.end)
-                            };
-                            completion = editor.state.completionActive;
-                            return hints;
-                        },
-                        completeOnSingleClick: true,
-                        completeSingle: false
-                    });
-
-                    hintCleaners.push(close);
-                }
-            };
         editor.setValue(info.solution);
         $('#title').text(problem.slug);
         jqDescription.html(problem.description);
@@ -372,77 +297,6 @@
             }
         });
 
-        var handler = {
-            destroy: function () {
-                $('#btn_code_hint').off('click');
-                $('#btn_code_test').off('click');
-                editor.off();//remove listenerrs from the editor
-                terminal.off();//same for the terminal is the needed?
-                terminal.destroy();
-                jqDescription.empty();
-                jqEditor.empty(); // TODO: perhaps you do not want to "free" the editor, just empty it
-                jqConsole.empty(); // TODO: the same with the console
-                jqHints.empty(); // TODO: just make static references to these
-                jqDescription = null;
-                jqEditor = null;
-                jqConsole = null;
-                jqHints = null;
-            },
-
-            /**
-             * Processes and display appropriately the server hints.
-             * TODO: sort hints so static and popup hints come first, and a (single) drop-down hint last
-             *
-             * @param {ServerHint[]} serverHints an array of hints from the server
-             */
-            processServerHints: function (serverHints) {
-                var n = serverHints.length,
-                    /** number */ i,
-                    /** ServerHint */ serverHint,
-                    /** HintDefinition */ hintDef,
-                    hintType, hintTemplate, t, fn;
-                clearHints();
-                for (i = 0; i < n; i++) {
-                    serverHint = serverHints[i];
-                    hintDef = hintDefs[serverHint.id];
-                    if (serverHint.indices) {
-                        indices = serverHint.indices
-                        for (i = 0; i < indices.length; i++) {
-                            hintDef = hintDef[indices[i]];
-                            if (!hintDef)
-                                break;
-                        }
-                    }
-                    if (!hintDef) {
-                        codeq.log.error('Undefined hint ' + serverHint.id + ' with indices ' + serverHint.indices);
-                        continue;
-                    }
-                    t = typeof hintDef;
-                    if (t === 'object') {
-                        hintType = hintDef.type;
-                        hintTemplate = hintDef.message;
-                    }
-                    else if (t === 'string') {
-                        hintType = 'static';
-                        hintTemplate = hintDef;
-                    }
-                    else {
-                        codeq.log.error('Unsupported hint definition: ' + t);
-                        continue;
-                    }
-
-                    fn = hintHandlers[hintType];
-                    if (!fn) codeq.log.error('Unsupported hint type: ' + hintType);
-                    else fn(hintType, hintTemplate, serverHint);
-                }
-            }
-        };
-
-        var jqButtons = $('#block-toolbar button');
-//        $(jqButtons.get(0)).on('click', function () { handler.processServerHints([{id:'x_must_be_female'}]); });
-//        $(jqButtons.get(1)).on('click', function () { handler.processServerHints([{id:'popup_unknown', start: 20, end: 26}]); });
-//        $(jqButtons.get(2)).on('click', function () { handler.processServerHints([{id:'drop_down', start: 20, end: 26, choices:['ena', 'dva', 'tri']}]); });
-
         $('#btn_code_hint').on('click', function () {
             terminal.append('hint.\n', 'input');
             terminal.inputDisable();
@@ -455,7 +309,7 @@
                 .then(
                 function hintSuccess(data) {
                     if (data.code === 0)
-                        handler.processServerHints(data.hints);
+                        hinter.handle(data.hints);
                     else
                         terminal.append(data.message + '\n', 'error');
                 },
@@ -481,7 +335,7 @@
                 .then(
                 function testSuccess(data) {
                     if (data.code === 0)
-                        handler.processServerHints(data.hints);
+                        hinter.handle(data.hints);
                     else
                         terminal.append(data.message + '\n', 'error');
                 },
@@ -496,6 +350,21 @@
                 .done();
         });
 
-        return handler;
+        return {
+            destroy: function () {
+                $('#btn_code_hint').off('click');
+                $('#btn_code_test').off('click');
+                editor.off('change');
+                hinter.destroy();
+                terminal.destroy();
+                jqDescription.empty();
+                jqEditor.empty(); // TODO: perhaps you do not want to "free" the editor, just empty it
+                jqConsole.empty(); // TODO: the same with the console
+                jqDescription = null;
+                jqEditor = null;
+                jqConsole = null;
+                jqHints = null;
+            }
+        };
     };
 })();
\ No newline at end of file
diff --git a/js/codeq/python.js b/js/codeq/python.js
index 103dd5d..3121f1e 100644
--- a/js/codeq/python.js
+++ b/js/codeq/python.js
@@ -199,7 +199,8 @@
             'queueTrace': function (trace) {
                 trace['dt'] = deltaActivityMillis();
                 queue.push(trace);
-                if (ts === null) setTimeout(timer, 10000); // flush every 10 seconds
+                if (ts === null) ts = setTimeout(timer, 10000); // flush every 10 seconds
+                return this;
             },
             'flush': flush,
             'addAndPurge': function (trace) {
@@ -233,83 +234,7 @@
             editor = CodeMirror(jqEditor[0], { cursorHeight: 0.85, lineNumbers: true, matchBrackets: true, mode: 'python' }),
             activityHandler = makeActivityHandler(editor, problem.id),
             terminal = makePythonTerminalHandler(jqConsole, editor, problem.id, activityHandler),
-            hintDefs = problem.hint,
-            hintCounter = 0, // for generating unique class-names
-            hintCleaners = [],
-            clearHints = function () {
-                var i;
-                for (i = hintCleaners.length - 1; i >= 0; i--) {
-                    hintCleaners[i]();
-                }
-                hintCleaners.length = 0;
-                hintCounter = 0;
-            },
-            addMark = function (start, end) {
-                var posStart = editor.posFromIndex(start),
-                    posEnd = editor.posFromIndex(end),
-                    doc = editor.getDoc(),
-                    mark = doc.markText(posStart, posEnd, {className: 'editor-mark _emark_' + hintCounter}),
-                    result = {start: posStart, end: posEnd, mark: mark, className: '_emark_' + hintCounter};
-                hintCleaners.push(function () { mark.clear(); mark = null; doc = null; result.mark = null; });
-                hintCounter++;
-                return result;
-            },
-            processTemplate = function (template, args) {
-                if (!args)
-                    return template;
-                return template.replace(/\[%=(\w+)%\]/g, function(match, name) {
-                    return args[name];
-                });
-            },
-            hintHandlers = {
-                'static': function (type, template, serverHint) {
-                    codeq.log.debug('Processing static hint');
-                    var message = processTemplate(template, serverHint.args);
-                    jqHints.append('<div class="hint-static">' + message + '</div>');
-                    // no hint cleaner here, a static hint remains on the screen
-                },
-                'popup': function (type, template, serverHint) {
-                    codeq.log.debug('Processing popup hint');
-                    var message = processTemplate(template, serverHint.args),
-                        mark = addMark(serverHint.start, serverHint.end), // add the mark
-                        jqMark = jqEditor.find('.' + mark.className);
-
-                    jqMark.popover({content: message, html: true, placement: 'auto bottom', trigger: 'hover focus click', container: 'body'});
-                    hintCleaners.push(function () { if (jqMark) { jqMark.popover('destroy'); jqMark = null; } });
-
-                    mark.mark.on('', function () {});
-                },
-                'dropdown': function (type, template, serverHint) {
-                    codeq.log.debug('Processing dropdown hint');
-                    var completion = null, // the completion object, created in showHint()
-                        close = function () {
-                            if (completion) {
-                                completion.close();
-                                completion = null;
-                            }
-                        };
-
-                    if ((editor.listSelections().length > 1) || editor.somethingSelected()) {
-                        // showHint() doesn't work if a selection is activeparts
-                    }
-
-                    editor.showHint({
-                        hint: function () {
-                            var hints = {
-                                list: serverHint.choices,
-                                from: editor.posFromIndex(serverHint.start),
-                                to: editor.posFromIndex(serverHint.end)
-                            };
-                            completion = editor.state.completionActive;
-                            return hints;
-                        },
-                        completeOnSingleClick: true,
-                        completeSingle: false
-                    });
-
-                    hintCleaners.push(close);
-                }
-            };
+            hinter = codeq.makeHinter(jqHints, jqEditor, editor, problem.hint);
 
         editor.setValue(info.solution);
         $('#title').text(problem.slug);
@@ -328,79 +253,7 @@
             }
         });
 
-        var handler = {
-            destroy: function () {
-                $('#btn_code_hint').off('click');
-                $('#btn_code_test').off('click');
-                editor.off();
-                terminal.off();
-                terminal.destroy();
-                jqDescription.empty();
-                jqEditor.empty(); // TODO: perhaps you do not want to "free" the editor, just empty it
-                jqConsole.empty(); // TODO: the same with the console
-                jqHints.empty(); // TODO: just make static references to these
-                jqDescription = null;
-                jqEditor = null;
-                jqConsole = null;
-                jqHints = null;
-            },
-
-            /**
-             * Processes and display appropriately the server hints.
-             * TODO: sort hints so static and popup hints come first, and a (single) drop-down hint last
-             *
-             * @param {ServerHint[]} serverHints an array of hints from the server
-             */
-            processServerHints: function (serverHints) {
-                var n = serverHints.length,
-                    /** number */ i,
-                    /** ServerHint */ serverHint,
-                    /** HintDefinition */ hintDef,
-                    hintType, hintTemplate, t, fn;
-                clearHints();
-                for (i = 0; i < n; i++) {
-                    serverHint = serverHints[i];
-                    hintDef = hintDefs[serverHint.id];
-                    if (serverHint.indices) {
-                        indices = serverHint.indices
-                        for (i = 0; i < indices.length; i++) {
-                            hintDef = hintDef[indices[i]];
-                            if (!hintDef)
-                                break;
-                        }
-                    }
-                    if (!hintDef) {
-                        codeq.log.error('Undefined hint ' + serverHint.id + ' with indices ' + serverHint.indices);
-                        continue;
-                    }
-                    t = typeof hintDef;
-                    if (t === 'object') {
-                        hintType = hintDef.type;
-                        hintTemplate = hintDef.message;
-                    }
-                    else if (t === 'string') {
-                        hintType = 'static';
-                        hintTemplate = hintDef;
-                    }
-                    else {
-                        codeq.log.error('Unsupported hint definition: ' + t);
-                        continue;
-                    }
-
-                    fn = hintHandlers[hintType];
-                    if (!fn) codeq.log.error('Unsupported hint type: ' + hintType);
-                    else fn(hintType, hintTemplate, serverHint);
-                }
-            }
-        };
-
-        var jqButtons = $('#block-toolbar button');
-//        $(jqButtons.get(0)).on('click', function () { handler.processServerHints([{id:'x_must_be_female'}]); });
-//        $(jqButtons.get(1)).on('click', function () { handler.processServerHints([{id:'popup_unknown', start: 20, end: 26}]); });
-//        $(jqButtons.get(2)).on('click', function () { handler.processServerHints([{id:'drop_down', start: 20, end: 26, choices:['ena', 'dva', 'tri']}]); });
-
         $('#btn_code_hint').on('click', function () {
-//            handler.processServerHints([{id:'drop_down', start: 20, end: 26, choices:['ena', 'dva', 'tri']}]);
             var doc = editor.getDoc();
             codeq.comms.sendHint({
                 'language': 'python',
@@ -409,7 +262,7 @@
             }).then(
                 function hintSuccess(data) {
                     if (data.code === 0)
-                        handler.processServerHints(data.hints);
+                        hinter.handle(data.hints);
                     else
                         terminal.append('error: ' + data.message);
                 },
@@ -427,7 +280,7 @@
             }).then(
                 function testSuccess(data) {
                     if (data.code === 0)
-                        handler.processServerHints(data.hints);
+                        hinter.handle(data.hints);
                     else
                         terminal.append('error: ' + data.message);
                 },
@@ -442,6 +295,21 @@
             'text': ''
         });
 
-        return handler;
+        return {
+            destroy: function () {
+                $('#btn_code_hint').off('click');
+                $('#btn_code_test').off('click');
+                editor.off('change');
+                hinter.destroy();
+                terminal.destroy();
+                jqDescription.empty();
+                jqEditor.empty(); // TODO: perhaps you do not want to "free" the editor, just empty it
+                jqConsole.empty(); // TODO: the same with the console
+                jqDescription = null;
+                jqEditor = null;
+                jqConsole = null;
+                jqHints = null;
+            }
+        };
     };
 })();
diff --git a/js/prolog.js b/js/prolog.js
index 1082392..ecec0f3 100644
--- a/js/prolog.js
+++ b/js/prolog.js
@@ -6,10 +6,8 @@
     // a constant
     var firstCharacterPos = {'line': 0, 'ch': 0};
 
-    //codeq.makePrologTerminalHandler = function (jqConsole, editor, problem_id, activityHandler) {
     var makePrologTerminalHandler = function (jqConsole, editor, problem_id, activityHandler) {
         var promptMode = true, // default: query composition; alternative: query result browsing
-            manualStop = false, // if the user stopped showing next answers (false) or if there are no more answers (true)
             terminal = codeq.makeConsole(jqConsole, {
                 'greeting': 'CodeQ Prolog terminal proxy'
             }),
@@ -26,7 +24,7 @@
                 }
                 if (promptMode) {
                     terminal.setLineBuffered();
-                    terminal.append(manualStop ? '?- ' : '.\n?- ', 'output');
+                    terminal.append('.\n?- ', 'output');
                 }
             },
             tcf = function terminalCommandFailed (error) {
@@ -51,7 +49,6 @@
         terminal.onInput = function (command) {
             if (promptMode) {
                 promptMode = false;
-                manualStop = false;
                 terminal.setNotBuffered();
                 return codeq.comms.sendQuery({
                     'problem_id': problem_id,
@@ -73,7 +70,6 @@
                 }
                 else {
                     // stop searching for answers
-                    manualStop = true;
                     return codeq.comms.sendQuery({
                         'problem_id': problem_id,
                         'step': 'end',
@@ -148,7 +144,7 @@
             jqConsole = $('#console'),
             jqHints = $('#info'),
             editor = CodeMirror(jqEditor[0], { cursorHeight: 0.85, lineNumbers: true, matchBrackets: true }),
-            activityHandler = codeq.makeActivityHandler(editor, problem.id),
+            activityHandler = makeActivityHandler(editor, problem.id),
             terminal = makePrologTerminalHandler(jqConsole, editor, problem.id, activityHandler),
             hinter = codeq.makeHinter(jqHints, jqEditor, editor, problem.hint);
 
diff --git a/js/python.js b/js/python.js
index 4a2ac92..d114b7e 100644
--- a/js/python.js
+++ b/js/python.js
@@ -83,8 +83,6 @@
         };
     };
 
-
-
     /**
      * Creates a new handler for the given Prolog assignment definition.
      *
@@ -98,7 +96,7 @@
             jqConsole = $('#console'),
             jqHints = $('#info'),
             editor = CodeMirror(jqEditor[0], { cursorHeight: 0.85, lineNumbers: true, matchBrackets: true, mode: 'python' }),
-            activityHandler = codeq.makeActivityHandler(editor, problem.id),
+            activityHandler = makeActivityHandler(editor, problem.id),
             terminal = makePythonTerminalHandler(jqConsole, editor, problem.id, activityHandler),
             hinter = codeq.makeHinter(jqHints, jqEditor, editor, problem.hint);
 
-- 
cgit v1.2.1