const express = require('express');
const crypto = require('crypto'); // For encrypting passwords
const { fromUnixTime, format, getUnixTime } = require("date-fns")
const fs = require('fs');
const users = require('./users.js');
const posts = require('./posts.js');
const config = require('./config.js');
const app = express();
const port = 8080;
let footer_div = config.site_wide_footer
footer_div = replace_format_indicators(footer_div)
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static(config.root_path));
function get_userID(username) {
for (let i = 0; i < users.users.length; i++) {
if (users.users[i]['username'] == username) {
return i
}
}
return -1
}
function unix_time_to_date_format(unix_time) {
date = fromUnixTime(unix_time)
formatted_date = format(date, config.date_format)
return formatted_date
}
function unix_time_to_rss_date(unix_time) {
date = fromUnixTime(unix_time)
formatted_date = format(date, "EEE, dd MMM yyyy HH:mm:ss")
return `${formatted_date} ${config.time_zone}`
}
function hyperlink_tags(tags) {
string = ""
for (let tag_index = 0; tag_index < tags.length; tag_index++) {
string += `${tags[tag_index]}`
if (tag_index < tags.length - 1) {
string += ", ";
}
}
return string
}
function replace_format_indicators(input_string, post_index=0, tag_name="tag") {
post_object = posts.posts[post_index]
output_string = input_string
.replaceAll("%%", "%")
.replaceAll("%A", (post_object["tags"]))
.replaceAll("%B", (hyperlink_tags(post_object["tags"])))
.replaceAll("%C", markdown_to_html(post_object["content"]))
.replaceAll("%D", unix_time_to_date_format(post_object["pubdate"]))
.replaceAll("%E", unix_time_to_date_format(post_object["editdate"]))
.replaceAll("%F", users.users[post_object["userID"]]['prettyname'])
.replaceAll("%G", tag_name)
.replaceAll("%I", users.users[post_object['userID']]['description'])
.replaceAll("%L", `/post/${post_index}`)
.replaceAll("%N", users.users[post_object["userID"]]['username'])
.replaceAll("%P", "/post")
.replaceAll("%O", `/edit/${post_index}`)
.replaceAll("%R", "/rss")
.replaceAll("%S", config.seperator)
.replaceAll("%T", markdown_to_html(post_object["title"]))
.replaceAll("%U", `/user/${users.users[post_object["userID"]]['username']}`)
.replaceAll("%Y", config.site_name)
.replaceAll("%W", config.site_description)
.replaceAll("%Z", config.attribution)
if (config.enable_hitcount == true) {
output_string = output_string
.replaceAll("%H", fs.readFileSync('hitcount.txt'))
}
return output_string
}
function escape_input(input) {
let output = input
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\\", "\")
.replaceAll('"', """)
.replaceAll("'", "'")
.replaceAll("/", "/")
return output
}
// Markdown supported:
// *text* = bold
// _text_ = italic
// [page](url) = hyperlink
// ```code``` = code
function markdown_to_html(input) {
// FIXME backticks before these should negate stuff
let output = input
.replaceAll(/\[(.*)\]\((https:\/\/|http:\/\/)(.*)\)/g, "$1")
.replaceAll(/\*(.*)\*/g,"$1")
.replaceAll(/_(.*)_/g,"$1")
.replaceAll(/```(.*)```/gms,"$1
")
.replaceAll("\n","
")
return output
}
app.get(config.rss_path, (req,res) => {
if (config.rss == false) {
res.send("Sorry, RSS is disabled!")
}
else {
let rss_content = `