Working version of wiki
This commit is contained in:
parent
2971151540
commit
5a1b0f85f4
42
app.js
42
app.js
@ -1,4 +1,40 @@
|
||||
var Stack = require('stack');
|
||||
var Express = require('express');
|
||||
var Routes = require('./routes');
|
||||
|
||||
module.exports = Stack.compose(
|
||||
);
|
||||
// TODO: Uncomment when we have internet
|
||||
// var TryCatch = require('./trycatch');
|
||||
|
||||
var App = module.exports = Express.createServer();
|
||||
|
||||
// Configuration
|
||||
|
||||
App.configure(function(){
|
||||
App.set('views', __dirname + '/views');
|
||||
App.set('view engine', 'jade');
|
||||
// This gives us scoped errors with long stack traces
|
||||
// TODO: Uncomment when we have internet
|
||||
// App.use(function (req, res, next) {
|
||||
// TryCatch(next, next);
|
||||
// });
|
||||
App.use(Express.bodyParser());
|
||||
App.use(Express.methodOverride());
|
||||
App.use(App.router);
|
||||
App.use(Express.static(__dirname + '/public'));
|
||||
});
|
||||
|
||||
App.configure('development', function(){
|
||||
App.use(Express.errorHandler({ dumpExceptions: true, showStack: true }));
|
||||
});
|
||||
|
||||
App.configure('production', function(){
|
||||
App.use(Express.errorHandler());
|
||||
});
|
||||
|
||||
// Routes
|
||||
App.get('/', Routes.index);
|
||||
App.get('/:name', Routes.view);
|
||||
App.get('/:name/edit', Routes.edit);
|
||||
App.post('/:name', Routes.save);
|
||||
|
||||
App.listen(process.env.PORT || 3000);
|
||||
console.log("Express server listening on port %d in %s mode", App.address().port, App.settings.env);
|
||||
|
57
db.js
Normal file
57
db.js
Normal file
@ -0,0 +1,57 @@
|
||||
var FS = require('fs');
|
||||
var Path = require('path');
|
||||
var Markdown = require('markdown').markdown;
|
||||
|
||||
// This function is used to map wiki page names to files
|
||||
// on the real filesystem.
|
||||
function pathFromName(name) {
|
||||
return Path.join(__dirname, "pages", name + ".markdown");
|
||||
}
|
||||
|
||||
// Load a file from disk and parse out the title and generate the HTML
|
||||
exports.loadPage = function (name, callback) {
|
||||
// Attempt to load the file from disk
|
||||
var path = pathFromName(name);
|
||||
FS.readFile(path, 'utf8', function (err, markdown) {
|
||||
var exists = true;
|
||||
if (err) {
|
||||
// If it's not there, generate a placeholder body
|
||||
if (err.code === "ENOENT") {
|
||||
markdown = "# " + name.replace(/_/g, " ") + "\n\n" +
|
||||
"This page does not exist yet. Be the first to write it.";
|
||||
exists = false;
|
||||
} else {
|
||||
// Forward all other errors on
|
||||
return callback(err);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the markdown extracting the first header as the title
|
||||
// and then render as an HTML string
|
||||
var tree = Markdown.parse(markdown);
|
||||
var title = name;
|
||||
for (var i = 1, l = tree.length; i < l; i++) {
|
||||
if (tree[i] && tree[i][0] === "header") {
|
||||
title = tree[i][2];
|
||||
tree.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
var html = Markdown.toHTML(tree);
|
||||
|
||||
// Send back the page as an object
|
||||
callback(null, {
|
||||
name: name,
|
||||
title: title,
|
||||
exists: exists,
|
||||
markdown: markdown,
|
||||
html: html,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Saving is simple. Just put the markdown in the file
|
||||
exports.savePage = function (name, value, callback) {
|
||||
var path = pathFromName(name);
|
||||
FS.writeFile(path, value, callback);
|
||||
};
|
@ -1,8 +1,10 @@
|
||||
{
|
||||
"name": "wiki-contest",
|
||||
"version": "0.0.0",
|
||||
"author": "Tim Caswell <tim@c9.io>",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"express": "2.5.5",
|
||||
"jade": ">= 0.0.1",
|
||||
"markdown": "~0.3.1"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
# Home Page
|
||||
|
||||
This is the homepage of the wiki.
|
||||
|
||||
Cool stuff here.
|
8
public/stylesheets/style.css
Normal file
8
public/stylesheets/style.css
Normal file
@ -0,0 +1,8 @@
|
||||
body {
|
||||
padding: 50px;
|
||||
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00B7FF;
|
||||
}
|
31
routes/index.js
Normal file
31
routes/index.js
Normal file
@ -0,0 +1,31 @@
|
||||
// Load our model abstraction so we can load and save pages in the wiki.
|
||||
var DB = require('../db');
|
||||
|
||||
// When the wiki is initially loaded, simply redirect to the `home` page.
|
||||
exports.index = function(req, res) {
|
||||
res.redirect("/home");
|
||||
};
|
||||
|
||||
// Load a page from the database and render as html
|
||||
exports.view = function (req, res, next) {
|
||||
DB.loadPage(req.params.name, function (err, page) {
|
||||
if (err) return next(err);
|
||||
res.render('view', page);
|
||||
});
|
||||
};
|
||||
|
||||
// Load a page from the database and render edit form
|
||||
exports.edit = function (req, res, next) {
|
||||
DB.loadPage(req.params.name, function (err, page) {
|
||||
if (err) return next(err);
|
||||
res.render('edit', page);
|
||||
});
|
||||
};
|
||||
|
||||
// Save changes to a page and redirect to view page
|
||||
exports.save = function (req, res, next) {
|
||||
DB.savePage(req.params.name, req.body.markdown, function (err) {
|
||||
if (err) return next(err)
|
||||
res.redirect("/" + req.params.name);
|
||||
});
|
||||
}
|
13
server.js
13
server.js
@ -1,13 +0,0 @@
|
||||
var Http = require('http');
|
||||
var Stack = require('stack');
|
||||
var Creationix = require('creationix');
|
||||
var App = require('./app');
|
||||
|
||||
var PORT = process.env.PORT || 8080;
|
||||
|
||||
Http.createServer(Stack(
|
||||
Creationix.log(),
|
||||
App
|
||||
)).listen(PORT);
|
||||
console.log("Server listening on http://localhost:%s/", PORT);
|
||||
|
4
views/edit.jade
Normal file
4
views/edit.jade
Normal file
@ -0,0 +1,4 @@
|
||||
h1= title
|
||||
form(method="post", action="/" + name)
|
||||
textarea(name="markdown")= markdown
|
||||
input(type="submit")
|
6
views/layout.jade
Normal file
6
views/layout.jade
Normal file
@ -0,0 +1,6 @@
|
||||
!!!
|
||||
html
|
||||
head
|
||||
title= title
|
||||
link(rel='stylesheet', href='/stylesheets/style.css')
|
||||
body!= body
|
3
views/view.jade
Normal file
3
views/view.jade
Normal file
@ -0,0 +1,3 @@
|
||||
h1= title
|
||||
.article!= html
|
||||
a(href="/" + name + "/edit")= (exists ? "Edit" : "Create") + " this Page"
|
Loading…
Reference in New Issue
Block a user