1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | 'use strict';
|
16 |
|
17 | var flatten = require('./util').flatten;
|
18 | var generateJSON = require('./templatemarkutil').generateJSON;
|
19 | var {
|
20 | NS_PREFIX_CommonMarkModel
|
21 | } = require('@accordproject/markdown-common').CommonMarkModel;
|
22 | var {
|
23 | NS_PREFIX_CiceroMarkModel
|
24 | } = require('@accordproject/markdown-cicero').CiceroMarkModel;
|
25 |
|
26 |
|
27 |
|
28 |
|
29 | class ToCiceroMarkVisitor {
|
30 | |
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | static cloneNode(serializer, node) {
|
38 | return serializer.fromJSON(serializer.toJSON(node));
|
39 | }
|
40 |
|
41 | |
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 | static visitChildren(visitor, thing, parameters) {
|
48 | if (thing.nodes) {
|
49 | thing.nodes = ToCiceroMarkVisitor.visitNodes(visitor, thing.nodes, parameters);
|
50 | }
|
51 | }
|
52 |
|
53 | |
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | static visitNodes(visitor, things, parameters) {
|
61 | return flatten(things.map(node => {
|
62 | return node.accept(visitor, parameters);
|
63 | }));
|
64 | }
|
65 |
|
66 | |
67 |
|
68 |
|
69 |
|
70 |
|
71 | static matchTag(tag) {
|
72 | if (tag === 'VariableDefinition') {
|
73 | return NS_PREFIX_CiceroMarkModel + 'Variable';
|
74 | } else if (tag === 'FormattedVariableDefinition') {
|
75 | return NS_PREFIX_CiceroMarkModel + 'FormattedVariable';
|
76 | } else if (tag === 'EnumVariableDefinition') {
|
77 | return NS_PREFIX_CiceroMarkModel + 'EnumVariable';
|
78 | } else if (tag === 'FormulaDefinition') {
|
79 | return NS_PREFIX_CiceroMarkModel + 'Formula';
|
80 | } else if (tag === 'ClauseDefinition') {
|
81 | return NS_PREFIX_CiceroMarkModel + 'Clause';
|
82 | } else if (tag === 'ConditionalDefinition') {
|
83 | return NS_PREFIX_CiceroMarkModel + 'Conditional';
|
84 | } else if (tag === 'OptionalDefinition') {
|
85 | return NS_PREFIX_CiceroMarkModel + 'Optional';
|
86 | } else if (tag === 'ListBlockDefinition') {
|
87 | return NS_PREFIX_CiceroMarkModel + 'ListBlock';
|
88 | } else {
|
89 | return tag;
|
90 | }
|
91 | }
|
92 |
|
93 | |
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | visit(thing, parameters) {
|
100 | var that = this;
|
101 | switch (thing.getType()) {
|
102 | case 'EnumVariableDefinition':
|
103 | {
|
104 | var ciceroMarkTag = ToCiceroMarkVisitor.matchTag(thing.getType());
|
105 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(ciceroMarkTag);
|
106 | thing.value = '' + parameters.data[thing.name];
|
107 | }
|
108 | break;
|
109 | case 'VariableDefinition':
|
110 | case 'FormattedVariableDefinition':
|
111 | {
|
112 | var _ciceroMarkTag = ToCiceroMarkVisitor.matchTag(thing.getType());
|
113 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag);
|
114 | var data = thing.name === 'this' ? parameters.data : parameters.data[thing.name];
|
115 | var elementType = thing.identifiedBy ? 'Resource' : thing.elementType;
|
116 | parameters.visitor = that;
|
117 | var draftFun = parameters.parserManager.getParsingTable().getDrafter(thing.name, elementType, thing.format, parameters);
|
118 | var draftedTo = draftFun(data, thing.format);
|
119 | if (typeof draftedTo === 'string') {
|
120 | thing.value = '' + draftedTo;
|
121 | } else {
|
122 | return draftedTo;
|
123 | }
|
124 | }
|
125 | break;
|
126 | case 'ContractDefinition':
|
127 | {
|
128 | return ToCiceroMarkVisitor.visitNodes(this, thing.nodes, parameters);
|
129 | }
|
130 | case 'FormulaDefinition':
|
131 | {
|
132 | var _ciceroMarkTag2 = ToCiceroMarkVisitor.matchTag(thing.getType());
|
133 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag2);
|
134 | thing.value = parameters.parserManager.getFormulaEval(thing.name)(thing.code, parameters.fullData, parameters.currentTime);
|
135 | }
|
136 | break;
|
137 | case 'ClauseDefinition':
|
138 | {
|
139 | if (parameters.kind === 'contract') {
|
140 | var _ciceroMarkTag3 = ToCiceroMarkVisitor.matchTag(thing.getType());
|
141 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag3);
|
142 | var childrenParameters = {
|
143 | parserManager: parameters.parserManager,
|
144 | templateMarkModelManager: parameters.templateMarkModelManager,
|
145 | templateMarkSerializer: parameters.templateMarkSerializer,
|
146 | fullData: parameters.fullData,
|
147 | data: parameters.data[thing.name],
|
148 | kind: parameters.kind,
|
149 | currentTime: parameters.currentTime
|
150 | };
|
151 | ToCiceroMarkVisitor.visitChildren(this, thing, childrenParameters);
|
152 | } else {
|
153 | ToCiceroMarkVisitor.visitChildren(this, thing, parameters);
|
154 | }
|
155 | }
|
156 | break;
|
157 | case 'WithDefinition':
|
158 | {
|
159 | var _childrenParameters = {
|
160 | parserManager: parameters.parserManager,
|
161 | templateMarkModelManager: parameters.templateMarkModelManager,
|
162 | templateMarkSerializer: parameters.templateMarkSerializer,
|
163 | fullData: parameters.fullData,
|
164 | data: parameters.data[thing.name],
|
165 | kind: parameters.kind,
|
166 | currentTime: parameters.currentTime
|
167 | };
|
168 | return ToCiceroMarkVisitor.visitNodes(this, thing.nodes, _childrenParameters);
|
169 | }
|
170 | case 'ConditionalDefinition':
|
171 | {
|
172 | var _ciceroMarkTag4 = ToCiceroMarkVisitor.matchTag(thing.getType());
|
173 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag4);
|
174 | ToCiceroMarkVisitor.visitNodes(this, thing.whenTrue, parameters);
|
175 | ToCiceroMarkVisitor.visitNodes(this, thing.whenFalse, parameters);
|
176 | if (parameters.data[thing.name]) {
|
177 | thing.isTrue = true;
|
178 | thing.nodes = thing.whenTrue;
|
179 | } else {
|
180 | thing.isTrue = false;
|
181 | thing.nodes = thing.whenFalse;
|
182 | }
|
183 | }
|
184 | break;
|
185 | case 'OptionalDefinition':
|
186 | {
|
187 | var _ciceroMarkTag5 = ToCiceroMarkVisitor.matchTag(thing.getType());
|
188 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag5);
|
189 | if (parameters.data[thing.name]) {
|
190 | thing.hasSome = true;
|
191 | thing.nodes = thing.whenSome;
|
192 | var someParameters = {
|
193 | parserManager: parameters.parserManager,
|
194 | templateMarkModelManager: parameters.templateMarkModelManager,
|
195 | templateMarkSerializer: parameters.templateMarkSerializer,
|
196 | fullData: parameters.fullData,
|
197 | data: parameters.data[thing.name],
|
198 | kind: parameters.kind,
|
199 | currentTime: parameters.currentTime
|
200 | };
|
201 | ToCiceroMarkVisitor.visitNodes(this, thing.whenSome, someParameters);
|
202 | var noneParameters = {
|
203 | parserManager: parameters.parserManager,
|
204 | templateMarkModelManager: parameters.templateMarkModelManager,
|
205 | templateMarkSerializer: parameters.templateMarkSerializer,
|
206 | fullData: parameters.fullData,
|
207 | data: {},
|
208 | kind: parameters.kind,
|
209 | currentTime: parameters.currentTime
|
210 | };
|
211 | ToCiceroMarkVisitor.visitNodes(this, thing.whenNone, noneParameters);
|
212 | } else {
|
213 | thing.hasSome = false;
|
214 | thing.nodes = thing.whenNone;
|
215 | var invented = generateJSON(parameters.parserManager.getModelManager(), thing.elementType);
|
216 | var _someParameters = {
|
217 | parserManager: parameters.parserManager,
|
218 | templateMarkModelManager: parameters.templateMarkModelManager,
|
219 | templateMarkSerializer: parameters.templateMarkSerializer,
|
220 | fullData: parameters.fullData,
|
221 | data: invented,
|
222 |
|
223 | kind: parameters.kind,
|
224 | currentTime: parameters.currentTime
|
225 | };
|
226 | ToCiceroMarkVisitor.visitNodes(this, thing.whenSome, _someParameters);
|
227 | var _noneParameters = {
|
228 | parserManager: parameters.parserManager,
|
229 | templateMarkModelManager: parameters.templateMarkModelManager,
|
230 | templateMarkSerializer: parameters.templateMarkSerializer,
|
231 | fullData: parameters.fullData,
|
232 | data: {},
|
233 | kind: parameters.kind,
|
234 | currentTime: parameters.currentTime
|
235 | };
|
236 | ToCiceroMarkVisitor.visitNodes(this, thing.whenNone, _noneParameters);
|
237 | }
|
238 | }
|
239 | break;
|
240 | case 'ListBlockDefinition':
|
241 | {
|
242 |
|
243 | var itemNode = ToCiceroMarkVisitor.cloneNode(parameters.templateMarkSerializer, thing);
|
244 | itemNode.$classDeclaration = parameters.templateMarkModelManager.getType(NS_PREFIX_CommonMarkModel + 'Item');
|
245 | delete itemNode.elementType;
|
246 | delete itemNode.decorators;
|
247 | delete itemNode.name;
|
248 | delete itemNode.type;
|
249 | delete itemNode.start;
|
250 | delete itemNode.tight;
|
251 | delete itemNode.delimiter;
|
252 | var dataItems = parameters.data[thing.name];
|
253 | var mapItems = function mapItems(item) {
|
254 | var itemParameters = {
|
255 | parserManager: parameters.parserManager,
|
256 | templateMarkModelManager: parameters.templateMarkModelManager,
|
257 | templateMarkSerializer: parameters.templateMarkSerializer,
|
258 | fullData: parameters.fullData,
|
259 | data: item,
|
260 | kind: parameters.kind,
|
261 | currentTime: parameters.currentTime
|
262 | };
|
263 | return ToCiceroMarkVisitor.cloneNode(parameters.templateMarkSerializer, itemNode).accept(that, itemParameters);
|
264 | };
|
265 |
|
266 |
|
267 | var _ciceroMarkTag6 = ToCiceroMarkVisitor.matchTag(thing.getType());
|
268 | thing.$classDeclaration = parameters.templateMarkModelManager.getType(_ciceroMarkTag6);
|
269 | thing.nodes = flatten(dataItems.map(mapItems));
|
270 | delete thing.elementType;
|
271 | }
|
272 | break;
|
273 | case 'JoinDefinition':
|
274 | {
|
275 |
|
276 | var _itemNode = ToCiceroMarkVisitor.cloneNode(parameters.templateMarkSerializer, thing);
|
277 | _itemNode.$classDeclaration = parameters.templateMarkModelManager.getType(NS_PREFIX_CommonMarkModel + 'Item');
|
278 | delete _itemNode.elementType;
|
279 | delete _itemNode.decorators;
|
280 | delete _itemNode.name;
|
281 | delete _itemNode.separator;
|
282 | var _dataItems = parameters.data[thing.name];
|
283 | var _mapItems = function _mapItems(item, index) {
|
284 | var itemParameters = {
|
285 | parserManager: parameters.parserManager,
|
286 | templateMarkModelManager: parameters.templateMarkModelManager,
|
287 | templateMarkSerializer: parameters.templateMarkSerializer,
|
288 | fullData: parameters.fullData,
|
289 | data: item,
|
290 | kind: parameters.kind,
|
291 | currentTime: parameters.currentTime
|
292 | };
|
293 | var resultNodes = ToCiceroMarkVisitor.cloneNode(parameters.templateMarkSerializer, _itemNode).accept(that, itemParameters)[0].nodes;
|
294 | if (index > 0) {
|
295 | resultNodes.unshift(parameters.templateMarkSerializer.fromJSON({
|
296 | '$class': 'org.accordproject.commonmark.Text',
|
297 | 'text': thing.separator
|
298 | }));
|
299 | }
|
300 | return resultNodes;
|
301 | };
|
302 |
|
303 |
|
304 | return flatten(_dataItems.map(_mapItems));
|
305 | }
|
306 | case 'Document':
|
307 | {
|
308 | ToCiceroMarkVisitor.visitChildren(this, thing.nodes[0], parameters);
|
309 | thing.nodes = thing.nodes[0].nodes;
|
310 | }
|
311 | break;
|
312 | default:
|
313 | ToCiceroMarkVisitor.visitChildren(this, thing, parameters);
|
314 | }
|
315 | return [thing];
|
316 | }
|
317 | }
|
318 | module.exports = ToCiceroMarkVisitor; |
\ | No newline at end of file |