Add ability to get slide contents by id
This commit is contained in:
parent
000038a2bf
commit
04646ddeed
73
bin/deck
73
bin/deck
@ -2,9 +2,12 @@
|
|||||||
//# vi: ft=javascript
|
//# vi: ft=javascript
|
||||||
|
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
var handlebars = require('handlebars');
|
var _ = require('lodash');
|
||||||
|
var async = require('async');
|
||||||
var express = require('express');
|
var express = require('express');
|
||||||
|
var handlebars = require('handlebars');
|
||||||
|
|
||||||
var app = express();
|
var app = express();
|
||||||
var staticHandler = express['static'].bind(express);
|
var staticHandler = express['static'].bind(express);
|
||||||
@ -19,12 +22,24 @@ app.use((function log() {
|
|||||||
};
|
};
|
||||||
}()));
|
}()));
|
||||||
|
|
||||||
|
function renderError(res, err) {
|
||||||
|
console.error(err);
|
||||||
|
res.writeHead(500, {'Content-Type': 'text/plain'});
|
||||||
|
res.write(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
function pathToFile() {
|
||||||
|
return path.normalize(
|
||||||
|
path.join.apply(null, [__dirname, '..'].concat(_.toArray(arguments)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
app.get('/', function index(req, res) {
|
app.get('/', function index(req, res) {
|
||||||
var indexFile = __dirname + '/../assets/index.html';
|
var indexFile = pathToFile('assets', 'index.html');
|
||||||
|
|
||||||
function compileServe(err, text) {
|
function compileServe(err, text) {
|
||||||
if (err) {
|
if (err) {
|
||||||
res.writeHead(500, {'Content-Type': 'text/plain'}, err);
|
renderError(res, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var tmpl = handlebars.compile(text);
|
var tmpl = handlebars.compile(text);
|
||||||
@ -34,6 +49,58 @@ app.get('/', function index(req, res) {
|
|||||||
fs.readFile(indexFile, {encoding: 'utf8'}, compileServe);
|
fs.readFile(indexFile, {encoding: 'utf8'}, compileServe);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
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(/slide\/(\d+)/, function showHandler(req, res, next) {
|
||||||
|
var slideId = req.params[0];
|
||||||
|
var slidePath = pathToFile('data', 'slide', slideId + '.json');
|
||||||
|
|
||||||
|
fs.exists(slidePath, function (exists) {
|
||||||
|
if (!exists) {
|
||||||
|
next();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.use('/data', staticHandler('data'));
|
app.use('/data', staticHandler('data'));
|
||||||
app.use('/vendor', staticHandler('vendor'));
|
app.use('/vendor', staticHandler('vendor'));
|
||||||
app.use('/static', staticHandler('static'));
|
app.use('/static', staticHandler('static'));
|
||||||
|
|||||||
7
data/code/prototypes.js
vendored
Normal file
7
data/code/prototypes.js
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
(function (phantom) {
|
||||||
|
console.log(Function.prototype.bind);
|
||||||
|
|
||||||
|
if (phantom) {
|
||||||
|
phantom.exit();
|
||||||
|
}
|
||||||
|
}(this.phantom));
|
||||||
3
data/copy/title.md
Normal file
3
data/copy/title.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# PhantomJS Under the Hood
|
||||||
|
|
||||||
|
- Buddy Sandidge
|
||||||
4
data/slide/01.json
Normal file
4
data/slide/01.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"copy": "title",
|
||||||
|
"code": "prototypes"
|
||||||
|
}
|
||||||
@ -33,6 +33,7 @@
|
|||||||
"requirejs": "^2.1.15"
|
"requirejs": "^2.1.15"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"async": "^0.9.0",
|
||||||
"express": "^4.11.2",
|
"express": "^4.11.2",
|
||||||
"handlebars": "^1.3.0"
|
"handlebars": "^1.3.0"
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user