var Q = require('q'); var url = require('url'); var fs = require('fs'); var path = require('path'); var request = require('request'); function codeblock(language, content) { return '
' + content + '
';
}
// Convert a range to a {start,end} object
function rangeToLines(range) {
range = (range || '').split(':');
if (range.length != 2) {
return null;
}
return {
start: Number(range[0]) - 1,
end: Number(range[1]) - 1
}
}
module.exports = {
blocks: {
codesnippet: {
process: function(block) {
var that = this;
var filename = block.args[0];
// Lines range
var range = rangeToLines(block.kwargs.lines);
// Determine language
var language = block.kwargs.language || (filename? path.extname(filename).slice(1) : '');
if (!filename) return codeblock(language, block.body);
// Read the file
return Q()
.then(function() {
if (url.parse(filename).protocol) {
var d = Q.defer();
request(filename, function (error, response, body) {
if (error) return d.reject(error);
if (Math.floor(response.statusCode/200) != 1) d.reject(new Error('No 2XX status code when downloading '+filename));
d.resolve(body.toString('utf-8'));
});
return d.promise;
} else {
return that.book.readFile(filename);
}
})
// Return the html content
.then(function(content) {
if (range) {
var lines = content.match(/[^\r\n]+/g);
lines = lines.slice(range.start, range.end);
content = lines.join('\n');
}
return codeblock(language, content);
});
}
}
}
};