UNPKG

13.1 kBJavaScriptView Raw
1/*
2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 *
6 * http://www.apache.org/licenses/LICENSE-2.0
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15'use strict';
16
17var flatten = require('./util').flatten;
18var generateJSON = require('./templatemarkutil').generateJSON;
19var {
20 NS_PREFIX_CommonMarkModel
21} = require('@accordproject/markdown-common').CommonMarkModel;
22var {
23 NS_PREFIX_CiceroMarkModel
24} = require('@accordproject/markdown-cicero').CiceroMarkModel;
25
26/**
27 * Drafts a CiceroMark DOM from a TemplateMark DOM
28 */
29class ToCiceroMarkVisitor {
30 /**
31 * Clone a CiceroMark node
32 * @param {*} serializer the serializer
33 * @param {*} node the node to visit
34 * @param {*} [parameters] optional parameters
35 * @return {*} the cloned node
36 */
37 static cloneNode(serializer, node) {
38 return serializer.fromJSON(serializer.toJSON(node));
39 }
40
41 /**
42 * Visits a sub-tree and return CiceroMark DOM
43 * @param {*} visitor the visitor to use
44 * @param {*} thing the node to visit
45 * @param {*} [parameters] optional parameters
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 * Visits a list of nodes and return the CiceroMark DOM
55 * @param {*} visitor the visitor to use
56 * @param {*} things the list node to visit
57 * @param {*} [parameters] optional parameters
58 * @return {*} the visited nodes
59 */
60 static visitNodes(visitor, things, parameters) {
61 return flatten(things.map(node => {
62 return node.accept(visitor, parameters);
63 }));
64 }
65
66 /**
67 * Match template tag to instance tag
68 * @param {string} tag the template tag
69 * @return {string} the corresponding instance tag
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 * Visit a node
95 * @param {*} thing the object being visited
96 * @param {*} parameters the parameters
97 * @return {*} the visited nodes
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 // Need to invent some data here!
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 // Clone the thing and create an item blueprint
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 // Result List node
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 // Clone the thing and create an item blueprint
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 // Result List node
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}
318module.exports = ToCiceroMarkVisitor;
\No newline at end of file