@@ -7,9 +7,21 @@ var Db = require("./lib/db.js"); | |||
var conf = JSON.parse(fs.readFileSync("conf.json")); | |||
var endpoints = { | |||
"/": "index.html", | |||
//General files | |||
"/favicon.ico": "favicon.ico", | |||
"/bootstrap.css": "bootstrap.css", | |||
"/404": "404.html", | |||
"/viewer": "viewer.node.js" | |||
//Index files | |||
"/": "index/index.node.js", | |||
"/index/script.js": "index/script.js", | |||
"/index/style.css": "index/style.css", | |||
//Viewer files | |||
"/viewer": "viewer/index.node.js", | |||
"/viewer/script.js": "viewer/script.js", | |||
"/viewer/style.css": "viewer/style.css" | |||
} | |||
//Prepare endpoints | |||
@@ -24,7 +36,7 @@ Object.keys(endpoints).forEach(function(i) { | |||
//If it doesn't end with .node.js, it's a regular text file and will | |||
//just be served as is | |||
} else { | |||
endpoints[i] = fs.readFileSync(conf.webroot+"/"+endpoints[i], "utf8"); | |||
endpoints[i] = fs.readFileSync(conf.webroot+"/"+endpoints[i]); | |||
} | |||
//Errors will usually be because an endpoint doesn't exist | |||
@@ -47,6 +59,12 @@ fs.readdirSync("templates").forEach(function(f) { | |||
templates[f.replace(/\.html$/, "")] = fs.readFileSync("templates/"+f, "utf8"); | |||
}); | |||
//Prepare all views | |||
var views = {}; | |||
fs.readdirSync("views").forEach(function(f) { | |||
views[f.replace(/\.html$/, "")] = fs.readFileSync("views/"+f, "utf8"); | |||
}); | |||
//Function to run on each request | |||
function onRequest(req, res) { | |||
console.log("Request for "+req.url); | |||
@@ -61,7 +79,13 @@ function onRequest(req, res) { | |||
//Execute if it's a .node.js, or just respond with the contents of the file | |||
if (typeof ep == "function") { | |||
ep(new Context(req, res, templates, conf)); | |||
ep(new Context({ | |||
req: req, | |||
res: res, | |||
templates: templates, | |||
views: views, | |||
conf: conf | |||
})); | |||
} else { | |||
res.end(ep); | |||
} |
@@ -1,8 +1,20 @@ | |||
module.exports = function(req, res, templates, conf) { | |||
this.req = req; | |||
this.res = res; | |||
this.templates = templates; | |||
this.conf = conf; | |||
function templatify(str, args) { | |||
if (args == undefined) | |||
return str; | |||
for (var i in args) { | |||
str = str.split("{{"+i+"}}").join(args[i]); | |||
} | |||
return str; | |||
} | |||
module.exports = function(options) { | |||
this.req = options.req; | |||
this.res = options.res; | |||
this.templates = options.templates; | |||
this.views = options.views; | |||
this.conf = options.conf; | |||
} | |||
module.exports.prototype = { | |||
@@ -12,14 +24,17 @@ module.exports.prototype = { | |||
template: function(name, args) { | |||
var str = this.templates[name]; | |||
if (!str) | |||
throw new Error("No such template: "+name); | |||
for (var i in args) { | |||
str = str.split("{{"+i+"}}").join(args[i]); | |||
} | |||
return templatify(str, args); | |||
}, | |||
return str; | |||
view: function(name, args) { | |||
var str = this.views[name]; | |||
if (!str) | |||
throw new Error("No such view: "+name); | |||
return templatify(str, args); | |||
} | |||
} |
@@ -0,0 +1,9 @@ | |||
<div class="navbar navbar-fixed-top"> | |||
<div class="navbar-inner"> | |||
<div class="container"> | |||
<div class="pull-right"> | |||
Log In | |||
</div> | |||
</div> | |||
</div> | |||
</div> |
@@ -2,8 +2,9 @@ | |||
<html> | |||
<head> | |||
<meta charset="utf-8"> | |||
<link rel="stylesheet" href="/bootstrap.css"> | |||
</head> | |||
<body> | |||
Hi. | |||
{{header}} | |||
</body> | |||
</html> |
@@ -5,6 +5,6 @@ | |||
<title>{{title}}</title> | |||
</head> | |||
<body> | |||
{{header}} | |||
</body> | |||
</html> |
@@ -0,0 +1,5 @@ | |||
module.exports = function(ctx) { | |||
ctx.end(ctx.view("index", { | |||
header: ctx.template("header") | |||
})); | |||
} |
@@ -1,5 +0,0 @@ | |||
module.exports = function(ctx) { | |||
api.end(api.template("viewer", { | |||
title: "lol hi" | |||
})); | |||
} |
@@ -0,0 +1,5 @@ | |||
module.exports = function(ctx) { | |||
ctx.end(ctx.view("viewer", { | |||
header: ctx.template("header") | |||
})); | |||
} |