diff --git a/.jshintrc b/.jshintrc
index 7d01fdaf66..fe8c79be7b 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -16,7 +16,6 @@
"strict": false, // Require `use strict` pragma in every file.
"trailing": true, // Prohibit trailing whitespaces.
"smarttabs": false, // Suppresses warnings about mixed tabs and spaces
- "esnext": true, // Allow ES6 maybe :p
"globals": { // Globals variables.
"jasmine": true,
"angular": true,
diff --git a/client/commonFramework/bindings.js b/client/commonFramework/bindings.js
index 0c4d5b6fc4..18b98fb29e 100644
--- a/client/commonFramework/bindings.js
+++ b/client/commonFramework/bindings.js
@@ -2,7 +2,8 @@ window.common = (function(global) {
const {
$,
Rx: { Observable },
- common = { init: [] }
+ common = { init: [] },
+ Mousetrap
} = global;
common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {
@@ -42,6 +43,11 @@ window.common = (function(global) {
);
});
+ // set focus keybind
+ Mousetrap.bind(['command+shift+e', 'ctrl+shift+e'], () => {
+ common.editor.focus();
+ });
+
// video checklist binding
$('.challenge-list-checkbox').on('change', function() {
var checkboxId = $(this).parent().parent().attr('id');
diff --git a/client/commonFramework/init.js b/client/commonFramework/init.js
index ff4130efd1..e054bab6c1 100644
--- a/client/commonFramework/init.js
+++ b/client/commonFramework/init.js
@@ -28,7 +28,7 @@ window.common = (function(global) {
seedData = Array.isArray(seedData) ? seedData : [seedData];
return seedData.reduce(function(seed, line) {
return '' + seed + line + '\n';
- }, '');
+ }, '\n');
};
common.seed = common.arrayToNewLineString(common.challengeSeed);
diff --git a/client/less/main.less b/client/less/main.less
index 672eccc002..192581626a 100644
--- a/client/less/main.less
+++ b/client/less/main.less
@@ -499,6 +499,22 @@ thead {
}
}
+a[href="/email-signup"], a[href="/email-signin"] {
+ &.btn-social.btn-lg > :first-child {
+ line-height:43px;
+ font-size:26px;
+ }
+}
+
+form.email-update .btn{
+ margin:0;
+ width:40%;
+ display:inline-block;
+ &:last-child {
+ float:right;
+ }
+}
+
.public-profile-img {
height: 200px;
width: 200px;
diff --git a/common/models/user.js b/common/models/user.js
index 3f99fbba51..e406eecf1c 100644
--- a/common/models/user.js
+++ b/common/models/user.js
@@ -306,6 +306,48 @@ module.exports = function(User) {
}
);
+ User.prototype.updateEmail = function updateEmail(email) {
+ if (this.email && this.email === email) {
+ return Promise.reject(new Error(
+ `${email} is already associated with this account.`
+ ));
+ }
+ return User.doesExist(null, email)
+ .then(exists => {
+ if (exists) {
+ return Promise.reject(
+ new Error(`${email} is already associated with another account.`)
+ );
+ }
+ return this.update$({ email }).toPromise();
+ });
+ };
+
+ User.remoteMethod(
+ 'updateEmail',
+ {
+ isStatic: false,
+ description: 'updates the email of the user object',
+ accepts: [
+ {
+ arg: 'email',
+ type: 'string',
+ required: true
+ }
+ ],
+ returns: [
+ {
+ arg: 'status',
+ type: 'object'
+ }
+ ],
+ http: {
+ path: '/update-email',
+ verb: 'POST'
+ }
+ }
+ );
+
User.giveBrowniePoints =
function giveBrowniePoints(receiver, giver, data = {}, dev = false, cb) {
const findUser = observeMethod(User, 'findOne');
diff --git a/common/models/user.json b/common/models/user.json
index 3bdfb8be7d..ad7294688d 100644
--- a/common/models/user.json
+++ b/common/models/user.json
@@ -235,6 +235,13 @@
"principalId": "$everyone",
"permission": "ALLOW",
"property": "giveBrowniePoints"
+ },
+ {
+ "accessType": "EXECUTE",
+ "principalType": "ROLE",
+ "principalId": "$owner",
+ "permission": "ALLOW",
+ "property": "updateEmail"
}
],
"methods": []
diff --git a/package.json b/package.json
index 4ac012c6c1..9fae5eb92c 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,7 @@
"compression": "^1.6.0",
"connect-mongo": "~1.1.0",
"cookie-parser": "^1.4.0",
+ "csurf": "^1.8.3",
"debug": "^2.2.0",
"dedent": "~0.6.0",
"dotenv": "^2.0.0",
diff --git a/seed/bonfireMDNlinks.js b/seed/bonfireMDNlinks.js
index 43e382a176..12d13e26ab 100644
--- a/seed/bonfireMDNlinks.js
+++ b/seed/bonfireMDNlinks.js
@@ -43,7 +43,7 @@ var links = {
// ======== STRING METHODS
"String.charAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt",
- "String.charCodeAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt",
+ "String.prototype.charCodeAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt",
"String.concat()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat",
"String.indexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf",
"String.fromCharCode()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode",
diff --git a/seed/challenges/01-front-end-development-certification/advanced-bonfires.json b/seed/challenges/01-front-end-development-certification/advanced-bonfires.json
index 9e0bb1c285..323d26de85 100644
--- a/seed/challenges/01-front-end-development-certification/advanced-bonfires.json
+++ b/seed/challenges/01-front-end-development-certification/advanced-bonfires.json
@@ -148,7 +148,7 @@
"assert.isString(checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return a string.');",
"assert.isString(checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return a string.');",
"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"QUARTER\", 0.50]], 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])
should return [[\"QUARTER\", 0.50]]
.');",
- "assert.deepEqual(checkCashRegister(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]], 'message: checkCashRegister(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])
should return [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15], [\"ONE\", 1], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]]
.');",
+ "assert.deepEqual(checkCashRegister(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]]), [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15.00], [\"ONE\", 1.00], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]], 'message: checkCashRegister(3.26, 100.00, [[\"PENNY\", 1.01], [\"NICKEL\", 2.05], [\"DIME\", 3.10], [\"QUARTER\", 4.25], [\"ONE\", 90.00], [\"FIVE\", 55.00], [\"TEN\", 20.00], [\"TWENTY\", 60.00], [\"ONE HUNDRED\", 100.00]])
should return [[\"TWENTY\", 60.00], [\"TEN\", 20.00], [\"FIVE\", 15.00], [\"ONE\", 1.00], [\"QUARTER\", 0.50], [\"DIME\", 0.20], [\"PENNY\", 0.04]]
.');",
"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Insufficient Funds\".');",
"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Insufficient Funds\", 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.01], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 1.00], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Insufficient Funds\".');",
"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]]), \"Closed\", 'message: checkCashRegister(19.50, 20.00, [[\"PENNY\", 0.50], [\"NICKEL\", 0], [\"DIME\", 0], [\"QUARTER\", 0], [\"ONE\", 0], [\"FIVE\", 0], [\"TEN\", 0], [\"TWENTY\", 0], [\"ONE HUNDRED\", 0]])
should return \"Closed\".');"
@@ -244,7 +244,10 @@
"assert.strictEqual(permAlone('aabb'), 8, 'message: permAlone(\"aabb\")
should return 8.');",
"assert.strictEqual(permAlone('abcdefa'), 3600, 'message: permAlone(\"abcdefa\")
should return 3600.');",
"assert.strictEqual(permAlone('abfdefa'), 2640, 'message: permAlone(\"abfdefa\")
should return 2640.');",
- "assert.strictEqual(permAlone('zzzzzzzz'), 0, 'message: permAlone(\"zzzzzzzz\")
should return 0.');"
+ "assert.strictEqual(permAlone('zzzzzzzz'), 0, 'message: permAlone(\"zzzzzzzz\")
should return 0.');",
+ "assert.strictEqual(permAlone('a'), 1, 'message: permAlone(\"a\")
should return 1.');",
+ "assert.strictEqual(permAlone('aaab'), 0, 'message: permAlone(\"aaab\")
should return 0.');",
+ "assert.strictEqual(permAlone('aaabb'), 12, 'message: permAlone(\"aaabb\")
should return 12.');"
],
"type": "bonfire",
"MDNlinks": [
@@ -368,7 +371,7 @@
"The array will contain objects in the format {name: 'name', avgAlt: avgAlt}
.",
"You can read about orbital periods on wikipedia.",
"The values should be rounded to the nearest whole number. The body being orbited is Earth.",
- "The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418",
+ "The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418 km3s-2.",
"Remember to use Read-Search-Ask if you get stuck. Try to pair program. Write your own code."
],
"challengeSeed": [
@@ -398,7 +401,7 @@
"El arreglo debe contener objetos en el formato {name: 'name', avgAlt: avgAlt}
.",
"Puedes leer acerca de períodos orbitales en wikipedia.",
"Los valores deben estar redondeados al número entero más próximo. El cuerpo orbitado es la Tierra",
- "El radio de la Tierra es 6367.4447 kilómetros, y el valor GM del planeta es de 398600.4418",
+ "El radio de la Tierra es 6367.4447 kilómetros, y el valor GM del planeta es de 398600.4418 km3s-2.",
"Recuerda utilizar Read-Search-Ask si te sientes atascado. Intenta programar en pareja. Escribe tu propio código."
]
},
diff --git a/seed/challenges/01-front-end-development-certification/basic-bonfires.json b/seed/challenges/01-front-end-development-certification/basic-bonfires.json
index 630dcbe61e..8cd435739d 100644
--- a/seed/challenges/01-front-end-development-certification/basic-bonfires.json
+++ b/seed/challenges/01-front-end-development-certification/basic-bonfires.json
@@ -542,7 +542,8 @@
"assert(mutation([\"Mary\", \"Aarmy\"]) === true, 'message: mutation([\"Mary\", \"Aarmy\"])
should return true.');",
"assert(mutation([\"Alien\", \"line\"]) === true, 'message: mutation([\"Alien\", \"line\"])
should return true.');",
"assert(mutation([\"floor\", \"for\"]) === true, 'message: mutation([\"floor\", \"for\"])
should return true.');",
- "assert(mutation([\"hello\", \"neo\"]) === false, 'message: mutation([\"hello\", \"neo\"])
should return false.');"
+ "assert(mutation([\"hello\", \"neo\"]) === false, 'message: mutation([\"hello\", \"neo\"])
should return false.');",
+ "assert(mutation([\"voodoo\", \"no\"]) === false, 'message: mutation([\"voodoo\", \"no\"])
should return false.');"
],
"type": "bonfire",
"isRequired": true,
@@ -715,7 +716,7 @@
],
"type": "bonfire",
"MDNlinks": [
- "String.charCodeAt()",
+ "String.prototype.charCodeAt()",
"String.fromCharCode()"
],
"challengeType": 5,
diff --git a/seed/challenges/01-front-end-development-certification/basic-javascript.json b/seed/challenges/01-front-end-development-certification/basic-javascript.json
index 2d4007353b..410860c8e6 100644
--- a/seed/challenges/01-front-end-development-certification/basic-javascript.json
+++ b/seed/challenges/01-front-end-development-certification/basic-javascript.json
@@ -46,7 +46,7 @@
"id": "bd7123c9c443eddfaeb5bdef",
"title": "Declare JavaScript Variables",
"description": [
- "In computer science, data is anything that is meaningful to the computer. JavaScript provides seven different data types which are undefined
, null
, Boolean
, string
, symbol
, number
, and object
.",
+ "In computer science, data is anything that is meaningful to the computer. JavaScript provides seven different data types which are Undefined
, Null
, Boolean
, String
, Symbol
, Number
, and Object
.",
"For example, computers distinguish between numbers, such as the number 12
, and strings
, such as \"12\"
, \"dog\"
, or \"123 cats\"
, which are collections of characters. Computers can perform mathematical operations on a number, but not on a string.",
"Variables allow computers to store and manipulate data in a dynamic fashion. They do this by using a \"label\" to point to the data rather than using the data itself. Any of the seven data types may be stored in a variable.",
"Variables
are similar to the x and y variables you use in mathematics, which means they're a simple name to represent the data we want to refer to. Computer variables
differ from mathematical variables in that they can store different values at different times.",
@@ -433,7 +433,8 @@
"i = i + 1;
",
"Note
The entire line becomes i++;
, eliminating the need for the equal sign.",
"
++
operator on myVar
."
+ "Change the code to use the ++
operator on myVar
.",
+ "Hint"
) and four escaped double quotes (\"
) ');",
- "assert(myStr === \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"\", 'message: Variable myStr should equal to (\"I am a \"double quoted\" string inside \"double quotes\"\"
).');"
+ "assert(myStr === \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"\", 'message: Variable myStr should equal to (I am a \"double quoted\" string inside \"double quotes\"
).');"
],
"type": "waypoint",
"challengeType": 1,
@@ -2733,7 +2734,7 @@
"assert(testStrict(10) === \"Not Equal\", 'message: testStrict(10)
should return \"Not Equal\"');",
"assert(testStrict(7) === \"Equal\", 'message: testStrict(7)
should return \"Equal\"');",
"assert(testStrict(\"7\") === \"Not Equal\", 'message: testStrict(\"7\")
should return \"Not Equal\"');",
- "assert(code.match(/val\\s*===\\s*\\d+/g).length > 0, 'message: You should use the ===
operator');"
+ "assert(code.match(/(val\\s*===\\s*\\d+)|(\\d+\\s*===\\s*val)/g).length > 0, 'message: You should use the ===
operator');"
],
"type": "waypoint",
"challengeType": 1,
@@ -3507,11 +3508,11 @@
"function switchOfStuff(val) {\n var answer = \"\";\n\n switch(val) {\n case \"a\":\n answer = \"apple\";\n break;\n case \"b\":\n answer = \"bird\";\n break;\n case \"c\":\n answer = \"cat\";\n break;\n default:\n answer = \"stuff\";\n }\n return answer; \n}"
],
"tests": [
- "assert(switchOfStuff(\"a\") === \"apple\", 'message: switchOfStuff(\"a\") should have a value of \"apple\"');",
- "assert(switchOfStuff(\"b\") === \"bird\", 'message: switchOfStuff(\"b\") should have a value of \"bird\"');",
- "assert(switchOfStuff(\"c\") === \"cat\", 'message: switchOfStuff(\"c\") should have a value of \"cat\"');",
- "assert(switchOfStuff(\"d\") === \"stuff\", 'message: switchOfStuff(\"d\") should have a value of \"stuff\"');",
- "assert(switchOfStuff(4) === \"stuff\", 'message: switchOfStuff(4) should have a value of \"stuff\"');",
+ "assert(switchOfStuff(\"a\") === \"apple\", 'message: switchOfStuff(\"a\")
should have a value of \"apple\"');",
+ "assert(switchOfStuff(\"b\") === \"bird\", 'message: switchOfStuff(\"b\")
should have a value of \"bird\"');",
+ "assert(switchOfStuff(\"c\") === \"cat\", 'message: switchOfStuff(\"c\")
should have a value of \"cat\"');",
+ "assert(switchOfStuff(\"d\") === \"stuff\", 'message: switchOfStuff(\"d\")
should have a value of \"stuff\"');",
+ "assert(switchOfStuff(4) === \"stuff\", 'message: switchOfStuff(4)
should have a value of \"stuff\"');",
"assert(!/else/g.test(code) || !/if/g.test(code), 'message: You should not use any if
or else
statements');",
"assert(code.match(/break/g).length > 2, 'message: You should have at least 3 break
statements');"
],
diff --git a/seed/challenges/01-front-end-development-certification/basic-ziplines.json b/seed/challenges/01-front-end-development-certification/basic-ziplines.json
index e95954309a..156b6f5fae 100644
--- a/seed/challenges/01-front-end-development-certification/basic-ziplines.json
+++ b/seed/challenges/01-front-end-development-certification/basic-ziplines.json
@@ -180,7 +180,7 @@
"Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/FreeCodeCamp/full/YqLyXB/.",
"Rule #1: Don't look at the example project's code. Figure it out for yourself.",
"Rule #2: Fulfill the below user stories. Use whichever libraries you need. Give it your own personal style.",
- "Rule #3: You may use your own CSS and frameworks other than Bootstrap.",
+ "Rule #3: You can use Bootstrap, or any other framework of your choice.",
"User Story: I can access all of the portfolio webpage's content just by scrolling.",
"User Story: I can click different buttons that will take me to the portfolio creator's different social media pages.",
"User Story: I can see thumbnail images of different projects the portfolio creator has built (if you haven't built any websites before, use placeholders.)",
diff --git a/seed/challenges/01-front-end-development-certification/bootstrap.json b/seed/challenges/01-front-end-development-certification/bootstrap.json
index 55ef24f68a..323a88e233 100644
--- a/seed/challenges/01-front-end-development-certification/bootstrap.json
+++ b/seed/challenges/01-front-end-development-certification/bootstrap.json
@@ -8,7 +8,7 @@
"id": "bad87fee1348bd9acde08712",
"title": "Use Responsive Design with Bootstrap Fluid Containers",
"description": [
- "Now let's go back to our Cat Photo App. This time, we'll style it using the popular Bootstrap responsive CSS framework.",
+ "In the HTML5 and CSS section of FreeCodeCamp we built a Cat Photo App. Now let's go back to it. This time, we'll style it using the popular Bootstrap responsive CSS framework.",
"Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design
.",
"With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.",
"You can add Bootstrap to any app just by including it by adding the following code to the top of your HTML:",
diff --git a/seed/challenges/01-front-end-development-certification/html5-and-css.json b/seed/challenges/01-front-end-development-certification/html5-and-css.json
index 6685ae4827..ff20498cb1 100644
--- a/seed/challenges/01-front-end-development-certification/html5-and-css.json
+++ b/seed/challenges/01-front-end-development-certification/html5-and-css.json
@@ -317,7 +317,7 @@
],
"title": "Fill in the Blank with Placeholder Text",
"description": [
- "Web developers traditionally use lorem ipsum text
as placeholder text. It's called lorem ipsum text because those are the first two words of a famous passage by Cicero of Ancient Rome.",
+ "Web developers traditionally use lorem ipsum text
as placeholder text. The 'lorem ipsum' text is randomly scraped from a famous passage by Cicero of Ancient Rome.",
"Lorem ipsum text has been used as placeholder text by typesetters since the 16th century, and this tradition continues on the web.",
"Well, 5 centuries is long enough. Since we're building a CatPhotoApp, let's use something called kitty ipsum text
.",
"Replace the text inside your p
element with the first few words of this kitty ipsum text: Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
@@ -3830,7 +3830,8 @@
],
"tests": [
"assert($(\"body\").css(\"background-color\") === \"rgb(0, 0, 0)\", 'message: Give your body
element the background-color
of black.');",
- "assert(code.match(/