1 | 'use strict';
|
2 |
|
3 | var stringifier = require('stringifier');
|
4 | var stringWidth = require('./string-width');
|
5 | var StringWriter = require('./string-writer');
|
6 | var ContextTraversal = require('./traverse');
|
7 | var udiff = require('./udiff');
|
8 | var defaultOptions = require('./default-options');
|
9 | var typeName = require('type-name');
|
10 | var extend = require('xtend');
|
11 | var map = require('array-map');
|
12 |
|
13 | var AssertionRenderer = require('./built-in/assertion');
|
14 | var FileRenderer = require('./built-in/file');
|
15 | var DiagramRenderer = require('./built-in/diagram');
|
16 | var BinaryExpressionRenderer = require('./built-in/binary-expression');
|
17 |
|
18 |
|
19 |
|
20 | var defaultRendererClasses = {
|
21 | './built-in/file': FileRenderer,
|
22 | './built-in/assertion': AssertionRenderer,
|
23 | './built-in/diagram': DiagramRenderer,
|
24 | './built-in/binary-expression': BinaryExpressionRenderer
|
25 | };
|
26 |
|
27 | function toRendererClass (rendererName) {
|
28 | var RendererClass;
|
29 | if (typeName(rendererName) === 'function') {
|
30 | RendererClass = rendererName;
|
31 | } else if (typeName(rendererName) === 'string') {
|
32 | if (defaultRendererClasses[rendererName]) {
|
33 | RendererClass = defaultRendererClasses[rendererName];
|
34 | } else {
|
35 | RendererClass = require(rendererName);
|
36 | }
|
37 | }
|
38 | return RendererClass;
|
39 | }
|
40 |
|
41 | function configure (options) {
|
42 | var config = extend(defaultOptions(), options);
|
43 | if (typeof config.widthOf !== 'function') {
|
44 | config.widthOf = stringWidth(extend(config));
|
45 | }
|
46 | if (typeof config.stringify !== 'function') {
|
47 | config.stringify = stringifier(extend(config));
|
48 | }
|
49 | if (typeof config.diff !== 'function') {
|
50 | config.diff = udiff(extend(config));
|
51 | }
|
52 | if (!config.writerClass) {
|
53 | config.writerClass = StringWriter;
|
54 | }
|
55 | return config;
|
56 | }
|
57 |
|
58 | function create (options) {
|
59 | var config = configure(options);
|
60 | var rendererClasses = map(config.renderers, toRendererClass);
|
61 | return function (context) {
|
62 | var traversal = new ContextTraversal(context);
|
63 | var writer = new config.writerClass(extend(config));
|
64 | var renderers = map(rendererClasses, function (RendererClass) {
|
65 | var renderer;
|
66 | if (RendererClass.length === 2) {
|
67 | renderer = new RendererClass(traversal, extend(config));
|
68 | } else {
|
69 | renderer = new RendererClass(extend(config));
|
70 | renderer.init(traversal);
|
71 | }
|
72 | return renderer;
|
73 | });
|
74 | traversal.emit('start', context);
|
75 | traversal.traverse();
|
76 | traversal.emit('render', writer);
|
77 | writer.write('');
|
78 | renderers.length = 0;
|
79 | return writer.flush();
|
80 | };
|
81 | }
|
82 |
|
83 | create.renderers = {
|
84 | AssertionRenderer: AssertionRenderer,
|
85 | FileRenderer: FileRenderer,
|
86 | DiagramRenderer: DiagramRenderer,
|
87 | BinaryExpressionRenderer: BinaryExpressionRenderer
|
88 | };
|
89 | create.defaultOptions = defaultOptions;
|
90 | create.stringWidth = stringWidth;
|
91 | module.exports = create;
|