const fs = require('fs-extra'); const path = require('path'); const chalk = require('chalk'); const SNIPPETS_PATH = './snippets'; const attempt = (task, cb) => { try { return cb(); } catch (e) { console.log(`${chalk.red('ERROR!')} During ${task}: ${e}`); process.exit(1); return null; } }; const capitalize = ([first, ...rest], lowerRest = false) => first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); const readSnippets = () => attempt('read snippets', () => fs .readdirSync(SNIPPETS_PATH) .sort((a, b) => (a.toLowerCase() < b.toLowerCase() ? -1 : 1)) .reduce((acc, name) => { acc[name] = fs.readFileSync(path.join(SNIPPETS_PATH, name), 'utf8').replace(/\r\n/g, '\n'); return acc; }, {}) ); const getCodeBlocks = str => { const regex = /```[.\S\s]*?```/g; const results = []; let m = null; while ((m = regex.exec(str)) !== null) { if (m.index === regex.lastIndex) { regex.lastIndex += 1; } m.forEach(match => results.push(match)); } return results; }; const getSection = (searchString, contents, includeSubsections = true) => { const indexOfSearch = contents.indexOf(searchString); if (indexOfSearch < 0) return ''; let endSearch = '\\n#'; if (includeSubsections) { let i; for (i = 0; searchString[i] === '#' && i < searchString.length; i++); if (i > 0) { endSearch += `{${i - 1},${i}}[^#]`; } } const endRegex = new RegExp(endSearch); const sliceStart = indexOfSearch + searchString.length + 1; const endIndex = contents.slice(sliceStart).search(endRegex); const sliceEnd = endIndex === -1 ? undefined : endIndex + sliceStart; return contents.slice(sliceStart, sliceEnd).trim(); }; const getTextualContent = str => { const regex = /###.*\n*([\s\S]*?)```/g; const results = []; let m = null; while ((m = regex.exec(str)) !== null) { if (m.index === regex.lastIndex) regex.lastIndex += 1; m.forEach((match, groupIndex) => { results.push(match); }); } return results[1]; }; const getTitle = contents => contents.split('\n')[0].replace(/^#+\s+/g, ''); module.exports = { attempt, readSnippets, SNIPPETS_PATH, capitalize, getTextualContent, getCodeBlocks, getSection, getTitle };