UNPKG

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