/*
|
|
* grunt-forceAtlas2
|
|
*
|
|
* This task crush and minify Force Atlas 2 code.
|
|
*/
|
|
var uglify = require('uglify-js');
|
|
|
|
// Shorteners
|
|
function minify(string) {
|
|
return uglify.minify(string, {fromString: true}).code;
|
|
}
|
|
|
|
// Crushing function
|
|
function crush(fnString) {
|
|
var pattern,
|
|
i,
|
|
l;
|
|
|
|
var np = [
|
|
'x',
|
|
'y',
|
|
'dx',
|
|
'dy',
|
|
'old_dx',
|
|
'old_dy',
|
|
'mass',
|
|
'convergence',
|
|
'size',
|
|
'fixed'
|
|
];
|
|
|
|
var ep = [
|
|
'source',
|
|
'target',
|
|
'weight'
|
|
];
|
|
|
|
var rp = [
|
|
'node',
|
|
'centerX',
|
|
'centerY',
|
|
'size',
|
|
'nextSibling',
|
|
'firstChild',
|
|
'mass',
|
|
'massCenterX',
|
|
'massCenterY'
|
|
];
|
|
|
|
// Replacing matrix accessors by incremented indexes
|
|
for (i = 0, l = rp.length; i < l; i++) {
|
|
pattern = new RegExp('rp\\(([^,]*), \'' + rp[i] + '\'\\)', 'g');
|
|
fnString = fnString.replace(
|
|
pattern,
|
|
(i === 0) ? '$1' : '$1 + ' + i
|
|
);
|
|
}
|
|
|
|
for (i = 0, l = np.length; i < l; i++) {
|
|
pattern = new RegExp('np\\(([^,]*), \'' + np[i] + '\'\\)', 'g');
|
|
fnString = fnString.replace(
|
|
pattern,
|
|
(i === 0) ? '$1' : '$1 + ' + i
|
|
);
|
|
}
|
|
|
|
for (i = 0, l = ep.length; i < l; i++) {
|
|
pattern = new RegExp('ep\\(([^,]*), \'' + ep[i] + '\'\\)', 'g');
|
|
fnString = fnString.replace(
|
|
pattern,
|
|
(i === 0) ? '$1' : '$1 + ' + i
|
|
);
|
|
}
|
|
|
|
return fnString;
|
|
}
|
|
|
|
// Cleaning function
|
|
function clean(string) {
|
|
return string.replace(
|
|
/function crush\(fnString\)/,
|
|
'var crush = null; function no_crush(fnString)'
|
|
);
|
|
}
|
|
|
|
module.exports = function(grunt) {
|
|
|
|
// Force atlas grunt multitask
|
|
function multitask() {
|
|
|
|
// Merge task-specific and/or target-specific options with these defaults.
|
|
var options = this.options({});
|
|
|
|
// Iterate over all specified file groups.
|
|
this.files.forEach(function(f) {
|
|
// Concat specified files.
|
|
var src = f.src.filter(function(filepath) {
|
|
// Warn on and remove invalid source files (if nonull was set).
|
|
if (!grunt.file.exists(filepath)) {
|
|
grunt.log.warn('Source file "' + filepath + '" not found.');
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}).map(function(filepath) {
|
|
// Read file source.
|
|
return grunt.file.read(filepath);
|
|
}).join('\n');
|
|
|
|
// Crushing, cleaning and minifying
|
|
src = minify(clean(crush(src)));
|
|
|
|
// Write the destination file.
|
|
grunt.file.write(f.dest, src);
|
|
|
|
// Print a success message.
|
|
grunt.log.writeln('File "' + f.dest + '" created.');
|
|
});
|
|
}
|
|
|
|
// Registering the task
|
|
grunt.registerMultiTask(
|
|
'forceAtlas2',
|
|
'A grunt task to crush and minify ForceAtlas2.',
|
|
multitask
|
|
);
|
|
};
|