var nunjucks = require('nunjucks'),
Get = require('./utils/get'),
get = new Get(),
File = require('./utils/file'),
file = new File(),
Extend = require('./utils/extend'),
extend = new Extend();
var nunjucks = require('nunjucks'),
Get = require('./utils/get'),
get = new Get(),
File = require('./utils/file'),
file = new File(),
Extend = require('./utils/extend'),
extend = new Extend();
var Geno = function() {};
Run through the configuration, the parsing and the compiling of the site.
done
is a function.Geno.prototype.build = function(done) {
done = (done || function() {});
this.configure(function(config) {
this.template(config, function(err, data) {
if (err) { return done(err); }
this.compile(config, data, function(err) {
if (err) { return done(err); }
return done();
});
}.bind(this));
}.bind(this));
};
Return the config
by reading the project's package.json
file and
the project's geno.json
file, if it exists.
callback
is a function.Geno.prototype.configure = function(callback) {
var pkgPath = get.path(process.cwd(), 'package.json'),
pkgInfo = require(pkgPath),
genPath = get.path(process.cwd(), 'geno.json');
file.exists(genPath, function(exists) {
if (exists) {
var genInfo = require(genPath),
config = extend.obj(pkgInfo, genInfo);
return callback(config);
} else {
return callback(pkgInfo);
}
});
};
Return the template file's data
.
config
is an object.callback
is a function.Geno.prototype.template = function(config, callback) {
var index = (config.template || get.lib('template/index.html'));
file.read(index, function(err, data) {
if (err) { return callback(err); }
return callback(null, data);
});
};
Compile the content by running the data
and config
through nunjucks
.
config
is an object.data
is a string.callback
is a function.Geno.prototype.compile = function(config, data, callback) {
var content = nunjucks.renderString(data, config),
output = (config.output || get.path(process.cwd(), 'site')),
style = (config.stylesheet || get.lib('template/style.css')),
script = (config.javascript || false);
this.generate(content, output, style, script, function(err) {
if (err) { return callback(err); }
return callback(null);
});
};
Generate the site by creating the output
directory and saving
the index.html
file.
content
is a string.output
is a string.style
is a string.script
is a string.callback
is a function.Geno.prototype.generate = function(content, output, style, script, callback) {
var index = get.path(output, 'index.html');
file.mkDir(output, function(err) {
if (err) { return callback(err); }
file.save(index, content, function() {
if (err) { return callback(err); }
this.assets(output, style, script, function(err) {
if (err) { return callback(err); }
return callback(null);
});
}.bind(this));
}.bind(this));
};
Copy all of the assets, ie. the style
and script
files.
output
is a string.style
is a string.script
is a string.callback
is a function.Geno.prototype.assets = function(output, style, script, callback) {
var css = get.path(output, 'style.css'),
src = get.name(script),
js = get.path(output, src);
file.copy(style, css, function(err) {
if (err) { return callback(err); }
if (!script) {
return callback(null);
} else {
file.copy(script, js, function(err) {
if (err) { return callback(err); }
return callback(null);
});
}
});
};
module.exports = Geno;
var path = require('path');
var Get = function() {};
Return the full path of the filename
.
directory
is a string.filename
is a string.Get.prototype.path = function(directory, filename) {
return path.join(directory, '/', filename);
};
Get.prototype.lib = function(filename) {
return path.join(__dirname, '../../', filename);
};
Get.prototype.name = function(filename) {
return path.basename(filename);
};
module.exports = Get;
var Extend = function() {};
Return a single object by combining two into one.
target
is an object.options
is an object.Extend.prototype.obj = function(target, options) {
for (var key in options) {
if (options.hasOwnProperty(key)) {
if (options[key] !== undefined) {
target[key] = options[key];
}
}
}
return target;
};
module.exports = Extend;
Import the required modules.
fs-extra
enables some extra fs
goodies, like copy
and mkdirp
.var fs = require('fs-extra');
var File = function() {};
Read the file
(synchronously) and return the data.
file
is a string.callback
is a function.File.prototype.read = function(file, callback) {
try {
var data = fs.readFileSync(file, { encoding: 'utf8' });
return callback(null, data);
} catch(err) {
return callback(err);
}
};
Save the file
and content
(synchronously).
file
is a string.content
is a string.callback
is a function.File.prototype.save = function(file, content, callback) {
try {
fs.writeFileSync(file, content, { encoding: 'utf8' });
return callback(null);
} catch(err) {
return callback(err);
}
};
Copy the target
to the destination
(synchronously).
target
is a string.destination
is a string.callback
is a function.File.prototype.copy = function(target, destination, callback) {
try {
fs.copySync(target, destination);
return callback(null);
} catch(err) {
return callback(err);
}
};
Check if the path
exists (synchronously).
path
is a string.callback
is a function.File.prototype.exists = function(path, callback) {
var exists = fs.existsSync(path);
return callback(exists);
};
File.prototype.mkDir = function(path, callback) {
try {
this.exists(path, function(exists) {
if (!exists) { fs.mkdirpSync(path); }
return callback(null);
});
} catch(err) {
return callback(err);
}
};
module.exports = File;