markdown.js 1.9 KB

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