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

// 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);