diff --git a/controllers/challenge.js b/controllers/challenge.js
index 621d58ef41..d3af11c5be 100644
--- a/controllers/challenge.js
+++ b/controllers/challenge.js
@@ -136,7 +136,7 @@ exports.returnCurrentChallenge = function(req, res, next) {
var nameString = req.user.currentChallenge.challengeName.trim()
.toLowerCase()
.replace(/\s/g, '-')
- .replace(/[^a-z0-9\-]/gi, '');
+ .replace(/[^a-z0-9\-\/.]/gi, '');
req.user.save(function(err) {
if (err) {
return next(err);
@@ -171,7 +171,7 @@ exports.returnIndividualChallenge = function(req, res, next) {
var dashedNameFull = challenge.name
.toLowerCase()
.replace(/\s/g, '-')
- .replace(/[^a-z0-9\-]/gi, '');
+ .replace(/[^a-z0-9\-\.]/gi, '');
if (dashedNameFull !== dashedName) {
return res.redirect('../challenges/' + dashedNameFull);
} else {
diff --git a/seed_data/challenges/basic-bonfires.json b/seed_data/challenges/basic-bonfires.json
index aa9f46a4a5..e9a01a9a3d 100644
--- a/seed_data/challenges/basic-bonfires.json
+++ b/seed_data/challenges/basic-bonfires.json
@@ -27,8 +27,7 @@
"Mark this Waypoint complete and move on."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "ad7123c8c441eddfaeb5bdef",
diff --git a/seed_data/challenges/basic-javascript.json b/seed_data/challenges/basic-javascript.json
index bd531192d7..6cd9fc39c2 100644
--- a/seed_data/challenges/basic-javascript.json
+++ b/seed_data/challenges/basic-javascript.json
@@ -15,8 +15,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-x9DnD/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7130d8c441eddfaeb5bdef",
@@ -29,8 +28,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-Bthev-mskY8/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7131d8c441eddfaeb5bdef",
@@ -43,8 +41,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-XEDZA/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7132d8c441eddfaeb5bdef",
@@ -56,8 +53,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-mrTNH-6VIZ9/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7133d8c441eddfaeb5bdef",
@@ -71,8 +67,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-ZA2rb/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7134d8c441eddfaeb5bdef",
@@ -85,8 +80,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/javascript-beginner-en-3bmfN/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7135d8c441eddfaeb5bdef",
@@ -99,8 +93,7 @@
"Be sure to also complete this section: http://www.codecademy.com/courses/building-an-address-book/0/1?curriculum_id=506324b3a7dffd00020bf661."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7136d8c441eddfaeb5bdef",
@@ -113,12 +106,11 @@
"Be sure to also complete the final section: http://www.codecademy.com/courses/close-the-super-makert/0/1."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7118d8c441eddfaeb5bdef",
- "name": "Waypoint: Discover Chrome's DevTools",
+ "name": "Waypoint: Discover Chrome DevTools",
"difficulty": 0.32,
"challengeSeed": "110752743",
"description": [
@@ -135,8 +127,7 @@
"Complete \"Chapter 7: Memory Profiling\"."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
},
{
"_id": "bd7138d8c441eddfaeb5bdef",
@@ -158,8 +149,7 @@
"Once you've completed these challenges, move on to our next Waypoint."
],
"challengeType": 2,
- "tests": [],
- "challengeType": 0
+ "tests": []
}
]
}
diff --git a/seed_data/challenges/full-stack-javascript.json b/seed_data/challenges/full-stack-javascript.json
index 62b9f36f9a..feeb71ba1b 100644
--- a/seed_data/challenges/full-stack-javascript.json
+++ b/seed_data/challenges/full-stack-javascript.json
@@ -144,7 +144,7 @@
"_id": "bd7153d8c441eddfaeb5bdfe",
"name": "Waypoint: Continue working with Node.js Servers",
"difficulty": 0.41,
- "challengeSeed": "126411561",
+ "challengeSeed": "128836506",
"description": [
"Let's continue the LearnYouNode Node School challenge. For this Waypoint, we'll do challenges 8 through 10.",
"Make sure that you are always in your project's \"workspace\" directory. You can always navigate back to this directory by running this command: cd ~/workspace
.",
@@ -161,7 +161,7 @@
"_id": "bd7153d8c441eddfaeb5bdfd",
"name": "Waypoint: Finish working with Node.js Servers",
"difficulty": 0.42,
- "challengeSeed": "126411561",
+ "challengeSeed": "128836507",
"description": [
"Let's continue the LearnYouNode Node School challenge. For this Waypoint, we'll do challenges 11 through 13.",
"Make sure that you are always in your project's \"workspace\" directory. You can always navigate back to this directory by running this command: cd ~/workspace
.",
diff --git a/seed_data/challenges/functional-programming.json b/seed_data/challenges/functional-programming.json
index bf5a9a9666..67f6a3b3f0 100644
--- a/seed_data/challenges/functional-programming.json
+++ b/seed_data/challenges/functional-programming.json
@@ -9,10 +9,10 @@
"challengeSeed": "114604814",
"description": [
"Functional programming holds the key to unlocking JavaScript's powerful asynchronous features.",
- "Functional programming in JavaScript involves using five key functions: \"map\", \"reduce\", \"filter\", \"concatAll\", and \"zip\".",
"Jafar Husain's 42-step interactive Functional Programming course will familiarize you with the various ways you can recombine these functions.",
+ "Functional programming in JavaScript involves using five key functions: \"map\", \"reduce\", \"filter\", \"concatAll\", and \"zip\".",
"Click here to go to the challenge: http://jhusain.github.io/learnrx/.",
- "This challenge will take several hours, but don't worry. Husain's website will save your progress (using your browser's local storage) so you don't need to finish it in one sitting.",
+ "This challenge will take several hours, but don't worry. Jafar's website will save your progress (using your browser's local storage) so you don't need to finish it in one sitting.",
"If you've spent several minutes on one of these challenges, and still can't figure out its correct answer, you can click \"show answer\", then click \"run\" to advance to the next challenge. Be sure to read the correct answer and make sure you understand it before moving on."
],
"challengeType": 2,
diff --git a/seed_data/challenges/object-oriented-javascript.json b/seed_data/challenges/object-oriented-javascript.json
index c15d186f45..feee80d16c 100644
--- a/seed_data/challenges/object-oriented-javascript.json
+++ b/seed_data/challenges/object-oriented-javascript.json
@@ -6,14 +6,14 @@
"_id": "bd7129d8c441eddfaeb5bddf",
"name": "Waypoint: Scope Your Variables",
"difficulty": 0.01,
- "challengeSeed": "114604814",
+ "challengeSeed": "128836683",
"description": [
"Objects will allow you to build applications more efficiently by using small, reusable blocks of code.",
"This course on Udacity will help you learn Object-Oriented Programming in JavaScript.",
- "First, we'll learn how JavaScript works in terms of scopes. You'll learn the difference between a \"Lexical Scope\" and an Execution Context.",
- "This theoretical foundation is useful for understanding when an a variable can be accessed and when it can't.",
+ "First, we'll learn how JavaScript works in terms of scopes. You'll learn the difference between a \"Lexical Scope\" and an \"Execution Context\".",
+ "This theoretical foundation is useful for understanding when a variable can be accessed and when it can't.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668697/m-2541189051 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668697/m-2541189051 and start the course.",
"Once you've completed this first section of scopes, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2
@@ -22,13 +22,13 @@
"_id": "bd7131d8c441eddfaeb5bdbf",
"name": "Waypoint: Reference your Current Object with This",
"difficulty": 0.03,
- "challengeSeed": "114614220",
+ "challengeSeed": "128836508",
"description": [
- "In this section, you'll learn how you can use this
to dynamically point to your current object.",
- "For example, if we were inside the function camper.completeCourse()
, this
would refer to the specific camper we were running the function on.",
- "Note that this section has several trick questions, designed to make you think. Don't get hung up on them, just keep moving forward.",
+ "In this section, you'll learn how you can use the keyword this
to dynamically point to your current object.",
+ "For example, if we were inside the function camper.completeCourse()
, this
would refer to the specific camper upon which we were running the function.",
+ "Note that this section poses several trick questions that were designed to make you think. Don't get hung up on them, just keep moving forward.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668699/m-2780408563 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668699/m-2780408563 and start the course.",
"Once you've completed this section of using the keyword this
, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -38,12 +38,12 @@
"_id": "bd7132d8c441eddfaeb5bdaf",
"name": "Waypoint: Traverse the Prototype Chain",
"difficulty": 0.04,
- "challengeSeed": "114612889",
+ "challengeSeed": "128836684",
"description": [
"Next we'll learn about the multiple ways you can create a copy of an object.",
"We'll also learn how an object's missing attributes can traverse the \"prototype chain\".",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668700/m-2616738615 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2593668700/m-2616738615 and start the course.",
"Once you've completed this section on prototype chain traversal, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -53,13 +53,13 @@
"_id": "bd7133d8c441eddfaeb5bd0f",
"name": "Waypoint: Reuse Code with Decorators",
"difficulty": 0.05,
- "challengeSeed": "114612888",
+ "challengeSeed": "128836681",
"description": [
- "In this section, we'll learn about the Decorator Pattern.",
- "The Decorator pattern will help you \"decorate\" an existing object with additional attributes. This pattern helps you reuse code, reducing the total amount of code you'll need to write and maintain.",
+ "In this section, we'll learn about the \"Decorator Pattern\".",
+ "The Decorator Pattern will help you \"decorate\" an existing object with additional attributes. This pattern helps you reuse code, reducing the total amount of code you'll need to write and maintain.",
"It's a convenient way to add functionality to objects without changing their underlying structure.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468536/m-2697628561 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468536/m-2697628561 and start the course.",
"Once you've completed this section of decorators, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -69,13 +69,13 @@
"_id": "bd7134d8c441eddfaeb5bd1f",
"name": "Waypoint: Build Objects with Functional Classes",
"difficulty": 0.06,
- "challengeSeed": "114612887",
+ "challengeSeed": "128836503",
"description": [
"Now we'll go over the simplest way to implement a JavaScript class.",
"A class is a set of functions that you can use to easily produce similar objects.",
- "You may have heard JavaScript doesn't have classes. This is technically true, but don't let it get in the way of the very important ideas in this section.",
+ "You may have heard JavaScript doesn't have classes. While this is technically true, don't let this fact prevent you from learning the important concepts in this section.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468537/m-2961989110 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468537/m-2961989110 and start the course.",
"Once you've completed this section of functional classes, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -85,13 +85,13 @@
"_id": "bd7135d8c441eddfaeb5bd2f",
"name": "Waypoint: Build Objects with Prototypal Classes",
"difficulty": 0.07,
- "challengeSeed": "114612885",
+ "challengeSeed": "128836505",
"description": [
"Now we'll learn how one object can be prototyped off of another object.",
- "Objects delegate their \"failed lookups\" up the \"prototype chain\".",
- "This means that if I create a second object based off another object, then try to access an attribute the second object doesn't have, JavaScript will \"fall through\" to the original object to see whether it has that attribute.",
+ "Objects will delegate their \"failed lookups\" on up through the \"prototype chain\".",
+ "This means that when you create a second object based off another object, then try to access an attribute that the second object doesn't have, JavaScript will \"fall through\" to the original object to see whether it has that attribute.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468538/m-3034538557 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468538/m-3034538557 and start the course.",
"Once you've completed this section of prototypal classes, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -101,13 +101,13 @@
"_id": "bd7136d8c441eddfaeb5bd3f",
"name": "Waypoint: Understand Pseudoclassical Patterns",
"difficulty": 0.08,
- "challengeSeed": "114612882",
+ "challengeSeed": "128836689",
"description": [
- "JavaScript doesn't have the traditional \"classes\" that lower-level languages like C and Java have.",
+ "JavaScript doesn't have the traditional \"classes\" that lower-level languages like C++ and Java have.",
"Instead, JavaScript does some tricks to allow you to write code as though it had these traditional classes. We call these \"pseudo-classes\".",
- "In this section, we'll learn how to build these pseudo-classes, and some tricks for later figuring out where these objects came from.",
+ "In this section, we'll learn how to build these pseudo-classes. We'll also learn some tricks for figuring out where these objects originally came from.",
"You can save your progress by creating a free Udacity account, but note that it's also possible to complete this entire course without an account by following the links we provide.",
- "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468539/e-2783098540/m-2695768694 and start the course.",
+ "Go to https://www.udacity.com/course/viewer#!/c-ud015/l-2794468539/e-2783098540/m-2695768694 and start the course.",
"Once you've completed this section pseudoclasses, mark this Waypoint complete and move on to the next one."
],
"challengeType": 2,
@@ -117,12 +117,12 @@
"_id": "bd7136d8c441eddfaeb5bd4f",
"name": "Waypoint: Subclass one Object to Another",
"difficulty": 0.09,
- "challengeSeed": "114612882",
+ "challengeSeed": "128836686",
"description": [
- "Now we know the three ways of creating objects (through functions, prototyping and pseudo classing).",
- "Let's learn how to subclass one object to another. This will give our new object the attributes of the original object. It will allow us to make further modifications new object without affecting the original object.",
+ "Now we know the three ways that we can create objects. Through: