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 "string1, string2, string3" // 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 += `${tags[tag_index].trim()}` // 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, ">> $1-$2") .replaceAll(/>>([0-9]*)-([0-9]*)/g, ">>$1-$2") .replaceAll(/>> ([0-9]*)-([0-9]*)/g, ">> $1-$2") .replaceAll(/>>([0-9]*)-([0-9]*)/g, ">>$1-$2") .replaceAll("\n", "
") }; // 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) };