1 | 'use strict';
|
2 |
|
3 | var stringifier = require('stringifier'),
|
4 | stringWidth = require('./string-width'),
|
5 | StringWriter = require('./string-writer'),
|
6 | ContextTraversal = require('./traverse'),
|
7 | defaultOptions = require('./default-options'),
|
8 | typeName = require('type-name'),
|
9 | extend = require('xtend');
|
10 |
|
11 | (function() {
|
12 |
|
13 |
|
14 | require('./built-in/assertion');
|
15 | require('./built-in/binary-expression');
|
16 | require('./built-in/diagram');
|
17 | require('./built-in/file');
|
18 | })();
|
19 |
|
20 | function create (options) {
|
21 | var config = extend(defaultOptions(), options);
|
22 | if (typeof config.widthOf !== 'function') {
|
23 | config.widthOf = stringWidth;
|
24 | }
|
25 | if (typeof config.stringify !== 'function') {
|
26 | config.stringify = stringifier(config);
|
27 | }
|
28 | if (!config.writerClass) {
|
29 | config.writerClass = StringWriter;
|
30 | }
|
31 | return function (context) {
|
32 | var traversal = new ContextTraversal(context);
|
33 | var writer = new config.writerClass(extend(config));
|
34 | config.renderers.forEach(function (rendererName) {
|
35 | var RendererClass;
|
36 | if (typeName(rendererName) === 'function') {
|
37 | RendererClass = rendererName;
|
38 | } else if (typeName(rendererName) === 'string') {
|
39 | RendererClass = require(rendererName);
|
40 | }
|
41 | new RendererClass(traversal, extend(config));
|
42 | });
|
43 | traversal.emit('start', context);
|
44 | traversal.traverse();
|
45 | traversal.emit('render', writer);
|
46 | writer.write('');
|
47 | return writer.flush();
|
48 | };
|
49 | }
|
50 |
|
51 | create.defaultOptions = defaultOptions;
|
52 | create.stringWidth = stringWidth;
|
53 | module.exports = create;
|