diff --git a/bin/deck b/bin/deck index e164d62..f43e49f 100755 --- a/bin/deck +++ b/bin/deck @@ -3,10 +3,8 @@ var fs = require('fs'); var path = require('path'); -var exec = require('child_process').exec; var _ = require('lodash'); -var async = require('async'); var express = require('express'); var handlebars = require('handlebars'); @@ -52,28 +50,16 @@ function index(req, res) { app.get('/', index); -function serveIfExists(path) { - return function _serveIfExists(cb) { - fs.exists(path, function (exists) { - if (!exists) { - cb(null, null); - return; - } - fs.readFile(path, {encoding: 'utf8'}, cb); - }); - }; -} - app.get('/slides', function showHandler(req, res) { fs.readdir(pathToFile('data', 'slide'), function (err, files) { files.sort(); var jsonFiles = _.filter(files, function (file) { - return /^\d+\.json$/.test(file); + return /^\d+\.md$/.test(file); }); res.send(_.map(jsonFiles, function (file) { return { - id: parseInt(file.replace(/\.json$/, ''), 10) + id: parseInt(file.replace(/\.md$/, ''), 10) }; })); }); @@ -85,107 +71,34 @@ app.get(/slide\/(\d+)/, function showHandler(req, res, next) { return; } - var slideId = req.params[0]; - var slidePath = pathToFile('data', 'slide', slideId + '.json'); + var slideIndex = req.params[0]; - fs.exists(slidePath, function (exists) { - if (!exists) { - next(); - return; + fs.readdir(pathToFile('data', 'slide'), function (err, files) { + if (err) { + return renderError(res, err); } - fs.readFile(slidePath, {encoding: 'utf8'}, function (err, content) { - if (err) { - renderError(res, err); - return; - } - - try { - var slide = JSON.parse(content); - } catch (err) { - renderError(res, err); - return; - } - - async.parallel({ - copy: serveIfExists(pathToFile('data', 'copy', slide.copy + '.md')), - code: serveIfExists(pathToFile('data', 'code', slide.code + '.js')) - }, function (err, slideContent) { - if (err) { - renderError(res, err); - return; - } - slideContent.id = parseInt(slideId, 10); - slideContent.title = slide.title || ''; - res.send(slideContent); - }); + files.sort(); + var markdownFiles = _.filter(files, function (file) { + return /\.md$/.test(file); }); - }); -}); - -app.get(/results\/([^\/]+)\/(\d\d)$/, function resultsHandler(req, res, next) { - var app = req.params[0]; - var slideId = req.params[1]; - var validApps = [ - 'node', 'phantomjs-1.9.8', 'phantomjs-2.0.0' - ]; - - if (!_.contains(validApps, app)) { - next(); - return; - } - - var slidePath = pathToFile('data', 'slide', slideId + '.json'); - fs.exists(slidePath, function (exists) { - if (!exists) { + if (slideIndex > markdownFiles.length) { return next(); } - var noSlideError = new Error('No code for slide'); - async.waterfall([ - - function (cb) { - fs.readFile(slidePath, {encoding: 'utf8'}, cb); - }, - - function (content, cb) { - try { - var slide = JSON.parse(content); - } catch (err) { - cb(err, null); - return; - } - cb(null, slide); - }, - - function (slide, cb) { - var codePath = pathToFile('data', 'code', slide.code + '.js'); - fs.exists(codePath, function (exists) { - if (exists) { - cb(null, codePath); - } else { - cb(noSlideError); - } - }); - }, - - function (path, cb) { - exec(app + ' ' + path, cb); - } - - ], function (err, stdout, stderr) { - if (err === noSlideError) { - next(); - return; - } + var markdownFile = markdownFiles[slideIndex - 1]; + var markdownPath = pathToFile('data', 'slide', markdownFile); + fs.readFile(markdownPath, {encoding: 'utf8'}, function (err, content) { if (err) { - res.send({stdout: '', stderr: err.toString()}); - return; + return renderError(res, err); } - res.send({stdout: stdout, stderr: stderr}); - }); + res.send({ + id: parseInt(slideIndex, 10), + copy: content + }); + }); }); }); diff --git a/data/code/html5.js b/data/code/html5.js deleted file mode 100644 index e4edf4b..0000000 --- a/data/code/html5.js +++ /dev/null @@ -1,19 +0,0 @@ -var page = require('webpage').create(); -page.viewportSize = {width: 1280, height: 720}; - -page.open('https://html5test.com/', function() { - function doneLoading() { - var el = document.getElementById('loading'); - return window.getComputedStyle(el).display === 'none'; - } - - function checkPage() { - if (page.evaluate(doneLoading)) { - page.render('static/html5.' + phantom.version.major + '.png'); - console.log('created static/html5.' + phantom.version.major + '.png'); - phantom.exit(); - } - setTimeout(checkPage, 100); - } - checkPage(); -}); diff --git a/data/copy/crash-explain.md b/data/copy/crash-explain.md deleted file mode 100644 index 72aabb1..0000000 --- a/data/copy/crash-explain.md +++ /dev/null @@ -1,5 +0,0 @@ -# Use After Free - -- Create webpage object in JavaScript -- Close webpage in JavaScript -- Do something with webpage in JavaScript diff --git a/data/copy/js-runtime.md b/data/copy/js-runtime.md deleted file mode 100644 index 204c9df..0000000 --- a/data/copy/js-runtime.md +++ /dev/null @@ -1 +0,0 @@ -# JavaScript Runtime diff --git a/data/copy/only-title.md b/data/copy/only-title.md deleted file mode 100644 index cfa4384..0000000 --- a/data/copy/only-title.md +++ /dev/null @@ -1 +0,0 @@ -# PhantomJS diff --git a/data/copy/testing.md b/data/copy/testing.md deleted file mode 100644 index f00b526..0000000 --- a/data/copy/testing.md +++ /dev/null @@ -1 +0,0 @@ -# Testing diff --git a/data/copy/umd.md b/data/copy/umd.md deleted file mode 100644 index 6af4daa..0000000 --- a/data/copy/umd.md +++ /dev/null @@ -1 +0,0 @@ -# Backbone's UMD diff --git a/data/copy/use-after-free.md b/data/copy/use-after-free.md deleted file mode 100644 index 2afb56e..0000000 --- a/data/copy/use-after-free.md +++ /dev/null @@ -1 +0,0 @@ -# This will error, not crash diff --git a/data/slide/01.json b/data/slide/01.json deleted file mode 100644 index 2c94aea..0000000 --- a/data/slide/01.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "title" -} diff --git a/data/copy/title.md b/data/slide/01.md similarity index 100% rename from data/copy/title.md rename to data/slide/01.md diff --git a/data/slide/02.json b/data/slide/02.json deleted file mode 100644 index 1a86225..0000000 --- a/data/slide/02.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "about" -} diff --git a/data/copy/about.md b/data/slide/02.md similarity index 100% rename from data/copy/about.md rename to data/slide/02.md diff --git a/data/slide/03.json b/data/slide/03.json deleted file mode 100644 index 5c165e9..0000000 --- a/data/slide/03.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "screen-shot" -} diff --git a/data/copy/screen-shot.md b/data/slide/03.md similarity index 100% rename from data/copy/screen-shot.md rename to data/slide/03.md diff --git a/data/slide/04.json b/data/slide/04.json deleted file mode 100644 index e9a3a5a..0000000 --- a/data/slide/04.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "only-title", - "code": "phantom-webpage-screenshot" -} diff --git a/data/code/phantom-webpage-screenshot.js b/data/slide/04.md similarity index 88% rename from data/code/phantom-webpage-screenshot.js rename to data/slide/04.md index dc4afc7..e2f416e 100644 --- a/data/code/phantom-webpage-screenshot.js +++ b/data/slide/04.md @@ -1,3 +1,6 @@ +# PhantomJS + +```javascript var page = require('webpage').create(); page.viewportSize = {width: 1280, height: 720}; @@ -7,3 +10,4 @@ page.open('http://phantomjs.org', function() { console.log('created phantomjs.png. ☮ out!'); phantom.exit(); }); +``` diff --git a/data/slide/05.json b/data/slide/05.json deleted file mode 100644 index 9496681..0000000 --- a/data/slide/05.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "not-node" -} diff --git a/data/copy/not-node.md b/data/slide/05.md similarity index 100% rename from data/copy/not-node.md rename to data/slide/05.md diff --git a/data/slide/06.json b/data/slide/06.json deleted file mode 100644 index 6d4cd4c..0000000 --- a/data/slide/06.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "qt" -} diff --git a/data/copy/qt.md b/data/slide/06.md similarity index 100% rename from data/copy/qt.md rename to data/slide/06.md diff --git a/data/slide/07.json b/data/slide/07.json deleted file mode 100644 index 6ecc732..0000000 --- a/data/slide/07.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "use-after-free", - "code": "use-after-free" -} diff --git a/data/code/use-after-free.js b/data/slide/07.md similarity index 79% rename from data/code/use-after-free.js rename to data/slide/07.md index 433b7cc..70d7b8d 100644 --- a/data/code/use-after-free.js +++ b/data/slide/07.md @@ -1,3 +1,6 @@ +# This will error, not crash + +```javascript var phantom = this.phantom || {exit: function () {}}; var foo = {bar: {baz: 123}}; delete foo.bar; @@ -7,3 +10,4 @@ try { console.log(err); phantom.exit(); } +``` diff --git a/data/slide/08.json b/data/slide/08.json deleted file mode 100644 index 0d1a9e5..0000000 --- a/data/slide/08.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "null-pointer" -} diff --git a/data/copy/null-pointer.md b/data/slide/08.md similarity index 100% rename from data/copy/null-pointer.md rename to data/slide/08.md diff --git a/data/slide/09.json b/data/slide/09.json deleted file mode 100644 index de2da20..0000000 --- a/data/slide/09.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "crash-explain", - "code": "crash" -} diff --git a/data/code/crash.js b/data/slide/09.md similarity index 60% rename from data/code/crash.js rename to data/slide/09.md index 405f959..33867d6 100644 --- a/data/code/crash.js +++ b/data/slide/09.md @@ -1,3 +1,10 @@ +# Use After Free + +- Create webpage object in JavaScript +- Close webpage in JavaScript +- Do something with webpage in JavaScript + +```javascript var phantom = this.phantom || {exit: function () {}}; var page = require('webpage').create(); // code, code, code… @@ -6,3 +13,4 @@ page.open('about:blank', function () { console.log('☮ out!'); phantom.exit(); }); +``` diff --git a/data/slide/10.json b/data/slide/10.json deleted file mode 100644 index 468ceb8..0000000 --- a/data/slide/10.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "js-runtime", - "code": "prototypes" -} diff --git a/data/code/prototypes.js b/data/slide/10.md similarity index 90% rename from data/code/prototypes.js rename to data/slide/10.md index ec799dd..2edd1e1 100644 --- a/data/code/prototypes.js +++ b/data/slide/10.md @@ -1,3 +1,6 @@ +# JavaScript Runtime + +```javascript var phantom = this.phantom || {exit: function () {}}; console.log('bind:', typeof Function.prototype.bind); console.log('9 === parseInt("09"):', 9 === parseInt('09')); @@ -8,3 +11,4 @@ console.log('filter:', typeof Array.prototype.filter); console.log('Object.create:', typeof Object.create); phantom.exit(); +``` diff --git a/data/slide/11.json b/data/slide/11.json deleted file mode 100644 index 54efe99..0000000 --- a/data/slide/11.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "code-share" -} diff --git a/data/copy/code-share.md b/data/slide/11.md similarity index 100% rename from data/copy/code-share.md rename to data/slide/11.md diff --git a/data/slide/12.json b/data/slide/12.json deleted file mode 100644 index 3662815..0000000 --- a/data/slide/12.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "umd", - "code": "backbone-umd" -} diff --git a/data/code/backbone-umd.js b/data/slide/12.md similarity index 92% rename from data/code/backbone-umd.js rename to data/slide/12.md index 4bddc08..08b90ac 100644 --- a/data/code/backbone-umd.js +++ b/data/slide/12.md @@ -1,3 +1,6 @@ +# Backbone's UMD + +```javascript (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['underscore', 'jquery', 'exports'], function(_, $, exports) { @@ -12,3 +15,4 @@ }(this, function(root, Backbone, _, $) { // Backbone… })); +``` diff --git a/data/slide/13.json b/data/slide/13.json deleted file mode 100644 index 55d3be8..0000000 --- a/data/slide/13.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "only-title", - "code": "backbone" -} diff --git a/data/code/backbone.js b/data/slide/13.md similarity index 89% rename from data/code/backbone.js rename to data/slide/13.md index befac1e..1014c4a 100644 --- a/data/code/backbone.js +++ b/data/slide/13.md @@ -1,3 +1,6 @@ +# PhantomJS + +```javascript var phantom = phantom || {exit: function () {}}; var _ = require('../../vendor/underscore/underscore'); phantom.injectJs('../../vendor/backbone/backbone.js'); @@ -5,3 +8,4 @@ console.log(_.toString()); console.log(Backbone.View.toString()); phantom.exit(); //module.exports = Backbone; +``` diff --git a/data/slide/14.json b/data/slide/14.json deleted file mode 100644 index a12e499..0000000 --- a/data/slide/14.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "testing", - "code": "some-test" -} diff --git a/data/code/some-test.js b/data/slide/14.md similarity index 79% rename from data/code/some-test.js rename to data/slide/14.md index 9b8bd63..72634c0 100644 --- a/data/code/some-test.js +++ b/data/slide/14.md @@ -1,5 +1,9 @@ +# Testing + +```javascript describe('some test', function () { it('→ some test case', function () { expect(1 + 1).toBe(2); }); }); +``` diff --git a/data/slide/15.json b/data/slide/15.json deleted file mode 100644 index db310c4..0000000 --- a/data/slide/15.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "copy": "testing", - "code": "test" -} diff --git a/data/code/test.js b/data/slide/15.md similarity index 95% rename from data/code/test.js rename to data/slide/15.md index 54ad373..f22e907 100644 --- a/data/code/test.js +++ b/data/slide/15.md @@ -1,3 +1,6 @@ +# Testing + +```javascript phantom.injectJs('../../vendor/jasmine/lib/jasmine-core/jasmine.js'); var consoleFns = require('../../vendor/jasmine/lib/console/console.js'); var jasmine = jasmineRequire.core(jasmineRequire); @@ -13,3 +16,4 @@ jasmine.getEnv().addReporter(new jasmine.ConsoleReporter({ phantom.injectJs('./some-test.js'); jasmine.getEnv().execute(); +``` diff --git a/data/slide/16.json b/data/slide/16.json deleted file mode 100644 index 2a35e99..0000000 --- a/data/slide/16.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "other-awesome" -} diff --git a/data/copy/other-awesome.md b/data/slide/16.md similarity index 100% rename from data/copy/other-awesome.md rename to data/slide/16.md diff --git a/data/slide/17.json b/data/slide/17.json deleted file mode 100644 index b1dbd4c..0000000 --- a/data/slide/17.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "copy": "fin" -} diff --git a/data/copy/fin.md b/data/slide/17.md similarity index 100% rename from data/copy/fin.md rename to data/slide/17.md