186 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env node
 | 
						|
 | 
						|
/**
 | 
						|
 * Marked CLI
 | 
						|
 * Copyright (c) 2011-2013, Christopher Jeffrey (MIT License)
 | 
						|
 */
 | 
						|
 | 
						|
var fs = require('fs')
 | 
						|
  , util = require('util')
 | 
						|
  , marked = require('../');
 | 
						|
 | 
						|
/**
 | 
						|
 * Man Page
 | 
						|
 */
 | 
						|
 | 
						|
function help() {
 | 
						|
  var spawn = require('child_process').spawn;
 | 
						|
 | 
						|
  var options = {
 | 
						|
    cwd: process.cwd(),
 | 
						|
    env: process.env,
 | 
						|
    setsid: false,
 | 
						|
    customFds: [0, 1, 2]
 | 
						|
  };
 | 
						|
 | 
						|
  spawn('man',
 | 
						|
    [__dirname + '/../man/marked.1'],
 | 
						|
    options);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Main
 | 
						|
 */
 | 
						|
 | 
						|
function main(argv, callback) {
 | 
						|
  var files = []
 | 
						|
    , options = {}
 | 
						|
    , input
 | 
						|
    , output
 | 
						|
    , arg
 | 
						|
    , tokens
 | 
						|
    , opt;
 | 
						|
 | 
						|
  function getarg() {
 | 
						|
    var arg = argv.shift();
 | 
						|
 | 
						|
    if (arg.indexOf('--') === 0) {
 | 
						|
      // e.g. --opt
 | 
						|
      arg = arg.split('=');
 | 
						|
      if (arg.length > 1) {
 | 
						|
        // e.g. --opt=val
 | 
						|
        argv.unshift(arg.slice(1).join('='));
 | 
						|
      }
 | 
						|
      arg = arg[0];
 | 
						|
    } else if (arg[0] === '-') {
 | 
						|
      if (arg.length > 2) {
 | 
						|
        // e.g. -abc
 | 
						|
        argv = arg.substring(1).split('').map(function(ch) {
 | 
						|
          return '-' + ch;
 | 
						|
        }).concat(argv);
 | 
						|
        arg = argv.shift();
 | 
						|
      } else {
 | 
						|
        // e.g. -a
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      // e.g. foo
 | 
						|
    }
 | 
						|
 | 
						|
    return arg;
 | 
						|
  }
 | 
						|
 | 
						|
  while (argv.length) {
 | 
						|
    arg = getarg();
 | 
						|
    switch (arg) {
 | 
						|
      case '-o':
 | 
						|
      case '--output':
 | 
						|
        output = argv.shift();
 | 
						|
        break;
 | 
						|
      case '-i':
 | 
						|
      case '--input':
 | 
						|
        input = argv.shift();
 | 
						|
        break;
 | 
						|
      case '-t':
 | 
						|
      case '--tokens':
 | 
						|
        tokens = true;
 | 
						|
        break;
 | 
						|
      case '-h':
 | 
						|
      case '--help':
 | 
						|
        return help();
 | 
						|
      default:
 | 
						|
        if (arg.indexOf('--') === 0) {
 | 
						|
          opt = camelize(arg.replace(/^--(no-)?/, ''));
 | 
						|
          if (!marked.defaults.hasOwnProperty(opt)) {
 | 
						|
            continue;
 | 
						|
          }
 | 
						|
          if (arg.indexOf('--no-') === 0) {
 | 
						|
            options[opt] = typeof marked.defaults[opt] !== 'boolean'
 | 
						|
              ? null
 | 
						|
              : false;
 | 
						|
          } else {
 | 
						|
            options[opt] = typeof marked.defaults[opt] !== 'boolean'
 | 
						|
              ? argv.shift()
 | 
						|
              : true;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          files.push(arg);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function getData(callback) {
 | 
						|
    if (!input) {
 | 
						|
      if (files.length <= 2) {
 | 
						|
        return getStdin(callback);
 | 
						|
      }
 | 
						|
      input = files.pop();
 | 
						|
    }
 | 
						|
    return fs.readFile(input, 'utf8', callback);
 | 
						|
  }
 | 
						|
 | 
						|
  return getData(function(err, data) {
 | 
						|
    if (err) return callback(err);
 | 
						|
 | 
						|
    data = tokens
 | 
						|
      ? JSON.stringify(marked.lexer(data, options), null, 2)
 | 
						|
      : marked(data, options);
 | 
						|
 | 
						|
    if (!output) {
 | 
						|
      process.stdout.write(data + '\n');
 | 
						|
      return callback();
 | 
						|
    }
 | 
						|
 | 
						|
    return fs.writeFile(output, data, callback);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Helpers
 | 
						|
 */
 | 
						|
 | 
						|
function getStdin(callback) {
 | 
						|
  var stdin = process.stdin
 | 
						|
    , buff = '';
 | 
						|
 | 
						|
  stdin.setEncoding('utf8');
 | 
						|
 | 
						|
  stdin.on('data', function(data) {
 | 
						|
    buff += data;
 | 
						|
  });
 | 
						|
 | 
						|
  stdin.on('error', function(err) {
 | 
						|
    return callback(err);
 | 
						|
  });
 | 
						|
 | 
						|
  stdin.on('end', function() {
 | 
						|
    return callback(null, buff);
 | 
						|
  });
 | 
						|
 | 
						|
  try {
 | 
						|
    stdin.resume();
 | 
						|
  } catch (e) {
 | 
						|
    callback(e);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function camelize(text) {
 | 
						|
  return text.replace(/(\w)-(\w)/g, function(_, a, b) {
 | 
						|
    return a + b.toUpperCase();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Expose / Entry Point
 | 
						|
 */
 | 
						|
 | 
						|
if (!module.parent) {
 | 
						|
  process.title = 'marked';
 | 
						|
  main(process.argv.slice(), function(err, code) {
 | 
						|
    if (err) throw err;
 | 
						|
    return process.exit(code || 0);
 | 
						|
  });
 | 
						|
} else {
 | 
						|
  module.exports = main;
 | 
						|
}
 |