UNPKG

globdule

Version:

ARCHIVED Provide a filename following a naming convention, receive a data object back.

265 lines (182 loc) 5.56 kB
// Glodule // ======= var path = require('path'); var Globdule = function(){ Globdule.filters = {}; return this; }; // |key| String key of filter. Required. // |fn| Filter function. Required. // |params| Optional default parameters to be sent to |fn|. Can be overridden. Globdule.prototype.defineFilter = function(key, fn, params){ if (Globdule.filters[key] !== undefined){ throw new Error('Filter \''+key+'\' already exists'); } Globdule.filters[key] = {fn:fn, params:params}; return this; }; Globdule.prototype.feed = function(glob){ // Reset data this.input = glob; this.data = {}; this.leftovers = glob; return this; }; // |filter| can be the key of a registered filter or an anonymous function. // |overrideParams| will override default params of registered filter. Optional. Globdule.prototype.to = function(filter, overrideParams){ var fn; var params; if (typeof filter === 'function'){ if (overrideParams){ overrideParams = overrideParams; } fn = filter; } else { var key = filter; if (Globdule.filters[key]){ fn = Globdule.filters[key].fn; params = Globdule.filters[key].params; if (overrideParams){ Globdule.dupeObjAndOverwriteProps(params, overrideParams); } } else { throw new Error('Filter \''+key+'\' not found'); } } if (fn){ var result = fn(this.leftovers, this.data, params); if (result !== false){ this.leftovers = result; } } return this; }; Globdule.prototype.filterExists = function(key){ return Boolean(Globdule.filters[key]); } // Clean up the data returned. Globdule.prototype.end = function(){ this.data._input = this.input; this.data._leftovers = this.leftovers; return this.data; }; // Static // ------ Globdule.dupeObjAndOverwriteProps = function(baseObj, overwriteObj){ var dupe = {}; var p; for (p in baseObj){ dupe[p] = baseObj[p]; } for (p in overwriteObj){ dupe[p] = overwriteObj[p]; } return dupe; }; // Export // ------ var globdule = new Globdule(); module.exports = globdule; // Core filters // ------------ // Extracts file extension from filename var extFilter = function(glob, data, params){ var arr = glob.split('.'); if (arr.length === 1){ return false; } data.ext = '.' + arr[arr.length - 1]; return glob.substr(0, glob.length - data.ext.length); }; globdule.defineFilter('ext', extFilter); // Looks for (int)fps in |glob| and adds 'fps' to data object var fpsFilter = function(glob, data, params){ var match = /[0-9]+fps/i.exec(glob); if (match !== null){ match = match[0]; data.fps = Number(match.toLowerCase().split('fps').join('')); return glob.split(match).join(''); } return false; }; globdule.defineFilter('fps', fpsFilter); // Looks for (int)x(int), (int)x or x(int) in |glob| and adds props 'width' and 'height' // to data object var dimsFilter = function(glob, data, params){ var match = ''; var matchInfo; var search = /[0-9]*x[0-9]*/gi; while ((matchInfo = search.exec(glob)) !== null){ if (matchInfo[0].length > match.length){ match = matchInfo[0]; } } if (match.length <= 1){ return false; } var dims = match.toLowerCase().split('x'); if (dims[0].length > 0){ data.width = Number(dims[0]); } if (dims[1].length > 0){ data.height = Number(dims[1]); } return glob.split(match).join(''); }; globdule.defineFilter('dims', dimsFilter); // Converts leftovers to readable text, assuming words are separated by ' ', '-' or '_' var leftoversToTextFilter = function(glob, data, params){ glob = glob.replace(/(-|_)/g, ' '); glob = glob.replace(/ +/g, ' '); glob = glob.replace(/^ +/, ''); glob = glob.replace(/ +$/, ''); if (glob.length >= 1){ if (params.preserveCase){ data.description = glob; } else { data.description = glob.charAt(0).toUpperCase() + glob.substr(1).toLowerCase(); } } return ''; }; globdule.defineFilter('leftoversToText', leftoversToTextFilter, {preserveCase: false}); // Converts leftovers to a hyphen separated slug suitable for a filename, assuming words // are separated by ' ', '-' or '_' var leftoversToSlugFilter = function(glob, data, params){ glob = glob.replace(/( |-|_)/g, '-'); glob = glob.replace(/-+/g, '-'); glob = glob.replace(/^-+/, ''); glob = glob.replace(/-+$/, ''); if (glob.length >= 1){ data.slug = params.preserveCase ? glob : glob.toLowerCase(); } return ''; }; globdule.defineFilter('leftoversToSlug', leftoversToSlugFilter, {preserveCase: false}); // Converts leftovers to a hyphen separated slug suitable for a filename, assuming words // are separated by ' ', '-' or '_' var leftoversToSlugAndDescriptionFilter = function(glob, data, params){ glob = glob.replace(/( |-|_)/g, '-'); glob = glob.replace(/-+/g, '-'); glob = glob.replace(/^-+/, ''); glob = glob.replace(/-+$/, ''); if (glob.length >= 1){ data.slug = glob.toLowerCase(); } glob = glob.replace(/(-|_)/g, ' '); glob = glob.replace(/ +/g, ' '); glob = glob.replace(/^ +/, ''); glob = glob.replace(/ +$/, ''); if (glob.length >= 1){ data.description = glob.charAt(0).toUpperCase() + glob.substr(1).toLowerCase(); } return ''; }; globdule.defineFilter('leftoversToSlugAndDescription', leftoversToSlugAndDescriptionFilter); // Presuming the glob represents a file path, will extract the base directory var baseDirFilter = function(glob, data, params){ data.baseDir = path.dirname(glob) + path.sep; return path.basename(glob); }; globdule.defineFilter('baseDir', baseDirFilter);