markdown.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * Module dependencies.
  3. */
  4. var Base = require('./base');
  5. var utils = require('../utils');
  6. /**
  7. * Constants
  8. */
  9. var SUITE_PREFIX = '$';
  10. /**
  11. * Expose `Markdown`.
  12. */
  13. exports = module.exports = Markdown;
  14. /**
  15. * Initialize a new `Markdown` reporter.
  16. *
  17. * @api public
  18. * @param {Runner} runner
  19. */
  20. function Markdown(runner) {
  21. Base.call(this, runner);
  22. var level = 0;
  23. var buf = '';
  24. function title(str) {
  25. return Array(level).join('#') + ' ' + str;
  26. }
  27. function mapTOC(suite, obj) {
  28. var ret = obj;
  29. var key = SUITE_PREFIX + suite.title;
  30. obj = obj[key] = obj[key] || { suite: suite };
  31. suite.suites.forEach(function(suite) {
  32. mapTOC(suite, obj);
  33. });
  34. return ret;
  35. }
  36. function stringifyTOC(obj, level) {
  37. ++level;
  38. var buf = '';
  39. var link;
  40. for (var key in obj) {
  41. if (key === 'suite') {
  42. continue;
  43. }
  44. if (key !== SUITE_PREFIX) {
  45. link = ' - [' + key.substring(1) + ']';
  46. link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
  47. buf += Array(level).join(' ') + link;
  48. }
  49. buf += stringifyTOC(obj[key], level);
  50. }
  51. return buf;
  52. }
  53. function generateTOC(suite) {
  54. var obj = mapTOC(suite, {});
  55. return stringifyTOC(obj, 0);
  56. }
  57. generateTOC(runner.suite);
  58. runner.on('suite', function(suite) {
  59. ++level;
  60. var slug = utils.slug(suite.fullTitle());
  61. buf += '<a name="' + slug + '"></a>' + '\n';
  62. buf += title(suite.title) + '\n';
  63. });
  64. runner.on('suite end', function() {
  65. --level;
  66. });
  67. runner.on('pass', function(test) {
  68. var code = utils.clean(test.body);
  69. buf += test.title + '.\n';
  70. buf += '\n```js\n';
  71. buf += code + '\n';
  72. buf += '```\n\n';
  73. });
  74. runner.on('end', function() {
  75. process.stdout.write('# TOC\n');
  76. process.stdout.write(generateTOC(runner.suite));
  77. process.stdout.write(buf);
  78. });
  79. }