import { existsSync } from 'fs';
import { v4 as uuidV4, v5 as uuidV5, NIL as uuidNIL } from 'uuid';
import { getImg, postImg, getImgType } from './image';
import type { Thread, Comment } from '../models/Thread'
export async function processThreadIn(board: string, thread: Thread, comments = false) {
if(!thread || !board) return;
let imageId: string = thread.imageId;
// if(existsSync(`dist/client/images/${imageId}`))
if(existsSync(`public/images/${imageId}`))
thread.imageId = `/images/${imageId}`;
else
thread.imageId = await getImg(imageId);
thread.threadText = replaceURLs(thread.threadText, board, thread.id);
if(!comments) return;
for(let comment of thread.comments)
{
let cimageId = comment.imageId;
// if(existsSync(`dist/client/images/${cimageId}`))
if(existsSync(`public/images/${cimageId}`))
comment.imageId = `/images/${cimageId}`;
else
comment.imageId = await getImg(cimageId);
comment.commentText = replaceURLs(comment.commentText, board, thread.id);
}
}
export async function processThreadOut(form: any): Thread {
let img = form.get('image');
let t: Thread = {
id: uuidV4(),
threadName: form.get('ThreadName'),
threadCreator: uuidV5(form.get('iphash'), uuidNIL),
threadText: form.get('ThreadText'),
comments: [],
creationDate: Date.now(),
imageId: await postImg(img),
fileType: getImgType(img),
}
return t;
}
export async function processCommentOut(form: any): Comment {
let img = form.get('image');
let c: Comment = {};
c.id = uuidV4();
c.commentCreator = uuidV5(form.get('iphash'), uuidNIL);
c.commentText = form.get('CommentText');
c.creationDate = Date.now();
c.imageId = await postImg(img);
c.fileType = getImgType(img);
return c;
}
function replaceURLs(text: string, board: string, OPtid?: string): string {
if(!text) return;
if(OPtid) {
let replyRegex = /(^|[^>])>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
text = text.replace(replyRegex, (id) => {
let showid = id;
id = id.replace(/(>|\n| )/g, '');
if(id == OPtid) showid += "(OP)";
// this adds the targeted class
// to the target id when its hovered on
// and removes it when it stops hovering
return ` ${showid} `;
});
}
// link to thread on other board
let otherthreadlinkRegex = />>>\/.*\/[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
text = text.replace(otherthreadlinkRegex, (id) => {
let link = id.slice(4);
let parts = link.split('/');
let linkid = parts[1]; let board = parts[0];
return ` >>>/${board}/${linkid} `
});
// link to thread on this board
let threadlinkRegex = />>>[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}/g;
text = text.replace(threadlinkRegex, (id) => {
let linkid = id.slice(3); // remove the first >>>
return ` ${id} `
});
// link to another board
let otherboardRegex = />>>\/.*\/($|[^0-9a-fA-F])/g;
text = text.replace(otherboardRegex, (id) => {
let boardid = id.split('/')[1];
return ` >>>/${boardid}/ `
});
let newlineRegex = /(\r\n|\r|\n)/g;
text = text.replace(newlineRegex, () => {
return '
'
});
let urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
return text.replace(urlRegex, (url) => {
var hyperlink = url;
if (!hyperlink.match('^https?:\/\/')) {
hyperlink = 'http://' + hyperlink;
}
return ' ' + url + ' '
});
}