markdown.js 2.0 KB

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