marked 3.8 KB

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