markdown.js 2.4 KB

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