Geen omschrijving

index.js 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #!/usr/bin/env node
  2. 'use strict';
  3. var express = require('express')
  4. var app = express()
  5. var path = require('path');
  6. var fs = require('fs');
  7. var bodyParser = require('body-parser');
  8. var _ = require('lodash');
  9. app.engine('html', require('ejs').renderFile);
  10. app.set('view engine', 'html');
  11. //app.use('/public', express.static(path.join(__dirname + '/node_modules')));
  12. app.use(express.static('public'))
  13. app.use(bodyParser.json());
  14. var getPath = function(req){
  15. var path = "";
  16. if(req.params['folder_10'] != undefined){
  17. path = path + req.params['folder_10'] + "/"
  18. }
  19. if(req.params['folder_9'] != undefined){
  20. path = path + req.params['folder_9'] + "/"
  21. }
  22. if(req.params['folder_8'] != undefined){
  23. path = path + req.params['folder_8'] + "/"
  24. }
  25. if(req.params['folder_7'] != undefined){
  26. path = path + req.params['folder_7'] + "/"
  27. }
  28. if(req.params['folder_6'] != undefined){
  29. path = path + req.params['folder_6'] + "/"
  30. }
  31. if(req.params['folder_5'] != undefined){
  32. path = path + req.params['folder_5'] + "/"
  33. }
  34. if(req.params['folder_4'] != undefined){
  35. path = path + req.params['folder_4'] + "/"
  36. }
  37. if(req.params['folder_3'] != undefined){
  38. path = path + req.params['folder_3'] + "/"
  39. }
  40. if(req.params['folder_2'] != undefined){
  41. path = path + req.params['folder_2'] + "/"
  42. }
  43. if(req.params['folder_1'] != undefined){
  44. path = path + req.params['folder_1'] + "/"
  45. }
  46. return path;
  47. }
  48. var getIndexFilePath = function(path, req, res){
  49. if(req.params['file'] != undefined){
  50. path = path + req.params['file'] + "/";
  51. }
  52. console.log("Looking for index file in " + path);
  53. fs.readFile(path + "index.html", 'utf8', function (err,data) {
  54. if (err) {
  55. fs.readFile(path + "index.md", 'utf8', function (err,data) {
  56. if (err) {
  57. error_404(req, res);
  58. } else {
  59. req.params['file'] = buildFilename(req.params['file'], "index.md");
  60. get_file(req, res);
  61. }
  62. });
  63. } else {
  64. req.params['file'] = buildFilename(req.params['file'], "index.html");
  65. get_file(req, res);
  66. }
  67. });
  68. }
  69. var isFile = function(filename){
  70. var re = /(?:\.([^.]+))?$/;
  71. var ext = re.exec(filename)[1];
  72. if(ext != undefined){
  73. return true;
  74. }
  75. return false;
  76. }
  77. var buildFilename = function(path, filename){
  78. if(path == undefined){
  79. return filename;
  80. }
  81. return path + "/" + filename
  82. }
  83. var list_folder = function(req, res){
  84. var path = getPath(req);
  85. var file_type = "";
  86. var parts;
  87. var extension;
  88. var folder_content = [];
  89. // Path is file or folder
  90. if(!isFile(req.params['file'])){
  91. path = path + req.params['file'];
  92. }
  93. fs.readdir(path, function(err, files) {
  94. files.forEach(function() {
  95. folder_content.push(file);
  96. });
  97. res.json({ files: folder_content });
  98. })
  99. }
  100. var get_file = function(req, res){
  101. var path = getPath(req);
  102. var file_type = "";
  103. var parts;
  104. var extension;
  105. // Load file or look for index?
  106. if(isFile(req.params['file'])){
  107. // Set filetype
  108. path = path + req.params['file'];
  109. parts = req.params['file'].split(".");
  110. extension = parts[parts.length - 1]
  111. if(extension == "md"){
  112. file_type = "markdown"
  113. }
  114. else if(extension == "html"){
  115. file_type = "html"
  116. }
  117. } else {
  118. // return index file if it exists
  119. path = getIndexFilePath(path, req, res)
  120. return;
  121. }
  122. // Action for each filetype
  123. if(file_type == "markdown"){
  124. fs.readFile(path, 'utf8', function (err,data) {
  125. if (err) {
  126. return console.log(err);
  127. } else {
  128. console.log("Rendered: " + path)
  129. res.render('index', build_data(data));
  130. }
  131. });
  132. } else if(file_type == "html"){
  133. fs.readFile(path, 'utf8', function (err,data) {
  134. if (err) {
  135. return console.log(err);
  136. } else {
  137. console.log("Rendered: " + path)
  138. res.render(process.cwd() + "/" + path, extra_data());
  139. }
  140. });
  141. } else {
  142. res.sendFile( process.cwd() + "/" + path, function (err) {
  143. if (err) {
  144. console.log("Error: " + path + " - file not found");
  145. res.status(err.status).end();
  146. }
  147. else {
  148. console.log('Sent:', path);
  149. }
  150. });
  151. }
  152. }
  153. var write_file = function(req, res){
  154. var path = getPath(req);
  155. var save_data;
  156. // Write file
  157. if(isFile(req.params['file'])){
  158. path = path + req.params['file'];
  159. if(path == ""){
  160. console.log("Error: path not specified")
  161. res.status(400).end();
  162. return;
  163. }
  164. if (req.body.file != undefined) {
  165. save_data = req.body.file
  166. }
  167. else if(req.body.data != undefined){
  168. save_data = JSON.stringify(req.body.data)
  169. }
  170. fs.writeFile(path, save_data, function(err) {
  171. if(err) {
  172. console.log("Error: " + path + " - file could not be saved")
  173. console.log(err);
  174. res.status(err.status).end();
  175. } else {
  176. console.log("Saved: " + path);
  177. res.status(200).end();
  178. }
  179. });
  180. }
  181. }
  182. var error_404 = function(req, res){
  183. res.render('error-404', extra_data());
  184. }
  185. var markdown_parser = function(data){
  186. var md = require('markdown-it')({
  187. html: true,
  188. linkify: true,
  189. typographer: true
  190. }).use(require('markdown-it-math'), {
  191. inlineOpen: '\\(',
  192. inlineClose: '\\)',
  193. blockOpen: '\\[',
  194. blockClose: '\\]'
  195. })//.use(require('markdown-it-highlightjs'), {auto: true, code: false})
  196. return md.render(data)
  197. }
  198. var build_data = function(data){
  199. var obj = extra_data();
  200. obj.body = markdown_parser(data);
  201. return obj;
  202. }
  203. var extra_data = function(){
  204. var time = new Date();
  205. var date = time.getFullYear();
  206. var obj = {
  207. date: date
  208. }
  209. return obj;
  210. }
  211. var url_paths = [
  212. '/',
  213. '/:file',
  214. '/:folder_1/:file',
  215. '/:folder_2/:folder_1/:file',
  216. '/:folder_3/:folder_2/:folder_1/:file',
  217. '/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  218. '/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  219. '/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  220. '/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  221. '/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  222. '/:folder_9/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
  223. '/:folder_10/:folder_9/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file'
  224. ]
  225. // API get files in folder (?list=true)
  226. for (var i = 0; i < url_paths.length; i++) {
  227. app.get(url_paths[i], function (req, res) {
  228. if(req.params.list == true){
  229. console.log("Listing folder: " + url_paths[i]);
  230. list_folder(req, res);
  231. }
  232. });
  233. }
  234. // Get file
  235. for (var i = 0; i < url_paths.length; i++) {
  236. app.get(url_paths[i], function (req, res) {
  237. console.log("Sending File: " + url_paths[i]);
  238. get_file(req, res);
  239. })
  240. }
  241. // Write file content
  242. for (var i = 0; i < url_paths.length; i++) {
  243. app.post(url_paths[i], function (req, res) {
  244. console.log("Writing file: " + url_paths[i]);
  245. write_file(req, res);
  246. })
  247. }
  248. app.listen(3000, function () {
  249. console.log('Codex Server – listening on port 3000')
  250. })