UNPKG

5.79 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 CommonMarkUtils = require('@accordproject/markdown-common').CommonMarkUtils;
18
19// Basic parser constructors
20var computedParser = require('./combinators').computedParser;
21var enumParser = require('./combinators').enumParser;
22var conditionalParser = require('./combinators').conditionalParser;
23var optionalParser = require('./combinators').optionalParser;
24var ulistBlockParser = require('./combinators').ulistBlockParser;
25var olistBlockParser = require('./combinators').olistBlockParser;
26var joinBlockParser = require('./combinators').joinBlockParser;
27var withParser = require('./combinators').withParser;
28var clauseParser = require('./combinators').clauseParser;
29var wrappedClauseParser = require('./combinators').wrappedClauseParser;
30var contractParser = require('./combinators').contractParser;
31var mkVariable = require('./combinators').mkVariable;
32
33/**
34 * inContract
35 * @param {string[]} stack - the stack of ancestor nodes
36 * @return {boolean} are we inside a contract definition
37 */
38function inContract(stack) {
39 return stack.blocks.includes('ContractDefinition');
40}
41
42/* Those are additional rules to for the templatemark parser generation, complementing those for commonmark */
43
44//const CommonMarkUtils = require('./CommonMarkUtils');
45
46var rules = {};
47
48// Inline blocks
49rules.EnumVariableDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
50 var result = r => enumParser(thing.enumValues).map(value => mkVariable(thing, value));
51 resultSeq(parameters, result);
52};
53rules.VariableDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
54 var elementType = thing.identifiedBy ? 'Resource' : thing.elementType;
55 var format = thing.format ? thing.format : null;
56 var parserName = format ? elementType + '_' + format : elementType;
57 var result;
58 if (parameters.templateParser[parserName]) {
59 result = r => {
60 return r[parserName].map(value => mkVariable(thing, value));
61 };
62 } else {
63 var fragmentParameters = {};
64 fragmentParameters.parserManager = parameters.parserManager;
65 fragmentParameters.parsingTable = parameters.parsingTable;
66 fragmentParameters.templateParser = parameters.templateParser;
67 fragmentParameters.result = resultString('');
68 fragmentParameters.first = parameters.first;
69 fragmentParameters.stack = parameters.stack;
70 var parsingFun = parameters.parsingTable.getParser(thing.name, elementType, format, fragmentParameters);
71 parameters.templateParser[parserName] = parsingFun;
72 result = r => {
73 try {
74 return r[parserName].map(value => mkVariable(thing, value));
75 } catch (err) {
76 console.log('ERROR HANDLING VARIABLE ' + elementType);
77 throw err;
78 }
79 };
80 }
81 resultSeq(parameters, result);
82};
83rules.FormattedVariableDefinition = rules.VariableDefinition;
84rules.ConditionalDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
85 var whenTrueParser = visitor.visitChildren(visitor, thing, parameters, 'whenTrue');
86 var whenFalseParser = visitor.visitChildren(visitor, thing, parameters, 'whenFalse');
87 var result = r => conditionalParser(thing, whenTrueParser(r), whenFalseParser(r));
88 resultSeq(parameters, result);
89};
90rules.OptionalDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
91 var whenSomeParser = visitor.visitChildren(visitor, thing, parameters, 'whenSome');
92 var whenNoneParser = visitor.visitChildren(visitor, thing, parameters, 'whenNone');
93 var result = r => optionalParser(thing, whenSomeParser(r), whenNoneParser(r));
94 resultSeq(parameters, result);
95};
96rules.JoinDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
97 var result = r => joinBlockParser(thing, children(r));
98 resultSeq(parameters, result);
99};
100rules.WithDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
101 var result = r => withParser(thing.elementType, children(r)).map(value => mkVariable(thing, value));
102 resultSeq(parameters, result);
103};
104rules.FormulaDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
105 var result = r => computedParser(thing.value);
106 resultSeq(parameters, result);
107};
108
109// Container blocks
110rules.ListBlockDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
111 // const level = parameters.tight && parameters.tight === 'false' && parameters.index !== parameters.indexInit ? 2 : 1;
112 var level = 1;
113 var prefix = CommonMarkUtils.mkPrefix(parameters, level);
114 var result = thing.type === 'bullet' ? r => ulistBlockParser(thing, children(r), prefix) : r => olistBlockParser(thing, children(r), prefix);
115 resultSeq(parameters, result);
116};
117rules.ClauseDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
118 var result;
119 if (inContract(parameters.stack)) {
120 result = r => wrappedClauseParser(thing, children(r));
121 } else {
122 result = r => clauseParser(thing, children(r));
123 }
124 resultSeq(parameters, result);
125};
126rules.ContractDefinition = (visitor, thing, children, parameters, resultString, resultSeq) => {
127 var result = r => contractParser(thing, children(r));
128 resultSeq(parameters, result);
129};
130module.exports = rules;
\No newline at end of file