127 lines
5.3 KiB
JavaScript
127 lines
5.3 KiB
JavaScript
import { createRequire } from 'module';
|
|
const require = createRequire(import.meta.url)
|
|
const config = require("../config.json")
|
|
const fs = require('fs')
|
|
const locale = require(`../locales/${config.locale}.json`)
|
|
|
|
// 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.
|
|
// https://stackoverflow.com/a/16060619
|
|
export function require_module(module) {
|
|
if (config.cache_data == false) {
|
|
delete require.cache[require.resolve(module)];
|
|
return require(module);
|
|
}
|
|
else {
|
|
return require(module);
|
|
}
|
|
}
|
|
|
|
// The configuration defines a date format using the date-fns (a datetime library) syntax
|
|
// eg "yyyy-MM-dd"
|
|
// this converts unix time (an integer) into a string that is formatted according to config.js
|
|
// uses date-fns's fromUnixTime() and format() functions
|
|
// returns the formatted date (string)
|
|
export function unix_time_to_date_format(unix_time) {
|
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
|
let date = fromUnixTime(unix_time)
|
|
let formatted_date = format(date, config.date_format)
|
|
return formatted_date
|
|
}
|
|
// This is similar to the above function, however, instead of formatting to the users
|
|
// configuration, it formats to RFC-822 which is the date format used by RSS feeds
|
|
// eg "Mon, 23 May 2025 18:59:59 +0100"
|
|
// accepts unix time (int)
|
|
// returns the formatted date (string)
|
|
export function unix_time_to_rss_date(unix_time) {
|
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
|
let date = fromUnixTime(unix_time)
|
|
let formatted_date = format(date, "EEE, dd MMM yyyy HH:mm:ss")
|
|
return `${formatted_date} ${config.time_zone}`
|
|
}
|
|
// And again with atom's date format
|
|
export function unix_time_to_atom_date(unix_time) {
|
|
const { fromUnixTime, format, getUnixTime } = require("date-fns") // A date utility library
|
|
let date = fromUnixTime(unix_time)
|
|
let formatted_date = format(date, "yyyy-MM-dd'T'HH:mm:ss'Z'")
|
|
return `${formatted_date}`
|
|
}
|
|
// This function accepts a list of strings eg ["string1","string2,"string3"] (any length)
|
|
// then returns a string of them each pointing to a seperate url
|
|
// 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
|
|
// returns: string
|
|
export function render_tags(tags) {
|
|
let string = "" // Initialises the string
|
|
if (tags.length == 1 && tags[0] == "") {
|
|
string = locale.no_tags; // If there are no tags, output something
|
|
}
|
|
else {
|
|
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
|
|
if (tag_index < tags.length - 1) { // If there are more tags, then insert a comma
|
|
string += ", ";
|
|
}
|
|
}
|
|
}
|
|
return string
|
|
}
|
|
// The users are stored as a list of objects [ user_object, user_object, user_object ]
|
|
// So you cannot easily find the userID (position in list) from the username
|
|
// 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 not present it returns -1
|
|
export function get_userID(username) {
|
|
const users = require("../data/users.json")
|
|
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 -1 // If user is not present, return -1
|
|
}
|
|
|
|
// This escapes some potentially dangerous HTML characters with their HTML entities
|
|
// https://www.freeformatter.com/html-entities.html
|
|
// accepts a string
|
|
// returns a string with some character replaced by their entities
|
|
export function escape_input(input) {
|
|
let output = input
|
|
.replaceAll("&", "&") // This must be first
|
|
.replaceAll("<", "<")
|
|
.replaceAll(">", ">")
|
|
.replaceAll("\\", "\")
|
|
.replaceAll('"', """)
|
|
.replaceAll("'", "'")
|
|
.replaceAll("/", "/")
|
|
.replaceAll("%", "%")
|
|
return output
|
|
}
|
|
|
|
// Render comment content by replacing the >> int with a url link to that comment
|
|
// Syntax: ">> postID-commentID"
|
|
export function render_comment(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>")
|
|
.replaceAll("\n", "<br/>")
|
|
|
|
};
|
|
|
|
// Renders a string into markdown using markdown-it library
|
|
export function render_md(content) {
|
|
const markdownit = require("markdown-it")
|
|
const md = markdownit({ // this is just defining some options for markdown-it, should I add this to config.json?
|
|
html: false,
|
|
xhtmlOut: false,
|
|
breaks: true,
|
|
linkify: false,
|
|
typographer: true,
|
|
quotes: locale.quotes,
|
|
})
|
|
return md.render(content)
|
|
};
|
|
|