diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-03-30 21:50:00 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-03-30 21:50:00 +0000 |
| commit | d6e8f5801e036bf3adccf5d0d826f5e2f7f60bda (patch) | |
| tree | eabc0df2f16b3e0b3629011dd1b485b2d48d5d35 /lib | |
| parent | 2bae91155de4c8af88db552f26105b9d09fd972e (diff) | |
Add hacked together web interface
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/web.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/lib/web.js b/lib/web.js new file mode 100644 index 0000000..20bc44f --- /dev/null +++ b/lib/web.js @@ -0,0 +1,109 @@ +var http = require("http"); +var connect = require("connect"); +var url = require("url"); +var fs = require("fs"); +var q = require("q"); +var mammoth = require("./"); +var ZipFile = require("zipfile").ZipFile; + +function startServer(options) { + var app = connect() + .use(connect.bodyParser()) + .use("/static/", connect.static(__dirname + '/../static')) + .use(handlePage) + .use(renderTemplate); + http.createServer(app).listen(options.port); +} + + +var handlers = { + "/": handleIndex, + "/convert": handleConvert +}; + +function handlePage(request, response, next) { + var pathname = url.parse(request.url).pathname; + var handler = handlers[pathname]; + if (handler) { + handler(request, response, next); + } else { + next(); + } +} + +function handleIndex(request, response, next) { + if (url.parse(request.url).pathname !== "/") { + return next(); + } + request.template = { + name: "index.html" + }; + next(); +} + +function handleConvert(request, response, next) { + if (url.parse(request.url).pathname !== "/convert") { + return next(); + } + + var converter = new mammoth.Converter(); + var uploadedDocument = request.files.document; + var documentPath = uploadedDocument.path + // TODO: remove duplication from index.js + var zipFile = new ZipFile(documentPath); + var docxFile = { + read: function(path) { + return q.ninvoke(zipFile, "readFile", path, "utf-8") + .then(function(value) { + return value.toString(); + }); + } + }; + + converter.convertToHtml(docxFile) + .then(function(result) { + request.template = { + name: "convert.html", + values: { + documentName: uploadedDocument.name, + documentHtml: result.html + } + }; + next(); + }) + .fin(function() { + fs.unlink(documentPath); + }); +} + +function renderTemplate(request, response, next) { + if (!request.template) { + return next(); + } + var templateName = request.template.name; + q.nfcall(fs.readFile, "templates/" + templateName, "utf-8") + .then(function(templateContent) { + var values = request.template.values || {}; + var content = templateContent; + for (var key in values) { + if (Object.prototype.hasOwnProperty.call(values, key)) { + content = content.replace("{{" + key + "}}", values[key]); + } + } + response.writeHead(200, { + "content-type": "text/html; charset=utf-8" + }); + response.end(content); + }) + .fail(function(error) { + console.log(error); + next(error); + }); +} + +if (require.main === module) { + var argv = require("optimist").argv; + var port = argv.port ? parseInt(argv.port, 10) : 3000; + startServer({port: port}); + console.log("Server running on http://localhost:" + port); +} |
