2017-04-12 01:38:29 +02:00
// Accepts input of any filename, ie. node test.js README.md
2016-12-10 14:46:24 +01:00
2017-04-12 01:38:29 +02:00
const fs = require ( 'fs' ) ;
2016-12-10 14:46:24 +01:00
2017-04-12 01:38:29 +02:00
let log = '{\n' ;
let issuelog = ' "message": "#### Syntax Issues\\n\\n Name | Entry\\n----|----------------------\\n' ;
2016-12-10 14:46:24 +01:00
2017-04-12 01:38:29 +02:00
const file = fs . readFileSync ( process . argv [ 2 ] , 'utf8' ) ; // Reads argv into var file
2016-12-10 14:46:24 +01:00
2017-04-12 01:38:29 +02:00
function entryFilter ( md ) { // Function to find lines with entries
2018-07-02 05:29:00 +02:00
const linepatt = /^\s{0,2}-\s\[.*`/ ;
2017-04-12 01:38:29 +02:00
return linepatt . test ( md ) ;
2016-12-10 14:46:24 +01:00
}
2017-04-12 01:38:29 +02:00
function split ( text ) { // Function to split lines into array
return text . split ( /\r?\n/ ) ;
}
2016-12-10 14:46:24 +01:00
2017-04-12 01:38:29 +02:00
function findPattern ( text ) { // Test entries against 8 patterns. If matches pattern returns true
2018-07-03 04:13:30 +02:00
const nodnospatt = /^\s{0,2}-\s\[.*?\]\(.*?\) - .{0,249}?\. `.*?` `.*?`/ ; // Regex for entries with no demo and no source code
2018-07-02 05:29:00 +02:00
const slpatt = /^\s{0,2}-\s\[.*?\]\(.*?\) - .{0,249}?\. \(\[Demo\b\]\(.*?\), \[Source Code\b\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with demo and source code
const nodpatt = /^\s{0,2}-\s\[.*?\]\(.*?\) - .{0,249}?\. \(\[Source Code\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with no demo
const nospatt = /^\s{0,2}-\s\[.*?\]\(.*?\) - .{0,249}?\. \(\[Demo\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with no source code
const pnodnospatt = /^\s{0,2}-\s\[.*?\]\(.*?\) `⚠` - .{0,249}?\. `.*?` `.*?`/ ; // Regex for entries with proprietary with no demo and no source code
const pslpatt = /^\s{0,2}-\s\[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Demo\b\]\(.*?\), \[Source Code\b\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with proprietary with demo and source code
const pnodpatt = /^\s{0,2}-\s\[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Source Code\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with proprietary with no demo
const pnospatt = /^\s{0,2}-\s\[.*?\]\(.*?\) `⚠` - .{0,249}?\. \(\[Demo\]\(.*?\)\) `.*?` `.*?`/ ; // Regex for entries with proprietary with no source code
2016-12-10 14:46:24 +01:00
if ( nodnospatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( slpatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( nodpatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( nospatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( pnodnospatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( pslpatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( pnodpatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
} else if ( pnospatt . test ( text ) === true ) {
2017-04-12 01:38:29 +02:00
return true ;
2016-12-10 14:46:24 +01:00
}
2017-04-12 01:38:29 +02:00
return false ;
}
function entryErrorCheck ( md ) {
2018-07-02 05:29:00 +02:00
const namepatt = /^\s{0,2}-\s\[(.*?)\]/ ; // regex pattern to find name of entryArray
2017-04-12 01:38:29 +02:00
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 ;
2016-12-10 14:46:24 +01:00
} else {
2017-04-12 01:38:29 +02:00
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 ` ;
2016-12-10 14:46:24 +01:00
}
2017-04-12 01:38:29 +02:00
}
2016-12-10 14:46:24 +01:00
}
2017-04-12 01:38:29 +02:00
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 ) ;
2016-12-10 14:46:24 +01:00
}
}
2017-04-12 01:38:29 +02:00
entryErrorCheck ( file ) ;