123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <title>JSDoc: Source: feedback.js</title>
- <script src="scripts/prettify/prettify.js"> </script>
- <script src="scripts/prettify/lang-css.js"> </script>
- <!--[if lt IE 9]>
- <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]-->
- <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
- <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
- </head>
- <body>
- <div id="main">
- <h1 class="page-title">Source: feedback.js</h1>
-
-
- <section>
- <article>
- <pre class="prettyprint source linenums"><code>/**
- * An object that manages the feedback area, where users are told the state of their
- * program's execution and given guidance. Also manages the creation of the Trace Table.
- *
- * @constructor
- * @this {BlockPyFeedback}
- * @param {Object} main - The main BlockPy instance
- * @param {HTMLElement} tag - The HTML object this is attached to.
- */
- function BlockPyFeedback(main, tag) {
- this.main = main;
- this.tag = tag;
-
- this.body = this.tag.find('.blockpy-feedback-body');
- this.title = this.tag.find('.blockpy-feedback-title');
- this.original = this.tag.find('.blockpy-feedback-original');
- this.status = this.tag.find('.blockpy-feedback-status');
- this.trace = this.tag.find('.blockpy-feedback-trace');
-
- // Reload the tracetable on click
- this.trace.click(this.buildTraceTable.bind(this));
-
- this.original.hide();
- };
- /**
- * Reload the trace table, showing it if it was hidden and
- * resetting its position to the last step.
- */
- BlockPyFeedback.prototype.buildTraceTable = function() {
- var execution = this.main.model.execution;
- execution.show_trace(true);
- execution.trace_step(execution.last_step());
- this.main.components.server.logEvent('editor', 'trace')
- }
- /**
- * Raises a generic warning. This might not be used anymore.
- *
- * @param {String} html - Some HTML content to render to the user.
- */
- BlockPyFeedback.prototype.error = function(html) {
- this.tag.html(html);
- this.tag.removeClass("alert-success");
- this.tag.addClass("alert-warning");
- this.main.components.printer.print("Execution stopped - there was an error!");
- }
- /**
- * Clears any output currently in the feedback area. Also resets the printer and
- * any highlighted lines in the editor.
- */
- BlockPyFeedback.prototype.clear = function() {
- this.title.html("Ready");
- this.original.hide();
- this.body.html("Run your program to get feedback.");
- this.main.model.status.error("none");
- this.main.components.editor.unhighlightLines();
- this.main.components.printer.resetPrinter()
- };
- /**
- * Clears any errors from the editor area.
- */
- BlockPyFeedback.prototype.clearEditorErrors = function() {
- if (this.main.model.status.error() == "editor") {
- this.clear();
- }
- }
- /**
- * Show an error message related to a problem with the editor. This will appear in
- * the Feedback area, the Printer, and also log to the server. The relevant line of
- * code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.editorError = function(original, message, line) {
- original = this.prettyPrintError(original);
- this.title.html("Editor Error");
- this.original.show().html(original);
- this.body.html(message);
- this.main.model.status.error("editor");
- this.main.components.editor.highlightError(line-1);
- //this.main.components.printer.print("Editor error - could not make blocks!");
- this.main.components.server.logEvent('feedback', "Editor Error", original+"\n|\n"+message);
- }
- /**
- * Mark this problem as completed for the student. This will appear in the Feedback area,
- * and will also unhighlight lines in the editor and log to the server.
- */
- BlockPyFeedback.prototype.complete = function() {
- this.title.html("Complete!");
- this.original.hide();
- this.body.html("Great work!");
- this.main.model.status.error("complete");
- this.main.components.editor.unhighlightLines();
- this.main.components.server.logEvent('feedback', "Success");
- }
- /**
- * Mark this problem as finished for the student. This will appear in the Feedback area,
- * and will also unhighlight lines in the editor and log to the server.
- */
- BlockPyFeedback.prototype.finished = function() {
- this.title.html("Ran");
- this.original.hide();
- this.body.html("Your program ran successfully, without any errors. However, this problem does not have a correct solution. When you are satisfied with your program, you may stop working.");
- this.main.model.status.error("no errors");
- this.main.components.editor.unhighlightLines();
- this.main.components.server.logEvent('feedback', "Finished");
- }
- /**
- * This notifies the student that their code ran without errors, but that there was no
- * Success raised by the Checker. This will appear in the Feedback area,
- * and will also unhighlight lines in the editor and log to the server.
- */
- BlockPyFeedback.prototype.noErrors = function() {
- this.title.html("Ran");
- this.original.hide();
- this.body.html("No errors reported. View your output on the left.");
- this.main.model.status.error("no errors");
- this.main.components.editor.unhighlightLines();
- this.main.components.server.logEvent('feedback', "No Errors", '');
- }
- /**
- * Show an error message related to syntax issue. This will appear in
- * the Feedback area, the Printer, and also log to the server. The relevant line of
- * code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.syntaxError = function(original, message, line) {
- original = this.prettyPrintError(original);
- this.title.html("Syntax Error");
- this.original.show().html(original);
- this.body.html(message);
- this.main.model.status.error("syntax");
- this.main.components.editor.highlightError(line-1);
- this.main.components.printer.print("Execution stopped - there was an error!");
- this.main.components.server.logEvent('feedback', "Syntax Error", original+"\n|\n"+message);
- }
- /**
- * Show an error message related to semantic error with the program (e.g., unused variable).
- * This will appear in the Feedback area, the Printer, and also log to the server. The
- * relevant line of code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.semanticError = function(name, message, line) {
- this.title.html(name);
- this.original.hide();
- this.body.html(message);
- this.main.model.status.error("semantic");
- if (line !== null) {
- this.main.components.editor.highlightError(line-1);
- }
- this.main.components.printer.print("Execution stopped - there was an error!");
- this.main.components.server.logEvent('feedback', "Semantic Error", name+"\n|\n"+message);
- }
- /**
- * Show an error message related to a serious internal BlockPy program. Under normal conditions,
- * this should never appear to a student. This will appear in
- * the Feedback area, the Printer, and also log to the server. The relevant line of
- * code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.internalError = function(original, name, message) {
- original = this.prettyPrintError(original);
- this.title.html(name);
- this.original.show().html(original);
- this.body.html(message);
- this.main.model.status.error("internal");
- this.main.components.printer.print("Internal error! Please show this to an instructor!");
- this.main.components.server.logEvent('feedback', "Internal Error", name+"\n|\n"+original+"\n|\n"+message);
- }
- /**
- * Show an incorrect code message related to a problem as specified by the Checker. This will appear in
- * the Feedback area, the Printer, and also log to the server. The relevant line of
- * code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.instructorFeedback = function(name, message, line) {
- this.title.html(name);
- this.original.hide();
- this.body.html(message);
- this.main.model.status.error("feedback");
- if (line !== undefined) {
- this.main.components.editor.highlightError(line-1);
- }
- this.main.components.server.logEvent('feedback', "Instructor Feedback", name+"\n|\n"+"\n|\n"+message);
- }
- /**
- * Show "Empty Program" error, indicating the student hasn't written any code. This will appear in
- * the Feedback area, the Printer, and also log to the server. The relevant line of
- * code or block will also be highlighted.
- *
- * @param {String} original - HTML content that represents the original error message generated by the system.
- * @param {String} message - HTML content that is a hopefully friendlier message for the user explaining the error.
- * @param {number} line - What line the error occurred on.
- */
- BlockPyFeedback.prototype.emptyProgram = function() {
- this.title.html("Blank Program");
- this.original.hide().html("");
- this.body.html("You have not written any code yet.");
- this.main.model.status.error("runtime");
- this.main.components.server.logEvent('feedback', "Empty Program");
- }
- /**
- * Converts any kind of error (usually a Skulpt one) into a prettier version that's ready
- * for users to see. If it's already a string, it is passed along unchanged. But Skulpt
- * errors have to be processed more closely.
- */
- BlockPyFeedback.prototype.prettyPrintError = function(error) {
- if (typeof error === "string") {
- return error;
- } else {
- // A weird skulpt thing?
- if (error.tp$str !== undefined) {
- return error.tp$str().v;
- } else {
- return ""+error.name + ": " + error.message;
- }
- }
- }
- /**
- * Print an error to the printers -- the on screen one and the browser one. This
- * will attempt to provide extra explanation and context for an error.
- * Notice that this is largely for Run-time errors that will be thrown when the code
- * is executed, as opposed to ones raised elsewhere in the environment.
- *
- * @param {String} error - The error message to be analyzed and printed.
- */
- BlockPyFeedback.prototype.printError = function(error) {
- //console.log(error);
- original = this.prettyPrintError(error);
- this.title.html(error.tp$name);
- this.original.show().html(original);
- if (error.tp$name == "ParseError") {
- this.body.html("While attempting to convert the Python code into blocks, I found a syntax error. In other words, your Python code has a spelling or grammatical mistake. You should check to make sure that you have written all of your code correctly. To me, it looks like the problem is on line "+ error.args.v[2]+', where it says:<br><code>'+error.args.v[3][2]+'</code>', error.args.v[2]);
- } else if (error.constructor == Sk.builtin.NameError
- && error.args.v.length > 0
- && error.args.v[0].v == "name '___' is not defined") {
- this.body.html("You have incomplete blocks. Make sure that you do not have any dangling blocks or blocks that are connected incorrectly.<br><br>If you look at the text view of your Python code, you'll see <code>___</code> in the code. The converter will create these <code>___</code> to show that you have a block that's missing a piece.");
- } else if (error.tp$name in EXTENDED_ERROR_EXPLANATION) {
- this.body.html(EXTENDED_ERROR_EXPLANATION[error.tp$name]);
- } else {
- this.body.html(error.enhanced);
- }
- console.error(error);
- if (error.stack) {
- console.error(error.stack);
- }
- this.main.model.status.error("runtime");
- this.main.components.editor.highlightError(error.traceback[0].lineno-1);
- this.main.components.server.logEvent('feedback', "Runtime", original);
- }
- </code></pre>
- </article>
- </section>
- </div>
- <nav>
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="BlockPy.html">BlockPy</a></li><li><a href="BlockPyCorgis.html">BlockPyCorgis</a></li><li><a href="BlockPyDialog.html">BlockPyDialog</a></li><li><a href="BlockPyEditor.html">BlockPyEditor</a></li><li><a href="BlockPyEngine.html">BlockPyEngine</a></li><li><a href="BlockPyEnglish.html">BlockPyEnglish</a></li><li><a href="BlockPyFeedback.html">BlockPyFeedback</a></li><li><a href="BlockPyHistory.html">BlockPyHistory</a></li><li><a href="BlockPyPresentation.html">BlockPyPresentation</a></li><li><a href="BlockPyPrinter.html">BlockPyPrinter</a></li><li><a href="BlockPyServer.html">BlockPyServer</a></li><li><a href="BlockPyToolbar.html">BlockPyToolbar</a></li><li><a href="LocalStorageWrapper.html">LocalStorageWrapper</a></li><li><a href="PythonToBlocks.html">PythonToBlocks</a></li></ul><h3>Global</h3><ul><li><a href="global.html#BlockPyInterface">BlockPyInterface</a></li><li><a href="global.html#cloneNode">cloneNode</a></li><li><a href="global.html#encodeHTML">encodeHTML</a></li><li><a href="global.html#expandArray">expandArray</a></li><li><a href="global.html#EXTENDED_ERROR_EXPLANATION">EXTENDED_ERROR_EXPLANATION</a></li><li><a href="global.html#indent">indent</a></li><li><a href="global.html#instructor_module">instructor_module</a></li><li><a href="global.html#prettyPrintDateTime">prettyPrintDateTime</a></li><li><a href="global.html#randomInteger">randomInteger</a></li><li><a href="global.html#set_button_loaded">set_button_loaded</a></li><li><a href="global.html#timerGuard">timerGuard</a></li></ul>
- </nav>
- <br class="clear">
- <footer>
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Sun Mar 26 2017 09:45:03 GMT-0400 (Eastern Daylight Time)
- </footer>
- <script> prettyPrint(); </script>
- <script src="scripts/linenumber.js"> </script>
- </body>
- </html>
|