Skip to content
Browse files

complete check file

  • Loading branch information...
1 parent 3f9e427 commit d77b5bd79e0112b4729d6eb0917c56c7c64585fd Ubuntu committed Jul 12, 2013
Showing with 90 additions and 0 deletions.
  1. +16 −0 checks.json
  2. +74 −0 grader.js
View
16 checks.json
@@ -0,0 +1,16 @@
+["h1",
+ ".navigation"
+,".logo",
+".blank",
+".about",
+".heading",
+".subheading",
+".pitch",
+".video",
+".thermometer",
+".order",
+".social",
+".section1",
+".section2",
+".faq",
+".footer"]
View
74 grader.js
@@ -0,0 +1,74 @@
+#!/usr/bin/env node
+/*
+Automatically grade files for the presence of specified HTML tags/attributes.
+Uses commander.js and cheerio. Teaches command line application development
+and basic DOM parsing.
+
+References:
+
+ + cheerio
+ - https://github.com/MatthewMueller/cheerio
+ - http://encosia.com/cheerio-faster-windows-friendly-alternative-jsdom/
+ - http://maxogden.com/scraping-with-node.html
+
+ + commander.js
+ - https://github.com/visionmedia/commander.js
+ - http://tjholowaychuk.com/post/9103188408/commander-js-nodejs-command-line-interfaces-made-easy
+
+ + JSON
+ - http://en.wikipedia.org/wiki/JSON
+ - https://developer.mozilla.org/en-US/docs/JSON
+ - https://developer.mozilla.org/en-US/docs/JSON#JSON_in_Firefox_2
+*/
+
+var fs = require('fs');
+var program = require('commander');
+var cheerio = require('cheerio');
+var HTMLFILE_DEFAULT = "index.html";
+var CHECKSFILE_DEFAULT = "checks.json";
+
+var assertFileExists = function(infile) {
+ var instr = infile.toString();
+ if(!fs.existsSync(instr)) {
+ console.log("%s does not exist. Exiting.", instr);
+ process.exit(1); // http://nodejs.org/api/process.html#process_process_exit_code
+ }
+ return instr;
+};
+
+var cheerioHtmlFile = function(htmlfile) {
+ return cheerio.load(fs.readFileSync(htmlfile));
+};
+
+var loadChecks = function(checksfile) {
+ return JSON.parse(fs.readFileSync(checksfile));
+};
+
+var checkHtmlFile = function(htmlfile, checksfile) {
+ $ = cheerioHtmlFile(htmlfile);
+ var checks = loadChecks(checksfile).sort();
+ var out = {};
+ for(var ii in checks) {
+ var present = $(checks[ii]).length > 0;
+ out[checks[ii]] = present;
+ }
+ return out;
+};
+
+var clone = function(fn) {
+ // Workaround for commander.js issue.
+ // http://stackoverflow.com/a/6772648
+ return fn.bind({});
+};
+
+if(require.main == module) {
+ program
+ .option('-c, --checks <check_file>', 'Path to checks.json', clone(assertFileExists), CHECKSFILE_DEFAULT)
+ .option('-f, --file <html_file>', 'Path to index.html', clone(assertFileExists), HTMLFILE_DEFAULT)
+ .parse(process.argv);
+ var checkJson = checkHtmlFile(program.file, program.checks);
+ var outJson = JSON.stringify(checkJson, null, 4);
+ console.log(outJson);
+} else {
+ exports.checkHtmlFile = checkHtmlFile;
+}

0 comments on commit d77b5bd

Please sign in to comment.
Something went wrong with that request. Please try again.