-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathserver.js
143 lines (128 loc) · 3.65 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
var express = require('express')
, routes = require('./routes')
, http = require('http')
, path = require('path')
, util = require('util')
, fs = require('fs')
, marked = require('marked')
, partials = require('express-partials')
, nu = require('nodeutil')
, log = nu.logger.getInstance('server')
, mdutil = require('./lib/mdutil')
, genrss = require('./lib/gen-rss')
, gensitemap = require('./lib/gen-sitemap')
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(partials());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(function(req, res, next){
res.locals.session = req.session;
next();
});
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')));
app.use('/examples', express.static(path.join(__dirname, 'examples')));
app.use('/mdfiles', express.static(path.join(__dirname, 'mdfiles')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
function getMenu(req, res, next){
if(req.session.menu) {
log.info('Get menu from session...');
} else {
log.info('Reload the menu...');
req.session.menu = mdutil.getMenu();
}
next();
}
app.get('/', getMenu,
function(req, res){
var path = 'README.md';
var txt = fs.readFileSync(path, 'utf-8');
log.info('Got md: ' + path);
res.render('index', {
md: mdutil.md2html(txt)
});
});
var cache = {};
app.get('/md/:file', getMenu, function(req, res){
var path = 'mdfiles/' + req.params.file;
if(!cache[path]) {
var txt = fs.readFileSync(path, 'utf-8');
var header = txt.split('\n')[0];
var keywords = getKeywords(txt);
log.warn(keywords);
cache[path] = {txt: txt, header: header };
log.info('Got md: ' + path);
res.render('index', {
md: mdutil.md2html(txt),
header: header,
keywords: keywords
});
} else {
log.info('Got md from cache: ' + path);
var txt = cache[path].txt;
var header = txt.split('\n')[0];
var keywords = getKeywords(txt);
log.warn(keywords);
res.render('index', {
md: mdutil.md2html(txt),
header: header,
keywords: keywords
});
}
});
function getKeywords(txt){
var lines = txt.split('\n');
var out = '';
for(var i = 0 ; i < lines.length -1 ; i++) {
if(lines[i].startsWith('## ')) {
out = out + (out.length > 0 ? ',' : '') + lines[i].replace(/##\ /g,'');
}
}
return out;
}
app.post('/flush', getMenu, function(req, res){
log.warn('Got flush request...');
cache = {};
log.info('Done flush...');
res.render('index', {
md: 'Flush all cached md files... done.'
});
});
app.post('/flush/:file', getMenu, function(req, res){
log.warn('Got flush request of %s', req.params.file);
delete cache[req.params.file];
log.info('Done flush %s', req.params.file);
res.render('index', {md: 'Flush all cached md files... done.'});
});
//TODO: cache it
app.get('/rss', function(req, res) {
res.end(genrss.toRss());
});
app.get('/rss.xml', function(req, res) {
res.end(genrss.toRss());
});
app.get('/sitemap', function(req, res) {
gensitemap.toSiteMap(function(r){
res.end(r);
});
});
app.get('/sitemap.xml', function(req, res) {
gensitemap.toSiteMap(function(r){
res.end(r);
});
});
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});