UNPKG

3.85 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 P = require('parsimmon');
18var flatten = require('./util').flatten;
19var CommonMarkUtils = require('@accordproject/markdown-common').CommonMarkUtils;
20var FromCommonMarkVisitor = require('@accordproject/markdown-common').FromCommonMarkVisitor;
21var fromcommonmarkrules = require('@accordproject/markdown-common').fromcommonmarkrules;
22var toparserrules = require('./toparserrules');
23var templateMarkManager = require('./templatemarkutil').templateMarkManager;
24var seqFunParser = require('./combinators').seqFunParser;
25var resultString = result => {
26 return r => P.string(result);
27};
28var resultSeq = (parameters, result) => {
29 var resultParsers;
30 if (parameters.result) {
31 resultParsers = seqFunParser([parameters.result].concat(result));
32 } else {
33 resultParsers = seqFunParser(result);
34 }
35 parameters.result = function (x) {
36 return resultParsers(x).map(flatten);
37 };
38};
39
40/**
41 * Converts a TemplateMark DOM to a parser.
42 */
43class ToParserVisitor extends FromCommonMarkVisitor {
44 /**
45 * Construct the visitor.
46 * @param {object} [options] configuration options
47 * @param {*} resultSeq how to sequentially combine results
48 * @param {object} rules how to process each node type
49 */
50 constructor(options) {
51 var setFirst = thingType => {
52 return thingType === 'Item' || thingType === 'ClauseDefinition' || thingType === 'ListBlockDefinition' ? true : false;
53 };
54 var rules = fromcommonmarkrules;
55 Object.assign(rules, toparserrules);
56 super(options, resultString, resultSeq, rules, setFirst);
57 }
58
59 /**
60 * Converts a TemplateMark DOM to a parser for that node, given parameters
61 * @param {object} visitor - the visitor
62 * @param {object} ast - the template AST
63 * @param {object} parameters - current parameters
64 * @returns {object} the parser
65 */
66 static toParserWithParameters(visitor, ast, parameters) {
67 var localParameters = Object.assign({}, parameters);
68 localParameters.parserManager = parameters.parserManager;
69 localParameters.parsingTable = parameters.parsingTable, localParameters.templateParser = parameters.templateParser;
70 localParameters.result = resultString('');
71 localParameters.stack = parameters.stack;
72 localParameters.first = parameters.first;
73 var dom = templateMarkManager.serializer.fromJSON(ast);
74 dom.accept(visitor, localParameters);
75 return localParameters.result;
76 }
77
78 /**
79 * Converts a TemplateMark DOM to a full parser
80 * @param {*} parserManager - the parser manager
81 * @param {object} ast - the template AST
82 * @param {object} parsingTable - the parsing table
83 * @returns {object} the parser
84 */
85 toParser(parserManager, ast, parsingTable) {
86 // Start with an empty parser
87 var templateParser = {};
88 var parameters = {};
89 parameters.parserManager = parserManager;
90 parameters.parsingTable = parsingTable, parameters.templateParser = templateParser;
91 parameters.result = resultString('');
92 parameters.stack = CommonMarkUtils.blocksInit();
93 parameters.first = false;
94 var parser = ToParserVisitor.toParserWithParameters(this, ast, parameters);
95 templateParser.main = r => parser(r).map(function (x) {
96 return x[0];
97 });
98 return P.createLanguage(templateParser).main;
99 }
100}
101module.exports = ToParserVisitor;
\No newline at end of file