Compare commits
4 Commits
ef8711b0e1
...
be75382ead
| Author | SHA1 | Date | |
|---|---|---|---|
| be75382ead | |||
| 3d58c5b244 | |||
| 54b6f018cf | |||
| 7d38752f34 |
@@ -21,8 +21,8 @@ Read the [configuation guide](docs/CONFIG.md) for configuration help (in config.
|
|||||||
* user creation, modification and deletion via frontend
|
* user creation, modification and deletion via frontend
|
||||||
* multi user
|
* multi user
|
||||||
* powerful customisation via EJS
|
* powerful customisation via EJS
|
||||||
|
* Configuration via config.json
|
||||||
* site wide and user specific rss, atom
|
* site wide and user specific rss, atom
|
||||||
* hitcount
|
|
||||||
* Markdown syntax in posts
|
* Markdown syntax in posts
|
||||||
* Commenting on posts and replying to other comments
|
* Commenting on posts and replying to other comments
|
||||||
* site wide custom CSS and strings
|
* site wide custom CSS and strings
|
||||||
|
|||||||
@@ -16,10 +16,13 @@ All options show an example configuartion value and the variable type + an expla
|
|||||||
| root_path | "/path/to/root/of/website" | String | Anything in this directory will be in the webroot, so put favicon.ico and anything else here. |
|
| root_path | "/path/to/root/of/website" | String | Anything in this directory will be in the webroot, so put favicon.ico and anything else here. |
|
||||||
| data_storage | "json" | String | JSON is currently the only supported format, but SQL is going to be added/is a work in progress |
|
| data_storage | "json" | String | JSON is currently the only supported format, but SQL is going to be added/is a work in progress |
|
||||||
| cache_data | true | Boolean | Not caching data means you can edit the posts, users, comments etc, maunally and not have to restart the server, however, for large instances this is not reccomended as it takes longer to load the required data. Note: config.json always needs a restart |
|
| cache_data | true | Boolean | Not caching data means you can edit the posts, users, comments etc, maunally and not have to restart the server, however, for large instances this is not reccomended as it takes longer to load the required data. Note: config.json always needs a restart |
|
||||||
|
| request_data_limit | 20 | Integer | The maximum number of objects to return (latest), so if set to 20, then only the 20 most recent posts will ever show |
|
||||||
|
| root_path | '/var/www/blog_root' | String | Relative or Absolute path to the root directory of your static content, holds files such as favicon.ico, custom.css and robots.txt |
|
||||||
|
| locale | 'en_GB' | String | The locale to use which determines the language used and minor cultural differences |
|
||||||
## Basic Customisation
|
## Basic Customisation
|
||||||
| name | example value | variable type | explanation |
|
| name | example value | variable type | explanation |
|
||||||
|-----------------|----------------------------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|-----------------|----------------------------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|locale|"en-GB"|String|Your locale, see [/locales](/locales) for a list of all locales (you can open a PR for a new translation too)|
|
|locale|"en-US"|String|Your locale, see [/locales](/locales) for a list of all locales (you can open a PR for a new translation too)|
|
||||||
|seperator|"\<hr/\>"|String|By default, this will go inbetween posts and generally to seperate out content on pages.|
|
|seperator|"\<hr/\>"|String|By default, this will go inbetween posts and generally to seperate out content on pages.|
|
||||||
|site_name|"Pete's Blogging Site!"|String|It's the name of your blog site, a human readable string.|
|
|site_name|"Pete's Blogging Site!"|String|It's the name of your blog site, a human readable string.|
|
||||||
|site_description|"Read my blogs!"|String|This is what %W represents; it's the description of your instance, a human readable string.|
|
|site_description|"Read my blogs!"|String|This is what %W represents; it's the description of your instance, a human readable string.|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"cache_data": false,
|
"cache_data": false,
|
||||||
"allow_signup": true,
|
"allow_signup": true,
|
||||||
"site_description": "Read my blogs!",
|
"site_description": "Read my blogs!",
|
||||||
"timeline_length": 20,
|
"request_data_limit": 20,
|
||||||
"enable_hitcount": true,
|
"enable_hitcount": true,
|
||||||
"charset": "UTF-8",
|
"charset": "UTF-8",
|
||||||
"root_path": "../webroot/",
|
"root_path": "../webroot/",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"ejs": "^3.1.10",
|
"ejs": "^3.1.10",
|
||||||
"express": "^5.1.0",
|
"express": "^5.2.1",
|
||||||
"express-router": "^0.0.1",
|
"express-router": "^0.0.1",
|
||||||
"markdown-it": "^14.1.0",
|
"markdown-it": "^14.1.0",
|
||||||
"mysql": "^2.18.1",
|
"mysql": "^2.18.1",
|
||||||
|
|||||||
62
src/data.js
62
src/data.js
@@ -14,8 +14,12 @@ export function increment_hitcount(postID = -1) { // -1 Means it will increment
|
|||||||
writedata('hitcount', hitcount);
|
writedata('hitcount', hitcount);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let post = getdata('posts', postID);
|
let post = getdata('posts','id', postID);
|
||||||
if (typeof post.hitcount != 'undefined') {
|
if (post == 1) // Does not exist
|
||||||
|
{
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
else if (typeof post.hitcount != 'undefined') {
|
||||||
post.hitcount += 1;
|
post.hitcount += 1;
|
||||||
writedata('posts', post, postID)
|
writedata('posts', post, postID)
|
||||||
return 0
|
return 0
|
||||||
@@ -68,31 +72,45 @@ export function searchdata(term, type) { // Searches users and posts for any mat
|
|||||||
return search_results;
|
return search_results;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getdata(data, index=-1) {
|
export function getdata(table_name, key=-1, value=-1) {
|
||||||
|
let result = undefined
|
||||||
if (config["data_storage"] == "json") {
|
switch (config["data_storage"]) {
|
||||||
if (data == "posts" || data == 'users' || data == 'comments') {
|
case 'json':
|
||||||
let result = func.require_module(`../data/${data}.json`)
|
switch (table_name) {
|
||||||
if (index != -1) {
|
case 'users':
|
||||||
if (index < result.length) {
|
case 'posts':
|
||||||
return result[index]
|
case 'comments':
|
||||||
|
result = func.require_module(`../data/${table_name}.json`)
|
||||||
|
if (key != -1) {
|
||||||
|
if (key == 'id')
|
||||||
|
{ // id is the index
|
||||||
|
if (value < result.length && value >= 0)
|
||||||
|
{
|
||||||
|
return result[value]
|
||||||
}
|
}
|
||||||
return 1 // This index doesn't exist
|
else
|
||||||
}
|
{
|
||||||
return result
|
console.log("No object of this ID exists for the selected table")
|
||||||
}
|
|
||||||
else if (data == "hitcount") {
|
|
||||||
let result = func.require_module('../data/data.json') // This file is actually called data.json
|
|
||||||
return result["hitcount"]
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("Error, invalid requested")
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return result[func.find_key_value_pair(result, key, value)]
|
||||||
|
return -1 // This index doesn't exist
|
||||||
|
}
|
||||||
|
return result.slice(- config['data_request_limit'])
|
||||||
|
break;
|
||||||
|
case 'hitcount':
|
||||||
|
result = func.require_module('../data/data.json') // This file is actually called data.json
|
||||||
|
return result["hitcount"]
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log("Error, invalid requested")
|
||||||
|
return -1
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
// NOT YET WORKING!
|
// NOT YET WORKING!
|
||||||
if (config["data_storage"] == "mysql") {
|
case 'mysql':
|
||||||
const mysql = require('mysql');
|
const mysql = require('mysql');
|
||||||
let con = mysql.createConnection({
|
let con = mysql.createConnection({
|
||||||
host: config.database.host,
|
host: config.database.host,
|
||||||
|
|||||||
@@ -7,12 +7,15 @@ const locale = require(`../locales/${config.locale}.json`)
|
|||||||
// This function requires a module without caching it
|
// This function requires a module without caching it
|
||||||
// So the server doesn't need to be restarted, though this can slow it down a bit.
|
// So the server doesn't need to be restarted, though this can slow it down a bit.
|
||||||
// https://stackoverflow.com/a/16060619
|
// https://stackoverflow.com/a/16060619
|
||||||
export function require_module(module) {
|
export function require_module(module)
|
||||||
if (config.cache_data == false) {
|
{
|
||||||
|
if (config.cache_data == false)
|
||||||
|
{
|
||||||
delete require.cache[require.resolve(module)];
|
delete require.cache[require.resolve(module)];
|
||||||
return require(module);
|
return require(module);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
return require(module);
|
return require(module);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +25,8 @@ export function require_module(module) {
|
|||||||
// this converts unix time (an integer) into a string that is formatted according to config.js
|
// this converts unix time (an integer) into a string that is formatted according to config.js
|
||||||
// uses date-fns's fromUnixTime() and format() functions
|
// uses date-fns's fromUnixTime() and format() functions
|
||||||
// returns the formatted date (string)
|
// returns the formatted date (string)
|
||||||
export function unix_time_to_date_format(unix_time) {
|
export function unix_time_to_date_format(unix_time)
|
||||||
|
{
|
||||||
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
||||||
let date = fromUnixTime(unix_time)
|
let date = fromUnixTime(unix_time)
|
||||||
let formatted_date = format(date, config.date_format)
|
let formatted_date = format(date, config.date_format)
|
||||||
@@ -33,14 +37,16 @@ export function unix_time_to_date_format(unix_time) {
|
|||||||
// eg "Mon, 23 May 2025 18:59:59 +0100"
|
// eg "Mon, 23 May 2025 18:59:59 +0100"
|
||||||
// accepts unix time (int)
|
// accepts unix time (int)
|
||||||
// returns the formatted date (string)
|
// returns the formatted date (string)
|
||||||
export function unix_time_to_rss_date(unix_time) {
|
export function unix_time_to_rss_date(unix_time)
|
||||||
|
{
|
||||||
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
||||||
let date = fromUnixTime(unix_time)
|
let date = fromUnixTime(unix_time)
|
||||||
let formatted_date = format(date, "EEE, dd MMM yyyy HH:mm:ss")
|
let formatted_date = format(date, "EEE, dd MMM yyyy HH:mm:ss")
|
||||||
return `${formatted_date} ${config.time_zone}`
|
return `${formatted_date} ${config.time_zone}`
|
||||||
}
|
}
|
||||||
// And again with atom's date format
|
// And again with atom's date format
|
||||||
export function unix_time_to_atom_date(unix_time) {
|
export function unix_time_to_atom_date(unix_time)
|
||||||
|
{
|
||||||
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
||||||
let date = fromUnixTime(unix_time)
|
let date = fromUnixTime(unix_time)
|
||||||
let formatted_date = format(date, "yyyy-MM-dd'T'HH:mm:ss'Z'")
|
let formatted_date = format(date, "yyyy-MM-dd'T'HH:mm:ss'Z'")
|
||||||
@@ -51,13 +57,17 @@ export function unix_time_to_atom_date(unix_time) {
|
|||||||
// eg "<a href="/tag/string1">string1</a>, <a href="/tag/string2">string2</a>, <a href="/tag/string3">string3</a>"
|
// eg "<a href="/tag/string1">string1</a>, <a href="/tag/string2">string2</a>, <a href="/tag/string3">string3</a>"
|
||||||
// this is so you can have a list of tags that each point to their individual tag page
|
// this is so you can have a list of tags that each point to their individual tag page
|
||||||
// returns: string
|
// returns: string
|
||||||
export function render_tags(tags) {
|
export function render_tags(tags)
|
||||||
|
{
|
||||||
let string = "" // Initialises the string
|
let string = "" // Initialises the string
|
||||||
if (tags.length == 1 && tags[0] == "") {
|
if (tags.length == 1 && tags[0] == "")
|
||||||
|
{
|
||||||
string = ''; // If there are no tags, output nothing
|
string = ''; // If there are no tags, output nothing
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
for (let tag_index = 0; tag_index < tags.length; tag_index++) { // Loop over each tag
|
{
|
||||||
|
for (let tag_index = 0; tag_index < tags.length; tag_index++)
|
||||||
|
{ // Loop over each tag
|
||||||
string += `<a href="/tag/${tags[tag_index].trim()}">#${tags[tag_index].trim()}</a> ` // Adds the tag to the string as a HTML href
|
string += `<a href="/tag/${tags[tag_index].trim()}">#${tags[tag_index].trim()}</a> ` // Adds the tag to the string as a HTML href
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,10 +78,13 @@ export function render_tags(tags) {
|
|||||||
// This function returns the username for a given userID by looping over every user
|
// This function returns the username for a given userID by looping over every user
|
||||||
// if the user is present, it returns the index of the user (integer)
|
// if the user is present, it returns the index of the user (integer)
|
||||||
// if the user is not present it returns -1
|
// if the user is not present it returns -1
|
||||||
export function get_userID(username) {
|
export function get_userID(username)
|
||||||
const users = require("../data/users.json")
|
{
|
||||||
for (let i = 0; i < users.length; i++) { // Loop over every user
|
const users = require_module("../data/users.json")
|
||||||
if (users[i]['username'] == username) {
|
for (let i = 0; i < users.length; i++)
|
||||||
|
{ // Loop over every user
|
||||||
|
if (users[i]['username'] == username)
|
||||||
|
{
|
||||||
return i // If the username matches then return the index of that user
|
return i // If the username matches then return the index of that user
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,7 +95,8 @@ export function get_userID(username) {
|
|||||||
// https://www.freeformatter.com/html-entities.html
|
// https://www.freeformatter.com/html-entities.html
|
||||||
// accepts a string
|
// accepts a string
|
||||||
// returns a string with some character replaced by their entities
|
// returns a string with some character replaced by their entities
|
||||||
export function escape_input(input) {
|
export function escape_input(input)
|
||||||
|
{
|
||||||
let output = input
|
let output = input
|
||||||
.replaceAll("&", "&") // This must be first
|
.replaceAll("&", "&") // This must be first
|
||||||
.replaceAll("<", "<")
|
.replaceAll("<", "<")
|
||||||
@@ -97,7 +111,8 @@ export function escape_input(input) {
|
|||||||
|
|
||||||
// Render comment content by replacing the >> int with a url link to that comment
|
// Render comment content by replacing the >> int with a url link to that comment
|
||||||
// Syntax: ">> postID-commentID"
|
// Syntax: ">> postID-commentID"
|
||||||
export function render_comment(comment_content) {
|
export function render_comment(comment_content)
|
||||||
|
{
|
||||||
return comment_content
|
return comment_content
|
||||||
.replaceAll(/>> ([0-9]*)-([0-9]*)/g, "<a href='/comment/$1-$2'>>> $1-$2</a>")
|
.replaceAll(/>> ([0-9]*)-([0-9]*)/g, "<a href='/comment/$1-$2'>>> $1-$2</a>")
|
||||||
.replaceAll(/>>([0-9]*)-([0-9]*)/g, "<a href='/comment/$1-$2'>>>$1-$2</a>")
|
.replaceAll(/>>([0-9]*)-([0-9]*)/g, "<a href='/comment/$1-$2'>>>$1-$2</a>")
|
||||||
@@ -108,9 +123,11 @@ export function render_comment(comment_content) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Renders a string into markdown using markdown-it library
|
// Renders a string into markdown using markdown-it library
|
||||||
export function render_md(content) {
|
export function render_md(content)
|
||||||
|
{
|
||||||
const markdownit = require("markdown-it")
|
const markdownit = require("markdown-it")
|
||||||
const md = markdownit({ // this is just defining some options for markdown-it, should I add this to config.json?
|
const md = markdownit
|
||||||
|
({ // this is just defining some options for markdown-it, should I add this to config.json?
|
||||||
html: false,
|
html: false,
|
||||||
xhtmlOut: false,
|
xhtmlOut: false,
|
||||||
breaks: true,
|
breaks: true,
|
||||||
@@ -121,3 +138,11 @@ export function render_md(content) {
|
|||||||
return md.render(content)
|
return md.render(content)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function find_key_value_pair(data_array, key, value) {
|
||||||
|
for (let i = 0; i < data_array.length; i++) {
|
||||||
|
if (data_array[i][key] == value) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
};
|
||||||
|
|||||||
@@ -31,11 +31,10 @@ router.post("/submit_comment", (req,res) => {
|
|||||||
new_comment = {
|
new_comment = {
|
||||||
"name": name,
|
"name": name,
|
||||||
"content": content,
|
"content": content,
|
||||||
"id": comments[postID].length,
|
"id": comments[postID]['comments'].length,
|
||||||
"pubdate": unix_timestamp,
|
"pubdate": unix_timestamp,
|
||||||
"postID": postID,
|
|
||||||
};
|
};
|
||||||
comments[postID].push(new_comment);
|
comments[postID]['comments'].push(new_comment);
|
||||||
fs.writeFileSync(`../data/comments.json`, `${JSON.stringify(comments)}`, 'utf-8');
|
fs.writeFileSync(`../data/comments.json`, `${JSON.stringify(comments)}`, 'utf-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,8 +58,9 @@ router.post("/submit_post", (req,res) => {
|
|||||||
|
|
||||||
else if (users[func.get_userID(username)]['hash'] == password) { // Password matches
|
else if (users[func.get_userID(username)]['hash'] == password) { // Password matches
|
||||||
console.log(username, "is submitting a post titled:", title);
|
console.log(username, "is submitting a post titled:", title);
|
||||||
|
id = posts.length
|
||||||
posts.push({
|
posts.push({
|
||||||
"id": posts.length,
|
"id": id,
|
||||||
"userID": func.get_userID(username),
|
"userID": func.get_userID(username),
|
||||||
"title": title,
|
"title": title,
|
||||||
"content": content,
|
"content": content,
|
||||||
@@ -69,7 +69,7 @@ router.post("/submit_post", (req,res) => {
|
|||||||
"tags": tags,
|
"tags": tags,
|
||||||
})
|
})
|
||||||
fs.writeFileSync(`../data/posts.json`, `${JSON.stringify(posts)}`, 'utf-8');
|
fs.writeFileSync(`../data/posts.json`, `${JSON.stringify(posts)}`, 'utf-8');
|
||||||
comments.push([])
|
comments.push({'id': id, 'comments': []})
|
||||||
fs.writeFileSync(`../data/comments.json`, `${JSON.stringify(comments)}`)
|
fs.writeFileSync(`../data/comments.json`, `${JSON.stringify(comments)}`)
|
||||||
res.redirect(302, "/");
|
res.redirect(302, "/");
|
||||||
}
|
}
|
||||||
@@ -216,7 +216,7 @@ router.get('/search', (req, res) => {
|
|||||||
console.log('searching for: ', search_term);
|
console.log('searching for: ', search_term);
|
||||||
const search_results = data.searchdata(search_term, search_type); // data.searchdata returns an array of search results
|
const search_results = data.searchdata(search_term, search_type); // data.searchdata returns an array of search results
|
||||||
|
|
||||||
res.render('partials/search', {
|
res.render('pages/search', {
|
||||||
config,
|
config,
|
||||||
locale,
|
locale,
|
||||||
search_results,
|
search_results,
|
||||||
|
|||||||
@@ -38,14 +38,14 @@ router.get(`${config.edit_account_base_url}/:user_id`, (req,res) => {
|
|||||||
res.render("forms/edit_account", {
|
res.render("forms/edit_account", {
|
||||||
config,
|
config,
|
||||||
locale,
|
locale,
|
||||||
user: data.getdata('users', userID),
|
user: data.getdata('users', 'id', userID),
|
||||||
userID
|
userID
|
||||||
});
|
});
|
||||||
}); // /delete_account
|
}); // /delete_account
|
||||||
router.get(`${config.edit_post_base_url}/:post_id`, (req,res) => {
|
router.get(`${config.edit_post_base_url}/:post_id`, (req,res) => {
|
||||||
const postID = req.params.post_id
|
const postID = req.params.post_id
|
||||||
const post = data.getdata('posts', postID)
|
const post = data.getdata('posts','id', postID)
|
||||||
const user = data.getdata('users', post.userID)
|
const user = data.getdata('users', 'id', post.userID)
|
||||||
res.render("forms/edit_post", {
|
res.render("forms/edit_post", {
|
||||||
config,
|
config,
|
||||||
locale,
|
locale,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ router.get("/index/pages", (req,res) => {
|
|||||||
users: data.getdata('users'),
|
users: data.getdata('users'),
|
||||||
comments: data.getdata('comments'),
|
comments: data.getdata('comments'),
|
||||||
});
|
});
|
||||||
}); // /index/posts
|
}); // /index/pages
|
||||||
router.get("/index/posts", (req,res) => {
|
router.get("/index/posts", (req,res) => {
|
||||||
res.render("indexes/posts", {
|
res.render("indexes/posts", {
|
||||||
config,
|
config,
|
||||||
@@ -25,13 +25,13 @@ router.get("/index/users", (req,res) => {
|
|||||||
config,
|
config,
|
||||||
users: data.getdata('users'),
|
users: data.getdata('users'),
|
||||||
});
|
});
|
||||||
}); // /index/posts
|
}); // /index/users
|
||||||
router.get("/index/comments", (req,res) => {
|
router.get("/index/comments", (req,res) => {
|
||||||
res.render("indexes/comments", {
|
res.render("indexes/comments", {
|
||||||
config,
|
config,
|
||||||
comments: data.getdata('comments'),
|
comments: data.getdata('comments'),
|
||||||
});
|
});
|
||||||
}); // /index/posts
|
}); // /index/comments
|
||||||
|
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ router.get("/", (req,res) => {
|
|||||||
// Users
|
// Users
|
||||||
router.get("/user/:username", (req, res) => {
|
router.get("/user/:username", (req, res) => {
|
||||||
const userID = func.get_userID(req.params.username)
|
const userID = func.get_userID(req.params.username)
|
||||||
let user = data.getdata('users', userID)
|
let user = data.getdata('users', 'id', userID)
|
||||||
if (userID != -1) {
|
if (userID != -1) {
|
||||||
res.render("pages/user",
|
res.render("pages/user",
|
||||||
{
|
{
|
||||||
@@ -61,25 +61,25 @@ router.get("/user/:username", (req, res) => {
|
|||||||
// Posts
|
// Posts
|
||||||
router.get("/post/:post_index", (req, res) => {
|
router.get("/post/:post_index", (req, res) => {
|
||||||
const postID = parseInt(req.params.post_index)
|
const postID = parseInt(req.params.post_index)
|
||||||
let post = data.getdata('posts', postID)
|
let post = data.getdata('posts','id', postID)
|
||||||
if (post == 1) { // data.getdata returns error code 1 if nothing is available
|
if (post == 1) { // data.getdata returns error code 1 if nothing is available
|
||||||
res.render("partials/message", {
|
res.render("partials/message", {
|
||||||
message: locale.post_doesnt_exist,
|
message: locale.post_doesnt_exist,
|
||||||
config,
|
config,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
else if (typeof post["deleted"] == "undefined" || post["deleted"] == false) {
|
||||||
if (config.enable_hitcount) {
|
if (config.enable_hitcount) {
|
||||||
data.increment_hitcount(postID)
|
data.increment_hitcount(postID)
|
||||||
}
|
}
|
||||||
if (typeof post["deleted"] == "undefined" || post["deleted"] == false) {
|
|
||||||
res.render("pages/post",
|
res.render("pages/post",
|
||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
locale,
|
locale,
|
||||||
post,
|
post,
|
||||||
postID,
|
postID,
|
||||||
user: data.getdata('users', post.userID),
|
user: data.getdata('users','id', post.userID),
|
||||||
comments: data.getdata('comments', postID),
|
comments: data.getdata('comments','id', postID)["comments"],
|
||||||
fromUnixTime,
|
fromUnixTime,
|
||||||
format,
|
format,
|
||||||
getUnixTime,
|
getUnixTime,
|
||||||
@@ -117,7 +117,7 @@ router.get("/comment/:postID-:commentID", (req,res) => {
|
|||||||
const commentID = parseInt(req.params.commentID);
|
const commentID = parseInt(req.params.commentID);
|
||||||
const postID = parseInt(req.params.postID);
|
const postID = parseInt(req.params.postID);
|
||||||
|
|
||||||
let posts_comments = data.getdata('comments', postID)
|
let posts_comments = data.getdata('comments', 'id', postID)["comments"]
|
||||||
let comment = 1
|
let comment = 1
|
||||||
// For loop to find the comment with matching ID
|
// For loop to find the comment with matching ID
|
||||||
posts_comments.forEach((current_comment, index) => {
|
posts_comments.forEach((current_comment, index) => {
|
||||||
|
|||||||
@@ -11,30 +11,7 @@ const ejs = require("ejs")
|
|||||||
const func = require("./functions.js")
|
const func = require("./functions.js")
|
||||||
const data = require("./data.js")
|
const data = require("./data.js")
|
||||||
|
|
||||||
|
|
||||||
// Define the modules now so they are global
|
|
||||||
let users // contains a list of users, each user is an object containing username,prettyname,hash and description
|
|
||||||
let posts // contains a list of posts,
|
|
||||||
let comments // contains a list of comments
|
|
||||||
let config // contains a set of configuration for the site, see example-config.js for an example
|
|
||||||
|
|
||||||
config = require('../config.json');
|
config = require('../config.json');
|
||||||
if (config["data_storage"] == "json") {
|
|
||||||
try {
|
|
||||||
// We're going to try and import the modules,
|
|
||||||
users = require('../data/users.json');
|
|
||||||
posts = require('../data/posts.json');
|
|
||||||
comments = require('../data/comments.json');
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
// if they don't all import then
|
|
||||||
// inform the user to pass --first-time and exit with an error code
|
|
||||||
console.log("A file is missing!")
|
|
||||||
console.log("Run 'make' to initialise the data files")
|
|
||||||
console.log(error)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Import the locale
|
// Import the locale
|
||||||
try {
|
try {
|
||||||
@@ -67,6 +44,45 @@ app.use('/', standard_pages_routes);
|
|||||||
app.use('/', forms_routes);
|
app.use('/', forms_routes);
|
||||||
app.use('/', form_actions_routes);
|
app.use('/', form_actions_routes);
|
||||||
|
|
||||||
|
function perform_checks()
|
||||||
|
{
|
||||||
|
console.log("Performing startup checks...")
|
||||||
|
exit_flag = false
|
||||||
|
required_values = ['site_admin','seperator','site_name','site_url','locale','port','cache_data','allow_signup','site_description','request_data_limit','enable_hitcount','charset','root_path','edit_account_base_url','new_post_url','signup_url','default_commenter_username','rss','atom','date_format','time_zone','css']
|
||||||
|
// Perform some standard checks:
|
||||||
|
|
||||||
|
// data_storage
|
||||||
|
switch (config.data_storage)
|
||||||
|
{
|
||||||
|
case 'mysql':
|
||||||
|
case 'json':
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
console.log("[ ERROR ] invalid value in `data_storage`\nPlease modify config.json. Value should be 'mysql' or 'json'.")
|
||||||
|
exit_flag = true
|
||||||
|
}
|
||||||
|
// auto_generated
|
||||||
|
if (config.auto_generated)
|
||||||
|
{
|
||||||
|
console.log("[ ERROR ] `autogenerated` option set to true\nplease edit the config.json file to include your relevant information, then set to false or remove the autogenerated option.")
|
||||||
|
exit_flag = true
|
||||||
|
}
|
||||||
|
// Check required values are present
|
||||||
|
required_values.forEach((value) => { // Use a loop to check each required value is present
|
||||||
|
if (typeof config[value] == 'undefined') {
|
||||||
|
exit_flag = true
|
||||||
|
console.log(`[ ERROR ] \`${value}\` is undefined\nPlease set it to something, read the documentation for help.`)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (exit_flag)
|
||||||
|
{
|
||||||
|
console.log("Exiting due to errors.")
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
perform_checks()
|
||||||
|
|
||||||
|
|
||||||
app.listen(config.port, () => {
|
app.listen(config.port, () => {
|
||||||
console.log(`Server is running at http://localhost:${config.port} webroot: ${config.root_path}`);
|
console.log(`Server is running at http://localhost:${config.port} webroot: ${config.root_path}`);
|
||||||
console.log("Running in: ", __dirname)
|
console.log("Running in: ", __dirname)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<% }; %>
|
<% }; %>
|
||||||
Comments:<br/>
|
Comments:<br/>
|
||||||
<% for (let postID = 0; postID < comments.length; postID++) { %>
|
<% for (let postID = 0; postID < comments.length; postID++) { %>
|
||||||
<% for (let comment_index = 0; comment_index < comments[postID].length; comment_index++) { %>
|
<% for (let comment_index = 0; comment_index < comments[postID]['comments'].length; comment_index++) { %>
|
||||||
<a href="/comment/<%= postID %>-<%= comment_index %>"><%= postID %>-<%= comment_index %></a><br/>
|
<a href="/comment/<%= postID %>-<%= comment_index %>"><%= postID %>-<%= comment_index %></a><br/>
|
||||||
<% }; %>
|
<% }; %>
|
||||||
<% }; %>
|
<% }; %>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<% for (let postID = 0; postID < comments.length; postID++) { %>
|
<% for (let postID = 0; postID < comments.length; postID++) { %>
|
||||||
<% for (let comment_index = 0; comment_index < comments[postID].length; comment_index++) { %>
|
<% for (let comment_index = 0; comment_index < comments[postID]['comments'].length; comment_index++) { %>
|
||||||
<a href="/comment/<%= postID %>-<%= comment_index %>"><%= postID %>-<%= comment_index %></a><br/>
|
<a href="/comment/<%= postID %>-<%= comment_index %>"><%= postID %>-<%= comment_index %></a><br/>
|
||||||
<% }; %>
|
<% }; %>
|
||||||
<% }; %>
|
<% }; %>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<%- include('../partials/head'); %>
|
<%- include('../partials/head'); %>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id='header'>
|
<div id='site-header'>
|
||||||
<%- include('../headers/site_wide'); %>
|
<%- include('../headers/site_wide'); %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="post-details">
|
<div id="post-details">
|
||||||
<span id="post-author">
|
<span id="post-author">
|
||||||
<i><%= locale.written_by %> <a href="/user/<%= user.username %>"><%= user.username %></a></i>
|
<i><%= locale.written_by %> <a href="/user/<%= user.username %>"><%= user.prettyname %></a></i>
|
||||||
</span>
|
</span>
|
||||||
-
|
-
|
||||||
<span id="post-pubdate">
|
<span id="post-pubdate">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="post-details">
|
<div id="post-details">
|
||||||
<span id="post-author">
|
<span id="post-author">
|
||||||
<i><a href="/user/<%= user.username %>"><%= user.username %></a></i>
|
<i><a href="/user/<%= user.username %>"><%= user.prettyname %></a></i>
|
||||||
</span>
|
</span>
|
||||||
-
|
-
|
||||||
<span id="post-pubdate">
|
<span id="post-pubdate">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="post-details">
|
<div id="post-details">
|
||||||
<span id="post-author">
|
<span id="post-author">
|
||||||
<i><a href="/user/<%= user.username %>"><%= user.username %></a></i>
|
<i><a href="/user/<%= user.username %>"><%= user.prettyname %></a></i>
|
||||||
</span>
|
</span>
|
||||||
-
|
-
|
||||||
<span id="post-pubdate">
|
<span id="post-pubdate">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="post-details">
|
<div id="post-details">
|
||||||
<span id="post-author">
|
<span id="post-author">
|
||||||
<i><a href="/user/<%= user.username %>"><%= user.username %></a></i>
|
<i><a href="/user/<%= user.username %>"><%= user.prettyname %></a></i>
|
||||||
</span>
|
</span>
|
||||||
-
|
-
|
||||||
<span id="post-pubdate">
|
<span id="post-pubdate">
|
||||||
|
|||||||
@@ -15,11 +15,23 @@ body {
|
|||||||
input, textarea, button {
|
input, textarea, button {
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
font-size: 20px;
|
||||||
|
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 250px;
|
||||||
field-sizing: content; /* Only supported by Chromium */
|
field-sizing: content; /* Only supported by Chromium */
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
#search-form input {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
a:hover {
|
a:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user