UNPKG

pygments

Version:
185 lines (154 loc) 4.74 kB
/* * 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;