marked 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #!/usr/bin/env node
  2. /**
  3. * Marked CLI
  4. * Copyright (c) 2011-2013, Christopher Jeffrey (MIT License)
  5. */
  6. var fs = require('fs')
  7. , util = require('util')
  8. , marked = require('../');
  9. /**
  10. * Man Page
  11. */
  12. function help() {
  13. var spawn = require('child_process').spawn;
  14. var options = {
  15. cwd: process.cwd(),
  16. env: process.env,
  17. setsid: false,
  18. customFds: [0, 1, 2]
  19. };
  20. spawn('man',
  21. [__dirname + '/../man/marked.1'],
  22. options);
  23. }
  24. /**
  25. * Main
  26. */
  27. function main(argv, callback) {
  28. var files = []
  29. , options = {}
  30. , input
  31. , output
  32. , arg
  33. , tokens
  34. , opt;
  35. function getarg() {
  36. var arg = argv.shift();
  37. if (arg.indexOf('--') === 0) {
  38. // e.g. --opt
  39. arg = arg.split('=');
  40. if (arg.length > 1) {
  41. // e.g. --opt=val
  42. argv.unshift(arg.slice(1).join('='));
  43. }
  44. arg = arg[0];
  45. } else if (arg[0] === '-') {
  46. if (arg.length > 2) {
  47. // e.g. -abc
  48. argv = arg.substring(1).split('').map(function(ch) {
  49. return '-' + ch;
  50. }).concat(argv);
  51. arg = argv.shift();
  52. } else {
  53. // e.g. -a
  54. }
  55. } else {
  56. // e.g. foo
  57. }
  58. return arg;
  59. }
  60. while (argv.length) {
  61. arg = getarg();
  62. switch (arg) {
  63. case '--test':
  64. return require('../test').main(process.argv.slice());
  65. case '-o':
  66. case '--output':
  67. output = argv.shift();
  68. break;
  69. case '-i':
  70. case '--input':
  71. input = argv.shift();
  72. break;
  73. case '-t':
  74. case '--tokens':
  75. tokens = true;
  76. break;
  77. case '-h':
  78. case '--help':
  79. return help();
  80. default:
  81. if (arg.indexOf('--') === 0) {
  82. opt = camelize(arg.replace(/^--(no-)?/, ''));
  83. if (!marked.defaults.hasOwnProperty(opt)) {
  84. continue;
  85. }
  86. if (arg.indexOf('--no-') === 0) {
  87. options[opt] = typeof marked.defaults[opt] !== 'boolean'
  88. ? null
  89. : false;
  90. } else {
  91. options[opt] = typeof marked.defaults[opt] !== 'boolean'
  92. ? argv.shift()
  93. : true;
  94. }
  95. } else {
  96. files.push(arg);
  97. }
  98. break;
  99. }
  100. }
  101. function getData(callback) {
  102. if (!input) {
  103. if (files.length <= 2) {
  104. return getStdin(callback);
  105. }
  106. input = files.pop();
  107. }
  108. return fs.readFile(input, 'utf8', callback);
  109. }
  110. return getData(function(err, data) {
  111. if (err) return callback(err);
  112. data = tokens
  113. ? JSON.stringify(marked.lexer(data, options), null, 2)
  114. : marked(data, options);
  115. if (!output) {
  116. process.stdout.write(data + '\n');
  117. return callback();
  118. }
  119. return fs.writeFile(output, data, callback);
  120. });
  121. }
  122. /**
  123. * Helpers
  124. */
  125. function getStdin(callback) {
  126. var stdin = process.stdin
  127. , buff = '';
  128. stdin.setEncoding('utf8');
  129. stdin.on('data', function(data) {
  130. buff += data;
  131. });
  132. stdin.on('error', function(err) {
  133. return callback(err);
  134. });
  135. stdin.on('end', function() {
  136. return callback(null, buff);
  137. });
  138. try {
  139. stdin.resume();
  140. } catch (e) {
  141. callback(e);
  142. }
  143. }
  144. function camelize(text) {
  145. return text.replace(/(\w)-(\w)/g, function(_, a, b) {
  146. return a + b.toUpperCase();
  147. });
  148. }
  149. /**
  150. * Expose / Entry Point
  151. */
  152. if (!module.parent) {
  153. process.title = 'marked';
  154. main(process.argv.slice(), function(err, code) {
  155. if (err) throw err;
  156. return process.exit(code || 0);
  157. });
  158. } else {
  159. module.exports = main;
  160. }