UNPKG

5.34 kBJavaScriptView Raw
1var router = require("express").Router(),
2 tools = require("../lib/tools"),
3 path = require("path"),
4 renderer = require('../lib/renderer'),
5 models = require("../lib/models"),
6 app = require("../lib/app").getInstance(),
7 Promise = require("bluebird");
8
9models.use(Git);
10
11router.get("/", _getIndex);
12router.get("/wiki", _getWiki);
13router.get("/wiki/:page", _getWikiPage);
14router.get("/wiki/:page/history", _getHistory);
15router.get("/wiki/:page/:version", _getWikiPage);
16router.get("/wiki/:page/compare/:revisions", _getCompare);
17
18function _getHistory(req, res) {
19
20 var page = new models.Page(req.params.page);
21
22 page.fetch().then(function() {
23
24 return page.fetchHistory();
25 }).then(function(history) {
26
27 // FIXME better manage an error here
28 if (!page.error) {
29 res.render("history", {
30 items: history,
31 title: 'History of ' + page.name,
32 page: page
33 });
34 } else {
35 res.locals.title = "404 - Not found";
36 res.statusCode = 404;
37 res.render("404.jade");
38 }
39 });
40}
41
42function _getWiki(req, res) {
43
44 var items = [];
45 var pagen = 0|req.query.page;
46
47 var pages = new models.Pages();
48
49 pages.fetch(pagen).then(function() {
50
51 pages.models.forEach(function(page) {
52
53 if (!page.error) {
54 items.push({
55 page: page,
56 hashes: page.hashes.length == 2 ? page.hashes.join("..") : ""
57 });
58 }
59 });
60
61 res.render("list", {
62 items: items,
63 title: 'All the pages',
64 pageNumbers: Array.apply(null, Array(pages.totalPages)).map(function (x, i) { return i + 1; }),
65 pageCurrent: pages.currentPage
66 });
67 }).catch(function(ex) {
68 console.log(ex);
69 });
70}
71
72function _getWikiPage(req, res) {
73
74 var page = new models.Page(req.params.page, req.params.version);
75
76 page.fetch().then(function() {
77
78 if (!page.error) {
79
80 res.locals.canEdit = true;
81 if (page.revision != "HEAD") {
82 res.locals.warning = "You're not reading the latest revision of this page, which is " + "<a href='" + page.urlForShow() + "'>here</a>.";
83 res.locals.canEdit = false;
84 }
85
86 res.locals.notice = req.session.notice;
87 delete req.session.notice;
88
89 res.render("show", {
90 page: page,
91 title: app.locals.config.get("application").title + " – " + page.title,
92 content: renderer.render("# " + page.title + "\n" + page.content)
93 });
94 }
95 else {
96
97 if (req.user) {
98
99 // Try sorting out redirect loops with case insentive fs
100 // Path 'xxxxx.md' exists on disk, but not in 'HEAD'.
101 if (/but not in 'HEAD'/.test(page.error)) {
102 page.setNames(page.name.slice(0,1).toUpperCase() + page.name.slice(1));
103 }
104 res.redirect(page.urlFor("new"));
105 } else {
106
107 // Special case for the index page, anonymous user and an empty docbase
108 if (page.isIndex()) {
109 res.render("welcome", {
110 title: "Welcome to " + app.locals.config.get("application").title
111 });
112 }
113 else {
114 res.locals.title = "404 - Not found";
115 res.statusCode = 404;
116 res.render('404.jade');
117 return;
118 }
119 }
120 }
121 });
122}
123
124function _getCompare(req, res) {
125
126 var revisions = req.params.revisions;
127
128 var page = new models.Page(req.params.page);
129
130 page.fetch().then(function() {
131
132 return page.fetchRevisionsDiff(req.params.revisions);
133 }).then(function(diff) {
134 if (!page.error) {
135
136 var lines = [];
137 diff.split("\n").slice(4).forEach(function(line) {
138
139 if (line.slice(0,1) != '\\') {
140 lines.push({
141 text: line,
142 ldln: leftDiffLineNumber(0, line),
143 rdln: rightDiffLineNumber(0, line),
144 className: lineClass(line)
145 });
146 }
147 });
148
149 var revs = req.params.revisions.split("..");
150 res.render('compare', {
151 page: page,
152 lines: lines,
153 title: 'Revisions compare',
154 revs: revs
155 });
156
157 }
158 else {
159 res.locals.title = "404 - Not found";
160 res.statusCode = 404;
161 res.render('404.jade');
162 return;
163 }
164 });
165
166 var ldln = 0,
167 cdln;
168
169 function leftDiffLineNumber(id, line) {
170
171 var li;
172
173 switch(true) {
174
175 case line.slice(0,2) == '@@':
176 li = line.match(/\-(\d+)/)[1];
177 ldln = parseInt(li, 10);
178 cdln = ldln;
179 return '...';
180
181 case line.slice(0,1) == '+':
182 return "";
183
184 case line.slice(0,1) == '-':
185 default:
186 ldln++;
187 cdln = ldln - 1;
188 return cdln;
189 }
190 }
191
192 var rdln = 0;
193 function rightDiffLineNumber(id, line) {
194
195 var ri;
196
197 switch(true) {
198
199 case line.slice(0,2) == '@@':
200 ri = line.match(/\+(\d+)/)[1];
201 rdln = parseInt(ri, 10);
202 cdln = rdln;
203 return '...';
204
205 case line.slice(0,1) == '-':
206 return ' ';
207
208 case line.slice(0,1) == '+':
209 default:
210 rdln += 1;
211 cdln = rdln - 1;
212 return cdln;
213 }
214 }
215
216 function lineClass(line) {
217 if (line.slice(0,2) === '@@') {
218 return "gc";
219 }
220 if (line.slice(0,1) === '-') {
221 return "gd";
222 }
223 if (line.slice(0,1) === '+') {
224 return "gi";
225 }
226 }
227}
228
229function _getIndex(req, res) {
230 res.redirect('/wiki/' + app.locals.config.get("pages").index);
231}
232
233module.exports = router;