Files
Polaris/server/utils.js
T
2024-01-29 07:38:52 -07:00

134 lines
3.6 KiB
JavaScript

import isWord from 'is-word';
import * as rewriter from './utils/rewriter.js';
import TokenManager from './utils/token.js';
import config from '../polaris.config.js';
import path from 'node:path';
import url from 'node:url';
import fs from 'node:fs';
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
const dictionary = fs.readFileSync(path.join(__dirname, '../node_modules/is-word/dictionary/american-english.txt'))
.toString()
.split('\n')
.map(word => word.trim());
const englishWords = isWord('american-english');
const parsedFilter = config.options.filtering ? fs.readFileSync(path.join(__dirname, '../filter.txt'))
.toString()
.split('\n')
.map(query => query.trim())
.filter(query => query && !query.startsWith('->')) : [];
/**
* @param {string} url
* @param {string} folderPath
* @returns {{ exists: boolean, path: string }}
*/
export const pathToFile = (url = '', folderPath) => {
if (url.endsWith('/')) url = url + 'index.html';
else if (url.split(/[#?]/)[0].split('.').pop().trim() === url) {
if (!fs.existsSync(path.join(folderPath, url))) url = url + '.html';
}
return {
exists: fs.existsSync(path.join(folderPath, url)),
path: path.join(folderPath, url)
};
};
/**
* Get words from a string
* @param {string} input
* @param {Array.<string>} words
* @returns {Promise.<Array.<string>>}
*/
export const getWords = (input, words) => new Promise(async (resolve, reject) => {
let output = [];
for (let i = 0; i < words.length; i++) {
output.push(...Array((input.match(RegExp(words[i], 'gi')) || []).length).fill(words[i]));
if (i + 1 === words.length) resolve(output);
}
});
/**
* @param {string} query
* @returns {Promise.<{ flagged: true, query: string }>}
*/
export const filter = (query) => new Promise(async (resolve, reject) => {
if (parsedFilter.length === 0) {
resolve({
flagged: false,
query: ''
});
return;
}
const parsedQuery = query.replaceAll('/', ' ').replaceAll('-', ' ').replaceAll('_', ' ').split(' ');
for (let i = 0; i < parsedQuery.length; i++) {
/**
* @type {string}
*/
const query = parsedQuery[i];
const validWord = englishWords.check(query);
if (validWord && parsedFilter.includes(query)) {
resolve({
flagged: true,
query
});
return;
}
if (!validWord) {
const results = await (new Promise((resolve, reject) => {
for (let i = 0; i < parsedFilter.length; i++) {
const hasFiltered = query.includes(parsedFilter[i]);
if (hasFiltered) {
resolve({
flagged: true,
query: parsedFilter[i]
});
return;
}
if (i + 1 === parsedFilter.length) resolve({
flagged: false,
query: ''
});
}
}));
console.log(query);
if (results.flagged) {
resolve({
flagged: true,
query: results.query
});
return;
}
}
if (i + 1 === parsedQuery.length) resolve({
flagged: false,
query: ''
});
}
});
export default {
pathToFile,
filter,
TokenManager,
rewriter
};
export {
TokenManager,
rewriter
};