forked from Chalarangelo/30-seconds-of-code
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2350460
commit 0a2175e
Showing
7 changed files
with
151 additions
and
145 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
This is the builder script that generates the README file. | ||
Run using `npm run builder`. | ||
*/ | ||
// Load modules | ||
const fs = require('fs-extra'), path = require('path'), chalk = require('chalk'); | ||
// Set variables for paths | ||
const snippetsPath = './snippets', staticPartsPath = './static-parts'; | ||
// Set variables for script | ||
let snippets = {}, startPart = '', endPart = '', output = '', tagDbData = {}; | ||
// Load helper functions (these are from existing snippets in 30 seconds of code!) | ||
const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); | ||
const capitalize = (str, lowerRest = false) => str.slice(0, 1).toUpperCase() + (lowerRest ? str.slice(1).toLowerCase() : str.slice(1)); | ||
// Start the timer of the script | ||
console.time('Builder'); | ||
// Synchronously read all snippets and sort them as necessary (case-insensitive) | ||
try { | ||
let snippetFilenames = fs.readdirSync(snippetsPath); | ||
snippetFilenames.sort((a, b) => { | ||
a = a.toLowerCase(); | ||
b = b.toLowerCase(); | ||
if (a < b) return -1; | ||
if (a > b) return 1; | ||
return 0; | ||
}); | ||
// Store the data read from each snippet in the appropriate object | ||
for(let snippet of snippetFilenames) snippets[snippet] = fs.readFileSync(path.join(snippetsPath,snippet),'utf8'); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During snippet loading: ${err}`); | ||
process.exit(1); | ||
} | ||
// Load static parts for the README file | ||
try { | ||
startPart = fs.readFileSync(path.join(staticPartsPath,'README-start.md'),'utf8'); | ||
endPart = fs.readFileSync(path.join(staticPartsPath,'README-end.md'),'utf8'); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During static part loading: ${err}`); | ||
process.exit(1); | ||
} | ||
// Load tag data from the database | ||
try { | ||
tagDbData = objectFromPairs(fs.readFileSync('tag_database','utf8').split('\n').slice(0,-1).map(v => v.split(':').slice(0,2))); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During tag database loading: ${err}`); | ||
process.exit(1); | ||
} | ||
// Create the output for the README file | ||
try { | ||
// Add the start static part | ||
output += `${startPart+'\n'}`; | ||
// Loop over tags and snippets to create the table of contents | ||
for(let tag of [...new Set(Object.entries(tagDbData).map(t => t[1]))].filter(v => v).sort((a,b) => a.localeCompare(b))){ | ||
output +=`### ${capitalize(tag, true)}\n`; | ||
for(let taggedSnippet of Object.entries(tagDbData).filter(v => v[1] === tag)) | ||
output += `* [${taggedSnippet[0][0].toUpperCase() + taggedSnippet[0].replace(/-/g,' ').slice(1)}](#${taggedSnippet[0].replace(/\(/g,'').replace(/\)/g,'').toLowerCase()})\n` | ||
output += '\n'; | ||
} | ||
// Loop over tags and snippets to create the list of snippets | ||
for(let tag of [...new Set(Object.entries(tagDbData).map(t => t[1]))].filter(v => v).sort((a,b) => a.localeCompare(b))){ | ||
output +=`## ${capitalize(tag, true)}\n`; | ||
for(let taggedSnippet of Object.entries(tagDbData).filter(v => v[1] === tag)) | ||
output += `\n${snippets[taggedSnippet[0]+'.md']+'\n[⬆ back to top](#table-of-contents)\n'}`; | ||
} | ||
// Add the ending static part | ||
output += `\n${endPart+'\n'}`; | ||
// Write to the README file | ||
fs.writeFileSync('README.md', output); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During README generation: ${err}`); | ||
process.exit(1); | ||
} | ||
// Log a success message | ||
console.log(`${chalk.green('SUCCESS!')} README file generated!`); | ||
// Log the time taken | ||
console.timeEnd('Builder'); |
This file was deleted.
Oops, something went wrong.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/* | ||
This is the tagger script that updates the tag_databse file and logs stats for snippet tags. | ||
Run using `npm run tagger`. | ||
*/ | ||
// Load modules | ||
const fs = require('fs-extra'), path = require('path'), chalk = require('chalk'); | ||
// Set variables for paths | ||
const snippetsPath = './snippets'; | ||
// Set variables for script | ||
let snippets = {}, output = '', tagDbData = {}, missingTags = 0, tagDbStats = {}; | ||
// Load helper functions (these are from existing snippets in 30 seconds of code!) | ||
const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {}); | ||
const countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0); | ||
// Start the timer of the script | ||
console.time('Tagger'); | ||
// Synchronously read all snippets and sort them as necessary (case-insensitive) | ||
try { | ||
let snippetFilenames = fs.readdirSync(snippetsPath); | ||
snippetFilenames.sort((a, b) => { | ||
a = a.toLowerCase(); | ||
b = b.toLowerCase(); | ||
if (a < b) return -1; | ||
if (a > b) return 1; | ||
return 0; | ||
}); | ||
// Store the data read from each snippet in the appropriate object | ||
for(let snippet of snippetFilenames) snippets[snippet] = fs.readFileSync(path.join(snippetsPath,snippet),'utf8'); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During snippet loading: ${err}`); | ||
process.exit(1); | ||
} | ||
// Load tag data from the database | ||
try { | ||
tagDbData = objectFromPairs(fs.readFileSync('tag_database','utf8').split('\n').slice(0,-1).map(v => v.split(':').slice(0,2))); | ||
tagDbStats = Object.entries(tagDbData).sort((a,b) => a[1].localeCompare(b[1])).reduce((acc, val) => {acc.hasOwnProperty(val[1]) ? acc[val[1]]++ : acc[val[1]] = 1; return acc;}, {}); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During tag database loading: ${err}`); | ||
process.exit(1); | ||
} | ||
// Update the listing of snippets in tag_database and log the statistics, along with missing scripts | ||
try { | ||
for(let snippet of Object.entries(snippets)) | ||
if(tagDbData.hasOwnProperty(snippet[0].slice(0,-3)) && tagDbData[snippet[0].slice(0,-3)].trim()) | ||
output += `${snippet[0].slice(0,-3)}:${tagDbData[snippet[0].slice(0,-3)].trim()}\n`; | ||
else { | ||
output += `${snippet[0].slice(0,-3)}:\n`; | ||
missingTags++; | ||
console.log(`${chalk.yellow('Tag missing:')} ${snippet[0].slice(0,-3)}`); | ||
} | ||
// Write to tag_database | ||
fs.writeFileSync('tag_database', output); | ||
} | ||
catch (err){ // Handle errors (hopefully not!) | ||
console.log(`${chalk.red('ERROR!')} During tag_database generation: ${err}`); | ||
process.exit(1); | ||
} | ||
// Log statistics for the tag_database file | ||
console.log(`\n${chalk.bgWhite(chalk.black('=== TAG STATS ==='))}`) | ||
for(let tagData of Object.entries(tagDbStats).filter(v => v[0] !== 'undefined')) | ||
console.log(`${chalk.green(tagData[0])}: ${tagData[1]} snippets`); | ||
console.log(`${chalk.blue('Untagged snippets:')} ${missingTags}\n`); | ||
// Log a success message | ||
console.log(`${chalk.green('SUCCESS!')} tag_database file updated!`); | ||
// Log the time taken | ||
console.timeEnd('Tagger'); |
This file was deleted.
Oops, something went wrong.