This is a list of Free Software network services and web applications which can be hosted locally. Selfhosting is the process of locally hosting and managing applications instead of renting from SaaS providers.
https://reddit.com/r/selfhosted
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
4.0 KiB
85 lines
4.0 KiB
// Accepts input of any filename, ie. node test.js README.md
|
|
|
|
const fs = require('fs');
|
|
|
|
let log = '{\n';
|
|
let issuelog = ' "message": "#### Syntax Issues\\n\\n Name | Entry\\n----|----------------------\\n';
|
|
|
|
const file = fs.readFileSync(process.argv[2], 'utf8'); // Reads argv into var file
|
|
|
|
function entryFilter(md) { // Function to find lines with entries
|
|
const linepatt = /^ {0,4}\* \[.*`/;
|
|
return linepatt.test(md);
|
|
}
|
|
|
|
function split(text) { // Function to split lines into array
|
|
return text.split(/\r?\n/);
|
|
}
|
|
|
|
function findPattern(text) { // Test entries against 8 patterns. If matches pattern returns true
|
|
const nodnospatt = /^ {0,4}\* \[.*?\]\(.*?\) - .{0,249}?\. `.*?` `.*?`/; // Regex for entries with no demo and no source code
|
|
const slpatt = /^ {0,4}\* \[.*?\]\(.*?\) - .{0,249}?\. \(\[Demo\b\]\(.*?\), \[Source Code\b\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with demo and source code
|
|
const nodpatt = / {0,4}\* \[.*?\]\(.*?\) - .{0,249}?\. \(\[Source Code\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with no demo
|
|
const nospatt = / {0,4}\* \[.*?\]\(.*?\) - .{0,249}?\. \(\[Demo\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with no source code
|
|
const pnodnospatt = / {0,4}\* \[.*?\]\(.*?\) `⚠` - .{0,249}?\. `.*?` `.*?`/; // Regex for entries with proprietary with no demo and no source code
|
|
const pslpatt = / {0,4}\* \[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Demo\b\]\(.*?\), \[Source Code\b\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with proprietary with demo and source code
|
|
const pnodpatt = / {0,4}\* \[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Source Code\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with proprietary with no demo
|
|
const pnospatt = / {0,4}\* \[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Demo\]\(.*?\)\) `.*?` `.*?`/; // Regex for entries with proprietary with no source code
|
|
if (nodnospatt.test(text) === true) {
|
|
return true;
|
|
} else if (slpatt.test(text) === true) {
|
|
return true;
|
|
} else if (nodpatt.test(text) === true) {
|
|
return true;
|
|
} else if (nospatt.test(text) === true) {
|
|
return true;
|
|
} else if (pnodnospatt.test(text) === true) {
|
|
return true;
|
|
} else if (pslpatt.test(text) === true) {
|
|
return true;
|
|
} else if (pnodpatt.test(text) === true) {
|
|
return true;
|
|
} else if (pnospatt.test(text) === true) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function entryErrorCheck(md) {
|
|
const namepatt = /\* \[(.*?)\]/; // regex pattern to find name of entryArray
|
|
const entries = split(md); // Inserts each line into the entries array
|
|
let totalFail = 0;
|
|
let totalPass = 0;
|
|
let total = 0;
|
|
const entryArray = [];
|
|
for (let i = 0, len = entries.length; i < len; i += 1) { // Loop to create array of objects
|
|
entryArray[i] = new Object;
|
|
entryArray[i].raw = entries[i];
|
|
if (entryFilter(entries[i]) === true) { // filter out lines that don't with * [)
|
|
total += 1;
|
|
entryArray[i].name = namepatt.exec(entries[i])[1]; // Parses name of entry
|
|
entryArray[i].pass = findPattern(entries[i]); // Tests against known patterns
|
|
if (entryArray[i].pass === true) { // If entry passes increment totalPass counter
|
|
totalPass += 1;
|
|
} else {
|
|
console.log(`${entryArray[i].name} Failed.`); // If entry fails increment totalFail counter and append error to issuelog
|
|
// entryArray[i].error = findError(entries[i]) //WIP
|
|
totalFail += 1;
|
|
issuelog += `${entryArray[i].name} | ${entries[i]} \\n`;
|
|
}
|
|
}
|
|
}
|
|
if (totalFail > 0) { // Logs # passed & failed to console, and failures to syntaxcheck.json
|
|
console.log(`${totalFail} Failed, ${totalPass} Passed, of ${total}`);
|
|
log += ` "error": true,\n "title": "Found ${totalFail} entries with syntax error(s).",\n`;
|
|
fs.writeFileSync('syntaxcheck.json', `${log} ${issuelog} "\n}`);
|
|
process.exit(1);
|
|
} else { // Logs # of entries passed to console and error: false to syntaxcheck.json
|
|
console.log(`${totalFail} Failed, ${totalPass} Passed, of ${total} \n`);
|
|
log += ' "error": false\n}';
|
|
fs.writeFileSync('syntaxcheck.json', log);
|
|
process.exit(0);
|
|
}
|
|
}
|
|
|
|
entryErrorCheck(file);
|
|
|