{"version":3,"file":"13.js","mappings":"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","sources":["webpack://WebComponents/./node_modules/codemirror/mode/gas/gas.js","webpack://WebComponents/./runestone/lp/js/lp.js"],"sourcesContent":["// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/5/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"../../lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"gas\", function(_config, parserConfig) {\n 'use strict';\n\n // If an architecture is specified, its initialization function may\n // populate this array with custom parsing functions which will be\n // tried in the event that the standard functions do not find a match.\n var custom = [];\n\n // The symbol used to start a line comment changes based on the target\n // architecture.\n // If no architecture is pased in \"parserConfig\" then only multiline\n // comments will have syntax support.\n var lineCommentStartSymbol = \"\";\n\n // These directives are architecture independent.\n // Machine specific directives should go in their respective\n // architecture initialization function.\n // Reference:\n // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops\n var directives = {\n \".abort\" : \"builtin\",\n \".align\" : \"builtin\",\n \".altmacro\" : \"builtin\",\n \".ascii\" : \"builtin\",\n \".asciz\" : \"builtin\",\n \".balign\" : \"builtin\",\n \".balignw\" : \"builtin\",\n \".balignl\" : \"builtin\",\n \".bundle_align_mode\" : \"builtin\",\n \".bundle_lock\" : \"builtin\",\n \".bundle_unlock\" : \"builtin\",\n \".byte\" : \"builtin\",\n \".cfi_startproc\" : \"builtin\",\n \".comm\" : \"builtin\",\n \".data\" : \"builtin\",\n \".def\" : \"builtin\",\n \".desc\" : \"builtin\",\n \".dim\" : \"builtin\",\n \".double\" : \"builtin\",\n \".eject\" : \"builtin\",\n \".else\" : \"builtin\",\n \".elseif\" : \"builtin\",\n \".end\" : \"builtin\",\n \".endef\" : \"builtin\",\n \".endfunc\" : \"builtin\",\n \".endif\" : \"builtin\",\n \".equ\" : \"builtin\",\n \".equiv\" : \"builtin\",\n \".eqv\" : \"builtin\",\n \".err\" : \"builtin\",\n \".error\" : \"builtin\",\n \".exitm\" : \"builtin\",\n \".extern\" : \"builtin\",\n \".fail\" : \"builtin\",\n \".file\" : \"builtin\",\n \".fill\" : \"builtin\",\n \".float\" : \"builtin\",\n \".func\" : \"builtin\",\n \".global\" : \"builtin\",\n \".gnu_attribute\" : \"builtin\",\n \".hidden\" : \"builtin\",\n \".hword\" : \"builtin\",\n \".ident\" : \"builtin\",\n \".if\" : \"builtin\",\n \".incbin\" : \"builtin\",\n \".include\" : \"builtin\",\n \".int\" : \"builtin\",\n \".internal\" : \"builtin\",\n \".irp\" : \"builtin\",\n \".irpc\" : \"builtin\",\n \".lcomm\" : \"builtin\",\n \".lflags\" : \"builtin\",\n \".line\" : \"builtin\",\n \".linkonce\" : \"builtin\",\n \".list\" : \"builtin\",\n \".ln\" : \"builtin\",\n \".loc\" : \"builtin\",\n \".loc_mark_labels\" : \"builtin\",\n \".local\" : \"builtin\",\n \".long\" : \"builtin\",\n \".macro\" : \"builtin\",\n \".mri\" : \"builtin\",\n \".noaltmacro\" : \"builtin\",\n \".nolist\" : \"builtin\",\n \".octa\" : \"builtin\",\n \".offset\" : \"builtin\",\n \".org\" : \"builtin\",\n \".p2align\" : \"builtin\",\n \".popsection\" : \"builtin\",\n \".previous\" : \"builtin\",\n \".print\" : \"builtin\",\n \".protected\" : \"builtin\",\n \".psize\" : \"builtin\",\n \".purgem\" : \"builtin\",\n \".pushsection\" : \"builtin\",\n \".quad\" : \"builtin\",\n \".reloc\" : \"builtin\",\n \".rept\" : \"builtin\",\n \".sbttl\" : \"builtin\",\n \".scl\" : \"builtin\",\n \".section\" : \"builtin\",\n \".set\" : \"builtin\",\n \".short\" : \"builtin\",\n \".single\" : \"builtin\",\n \".size\" : \"builtin\",\n \".skip\" : \"builtin\",\n \".sleb128\" : \"builtin\",\n \".space\" : \"builtin\",\n \".stab\" : \"builtin\",\n \".string\" : \"builtin\",\n \".struct\" : \"builtin\",\n \".subsection\" : \"builtin\",\n \".symver\" : \"builtin\",\n \".tag\" : \"builtin\",\n \".text\" : \"builtin\",\n \".title\" : \"builtin\",\n \".type\" : \"builtin\",\n \".uleb128\" : \"builtin\",\n \".val\" : \"builtin\",\n \".version\" : \"builtin\",\n \".vtable_entry\" : \"builtin\",\n \".vtable_inherit\" : \"builtin\",\n \".warning\" : \"builtin\",\n \".weak\" : \"builtin\",\n \".weakref\" : \"builtin\",\n \".word\" : \"builtin\"\n };\n\n var registers = {};\n\n function x86(_parserConfig) {\n lineCommentStartSymbol = \"#\";\n\n registers.al = \"variable\";\n registers.ah = \"variable\";\n registers.ax = \"variable\";\n registers.eax = \"variable-2\";\n registers.rax = \"variable-3\";\n\n registers.bl = \"variable\";\n registers.bh = \"variable\";\n registers.bx = \"variable\";\n registers.ebx = \"variable-2\";\n registers.rbx = \"variable-3\";\n\n registers.cl = \"variable\";\n registers.ch = \"variable\";\n registers.cx = \"variable\";\n registers.ecx = \"variable-2\";\n registers.rcx = \"variable-3\";\n\n registers.dl = \"variable\";\n registers.dh = \"variable\";\n registers.dx = \"variable\";\n registers.edx = \"variable-2\";\n registers.rdx = \"variable-3\";\n\n registers.si = \"variable\";\n registers.esi = \"variable-2\";\n registers.rsi = \"variable-3\";\n\n registers.di = \"variable\";\n registers.edi = \"variable-2\";\n registers.rdi = \"variable-3\";\n\n registers.sp = \"variable\";\n registers.esp = \"variable-2\";\n registers.rsp = \"variable-3\";\n\n registers.bp = \"variable\";\n registers.ebp = \"variable-2\";\n registers.rbp = \"variable-3\";\n\n registers.ip = \"variable\";\n registers.eip = \"variable-2\";\n registers.rip = \"variable-3\";\n\n registers.cs = \"keyword\";\n registers.ds = \"keyword\";\n registers.ss = \"keyword\";\n registers.es = \"keyword\";\n registers.fs = \"keyword\";\n registers.gs = \"keyword\";\n }\n\n function armv6(_parserConfig) {\n // Reference:\n // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf\n // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf\n lineCommentStartSymbol = \"@\";\n directives.syntax = \"builtin\";\n\n registers.r0 = \"variable\";\n registers.r1 = \"variable\";\n registers.r2 = \"variable\";\n registers.r3 = \"variable\";\n registers.r4 = \"variable\";\n registers.r5 = \"variable\";\n registers.r6 = \"variable\";\n registers.r7 = \"variable\";\n registers.r8 = \"variable\";\n registers.r9 = \"variable\";\n registers.r10 = \"variable\";\n registers.r11 = \"variable\";\n registers.r12 = \"variable\";\n\n registers.sp = \"variable-2\";\n registers.lr = \"variable-2\";\n registers.pc = \"variable-2\";\n registers.r13 = registers.sp;\n registers.r14 = registers.lr;\n registers.r15 = registers.pc;\n\n custom.push(function(ch, stream) {\n if (ch === '#') {\n stream.eatWhile(/\\w/);\n return \"number\";\n }\n });\n }\n\n var arch = (parserConfig.architecture || \"x86\").toLowerCase();\n if (arch === \"x86\") {\n x86(parserConfig);\n } else if (arch === \"arm\" || arch === \"armv6\") {\n armv6(parserConfig);\n }\n\n function nextUntilUnescaped(stream, end) {\n var escaped = false, next;\n while ((next = stream.next()) != null) {\n if (next === end && !escaped) {\n return false;\n }\n escaped = !escaped && next === \"\\\\\";\n }\n return escaped;\n }\n\n function clikeComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch === \"/\" && maybeEnd) {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch === \"*\");\n }\n return \"comment\";\n }\n\n return {\n startState: function() {\n return {\n tokenize: null\n };\n },\n\n token: function(stream, state) {\n if (state.tokenize) {\n return state.tokenize(stream, state);\n }\n\n if (stream.eatSpace()) {\n return null;\n }\n\n var style, cur, ch = stream.next();\n\n if (ch === \"/\") {\n if (stream.eat(\"*\")) {\n state.tokenize = clikeComment;\n return clikeComment(stream, state);\n }\n }\n\n if (ch === lineCommentStartSymbol) {\n stream.skipToEnd();\n return \"comment\";\n }\n\n if (ch === '\"') {\n nextUntilUnescaped(stream, '\"');\n return \"string\";\n }\n\n if (ch === '.') {\n stream.eatWhile(/\\w/);\n cur = stream.current().toLowerCase();\n style = directives[cur];\n return style || null;\n }\n\n if (ch === '=') {\n stream.eatWhile(/\\w/);\n return \"tag\";\n }\n\n if (ch === '{') {\n return \"bracket\";\n }\n\n if (ch === '}') {\n return \"bracket\";\n }\n\n if (/\\d/.test(ch)) {\n if (ch === \"0\" && stream.eat(\"x\")) {\n stream.eatWhile(/[0-9a-fA-F]/);\n return \"number\";\n }\n stream.eatWhile(/\\d/);\n return \"number\";\n }\n\n if (/\\w/.test(ch)) {\n stream.eatWhile(/\\w/);\n if (stream.eat(\":\")) {\n return 'tag';\n }\n cur = stream.current().toLowerCase();\n style = registers[cur];\n return style || null;\n }\n\n for (var i = 0; i < custom.length; i++) {\n style = custom[i](ch, stream, state);\n if (style) {\n return style;\n }\n }\n },\n\n lineComment: lineCommentStartSymbol,\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\"\n };\n});\n\n});\n","// .. Copyright (C) 2017 Bryan A. Jones.\n//\n// This file is part of E-Book Binder.\n//\n// E-Book Binder is free software: you can redistribute it and/or modify it\n// under the terms of the GNU General Public License as published by the Free\n// Software Foundation, either version 3 of the License, or (at your option)\n// any later version.\n//\n// E-Book Binder is distributed in the hope that it will be useful, but WITHOUT\n// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\n// details.\n//\n// You should have received a copy of the GNU General Public License along\n// with E-Book Binder. If not, see .\n//\n// .. highlight:: javascript\n//\n// **************************************************************************************\n// |docname| - JavaScript functions supporting immediate feedback to in-browser questions\n// **************************************************************************************\n\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase\";\nimport CodeMirror from \"codemirror\";\nimport \"codemirror/mode/gas/gas.js\";\nimport \"codemirror/mode/python/python.js\";\nimport \"codemirror/mode/javascript/javascript.js\";\nimport \"codemirror/mode/sql/sql.js\";\nimport \"codemirror/mode/clike/clike.js\";\nimport \"codemirror/mode/octave/octave.js\";\nimport \"codemirror/lib/codemirror.css\";\n\n// Constructor\n// ===========\n// Object containing all instances of LP problems. (I assume there is just one per page.)\nwindow.LPList = {};\n\n// FITB constructor\nclass LP extends RunestoneBase {\n constructor(opts) {\n super(opts);\n this.useRunestoneServices = opts.useRunestoneServices;\n // Store the DOM element (the input) for the \"Test\" button.\n this.element = opts.orig;\n this.containerDiv = this.element;\n this.divid = this.element.id;\n // Store the DOM element (the textarea) where compile results will be displayed.\n this.resultElement = $(this.element).siblings(\".lp-result\");\n // Store the DOM element (a div) where feedback will be displayed.\n this.feedbackElement = $(this.element)\n .siblings(\".lp-feedback\")\n .children(\"div\");\n // Use a nice editor.\n this.textAreas = [];\n this.initTextAreas();\n // Handle clicks to the \"Save and run\" button.\n let that = this;\n $(this.element).click((eventObject) =>\n that.onSaveAndRun(eventObject).then(null)\n );\n this.checkServer(\"lp_build\", true);\n }\n\n // Look for each code snippet (a textarea). Make it a nice CodeMirror editor.\n initTextAreas(is_read_only = false) {\n let that = this;\n // Select only textareas that haven't been initialized with CodeMirror (which sets style=\"display:none\" on the textarea).\n $('textarea.code_snippet:not([style=\"display: none;\"])').each(function (index, element) {\n let editor = CodeMirror.fromTextArea(element, {\n lineNumbers: true,\n mode: $(that.element).attr(\"data-lang\"),\n indentUnit: 4,\n matchBrackets: true,\n readOnly: is_read_only,\n autoMatchParens: true,\n extraKeys: { Tab: \"indentMore\", \"Shift-Tab\": \"indentLess\" },\n });\n // Make the editor resizable.\n $(editor.getWrapperElement()).resizable({\n resize: function () {\n editor.setSize($(this).width(), $(this).height());\n editor.refresh();\n },\n });\n // Keep track of it.\n that.textAreas.push(editor);\n });\n }\n\n // Data structures:\n //\n // Format of data stored locally and on the server*::\n //\n // - answer: JSON-encoded string containing {\n // code_snippets: [\n // str, snippet 1, ...\n // ],\n // (optional) resultString: str, output from build.\n // }\n // - correct: (optional) float, a percentage from 0 to 100.\n // - timestamp: date/time in UTC.\n //\n // Format of data sent to the server*::\n //\n // - answer: JSON-encoded string containing only the code_snippets\n // array, not resultString. There's no point in sending the\n // previous resultString, since the server will compute a new\n // one.\n // - event: \"lp_build\"\n // - act: \"\", since the useinfo table requires it. It's not\n // otherwise used.\n // - path: str, giving the relative path to this web page. Used\n // to find the source code which produced this page in order\n // to do snippet replacement.\n // - div_id: str, the div_id of this component.\n //\n // Format of data received from the server::\n //\n // If there was an error:\n // - errors: [\n // str, error message 1, ...\n // ]\n //\n // Otherwise:\n // - answer: JSON-encoded string containing {\n // resultString: str, output from build.\n // Note that the code_snippets aren't sent back, to save\n // bandwidth.\n // }\n // - correct: float, a percentage from 0 to 100.\n // - timestamp: str, the server's timestamp.\n //\n // * For simplicity, I omitted the common fields (course, etc.) and discussed only fields unique to this component.\n\n async onSaveAndRun(_eventObject) {\n // Prevent multiple click while the build is running.\n $(this.element).attr(\"disabled\", true);\n $(this.resultElement).val(\"Building...\");\n $(this.feedbackElement).text(\"\").attr(\"\");\n // Since the Save and run button was clicked, we assume the code snippets have been changed; therefore, don't store ``correct`` or ``answer.resultString`` because they are out of date.\n //\n // Store the answer as a string, since this is what goes in to / comes out from the database. We have to translate this back to a data structure when restoring from the db or local storage.\n let code_snippets = this.textareasToData();\n this.setLocalStorage({\n answer: { code_snippets: code_snippets },\n timestamp: new Date(),\n });\n // Store the answer that the server returns, which includes additional data (correct/incorrect, feedback from the build, etc.).\n let serverAnswer;\n try {\n serverAnswer = await this.logBookEvent({\n event: \"lp_build\",\n answer: JSON.stringify(code_snippets),\n // This is required by useinfo, but not used.\n act: \"\",\n // Find the relative path to this web page. Slice off the leading ``/``.\n path: window.location.href\n .replace(eBookConfig.app, \"\")\n .slice(1),\n div_id: this.divid,\n });\n } catch (err) {\n $(this.feedbackElement)\n .val(`Error contacting server: {err}.`)\n .attr(\"class\", \"alert alert-danger\");\n return;\n } finally {\n // Always re-enable the button after the server responds.\n $(this.element).attr(\"disabled\", false);\n }\n serverAnswer = serverAnswer.detail;\n // The server doesn't return the ``code_snippets``, for efficiency. Include those. If an error was returned, note that there is no ``answer`` yet.\n if (!(\"answer\" in serverAnswer)) {\n serverAnswer.answer = {};\n }\n serverAnswer.answer.code_snippets = code_snippets;\n this.displayAnswer(serverAnswer);\n this.setLocalStorage(serverAnswer);\n }\n\n // Given a single answer, display it.\n displayAnswer(data) {\n if (\"errors\" in data) {\n // Display any server-side errors. If this key is present, other keys won't be.\n $(this.feedbackElement)\n .text(data.errors.join(\"
\"))\n .attr(\"class\", \"alert alert-danger\");\n } else {\n // Display and color-code the results.\n $(this.resultElement).val(data.answer.resultString);\n if (data.correct == null) {\n $(this.feedbackElement)\n .text(\"Response recorded.\")\n .attr(\"class\", \"alert alert-success\");\n } else if (data.correct >= 100) {\n $(this.feedbackElement)\n .text(\"Correct. Grade: \" + data.correct + \"%\")\n .attr(\"class\", \"alert alert-success\");\n } else {\n $(this.feedbackElement)\n .text(\"Incorrect. Grade: \" + data.correct + \"%\")\n .attr(\"class\", \"alert alert-danger\");\n }\n // Scroll to the bottom of the results.\n $(this.resultElement).scrollTop(this.resultElement[0].scrollHeight);\n }\n }\n\n // Store the contents of each textarea into an array of strings.\n textareasToData() {\n return $.map(this.textAreas, function (obj, index) {\n // See https://codemirror.net/doc/manual.html#api.\n return obj.getValue();\n });\n }\n\n // Store an array of strings in ``data.code_snippets`` into each textarea.\n dataToTextareas(data) {\n // For places where textareas aren't provided (instructor grading interface, assignment page), create them. However, these aren't runnable, so disable the \"Save and run\" button. Assume this is the case when there are no textareas. Reasoning: the page containing the problem contains code intended to be intermingled with the student's answer. If that's not present, we can't build.\n if (!this.textAreas.length) {\n // The unusual case -- a problem not on its original page. Create textareas to display the code, then initialize them. Note that we can't simply create these in the constructor (which would be convenient) since we don't yet know how many code snippets are associated with the problem.\n $(this.element).before((data.answer.code_snippets || []).map(() => `
`));\n // Put CodeMirror in read-only mode.\n this.initTextAreas(true);\n // Disable the \"Save and run\" button.\n $(this.element).prop(\"disabled\", true);\n // Now that we have textareas, let the usual case code run.\n }\n\n // The usual case -- a problem on its original page. Find all code snippet textareas.\n $(this.textAreas).each(function (index, value) {\n // Silently ignore if ``data.answer.code_snippets`` or ``data.answer.code_snippets[index]`` isn't defined.\n value.setValue((data.answer.code_snippets || \"\")[index] || \"\");\n });\n // Corner case TODO: if a problem is edited after students already submit code so that there are now fewer textareas, display these but don't save them when \"Save and run\" is pressed. This allows students to (hopefully) re-use code from now-discarded textareas.\n }\n\n // Restore answers from storage retrieval done in RunestoneBase.\n restoreAnswers(data) {\n // We store the answer as a JSON-encoded string in the db / local storage. Restore the actual data structure from it. Avoid exceptions if no data is available.\n data.answer = JSON.parse(data.answer || \"{}\");\n this.dataToTextareas(data);\n this.displayAnswer(data);\n }\n\n checkLocalStorage() {\n // Loads previous answers from local storage if they exist.\n var storedData;\n if (localStorage.length > 0) {\n var key = this.localStorageKey();\n var ex = localStorage.getItem(key);\n if (ex !== null) {\n try {\n storedData = JSON.parse(ex);\n } catch (err) {\n // error while parsing; likely due to bad value stored in storage\n console.log(err.message);\n localStorage.removeItem(key);\n return;\n }\n this.restoreAnswers(storedData);\n }\n }\n }\n\n setLocalStorage(data) {\n // Make a shallow copy, so we can JSON-encode the code snippets (matching what comes from the server) without changing the original object.\n let data_clone = Object.assign({}, data);\n data_clone.answer = JSON.stringify(data.answer);\n localStorage.setItem(this.localStorageKey(), JSON.stringify(data_clone));\n }\n}\n\n// Initialization\n// ==============\n// Find the custom HTML tags and execute our code on them.\n$(document).on(\"runestone:login-complete\", function () {\n $(\"[data-component=lp_build]\").each(function (index) {\n try {\n window.LPList[this.id] = new LP({\n orig: this,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n });\n } catch (err) {\n console.log(`Error rendering LP Problem ${this.id}`);\n }\n });\n});\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\nwindow.component_factory[\"lp_build\"] = function (opts) {\n return new LP(opts);\n};\n"],"names":["CodeMirror","defineMode","_config","parserConfig","custom","lineCommentStartSymbol","directives","registers","arch","architecture","toLowerCase","clikeComment","stream","state","ch","maybeEnd","next","tokenize","al","ah","ax","eax","rax","bl","bh","bx","ebx","rbx","cl","cx","ecx","rcx","dl","dh","dx","edx","rdx","si","esi","rsi","di","edi","rdi","sp","esp","rsp","bp","ebp","rbp","ip","eip","rip","cs","ds","ss","es","fs","gs","syntax","r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","r11","r12","lr","pc","r13","r14","r15","push","eatWhile","startState","token","eatSpace","style","cur","eat","skipToEnd","end","escaped","nextUntilUnescaped","current","test","i","length","lineComment","blockCommentStart","blockCommentEnd","mod","window","LPList","LP","constructor","opts","super","this","useRunestoneServices","element","orig","containerDiv","divid","id","resultElement","$","siblings","feedbackElement","children","textAreas","initTextAreas","that","click","eventObject","onSaveAndRun","then","checkServer","is_read_only","each","index","editor","lineNumbers","mode","attr","indentUnit","matchBrackets","readOnly","autoMatchParens","extraKeys","Tab","getWrapperElement","resizable","resize","setSize","width","height","refresh","_eventObject","val","text","serverAnswer","code_snippets","textareasToData","setLocalStorage","answer","timestamp","Date","logBookEvent","event","JSON","stringify","act","path","location","href","replace","eBookConfig","app","slice","div_id","err","detail","displayAnswer","data","errors","join","resultString","correct","scrollTop","scrollHeight","map","obj","getValue","dataToTextareas","before","prop","value","setValue","restoreAnswers","parse","checkLocalStorage","storedData","localStorage","key","localStorageKey","ex","getItem","console","log","message","removeItem","data_clone","Object","assign","setItem","document","on","component_factory"],"sourceRoot":""}