pygments
Version:
A pygments wrapper for nodejs
185 lines (154 loc) • 4.74 kB
JavaScript
/*
* pygments.js: A node.js wrapper for pygments
*
* (C) 2011, Pavan Kumar Sunkara
*
*/
var spawn = require('child_process').spawn,
spawnSync = require('child_process').spawnSync,
path = require('path'),
fs = require('fs');
var exists = fs.existsSync || path.existsSync;
var pygments = {};
//
// Default timeout threshold for pygments
//
pygments.timeout = 10;
//
// Default binary path for pygmentize
//
pygments.bin = 'pygmentize';
//
// ### function prepareColorizeParameters
// #### @target {String} Target to be highlighted
// #### @lexer {String} Lexer to use for highlighting
// #### @format {String} Format for the output
// #### @options {Object} Other options
// #### @returns {Object} the target and the options merged
//
pygments.prepareColorizeParameters = function(target, lexer, format, options) {
options = options || {};
if(lexer) options['l'] = lexer;
if(format) options['f'] = format;
options = pygments.merge_options(options);
target = pygments.stringize(target, (options['force']));
delete options['force'];
return {
target: target,
options: options
};
}
//
// ### function colorize
// #### @target {String} Target to be highlighted
// #### @lexer {String} Lexer to use for highlighting
// #### @format {String} Format for the output
// #### @callback {Function} Callback to be called on the highlighted string
// #### @options {Object} Other options
//
pygments.colorize = function(target, lexer, format, callback, options) {
colorizeParameters = pygments.prepareColorizeParameters(target, lexer, format, options);
pygments.execute(colorizeParameters.target, colorizeParameters.options, callback);
};
//
// ### function colorizeSync
// #### @target {String} Target to be highlighted
// #### @lexer {String} Lexer to use for highlighting
// #### @format {String} Format for the output
// #### @options {Object} Other options
// #### @returns {String} The highlighted string
//
pygments.colorizeSync = function(target, lexer, format, options) {
colorizeParameters = pygments.prepareColorizeParameters(target, lexer, format, options);
return pygments.executeSync(colorizeParameters.target, colorizeParameters.options);
};
//
// ### function execute
// #### @target {String} Target to be highlighted
// #### @options {Object} Options
//
pygments.execute = function(target, options, callback) {
var pyg = spawn(pygments.bin, pygments.convert_options(options));
var chunks = [];
pyg.stdout.on('data', function(chunk) {
chunks.push(chunk);
});
pyg.stderr.on('data', function (data) {
console.log(data.toString());
});
pyg.on('exit', function() {
var length = 0;
chunks.forEach(function(chunk) {
length += chunk.length;
});
var content = new Buffer(length);
var index = 0;
chunks.forEach(function(chunk) {
chunk.copy(content, index, 0, chunk.length);
index += chunk.length;
});
callback(content.toString());
});
pyg.stdin.write(target);
pyg.stdin.end();
};
//
// ### function executeSync
// #### @target {String} Target to be highlighted
// #### @options {Object} Options
// #### @returns {String} The highlighted string
//
pygments.executeSync = function(target, options) {
var spawnRes = spawnSync(pygments.bin, pygments.convert_options(options), {input:target});
return spawnRes.stdout.toString();
};
//
// ### function convert_options
// #### @options {Object} Options to be converted
//
pygments.convert_options = function(options) {
var cmd = [];
for(var option in options) {
validate_args(option, options[option]);
cmd.push("-"+option + options[option]);
}
return cmd;
};
//
// ### function merge_options
// #### @opts {Object} Options to be merged
//
pygments.merge_options = function(options) {
var default_options = {
'force': false,
'l': 'js',
'f': 'html',
'O': 'encoding=utf-8'
};
Object.keys(default_options).forEach(function (key) {
if (options[key] == null) {
options[key] = default_options[key];
}
});
return options;
};
//
// ### function stringize
// #### @target {String} Target to be highlighted
// #### @force {Boolean} Force the target to be string
//
pygments.stringize = function(target, force) {
force = (force===undefined ? false : force);
if(exists(target) && !force) {
var target_stats = fs.statSync(target);
if(target_stats.isFile()) {
return fs.readFileSync(target);
}
}
return target;
};
var validate_args = function(flag, value) {
if(!flag.match(/^[a-z]+$/i)) throw new Error("Flag is invalid: " + flag);
if(!value.match(/^[a-z0-9\-\_\+\=\#\,\s]+$/i)) throw new Error("Flag value is invalid: -"+flag+" "+value);
};
module.exports = pygments;