UNPKG

3.12 kBJavaScriptView Raw
1'use strict';
2
3var stringifier = require('stringifier');
4var stringWidth = require('./string-width');
5var StringWriter = require('./string-writer');
6var ContextTraversal = require('./traverse');
7var udiff = require('./udiff');
8var defaultOptions = require('./default-options');
9var typeName = require('type-name');
10var extend = require('xtend');
11var map = require('array-map');
12
13var AssertionRenderer = require('./built-in/assertion');
14var FileRenderer = require('./built-in/file');
15var DiagramRenderer = require('./built-in/diagram');
16var BinaryExpressionRenderer = require('./built-in/binary-expression');
17
18// "Browserify can only analyze static requires. It is not in the scope of browserify to handle dynamic requires."
19// https://github.com/substack/node-browserify/issues/377
20var defaultRendererClasses = {
21 './built-in/file': FileRenderer,
22 './built-in/assertion': AssertionRenderer,
23 './built-in/diagram': DiagramRenderer,
24 './built-in/binary-expression': BinaryExpressionRenderer
25};
26
27function 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
41function 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
58function 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
83create.renderers = {
84 AssertionRenderer: AssertionRenderer,
85 FileRenderer: FileRenderer,
86 DiagramRenderer: DiagramRenderer,
87 BinaryExpressionRenderer: BinaryExpressionRenderer
88};
89create.defaultOptions = defaultOptions;
90create.stringWidth = stringWidth;
91module.exports = create;