UNPKG

grunt-readme

Version:

Grunt plugin for generating a README from templates, including an optional table of contents. No Gruntfile config is necessary, just choose a starter template and you'll be ready to go.

119 lines (104 loc) 2.7 kB
/** * Utils */ // Node.js var fs = require('fs'); var path = require('path'); // node_modules var grunt = require('grunt'); var frep = require('frep'); var _ = require('lodash'); exports.meta = function (key, obj) { if (_.isUndefined(key)) { return {}; } else if (_.isString(obj[key])) { return String(obj[key]) || ""; } else if (_.isObject(obj[key])) { return JSON.stringify(obj[key], null, 2) || {}; } else { return null; } }; exports.dataFileReaderFactory = function(filepath) { var ext = path.extname(filepath); var reader = grunt.file.readJSON; switch(ext) { case '.json': grunt.verbose.writeln('>> Reading JSON'.yellow); reader = grunt.file.readJSON; break; case '.yml': case '.yaml': grunt.verbose.writeln('>> Reading YAML'.yellow); reader = grunt.file.readYAML; break; } return reader(filepath); }; exports.optionsDataFormatFactory = function(data) { var metadata; if (_.isString(data) || _.isArray(data)) { data.map(function(val) { grunt.verbose.ok('Type:'.yellow, grunt.util.kindOf(val)); // Skip empty data files to avoid compiler errors if (_.isString(val)) { grunt.file.expand(val).forEach(function(filepath) { var checkForContent = grunt.file.read(filepath); if (checkForContent.length === 0 || checkForContent === '') { grunt.verbose.warn('Skipping empty path:'.yellow, val); } else { var parsedData = exports.dataFileReaderFactory(filepath); metadata = grunt.config.process(_.extend({}, metadata, parsedData)); grunt.verbose.ok('metadata:'.yellow, metadata); } }); } if (_.isObject(val)) { metadata = grunt.config.process(_.extend({}, metadata, val)); grunt.verbose.ok('metadata:'.yellow, metadata); } }); } else if (_.isObject(data)) { metadata = data; } else { metadata = {}; } return metadata; }; exports.compileTemplate = function (src, dest, options, fn) { options = options || {}; var output = grunt.template.process(src, { data: options.data || {}, delimiters: options.delimiters || 'readme' }); output = _.isFunction(fn) ? fn(output) : output; grunt.file.write(dest, output); }; /** * Replacement patterns */ var arr = [ { pattern: /^`#/gm, replacement: '#' }, { pattern: /\[\%/g, replacement: '{%' }, { pattern: /\%\]/g, replacement: '%}' }, { pattern: /^\s*/, replacement: '' }, { pattern: /\s*\{{!(--)?.+(--)?}}/g, replacement: '' } ]; exports.frep = function(str) { return frep.strWithArr(str, arr); };