1 | var 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 |
|
9 | models.use(Git);
|
10 |
|
11 | router.get("/", _getIndex);
|
12 | router.get("/wiki", _getWiki);
|
13 | router.get("/wiki/:page", _getWikiPage);
|
14 | router.get("/wiki/:page/history", _getHistory);
|
15 | router.get("/wiki/:page/:version", _getWikiPage);
|
16 | router.get("/wiki/:page/compare/:revisions", _getCompare);
|
17 |
|
18 | function _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 |
|
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 |
|
42 | function _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 |
|
72 | function _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 |
|
100 |
|
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 |
|
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 |
|
124 | function _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 |
|
229 | function _getIndex(req, res) {
|
230 | res.redirect('/wiki/' + app.locals.config.get("pages").index);
|
231 | }
|
232 |
|
233 | module.exports = router;
|