UNPKG

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