diff --git a/app.js b/app.js index 9850b756f6..01759b96ea 100755 --- a/app.js +++ b/app.js @@ -40,8 +40,6 @@ var express = require('express'), resourcesController = require('./controllers/resources'), userController = require('./controllers/user'), nonprofitController = require('./controllers/nonprofits'), - bonfireController = require('./controllers/bonfire'), - coursewareController = require('./controllers/courseware'), fieldGuideController = require('./controllers/fieldGuide'), challengeMapController = require('./controllers/challengeMap'), challengeController = require('./controllers/challenge'), @@ -491,11 +489,6 @@ app.get('/api/trello', resourcesController.trelloCalls); app.get('/api/codepen/twitter/:screenName', resourcesController.codepenResources.twitter); -/** - * Bonfire related routes - */ -app.post('/completed-bonfire/', challengeController.completedBonfire); - /** * Field Guide related routes */ @@ -512,7 +505,7 @@ app.post('/completed-field-guide/', fieldGuideController.completedFieldGuide); /** - * Courseware related routes + * Challenge related routes */ app.get('/getstuff', challengeController.getStuff); diff --git a/controllers/bonfire.js b/controllers/bonfire.js deleted file mode 100644 index 68f22d9532..0000000000 --- a/controllers/bonfire.js +++ /dev/null @@ -1,333 +0,0 @@ -var _ = require('lodash'), - debug = require('debug')('freecc:cntr:bonfires'), - Bonfire = require('./../models/Bonfire'), - User = require('./../models/User'), - resources = require('./resources'), - R = require('ramda'); - MDNlinks = require('./../seed_data/bonfireMDNlinks'); - -/** - * Bonfire controller - */ - -exports.showAllBonfires = function(req, res) { - var completedBonfires = []; - if(req.user) { - completedBonfires = req.user.completedBonfires.map(function (elem) { - return elem._id; - }); - } - var noDuplicateBonfires = R.uniq(completedBonfires); - var data = {}; - data.bonfireList = resources.allBonfireNames(); - data.completedList = noDuplicateBonfires; - res.send(data); -}; - -exports.index = function(req, res) { - res.render('bonfire/show.jade', { - completedWith: null, - title: 'Bonfire Playground', - name: 'Bonfire Playground', - difficulty: 0, - brief: 'Feel free to play around!', - details: '', - tests: [], - challengeSeed: '', - cc: req.user ? req.user.bonfiresHash : undefined, - progressTimestamps: req.user ? req.user.progressTimestamps : undefined, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliments: resources.randomCompliment(), - bonfires: [], - bonfireHash: 'test' - - }); -}; - -exports.returnNextBonfire = function(req, res, next) { - if (!req.user) { - return res.redirect('../bonfires/meet-bonfire'); - } - var completed = req.user.completedBonfires.map(function (elem) { - return elem._id; - }); - - req.user.uncompletedBonfires = resources.allBonfireIds().filter(function (elem) { - if (completed.indexOf(elem) === -1) { - return elem; - } - }); - req.user.save(); - - var uncompletedBonfires = req.user.uncompletedBonfires; - - var displayedBonfires = Bonfire.find({'_id': uncompletedBonfires[0]}); - displayedBonfires.exec(function(err, bonfireFromMongo) { - if (err) { - return next(err); - } - var bonfire = bonfireFromMongo.pop(); - if (typeof bonfire === 'undefined') { - req.flash('errors', { - msg: "It looks like you've completed all the bonfires we have available. Good job!" - }); - return res.redirect('../bonfires/meet-bonfire'); - } - var nameString = bonfire.name.toLowerCase().replace(/\s/g, '-'); - return res.redirect('../bonfires/' + nameString); - }); -}; - -exports.returnIndividualBonfire = function(req, res, next) { - var dashedName = req.params.bonfireName; - - var bonfireName = dashedName.replace(/\-/g, ' '); - - Bonfire.find({'name': new RegExp(bonfireName, 'i')}, function(err, bonfireFromMongo) { - if (err) { - next(err); - } - - - if (bonfireFromMongo.length < 1) { - req.flash('errors', { - msg: "404: We couldn't find a bonfire with that name. Please double check the name." - }); - - return res.redirect('/bonfires'); - } - - var bonfire = bonfireFromMongo.pop(); - var dashedNameFull = bonfire.name.toLowerCase().replace(/\s/g, '-'); - if (dashedNameFull !== dashedName) { - return res.redirect('../bonfires/' + dashedNameFull); - } - res.render('bonfire/show', { - completedWith: null, - title: bonfire.name, - dashedName: dashedName, - name: bonfire.name, - difficulty: Math.floor(+bonfire.difficulty), - brief: bonfire.description.shift(), - details: bonfire.description, - tests: bonfire.tests, - challengeSeed: bonfire.challengeSeed, - points: req.user ? req.user.points : undefined, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - bonfires: bonfire, - bonfireHash: bonfire._id, - MDNkeys: bonfire.MDNlinks, - MDNlinks: getMDNlinks(bonfire.MDNlinks) - }); - }); -}; - -/** - * Bonfire Generator - * @param req Request Object - * @param res Response Object - * @returns void - */ - -exports.returnGenerator = function(req, res) { - res.render('bonfire/generator', { - title: null, - name: null, - difficulty: null, - brief: null, - details: null, - tests: null, - challengeSeed: null, - bonfireHash: randomString() - }); -}; - -/** - * Post for bonfire generation - */ - -function randomString() { - var chars = '0123456789abcdef'; - var string_length = 23; - var randomstring = 'a'; - for (var i = 0; i < string_length; i++) { - var rnum = Math.floor(Math.random() * chars.length); - randomstring += chars.substring(rnum, rnum + 1); - } - return randomstring; -} - -/** - * Helper function to populate the MDN links array. - */ - -function getMDNlinks(links) { - // takes in an array of links, which are strings - var populatedLinks = []; - - // for each key value, push the corresponding link from the MDNlinks object into a new array - links.forEach(function(value, index) { - populatedLinks.push(MDNlinks[value]); - }); - - return populatedLinks; - -} - -/** - * - */ - -exports.testBonfire = function(req, res) { - var bonfireName = req.body.name, - bonfireTests = req.body.tests, - bonfireDifficulty = req.body.difficulty, - bonfireDescription = req.body.description, - bonfireChallengeSeed = req.body.challengeSeed; - bonfireTests = bonfireTests.split('\r\n'); - bonfireDescription = bonfireDescription.split('\r\n'); - bonfireTests.filter(getRidOfEmpties); - bonfireDescription.filter(getRidOfEmpties); - bonfireChallengeSeed = bonfireChallengeSeed.replace('\r', ''); - - res.render('bonfire/show', { - completedWith: null, - title: bonfireName, - name: bonfireName, - difficulty: +bonfireDifficulty, - brief: bonfireDescription[0], - details: bonfireDescription.slice(1), - tests: bonfireTests, - challengeSeed: bonfireChallengeSeed, - cc: req.user ? req.user.bonfiresHash : undefined, - progressTimestamps: req.user ? req.user.progressTimestamps : undefined, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - bonfires: [], - bonfireHash: 'test' - }); -}; - -function getRidOfEmpties(elem) { - if (elem.length > 0) { - return elem; - } -} - -exports.publicGenerator = function(req, res) { - res.render('bonfire/public-generator'); -}; - -exports.generateChallenge = function(req, res) { - var bonfireName = req.body.name, - bonfireTests = req.body.tests, - bonfireDifficulty = req.body.difficulty, - bonfireDescription = req.body.description, - bonfireChallengeSeed = req.body.challengeSeed; - bonfireTests = bonfireTests.split('\r\n'); - bonfireDescription = bonfireDescription.split('\r\n'); - bonfireTests.filter(getRidOfEmpties); - bonfireDescription.filter(getRidOfEmpties); - bonfireChallengeSeed = bonfireChallengeSeed.replace('\r', ''); - - - var response = { - _id: randomString(), - name: bonfireName, - difficulty: bonfireDifficulty, - description: bonfireDescription, - challengeSeed: bonfireChallengeSeed, - tests: bonfireTests - }; - res.send(response); -}; - -exports.completedBonfire = function (req, res, next) { - var isCompletedWith = req.body.bonfireInfo.completedWith || ''; - var isCompletedDate = Math.round(+new Date()); - var bonfireHash = req.body.bonfireInfo.bonfireHash; - var isSolution = req.body.bonfireInfo.solution; - var bonfireName = req.body.bonfireInfo.bonfireName; - - if (isCompletedWith) { - var paired = User.find({'profile.username': isCompletedWith - .toLowerCase()}).limit(1); - paired.exec(function (err, pairedWith) { - if (err) { - return next(err); - } else { - var index = req.user.uncompletedBonfires.indexOf(bonfireHash); - if (index > -1) { - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedBonfires.splice(index, 1); - } - pairedWith = pairedWith.pop(); - - index = pairedWith.uncompletedBonfires.indexOf(bonfireHash); - if (index > -1) { - pairedWith.progressTimestamps.push(Date.now() || 0); - pairedWith.uncompletedBonfires.splice(index, 1); - - } - - pairedWith.completedBonfires.push({ - _id: bonfireHash, - name: bonfireName, - completedWith: req.user._id, - completedDate: isCompletedDate, - solution: isSolution - }); - - req.user.completedBonfires.push({ - _id: bonfireHash, - name: bonfireName, - completedWith: pairedWith._id, - completedDate: isCompletedDate, - solution: isSolution - }); - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - pairedWith.save(function (err, paired) { - if (err) { - return next(err); - } - if (user && paired) { - res.send(true); - } - }); - }); - } - }); - } else { - req.user.completedBonfires.push({ - _id: bonfireHash, - name: bonfireName, - completedWith: null, - completedDate: isCompletedDate, - solution: isSolution - }); - - var index = req.user.uncompletedBonfires.indexOf(bonfireHash); - if (index > -1) { - - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedBonfires.splice(index, 1); - } - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - if (user) { - res.send(true); - } - }); - } -}; diff --git a/controllers/courseware.js b/controllers/courseware.js deleted file mode 100644 index fbab4b69bc..0000000000 --- a/controllers/courseware.js +++ /dev/null @@ -1,384 +0,0 @@ -var _ = require('lodash'), - debug = require('debug')('freecc:cntr:courseware'), - Courseware = require('./../models/Courseware'), - User = require('./../models/User'), - resources = require('./resources'), - R = require('ramda'), - moment = require('moment'); - -/** - * Courseware controller - */ - -exports.showAllCoursewares = function(req, res) { - var completedList = []; - if(req.user) { - completedList = req.user.completedCoursewares.map(function (elem) { - return elem._id; - }); - } - var noDuplicatedCoursewares = R.uniq(completedList); - var data = {}; - data.coursewareList = resources.allCoursewareNames(); - data.completedList = noDuplicatedCoursewares; - res.send(data); -}; - -exports.returnNextCourseware = function(req, res, next) { - if (!req.user) { - return res.redirect('../challenges/learn-how-free-code-camp-works'); - } - - var completed = req.user.completedCoursewares.map(function (elem) { - return elem._id; - }); - - req.user.uncompletedCoursewares = resources.allCoursewareIds() - .filter(function (elem) { - if (completed.indexOf(elem) === -1) { - return elem; - } - }); - req.user.save(); - - var uncompletedCoursewares = req.user.uncompletedCoursewares[0]; - - var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares}); - displayedCoursewares.exec(function(err, courseware) { - if (err) { - return next(err); - } - - courseware = courseware.pop(); - if (typeof courseware === 'undefined') { - req.flash('errors', { - msg: "It looks like you've completed all the courses we have " + - "available. Good job!" - }); - return res.redirect('../challenges/learn-how-free-code-camp-works'); - } - var nameString = courseware.name.toLowerCase().replace(/\s/g, '-'); - return res.redirect('../challenges/' + nameString); - }); -}; - -exports.returnIndividualCourseware = function(req, res, next) { - var dashedName = req.params.coursewareName; - - var coursewareName = dashedName.replace(/\-/g, ' '); - - Courseware.find({'name': new RegExp(coursewareName, 'i')}, - function(err, coursewareFromMongo) { - if (err) { - next(err); - } - // Handle not found - if (coursewareFromMongo.length < 1) { - req.flash('errors', { - msg: "404: We couldn't find a challenge with that name. " + - "Please double check the name." - }); - return res.redirect('/challenges'); - } - var courseware = coursewareFromMongo.pop(); - - // Redirect to full name if the user only entered a partial - var dashedNameFull = courseware.name.toLowerCase().replace(/\s/g, '-'); - if (dashedNameFull !== dashedName) { - return res.redirect('../challenges/' + dashedNameFull); - } - - var challengeType = { - 0: function() { - res.render('coursewares/showHTML', { - title: courseware.name, - dashedName: dashedName, - name: courseware.name, - brief: courseware.description[0], - details: courseware.description.slice(1), - tests: courseware.tests, - challengeSeed: courseware.challengeSeed, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewareHash: courseware._id, - environment: resources.whichEnvironment(), - challengeType: courseware.challengeType - }); - }, - - 1: function() { - res.render('coursewares/showJS', { - title: courseware.name, - dashedName: dashedName, - name: courseware.name, - brief: courseware.description[0], - details: courseware.description.slice(1), - tests: courseware.tests, - challengeSeed: courseware.challengeSeed, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewareHash: courseware._id, - challengeType: courseware.challengeType - }); - }, - - 2: function() { - res.render('coursewares/showVideo', { - title: courseware.name, - dashedName: dashedName, - name: courseware.name, - details: courseware.description, - tests: courseware.tests, - video: courseware.challengeSeed[0], - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewareHash: courseware._id, - challengeType: courseware.challengeType - }); - }, - - 3: function() { - res.render('coursewares/showZiplineOrBasejump', { - title: courseware.name, - dashedName: dashedName, - name: courseware.name, - details: courseware.description, - video: courseware.challengeSeed[0], - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewareHash: courseware._id, - challengeType: courseware.challengeType - }); - }, - - 4: function() { - res.render('coursewares/showZiplineOrBasejump', { - title: courseware.name, - dashedName: dashedName, - name: courseware.name, - details: courseware.description, - video: courseware.challengeSeed[0], - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewareHash: courseware._id, - challengeType: courseware.challengeType - }); - } - }; - - return challengeType[courseware.challengeType](); - - }); -}; - -exports.testCourseware = function(req, res) { - var coursewareName = req.body.name, - coursewareTests = req.body.tests, - coursewareDifficulty = req.body.difficulty, - coursewareDescription = req.body.description, - coursewareEntryPoint = req.body.challengeEntryPoint, - coursewareChallengeSeed = req.body.challengeSeed; - coursewareTests = coursewareTests.split('\r\n'); - coursewareDescription = coursewareDescription.split('\r\n'); - coursewareTests.filter(getRidOfEmpties); - coursewareDescription.filter(getRidOfEmpties); - coursewareChallengeSeed = coursewareChallengeSeed.replace('\r', ''); - res.render('courseware/show', { - completedWith: null, - title: coursewareName, - name: coursewareName, - difficulty: +coursewareDifficulty, - brief: coursewareDescription[0], - details: coursewareDescription.slice(1), - tests: coursewareTests, - challengeSeed: coursewareChallengeSeed, - challengeEntryPoint: coursewareEntryPoint, - cc: req.user ? req.user.coursewaresHash : undefined, - progressTimestamps: req.user ? req.user.progressTimestamps : undefined, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliment: resources.randomCompliment(), - coursewares: [], - coursewareHash: 'test' - }); -}; - -function getRidOfEmpties(elem) { - if (elem.length > 0) { - return elem; - } -} - -exports.publicGenerator = function(req, res) { - res.render('courseware/public-generator'); -}; - -exports.generateChallenge = function(req, res) { - var coursewareName = req.body.name, - coursewareTests = req.body.tests, - coursewareDifficulty = req.body.difficulty, - coursewareDescription = req.body.description, - coursewareEntryPoint = req.body.challengeEntryPoint, - coursewareChallengeSeed = req.body.challengeSeed; - coursewareTests = coursewareTests.split('\r\n'); - coursewareDescription = coursewareDescription.split('\r\n'); - coursewareTests.filter(getRidOfEmpties); - coursewareDescription.filter(getRidOfEmpties); - coursewareChallengeSeed = coursewareChallengeSeed.replace('\r', ''); - - var response = { - _id: randomString(), - name: coursewareName, - difficulty: coursewareDifficulty, - description: coursewareDescription, - challengeEntryPoint: coursewareEntryPoint, - challengeSeed: coursewareChallengeSeed, - tests: coursewareTests - }; - res.send(response); -}; - -exports.completedCourseware = function (req, res, next) { - - var isCompletedDate = Math.round(+new Date()); - var coursewareHash = req.body.coursewareInfo.coursewareHash; - if (coursewareHash === "bd7139d8c441eddfaeb5bdef") { - req.user.finishedWaypoints = true; - } - - req.user.completedCoursewares.push({ - _id: coursewareHash, - completedDate: isCompletedDate, - name: req.body.coursewareInfo.coursewareName, - solution: null, - githubLink: null, - verified: true - }); - var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); - - if (index > -1) { - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedCoursewares.splice(index, 1); - } - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - if (user) { - res.sendStatus(200); - } - }); -}; - -exports.completedZiplineOrBasejump = function (req, res, next) { - debug('Inside controller for completed zipline or basejump with data %s', - req.body.coursewareInfo); - var isCompletedWith = req.body.coursewareInfo.completedWith || false; - var isCompletedDate = Math.round(+new Date()); - var coursewareHash = req.body.coursewareInfo.coursewareHash; - var solutionLink = req.body.coursewareInfo.publicURL; - var githubLink = req.body.coursewareInfo.challengeType === '4' - ? req.body.coursewareInfo.githubURL : true; - if (!solutionLink || !githubLink) { - req.flash('errors', { - msg: 'You haven\'t supplied the necessary URLs for us to inspect ' + - 'your work.' - }); - return res.sendStatus(403); - } - - if (isCompletedWith) { - var paired = User.find({'profile.username': isCompletedWith.toLowerCase()}).limit(1); - paired.exec(function (err, pairedWithFromMongo) { - if (err) { - return next(err); - } else { - var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); - if (index > -1) { - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedCoursewares.splice(index, 1); - } - var pairedWith = pairedWithFromMongo.pop(); - - req.user.completedCoursewares.push({ - _id: coursewareHash, - name: req.body.coursewareInfo.coursewareName, - completedWith: pairedWith._id, - completedDate: isCompletedDate, - solution: solutionLink, - githubLink: githubLink, - verified: false - }); - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - debug('this is the user object returned %s,' + - ' this is the req.user._id %s, ' + - 'this is the pairedWith._id %s', user, req.user._id, pairedWith._id); - debug(req.user._id.toString() === pairedWith._id.toString()); - if (req.user._id.toString() === pairedWith._id.toString()) { - return res.sendStatus(200); - } - index = pairedWith.uncompletedCoursewares.indexOf(coursewareHash); - if (index > -1) { - pairedWith.progressTimestamps.push(Date.now() || 0); - pairedWith.uncompletedCoursewares.splice(index, 1); - - } - - pairedWith.completedCoursewares.push({ - _id: coursewareHash, - name: req.body.coursewareInfo.coursewareName, - completedWith: req.user._id, - completedDate: isCompletedDate, - solution: solutionLink, - githubLink: githubLink, - verified: false - }); - pairedWith.save(function (err, paired) { - if (err) { - return next(err); - } - if (user && paired) { - return res.sendStatus(200); - } - }); - }); - } - }); - } else { - - req.user.completedCoursewares.push({ - _id: coursewareHash, - name: req.body.coursewareInfo.coursewareName, - completedWith: null, - completedDate: isCompletedDate, - solution: solutionLink, - githubLink: githubLink, - verified: false - }); - - var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); - if (index > -1) { - req.user.progressTimestamps.push(Date.now() || 0); - req.user.uncompletedCoursewares.splice(index, 1); - } - - req.user.save(function (err, user) { - if (err) { - return next(err); - } - if (user) { - return res.sendStatus(200); - } - }); - } -}; diff --git a/public/js/lib/bonfire/bonfireFramework_v0.1.3.js b/public/js/lib/bonfire/bonfireFramework_v0.1.3.js deleted file mode 100644 index 1a75971798..0000000000 --- a/public/js/lib/bonfire/bonfireFramework_v0.1.3.js +++ /dev/null @@ -1,244 +0,0 @@ -var widgets = []; -var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("codeEditor"), { - lineNumbers: true, - mode: "javascript", - theme: 'monokai', - runnable: true, - lint: true, - matchBrackets: true, - autoCloseBrackets: true, - scrollbarStyle: 'null', - lineWrapping: true, - gutters: ["CodeMirror-lint-markers"], - onKeyEvent: doLinting -}); -var editor = myCodeMirror; -editor.setSize("100%", "auto"); - -// Hijack tab key to enter two spaces intead -editor.setOption("extraKeys", { - Tab: function(cm) { - if (cm.somethingSelected()){ - cm.indentSelection("add"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - }, - "Shift-Tab": function(cm) { - if (cm.somethingSelected()){ - cm.indentSelection("subtract"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - }, - "Ctrl-Enter": function() { - bonfireExecute(); - return false; - } -}); - - - -var attempts = 0; -if (attempts) { - attempts = 0; -} - -var codeOutput = CodeMirror.fromTextArea(document.getElementById("codeOutput"), { - lineNumbers: false, - mode: "text", - theme: 'monokai', - readOnly: 'nocursor', - lineWrapping: true -}); - -codeOutput.setValue('/**\n' + -' * Your output will go here.\n' + ' * Console.log() -type statements\n' + -' * will appear in your browser\'s\n' + ' * DevTools JavaScript console.\n' + -' */'); -codeOutput.setSize("100%", "100%"); -var info = editor.getScrollInfo(); -var after = editor.charCoords({line: editor.getCursor().line + 1, ch: 0}, "local").top; -if (info.top + info.clientHeight < after) - editor.scrollTo(null, after - info.clientHeight + 3); - - -var editorValue; - - -var challengeSeed = challengeSeed || null; -var tests = tests || []; - -var allSeeds = ''; -(function() { - challengeSeed.forEach(function(elem) { - allSeeds += elem + '\n'; - }); -})(); - - -myCodeMirror.setValue(editorValue); - -function doLinting () { - editor.operation(function () { - for (var i = 0; i < widgets.length; ++i) - editor.removeLineWidget(widgets[i]); - widgets.length = 0; - JSHINT(editor.getValue()); - for (var i = 0; i < JSHINT.errors.length; ++i) { - var err = JSHINT.errors[i]; - if (!err) continue; - var msg = document.createElement("div"); - var icon = msg.appendChild(document.createElement("span")); - icon.innerHTML = "!!"; - icon.className = "lint-error-icon"; - msg.appendChild(document.createTextNode(err.reason)); - msg.className = "lint-error"; - widgets.push(editor.addLineWidget(err.line - 1, msg, { - coverGutter: false, - noHScroll: true - })); - } - }); -}; - -$('#submitButton').on('click', function () { - bonfireExecute(); -}); - -function bonfireExecute() { - attempts++; - ga('send', 'event', 'Bonfire', 'ran-code', challengeName); - userTests= null; - $('#codeOutput').empty(); - var userJavaScript = myCodeMirror.getValue(); - userJavaScript = removeComments(userJavaScript); - userJavaScript = scrapeTests(userJavaScript); - // simple fix in case the user forgets to invoke their function - - submit(userJavaScript, function(cls, message) { - if (cls) { - codeOutput.setValue(message.error); - runTests('Error', null); - } else { - codeOutput.setValue(message.output); - message.input = removeLogs(message.input); - runTests(null, message); - } - }); -} - - -var userTests; -var testSalt = Math.random(); - - -var scrapeTests = function(userJavaScript) { - - // insert tests from mongo - for (var i = 0; i < tests.length; i++) { - userJavaScript += '\n' + tests[i]; - } - - var counter = 0; - var regex = new RegExp(/(expect(\s+)?\(.*\;)|(assert(\s+)?\(.*\;)|(assert\.\w.*\;)|(.*\.should\..*\;)/); - var match = regex.exec(userJavaScript); - while (match != null) { - var replacement = '//' + counter + testSalt; - userJavaScript = userJavaScript.substring(0, match.index) + replacement + userJavaScript.substring(match.index + match[0].length); - - if (!userTests) { - userTests= []; - } - userTests.push({"text": match[0], "line": counter, "err": null}); - counter++; - match = regex.exec(userJavaScript); - } - - return userJavaScript; -}; - -function removeComments(userJavaScript) { - var regex = new RegExp(/(\/\*[^(\*\/)]*\*\/)|\/\/[^\n]*/g); - return userJavaScript.replace(regex, ''); -} - -function removeLogs(userJavaScript) { - return userJavaScript.replace(/(console\.[\w]+\s*\(.*\;)/g, ''); -} - -var pushed = false; -var createTestDisplay = function() { - if (pushed) { - userTests.pop(); - } - for (var i = 0; i < userTests.length;i++) { - var test = userTests[i]; - var testDoc = document.createElement("div"); - if (test.err != null) { - $(testDoc) - .html("
" + test.text + "
" + test.err + "
") - .prependTo($('#testSuite')) - } else { - $(testDoc) - .html("
" + test.text + "
") - .appendTo($('#testSuite')); - } - }; -}; -var assert = chai.assert; -var expect = chai.expect; -var should = chai.should(); -chai.config.showDiff = true; - -var reassembleTest = function(test, data) { - var lineNum = test.line; - var regexp = new RegExp("\/\/" + lineNum + testSalt); - return data.input.replace(regexp, test.text); -}; - -var runTests = function(err, data) { - var allTestsPassed = true; - pushed = false; - $('#testSuite').children().remove(); - if (err && userTests.length > 0) { - userTests= [{text:"Program Execution Failure", err: "No user tests were run."}]; - createTestDisplay(); - } else if (userTests) { - userTests.push(false); - pushed = true; - userTests.forEach(function(test, ix, arr){ - try { - if (test) { - var output = eval(reassembleTest(test, data)); - } - } catch(error) { - allTestsPassed = false; - arr[ix].err = error.message; - } finally { - if (!test) { - createTestDisplay(); - } - } - }); - - if (allTestsPassed) { - allTestsPassed = false; - showCompletion(); - } - - } -}; - -function showCompletion() { - var time = Math.floor(Date.now()) - started; - ga('send', 'event', 'Challenge', 'solved', challengeName + ', Time: ' + time +', Attempts: ' + attempts); - $('#complete-bonfire-dialog').modal('show'); - $('#complete-bonfire-dialog').keydown(function(e) { - if (e.ctrlKey && e.keyCode == 13) { - $('.next-bonfire-button').click(); - } - }); -} diff --git a/public/js/lib/bonfire/plugin_v0.1.5.js b/public/js/lib/coursewares/plugin_v0.1.5.js similarity index 100% rename from public/js/lib/bonfire/plugin_v0.1.5.js rename to public/js/lib/coursewares/plugin_v0.1.5.js diff --git a/public/js/lib/bonfire/bonfireInit.js b/public/js/lib/coursewares/sandbox.js similarity index 100% rename from public/js/lib/bonfire/bonfireInit.js rename to public/js/lib/coursewares/sandbox.js diff --git a/views/bonfire/bonfire.jade b/views/bonfire/bonfire.jade index a5fdabf7ca..ebabc5a0f4 100644 --- a/views/bonfire/bonfire.jade +++ b/views/bonfire/bonfire.jade @@ -13,7 +13,7 @@ block content link(rel="stylesheet", href="http://fonts.googleapis.com/css?family=Ubuntu+Mono") script(src='/js/lib/codemirror/mode/javascript/javascript.js') script(src='/js/lib/jailed/jailed.js') - script(src='/js/lib/bonfire/bonfireInit.js') + script(src='/js/lib/bonfire/sandbox.js') .row script(type="text/javascript"). var tests = !{JSON.stringify(tests)}; diff --git a/views/bonfire/show.jade b/views/bonfire/show.jade index 087dea3568..bd5e999af8 100644 --- a/views/bonfire/show.jade +++ b/views/bonfire/show.jade @@ -14,7 +14,7 @@ block content link(rel="stylesheet", href="http://fonts.googleapis.com/css?family=Ubuntu+Mono") script(type='text/javascript', src='/js/lib/codemirror/mode/javascript/javascript.js') script(type='text/javascript', src='/js/lib/jailed/jailed.js') - script(type='text/javascript', src='/js/lib/bonfire/bonfireInit.js') + script(type='text/javascript', src='/js/lib/coursewares/sandbox.js') .row .col-xs-12.col-sm-12.col-md-4.bonfire-top diff --git a/views/coursewares/showHTML.jade b/views/coursewares/showHTML.jade index c613866594..50f20eb569 100644 --- a/views/coursewares/showHTML.jade +++ b/views/coursewares/showHTML.jade @@ -14,7 +14,7 @@ block content link(rel="stylesheet", href="http://fonts.googleapis.com/css?family=Ubuntu+Mono") script(src='/js/lib/codemirror/mode/javascript/javascript.js') script(src='/js/lib/jailed/jailed.js') - script(src='/js/lib/bonfire/bonfireInit.js') + script(src='/js/lib/bonfire/sandbox.js') script(src='/js/lib/codemirror/mode/xml/xml.js') script(src='/js/lib/codemirror/mode/css/css.js') script(src='/js/lib/codemirror/mode/htmlmixed/htmlmixed.js') diff --git a/views/coursewares/showJS.jade b/views/coursewares/showJS.jade index 8fe21bb4f1..f881f8f9cf 100644 --- a/views/coursewares/showJS.jade +++ b/views/coursewares/showJS.jade @@ -13,7 +13,7 @@ block content link(rel="stylesheet", href="http://fonts.googleapis.com/css?family=Ubuntu+Mono") script(src='/js/lib/codemirror/mode/javascript/javascript.js') script(src='/js/lib/jailed/jailed.js') - script(src='/js/lib/bonfire/bonfireInit.js') + script(src='/js/lib/coursewares/sandbox.js') .row .col-xs-12.col-sm-12.col-md-4.bonfire-top #testCreatePanel