123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- #!/usr/bin/env node
- 'use strict';
- var express = require('express')
- var app = express()
- var path = require('path');
- var fs = require('fs');
- var bodyParser = require('body-parser');
- var _ = require('lodash');
- app.engine('html', require('ejs').renderFile);
- app.set('view engine', 'html');
- app.use(express.static('public'))
- app.use(bodyParser.json());
- var getPath = function(req){
- var path = "";
- if(req.params['folder_10'] != undefined){
- path = path + req.params['folder_10'] + "/"
- }
- if(req.params['folder_9'] != undefined){
- path = path + req.params['folder_9'] + "/"
- }
- if(req.params['folder_8'] != undefined){
- path = path + req.params['folder_8'] + "/"
- }
- if(req.params['folder_7'] != undefined){
- path = path + req.params['folder_7'] + "/"
- }
- if(req.params['folder_6'] != undefined){
- path = path + req.params['folder_6'] + "/"
- }
- if(req.params['folder_5'] != undefined){
- path = path + req.params['folder_5'] + "/"
- }
- if(req.params['folder_4'] != undefined){
- path = path + req.params['folder_4'] + "/"
- }
- if(req.params['folder_3'] != undefined){
- path = path + req.params['folder_3'] + "/"
- }
- if(req.params['folder_2'] != undefined){
- path = path + req.params['folder_2'] + "/"
- }
- if(req.params['folder_1'] != undefined){
- path = path + req.params['folder_1'] + "/"
- }
- return path;
- }
- var getIndexFilePath = function(path, req, res){
- if(req.params['file'] != undefined){
- path = path + req.params['file'] + "/";
- }
- console.log("Looking for index file in " + path);
- fs.readFile(path + "index.html", 'utf8', function (err,data) {
- if (err) {
- fs.readFile(path + "index.md", 'utf8', function (err,data) {
- if (err) {
- error_404(req, res);
- } else {
- req.params['file'] = buildFilename(req.params['file'], "index.md");
- get_file(req, res);
- }
- });
- } else {
- req.params['file'] = buildFilename(req.params['file'], "index.html");
- get_file(req, res);
- }
- });
- }
- var isFile = function(filename){
- var re = /(?:\.([^.]+))?$/;
- var ext = re.exec(filename)[1];
- if(ext != undefined){
- return true;
- }
- return false;
- }
- var buildFilename = function(path, filename){
- if(path == undefined){
- return filename;
- }
- return path + "/" + filename
- }
- var list_folder = function(req, res){
- var path = getPath(req);
- var file_type = "";
- var parts;
- var extension;
- var folder_content = [];
-
- if(!isFile(req.params['file'])){
- path = path + req.params['file'];
- }
- fs.readdir(path, function(err, files) {
- files.forEach(function() {
- folder_content.push(file);
- });
- res.json({ files: folder_content });
- })
- }
- var get_file = function(req, res){
- var path = getPath(req);
- var file_type = "";
- var parts;
- var extension;
-
- if(isFile(req.params['file'])){
-
- path = path + req.params['file'];
- parts = req.params['file'].split(".");
- extension = parts[parts.length - 1]
- if(extension == "md"){
- file_type = "markdown"
- }
- else if(extension == "html"){
- file_type = "html"
- }
- } else {
-
- path = getIndexFilePath(path, req, res)
- return;
- }
-
- if(file_type == "markdown"){
- fs.readFile(path, 'utf8', function (err,data) {
- if (err) {
- return console.log(err);
- } else {
- console.log("Rendered: " + path)
- res.render('index', build_data(data));
- }
- });
- } else if(file_type == "html"){
- fs.readFile(path, 'utf8', function (err,data) {
- if (err) {
- return console.log(err);
- } else {
- console.log("Rendered: " + path)
- res.render(process.cwd() + "/" + path, extra_data());
- }
- });
- } else {
- res.sendFile( process.cwd() + "/" + path, function (err) {
- if (err) {
- console.log("Error: " + path + " - file not found");
- res.status(err.status).end();
- }
- else {
- console.log('Sent:', path);
- }
- });
- }
- }
- var write_file = function(req, res){
- var path = getPath(req);
- var save_data;
-
- if(isFile(req.params['file'])){
- path = path + req.params['file'];
- if(path == ""){
- console.log("Error: path not specified")
- res.status(400).end();
- return;
- }
- if (req.body.file != undefined) {
- save_data = req.body.file
- }
- else if(req.body.data != undefined){
- save_data = JSON.stringify(req.body.data)
- }
- fs.writeFile(path, save_data, function(err) {
- if(err) {
- console.log("Error: " + path + " - file could not be saved")
- console.log(err);
- res.status(err.status).end();
- } else {
- console.log("Saved: " + path);
- res.status(200).end();
- }
- });
- }
- }
- var error_404 = function(req, res){
- res.render('error-404', extra_data());
- }
- var markdown_parser = function(data){
- var md = require('markdown-it')({
- html: true,
- linkify: true,
- typographer: true
- }).use(require('markdown-it-math'), {
- inlineOpen: '\\(',
- inlineClose: '\\)',
- blockOpen: '\\[',
- blockClose: '\\]'
- })
- return md.render(data)
- }
- var build_data = function(data){
- var obj = extra_data();
- obj.body = markdown_parser(data);
- return obj;
- }
- var extra_data = function(){
- var time = new Date();
- var date = time.getFullYear();
- var obj = {
- date: date
- }
- return obj;
- }
- var url_paths = [
- '/',
- '/:file',
- '/:folder_1/:file',
- '/:folder_2/:folder_1/:file',
- '/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_9/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file',
- '/:folder_10/:folder_9/:folder_8/:folder_7/:folder_6/:folder_5/:folder_4/:folder_3/:folder_2/:folder_1/:file'
- ]
- for (var i = 0; i < url_paths.length; i++) {
- app.get(url_paths[i], function (req, res) {
- if(req.params.list == true){
- console.log("Listing folder: " + url_paths[i]);
- list_folder(req, res);
- }
- });
- }
- for (var i = 0; i < url_paths.length; i++) {
- app.get(url_paths[i], function (req, res) {
- console.log("Sending File: " + url_paths[i]);
- get_file(req, res);
- })
- }
- for (var i = 0; i < url_paths.length; i++) {
- app.post(url_paths[i], function (req, res) {
- console.log("Writing file: " + url_paths[i]);
- write_file(req, res);
- })
- }
- app.listen(3000, function () {
- console.log('Codex Server – listening on port 3000')
- })
|