var http = require("http");
|
|
var path = require("path");
|
|
|
|
var express = require("express");
|
|
|
|
|
|
function shuffle(array) {
|
|
for (var i = array.length - 1; i > 0; i--) {
|
|
var j = Math.floor(Math.random() * (i + 1));
|
|
var temp = array[i];
|
|
array[i] = array[j];
|
|
array[j] = temp;
|
|
}
|
|
return array;
|
|
}
|
|
|
|
|
|
var root = path.join(__dirname, "..");
|
|
|
|
var argc = process.argv.length;
|
|
if(argc < 3){
|
|
console.error("must provide data file, e.g. \"learncards data.json\"");
|
|
process.exit(1);
|
|
}
|
|
var data_file = path.join(process.cwd(), process.argv[argc - 1]);
|
|
var data = require(data_file);
|
|
|
|
if(typeof(data) !== "object" || !data.hasOwnProperty("cards")){
|
|
console.error("data file ", data_file, "does not contain \"cards\" property");
|
|
process.exit(1);
|
|
}
|
|
|
|
var num_cards = data.cards.length;
|
|
for(var i = 0; i < num_cards; ++i){
|
|
var next = data.cards[i];
|
|
if(!next.hasOwnProperty("question")){
|
|
console.error("card", next, "requires \"question\" property");
|
|
process.exit(1);
|
|
}
|
|
if(!next.hasOwnProperty("answer")){
|
|
console.error("card", next, "requires \"answer\" property");
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
var title = "Learn Cards";
|
|
if(data.hasOwnProperty("title")){
|
|
title = data.title + " - Learn Cards";
|
|
}
|
|
|
|
var app = express();
|
|
app.set("port", process.env.PORT || 8000);
|
|
app.set("views", path.join(root, "views"));
|
|
app.set("view engine", "jade");
|
|
|
|
app.use(express.favicon());
|
|
app.use(app.router);
|
|
app.use(express.static(path.join(root, "public")));
|
|
app.use(express.errorHandler());
|
|
|
|
|
|
app.get("/", function(req, res){
|
|
res.render("index", {title: title});
|
|
});
|
|
|
|
app.get("/card.json", function(req, res){
|
|
var index = 0;
|
|
if(req.query.next){
|
|
index = parseInt(req.query.next);
|
|
} else if(req.query.rand){
|
|
index = Math.floor(Math.random() * num_cards);
|
|
}
|
|
if(index >= num_cards){
|
|
index = 0;
|
|
}
|
|
var card = {};
|
|
card.question = data.cards[index].question;
|
|
card.answer = data.cards[index].answer;
|
|
if(req.query.swap){
|
|
var swap = req.query.swap || "";
|
|
swap = swap.toLowerCase();
|
|
if(Boolean(swap)){
|
|
if(swap == "true" || (swap == "random" && Math.random() < 0.5)){
|
|
var q = card.question;
|
|
card.question = card.answer;
|
|
card.answer = q;
|
|
}
|
|
}
|
|
}
|
|
res.json(200, {index: index, card: card});
|
|
});
|
|
|
|
var server = http.createServer(app);
|
|
server.listen(app.get("port"), function(){
|
|
console.log("learncards is listening on port", app.get("port"));
|
|
});
|