@ -1,91 +0,0 @@ | |||
/** | |||
* Main server file for the blog. This file is responsible for | |||
* creating the server and listening for clients. The main run | |||
* function parses the url and calls a sub module to make the | |||
* appropriate pages. | |||
* | |||
* @author Jeffery Russell 7-21-18 | |||
*/ | |||
//http server | |||
const http = require('http'); | |||
//parsing request url | |||
const url = require('url'); | |||
//express app | |||
const express = require("express"); | |||
const app = express(); | |||
//session data for login | |||
const session = require('express-session'); | |||
//sending static content | |||
const includes = require('./includes/includes.js'); | |||
//used for file io | |||
const utils = require('./utils/utils.js'); | |||
//cache -- only used for static contents | |||
const cache = require('memory-cache'); | |||
//Initializes sessions for login | |||
app.use(session({ secret: utils.getFileLine('../session_secret'), cookie: { maxAge: 6000000 }})); | |||
//port to listen for the admin server on | |||
const port = 8001; | |||
/** | |||
* Parses the request url and calls correct JS files | |||
*/ | |||
app.use(function(request, result) | |||
{ | |||
//prevents people from pointing their dns at my IP:port for my site | |||
if(request.headers.host.includes("localhost:" + port) || | |||
request.headers.host.includes("jrtechs.net")) | |||
{ | |||
const filename = url.parse(request.url, true).pathname; | |||
//handles image requests | |||
if(filename.includes("/img/") || filename.includes(".jpg") || filename.includes(".png")) | |||
{ | |||
includes.sendJS(result, filename, cache); | |||
} | |||
else if(filename.includes("/css/") || filename.includes(".woff2")) | |||
{ | |||
includes.sendCSS(result, filename, cache) | |||
} | |||
else if(filename.includes("/js/") || filename.includes(".js")) | |||
{ | |||
includes.sendJS(result, filename, cache); | |||
} | |||
else | |||
{ | |||
result.writeHead(200, {'Content-Type': 'text/html'}); | |||
const file = "./admin/admin.js"; | |||
Promise.all([includes.printAdminHeader(), | |||
require(file).main(request), | |||
includes.printFooter()]).then(function(content) | |||
{ | |||
result.write(content.join('')); | |||
result.end(); | |||
}).catch(function(err) | |||
{ | |||
console.log(err); | |||
throw err; | |||
}); | |||
} | |||
} | |||
else | |||
{ | |||
// utils.printWrongHost(result); | |||
result.writeHead(418, {}); | |||
result.end(); | |||
} | |||
}); | |||
http.createServer(app).listen(port); |
@ -1,7 +0,0 @@ | |||
#!/bin/bash | |||
# | |||
# Runs the admin nodejs server for jrtechs.net | |||
# | |||
# 8/18/18 Jeffery Russell | |||
nodejs admin.js |
@ -0,0 +1,104 @@ | |||
# Insertion Sort | |||
# Heap Sort | |||
# Merge Sort | |||
#Quick Sort | |||
## Memory Greedy Solution | |||
``` | |||
def quickSortNormal(data): | |||
""" | |||
This is the traditional implementation of quick sort | |||
where there are two recursive calls. | |||
""" | |||
if len(data) == 0: | |||
return [] | |||
else: | |||
less, equal, greater = partition(data) | |||
return quickSortNormal(less) + equal + quickSortNormal(greater) | |||
``` | |||
## Accumulation Solution | |||
``` | |||
def quick_sort_accumulation(data, a): | |||
""" | |||
Implementation of quickSort which forces tail recursion | |||
by wrapping the second recursive in the tail positioned | |||
recursive call and added an accumulation variable. | |||
""" | |||
if len(data) == 0: | |||
return a | |||
less, equal, greater = partition(data) | |||
return quick_sort_accumulation(less, | |||
equal + quick_sort_accumulation(greater, a)) | |||
def quicksort(data): | |||
""" | |||
Wrapper function for quick sort accumulation. | |||
""" | |||
return quick_sort_accumulation(data, []) | |||
``` | |||
## In-Place Sorting Implementation | |||
``` | |||
def iterative_partition(data, left, right): | |||
""" | |||
Function which partitions the data into two segments, | |||
the left which is less than the pivot and the right | |||
which is greater than the pivot. The pivot for this | |||
algo is the right most index. This function returns | |||
the ending index of the pivot. | |||
:param data: array to be sorted | |||
:param left: left most portion of array to look at | |||
:param right: right most portion of the array to look at | |||
""" | |||
x = data[right] | |||
i = left - 1 | |||
j = left | |||
while j < right: | |||
if data[j] <= x: | |||
i = i + 1 | |||
data[i], data[j] = data[j], data[i] | |||
j = j+1 | |||
data[i + 1], data[right] = data[right], data[i + 1] | |||
return i + 1 | |||
def iterative_quick_sort(data): | |||
""" | |||
In place implementation of quick sort | |||
Wrapper function for iterative_quick_sort_helper which | |||
initializes, left, right to be the extrema of the array. | |||
""" | |||
iterative_quick_sort_helper(data, 0, len(data) -1) | |||
return data | |||
def iterative_quick_sort_helper(data, left, right): | |||
""" | |||
Uses the divide and conquer algo to sort an array | |||
:param data: array of data | |||
:param left: left index bound for sorting | |||
:param right: right bound for sorting | |||
""" | |||
if left < right: | |||
pivot = iterative_partition(data, left, right) | |||
iterative_quick_sort_helper(data, left, pivot -1) | |||
iterative_quick_sort_helper(data, pivot+1, right) | |||
``` |
@ -1,64 +0,0 @@ | |||
//file io | |||
const utils = require('../utils/utils.js'); | |||
//used to parse the request URL | |||
const url = require('url'); | |||
/** | |||
* @author Jeffery Russell 10-30-18 | |||
* | |||
* @type {{main: (function(*=, *): Promise)}} | |||
*/ | |||
module.exports= | |||
{ | |||
/** | |||
* Calls posts and sidebar modules to render blog contents in order | |||
* | |||
* @param requestURL | |||
* @returns {Promise|*} | |||
*/ | |||
main: function(request, result, baseURL) | |||
{ | |||
//const filename = url.parse(request.url, true).pathname | |||
var filename = url.parse(request.url, true).pathname; | |||
if(filename.includes(".svg") || filename.includes(".svg")) | |||
{ | |||
result.writeHead(200, {'Content-Type': 'image/svg+xml'}); | |||
} | |||
else if(filename.includes("/img/") || filename.includes(".jpg") || | |||
filename.includes(".png") || filename.includes(".ico")) | |||
{ | |||
result.writeHead(200, {'Content-Type': 'image/png'}); | |||
} | |||
else if(filename.includes("/css/") || filename.includes(".woff2") || | |||
filename.includes(".txt")) | |||
{ | |||
result.writeHead(200, {'Content-Type': 'text/css'}); | |||
} | |||
else if(filename.includes("/js/") || filename.includes(".js")) | |||
{ | |||
result.writeHead(200, {'Content-Type': 'application/javascript'}); | |||
} | |||
else | |||
{ | |||
result.writeHead(200, {'Content-Type': 'text/html'}); | |||
} | |||
if(filename == baseURL || filename == baseURL.substring(0, baseURL.length - 1)) | |||
{ | |||
filename = baseURL + "index.html"; | |||
} | |||
utils.include("./blogContent/projects" + filename).then(function(content) | |||
{ | |||
result.write(content); | |||
result.end(); | |||
}).catch(function(error) | |||
{ | |||
console.log(error); | |||
}); | |||
} | |||
}; |
@ -0,0 +1,50 @@ | |||
//used to append static content to result | |||
const includes = require('../includes/includes.js'); | |||
/** | |||
* @author Jeffery Russell 10-30-18 | |||
* | |||
* @type {{main: (function(*=, *): Promise)}} | |||
*/ | |||
module.exports= | |||
{ | |||
serveStaticContent: function(request, result, filename, baseURL) | |||
{ | |||
console.log(filename); | |||
if (filename.includes(".svg") || filename.includes(".svg")) | |||
{ | |||
includes.sendSVG(result, baseURL + filename); | |||
return true; | |||
} | |||
//handles image requests | |||
else if (filename.includes(".jpg") || | |||
filename.includes(".png") || filename.includes(".ico")) | |||
{ | |||
includes.sendImage(result, baseURL + filename); | |||
return true; | |||
} | |||
//css and font files | |||
else if (filename.includes(".woff2") || filename.includes(".css") || | |||
filename.includes(".txt")) | |||
{ | |||
includes.sendCSS(result, baseURL + filename); | |||
return true; | |||
} | |||
//scripts | |||
else if (filename.includes(".js")) | |||
{ | |||
includes.sendJS(result, baseURL + filename); | |||
return true; | |||
} | |||
//html | |||
else if (filename.includes(".html")) | |||
{ | |||
includes.sendHTML(result, baseURL + filename); | |||
return true; | |||
} | |||
return false; | |||
} | |||
}; |
@ -0,0 +1,48 @@ | |||
//sending static content | |||
const includes = require('../includes/includes.js'); | |||
//used to append static content to result | |||
const contentLoader = require('../includes/staticContentServer.js'); | |||
/** | |||
* @author Jeffery Russell 11-3-18 | |||
* | |||
* @type {{main: (function(*=, *): Promise)}} | |||
*/ | |||
module.exports= | |||
{ | |||
/** | |||
* Calls posts and sidebar modules to render blog contents in order | |||
* | |||
* @param requestURL | |||
* @returns {Promise|*} | |||
*/ | |||
main: function(request, result, filename) | |||
{ | |||
if(contentLoader.serveStaticContent(request, result, filename, "")) | |||
{ | |||
//do nothing | |||
} | |||
else | |||
{ | |||
result.writeHead(200, {'Content-Type': 'text/html'}); | |||
const file = "../admin/admin.js"; | |||
Promise.all([includes.printAdminHeader(), | |||
require(file).main(request), | |||
includes.printFooter()]).then(function(content) | |||
{ | |||
result.write(content.join('')); | |||
result.end(); | |||
}).catch(function(err) | |||
{ | |||
console.log(err); | |||
throw err; | |||
}); | |||
} | |||
} | |||
}; |
@ -0,0 +1,83 @@ | |||
//used to append static content to result | |||
const includes = require('../includes/includes.js'); | |||
//used to append static content to result | |||
const contentLoader = require('../includes/staticContentServer.js'); | |||
//caching program to make the application run faster | |||
const cache = require('memory-cache'); | |||
/** | |||
* @author Jeffery Russell 11-3-18 | |||
* | |||
* @type {{main: (function(*=, *): Promise)}} | |||
*/ | |||
module.exports= | |||
{ | |||
/** | |||
* Calls posts and sidebar modules to render blog contents in order | |||
* | |||
* @param requestURL | |||
* @returns {Promise|*} | |||
*/ | |||
main: function(request, result, filename) | |||
{ | |||
if(contentLoader.serveStaticContent(request, result, filename, "")) | |||
{ | |||
//do nothing | |||
} | |||
//downloads | |||
else if (filename.includes("/downloads/")) | |||
{ | |||
require("../includes/downloads.js").main(result, filename); | |||
} | |||
else if (filename.includes("/contact")) | |||
{ | |||
require("../includes/contact.js").main(request, result); | |||
} | |||
else | |||
{ | |||
const html = cache.get(filename); | |||
result.writeHead(200, {'Content-Type': 'text/html'}); | |||
if (html == null) { | |||
var file = ""; | |||
if (filename === '' || filename === '/') | |||
{ | |||
file = "../posts/homePage.js"; | |||
} | |||
else | |||
{ | |||
var urlSplit = filename.split("/"); | |||
if (urlSplit.length >= 2 && urlSplit[1] === 'category') //single category page | |||
file = "../posts/category.js"; | |||
else | |||
file = "../posts/posts.js"; | |||
} | |||
Promise.all([includes.printHeader(), | |||
require(file).main(filename, request), | |||
includes.printFooter()]).then(function (content) | |||
{ | |||
result.write(content.join('')); | |||
result.end(); | |||
cache.put(filename, content.join('')); | |||
}).catch(function (err) | |||
{ | |||
console.log(err); | |||
throw err; | |||
}); | |||
} | |||
else | |||
{ | |||
result.write(html); | |||
result.end(); | |||
} | |||
} | |||
} | |||
}; |
@ -0,0 +1,41 @@ | |||
//file io | |||
const utils = require('../utils/utils.js'); | |||
//used to parse the request URL | |||
const url = require('url'); | |||
//used to append static content to result | |||
const contentLoader = require('../includes/staticContentServer.js'); | |||
/** | |||
* @author Jeffery Russell 10-30-18 | |||
* | |||
* @type {{main: (function(*=, *): Promise)}} | |||
*/ | |||
module.exports= | |||
{ | |||
/** | |||
* Calls posts and sidebar modules to render blog contents in order | |||
* | |||
* @param requestURL | |||
* @returns {Promise|*} | |||
*/ | |||
main: function(request, result, baseURL) | |||
{ | |||
var filename = url.parse(request.url, true).pathname; | |||
if(filename == baseURL || filename == baseURL.substring(0, baseURL.length - 1)) | |||
{ | |||
filename = baseURL + "index.html"; | |||
} | |||
if (!contentLoader.serveStaticContent(request, result, filename, "/blogContent/projects")) | |||
{ | |||
//do something? | |||
} | |||
} | |||
}; |