globdule
Version:
ARCHIVED Provide a filename following a naming convention, receive a data object back.
265 lines (182 loc) • 5.56 kB
JavaScript
// 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);