precedent 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.config/code-server/config.yaml +1 -1
- package/.config/configstore/update-notifier-npm.json +1 -1
- package/Dockerfile_LUXURYCode +69 -0
- package/dist/precedent.js +302 -307
- package/dist/precedent.min.js +29 -27
- package/dist/precedent.min.js.map +1 -1
- package/gulpfile.js +36 -15
- package/package.json +26 -12
- package/source/Precedent-Browser-Shim.js +5 -9
- package/source/StringParser.js +1 -1
- package/source/WordTree.js +7 -7
- package/test/Precedent_tests.js +106 -0
- package/test.js +1 -0
- package/.config/luxury-extras/.vscode/launch.json +0 -46
- package/.config/luxury-extras/Dockerfile +0 -32
- package/.config/luxury-extras/Dockerfile_LUXURYCode +0 -45
- package/.config/luxury-extras/MySQL/Dockerfile +0 -51
- package/.config/luxury-extras/MySQL/Dockerfile_LUXURYCODE +0 -65
- package/.config/luxury-extras/MySQL/MySQL-Laden-Entry.sh +0 -17
- package/.config/luxury-extras/MySQL/MySQL-Security.sql +0 -5
- package/.config/luxury-extras/model/ddl/BookStore.ddl +0 -66
- package/.config/luxury-extras/model/documentation/Dictionary.md +0 -18
- package/.config/luxury-extras/model/documentation/Model-Author.md +0 -20
- package/.config/luxury-extras/model/documentation/Model-Book.md +0 -26
- package/.config/luxury-extras/model/documentation/Model-BookAuthorJoin.md +0 -14
- package/.config/luxury-extras/model/documentation/Model-BookPrice.md +0 -25
- package/.config/luxury-extras/model/documentation/Model-Review.md +0 -22
- package/.config/luxury-extras/model/documentation/ModelChangeTracking.md +0 -17
- package/.config/luxury-extras/model/documentation/README.md +0 -1
- package/.config/luxury-extras/model/documentation/diagram/README.md +0 -1
- package/.config/luxury-extras/model/documentation/diagram/Stricture_Output.dot +0 -13
- package/.config/luxury-extras/model/documentation/diagram/Stricture_Output.png +0 -0
- package/.config/luxury-extras/model/json_schema_entities/BookStore-MeadowSchema-Author.json +0 -220
- package/.config/luxury-extras/model/json_schema_entities/BookStore-MeadowSchema-Book.json +0 -268
- package/.config/luxury-extras/model/json_schema_entities/BookStore-MeadowSchema-BookAuthorJoin.json +0 -172
- package/.config/luxury-extras/model/json_schema_entities/BookStore-MeadowSchema-BookPrice.json +0 -260
- package/.config/luxury-extras/model/json_schema_entities/BookStore-MeadowSchema-Review.json +0 -236
- package/.config/luxury-extras/model/json_schema_entities/README.md +0 -1
- package/.config/luxury-extras/model/json_schema_model/BookStore-Extended.json +0 -915
- package/.config/luxury-extras/model/json_schema_model/BookStore-PICT.json +0 -1
- package/.config/luxury-extras/model/json_schema_model/BookStore.json +0 -280
- package/.config/luxury-extras/model/json_schema_model/README.md +0 -1
- package/.config/luxury-extras/model/mysql_create/BookStore-CreateDatabase.mysql.sql +0 -116
- package/.config/luxury-extras/model/mysql_create/README.md +0 -1
- package/DockerfileLUXURYCode +0 -45
package/dist/precedent.js
CHANGED
|
@@ -1,322 +1,317 @@
|
|
|
1
|
-
(function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
(function (f) {
|
|
2
|
+
if (typeof exports === "object" && typeof module !== "undefined") {
|
|
3
|
+
module.exports = f();
|
|
4
|
+
} else if (typeof define === "function" && define.amd) {
|
|
5
|
+
define([], f);
|
|
6
|
+
} else {
|
|
7
|
+
var g;
|
|
8
|
+
if (typeof window !== "undefined") {
|
|
9
|
+
g = window;
|
|
10
|
+
} else if (typeof global !== "undefined") {
|
|
11
|
+
g = global;
|
|
12
|
+
} else if (typeof self !== "undefined") {
|
|
13
|
+
g = self;
|
|
14
|
+
} else {
|
|
15
|
+
g = this;
|
|
16
|
+
}
|
|
17
|
+
g.Precedent = f();
|
|
18
|
+
}
|
|
19
|
+
})(function () {
|
|
20
|
+
var define, module, exports;
|
|
21
|
+
return function () {
|
|
22
|
+
function r(e, n, t) {
|
|
23
|
+
function o(i, f) {
|
|
24
|
+
if (!n[i]) {
|
|
25
|
+
if (!e[i]) {
|
|
26
|
+
var c = "function" == typeof require && require;
|
|
27
|
+
if (!f && c) return c(i, !0);
|
|
28
|
+
if (u) return u(i, !0);
|
|
29
|
+
var a = new Error("Cannot find module '" + i + "'");
|
|
30
|
+
throw a.code = "MODULE_NOT_FOUND", a;
|
|
31
|
+
}
|
|
32
|
+
var p = n[i] = {
|
|
33
|
+
exports: {}
|
|
34
|
+
};
|
|
35
|
+
e[i][0].call(p.exports, function (r) {
|
|
36
|
+
var n = e[i][1][r];
|
|
37
|
+
return o(n || r);
|
|
38
|
+
}, p, p.exports, r, e, n, t);
|
|
39
|
+
}
|
|
40
|
+
return n[i].exports;
|
|
41
|
+
}
|
|
42
|
+
for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]);
|
|
43
|
+
return o;
|
|
44
|
+
}
|
|
45
|
+
return r;
|
|
46
|
+
}()({
|
|
47
|
+
1: [function (require, module, exports) {
|
|
48
|
+
/**
|
|
49
|
+
* Simple browser shim loader - assign the npm module to a window global automatically
|
|
50
|
+
*
|
|
51
|
+
* @license MIT
|
|
52
|
+
* @author <steven@velozo.com>
|
|
53
|
+
*/
|
|
54
|
+
var libNPMModuleWrapper = require('./Precedent.js');
|
|
55
|
+
if (typeof window == 'object' && !window.hasOwnProperty('Precedent')) {
|
|
56
|
+
window.Precedent = libNPMModuleWrapper;
|
|
57
|
+
}
|
|
58
|
+
module.exports = libNPMModuleWrapper;
|
|
59
|
+
}, {
|
|
60
|
+
"./Precedent.js": 2
|
|
61
|
+
}],
|
|
62
|
+
2: [function (require, module, exports) {
|
|
63
|
+
/**
|
|
64
|
+
* Precedent Meta-Templating
|
|
65
|
+
*
|
|
66
|
+
* @license MIT
|
|
67
|
+
*
|
|
68
|
+
* @author Steven Velozo <steven@velozo.com>
|
|
69
|
+
*
|
|
70
|
+
* @description Process text streams, parsing out meta-template expressions.
|
|
71
|
+
*/
|
|
72
|
+
var libWordTree = require(`./WordTree.js`);
|
|
73
|
+
var libStringParser = require(`./StringParser.js`);
|
|
74
|
+
class Precedent {
|
|
75
|
+
/**
|
|
76
|
+
* Precedent Constructor
|
|
77
|
+
*/
|
|
78
|
+
constructor() {
|
|
79
|
+
this.WordTree = new libWordTree();
|
|
80
|
+
this.StringParser = new libStringParser();
|
|
81
|
+
this.ParseTree = this.WordTree.ParseTree;
|
|
82
|
+
}
|
|
6
83
|
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Add a Pattern to the Parse Tree
|
|
86
|
+
* @method addPattern
|
|
87
|
+
* @param {Object} pTree - A node on the parse tree to push the characters into
|
|
88
|
+
* @param {string} pPattern - The string to add to the tree
|
|
89
|
+
* @param {number} pIndex - callback function
|
|
90
|
+
* @return {bool} True if adding the pattern was successful
|
|
91
|
+
*/
|
|
92
|
+
addPattern(pPatternStart, pPatternEnd, pParser) {
|
|
93
|
+
return this.WordTree.addPattern(pPatternStart, pPatternEnd, pParser);
|
|
94
|
+
}
|
|
10
95
|
|
|
11
|
-
|
|
12
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Parse a string with the existing parse tree
|
|
98
|
+
* @method parseString
|
|
99
|
+
* @param {string} pString - The string to parse
|
|
100
|
+
* @return {string} The result from the parser
|
|
101
|
+
*/
|
|
102
|
+
parseString(pString) {
|
|
103
|
+
return this.StringParser.parseString(pString, this.ParseTree);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
module.exports = Precedent;
|
|
107
|
+
}, {
|
|
108
|
+
"./StringParser.js": 3,
|
|
109
|
+
"./WordTree.js": 4
|
|
110
|
+
}],
|
|
111
|
+
3: [function (require, module, exports) {
|
|
112
|
+
/**
|
|
113
|
+
* String Parser
|
|
114
|
+
*
|
|
115
|
+
* @license MIT
|
|
116
|
+
*
|
|
117
|
+
* @author Steven Velozo <steven@velozo.com>
|
|
118
|
+
*
|
|
119
|
+
* @description Parse a string, properly processing each matched token in the word tree.
|
|
120
|
+
*/
|
|
13
121
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
122
|
+
class StringParser {
|
|
123
|
+
/**
|
|
124
|
+
* StringParser Constructor
|
|
125
|
+
*/
|
|
126
|
+
constructor() {}
|
|
18
127
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* @
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
128
|
+
/**
|
|
129
|
+
* Create a fresh parsing state object to work with.
|
|
130
|
+
* @method newParserState
|
|
131
|
+
* @param {Object} pParseTree - A node on the parse tree to begin parsing from (usually root)
|
|
132
|
+
* @return {Object} A new parser state object for running a character parser on
|
|
133
|
+
* @private
|
|
134
|
+
*/
|
|
135
|
+
newParserState(pParseTree) {
|
|
136
|
+
return {
|
|
137
|
+
ParseTree: pParseTree,
|
|
138
|
+
Output: '',
|
|
139
|
+
OutputBuffer: '',
|
|
140
|
+
Pattern: false,
|
|
141
|
+
PatternMatch: false,
|
|
142
|
+
PatternMatchOutputBuffer: ''
|
|
143
|
+
};
|
|
144
|
+
}
|
|
32
145
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Assign a node of the parser tree to be the next potential match.
|
|
148
|
+
* If the node has a PatternEnd property, it is a valid match and supercedes the last valid match (or becomes the initial match).
|
|
149
|
+
* @method assignNode
|
|
150
|
+
* @param {Object} pNode - A node on the parse tree to assign
|
|
151
|
+
* @param {Object} pParserState - The state object for the current parsing task
|
|
152
|
+
* @private
|
|
153
|
+
*/
|
|
154
|
+
assignNode(pNode, pParserState) {
|
|
155
|
+
pParserState.PatternMatch = pNode;
|
|
43
156
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
* @param {Object} pTree - A node on the parse tree to push the characters into
|
|
51
|
-
* @param {string} pPattern - The string to add to the tree
|
|
52
|
-
* @param {number} pIndex - callback function
|
|
53
|
-
* @return {bool} True if adding the pattern was successful
|
|
54
|
-
*/
|
|
55
|
-
addPattern(pPatternStart, pPatternEnd, pParser)
|
|
56
|
-
{
|
|
57
|
-
return this.WordTree.addPattern(pPatternStart, pPatternEnd, pParser);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Parse a string with the existing parse tree
|
|
62
|
-
* @method parseString
|
|
63
|
-
* @param {string} pString - The string to parse
|
|
64
|
-
* @return {string} The result from the parser
|
|
65
|
-
*/
|
|
66
|
-
parseString(pString)
|
|
67
|
-
{
|
|
68
|
-
return this.StringParser.parseString(pString, this.ParseTree);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
157
|
+
// If the pattern has a END we can assume it has a parse function...
|
|
158
|
+
if (pParserState.PatternMatch.hasOwnProperty('PatternEnd')) {
|
|
159
|
+
// ... this is the legitimate start of a pattern.
|
|
160
|
+
pParserState.Pattern = pParserState.PatternMatch;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
71
163
|
|
|
72
|
-
|
|
164
|
+
/**
|
|
165
|
+
* Append a character to the output buffer in the parser state.
|
|
166
|
+
* This output buffer is used when a potential match is being explored, or a match is being explored.
|
|
167
|
+
* @method appendOutputBuffer
|
|
168
|
+
* @param {string} pCharacter - The character to append
|
|
169
|
+
* @param {Object} pParserState - The state object for the current parsing task
|
|
170
|
+
* @private
|
|
171
|
+
*/
|
|
172
|
+
appendOutputBuffer(pCharacter, pParserState) {
|
|
173
|
+
pParserState.OutputBuffer += pCharacter;
|
|
174
|
+
}
|
|
73
175
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
* @
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Flush the output buffer to the output and clear it.
|
|
178
|
+
* @method flushOutputBuffer
|
|
179
|
+
* @param {Object} pParserState - The state object for the current parsing task
|
|
180
|
+
* @private
|
|
181
|
+
*/
|
|
182
|
+
flushOutputBuffer(pParserState) {
|
|
183
|
+
pParserState.Output += pParserState.OutputBuffer;
|
|
184
|
+
pParserState.OutputBuffer = '';
|
|
185
|
+
}
|
|
84
186
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
{
|
|
105
|
-
ParseTree: pParseTree,
|
|
187
|
+
/**
|
|
188
|
+
* Check if the pattern has ended. If it has, properly flush the buffer and start looking for new patterns.
|
|
189
|
+
* @method checkPatternEnd
|
|
190
|
+
* @param {Object} pParserState - The state object for the current parsing task
|
|
191
|
+
* @private
|
|
192
|
+
*/
|
|
193
|
+
checkPatternEnd(pParserState) {
|
|
194
|
+
if (pParserState.OutputBuffer.length >= pParserState.Pattern.PatternEnd.length + pParserState.Pattern.PatternStart.length && pParserState.OutputBuffer.substr(-pParserState.Pattern.PatternEnd.length) === pParserState.Pattern.PatternEnd) {
|
|
195
|
+
// ... this is the end of a pattern, cut off the end tag and parse it.
|
|
196
|
+
// Trim the start and end tags off the output buffer now
|
|
197
|
+
pParserState.OutputBuffer = pParserState.Pattern.Parse(pParserState.OutputBuffer.substr(pParserState.Pattern.PatternStart.length, pParserState.OutputBuffer.length - (pParserState.Pattern.PatternStart.length + pParserState.Pattern.PatternEnd.length)));
|
|
198
|
+
// Flush the output buffer.
|
|
199
|
+
this.flushOutputBuffer(pParserState);
|
|
200
|
+
// End pattern mode
|
|
201
|
+
pParserState.Pattern = false;
|
|
202
|
+
pParserState.PatternMatch = false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
106
205
|
|
|
107
|
-
|
|
108
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Parse a character in the buffer.
|
|
208
|
+
* @method parseCharacter
|
|
209
|
+
* @param {string} pCharacter - The character to append
|
|
210
|
+
* @param {Object} pParserState - The state object for the current parsing task
|
|
211
|
+
* @private
|
|
212
|
+
*/
|
|
213
|
+
parseCharacter(pCharacter, pParserState) {
|
|
214
|
+
// (1) If we aren't in a pattern match, and we aren't potentially matching, and this may be the start of a new pattern....
|
|
215
|
+
if (!pParserState.PatternMatch && pParserState.ParseTree.hasOwnProperty(pCharacter)) {
|
|
216
|
+
// ... assign the node as the matched node.
|
|
217
|
+
this.assignNode(pParserState.ParseTree[pCharacter], pParserState);
|
|
218
|
+
this.appendOutputBuffer(pCharacter, pParserState);
|
|
219
|
+
}
|
|
220
|
+
// (2) If we are in a pattern match (actively seeing if this is part of a new pattern token)
|
|
221
|
+
else if (pParserState.PatternMatch) {
|
|
222
|
+
// If the pattern has a subpattern with this key
|
|
223
|
+
if (pParserState.PatternMatch.hasOwnProperty(pCharacter)) {
|
|
224
|
+
// Continue matching patterns.
|
|
225
|
+
this.assignNode(pParserState.PatternMatch[pCharacter], pParserState);
|
|
226
|
+
}
|
|
227
|
+
this.appendOutputBuffer(pCharacter, pParserState);
|
|
228
|
+
if (pParserState.Pattern) {
|
|
229
|
+
// ... Check if this is the end of the pattern (if we are matching a valid pattern)...
|
|
230
|
+
this.checkPatternEnd(pParserState);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// (3) If we aren't in a pattern match or pattern, and this isn't the start of a new pattern (RAW mode)....
|
|
234
|
+
else {
|
|
235
|
+
pParserState.Output += pCharacter;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
109
238
|
|
|
110
|
-
|
|
239
|
+
/**
|
|
240
|
+
* Parse a string for matches, and process any template segments that occur.
|
|
241
|
+
* @method parseString
|
|
242
|
+
* @param {string} pString - The string to parse.
|
|
243
|
+
* @param {Object} pParseTree - The parse tree to begin parsing from (usually root)
|
|
244
|
+
*/
|
|
245
|
+
parseString(pString, pParseTree) {
|
|
246
|
+
let tmpParserState = this.newParserState(pParseTree);
|
|
247
|
+
for (var i = 0; i < pString.length; i++) {
|
|
248
|
+
// TODO: This is not fast.
|
|
249
|
+
this.parseCharacter(pString[i], tmpParserState);
|
|
250
|
+
}
|
|
251
|
+
this.flushOutputBuffer(tmpParserState);
|
|
252
|
+
return tmpParserState.Output;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
module.exports = StringParser;
|
|
256
|
+
}, {}],
|
|
257
|
+
4: [function (require, module, exports) {
|
|
258
|
+
/**
|
|
259
|
+
* Word Tree
|
|
260
|
+
*
|
|
261
|
+
* @license MIT
|
|
262
|
+
*
|
|
263
|
+
* @author Steven Velozo <steven@velozo.com>
|
|
264
|
+
*
|
|
265
|
+
* @description Create a tree (directed graph) of Javascript objects, one character per object.
|
|
266
|
+
*/
|
|
111
267
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* If the node has a PatternEnd property, it is a valid match and supercedes the last valid match (or becomes the initial match).
|
|
120
|
-
* @method assignNode
|
|
121
|
-
* @param {Object} pNode - A node on the parse tree to assign
|
|
122
|
-
* @param {Object} pParserState - The state object for the current parsing task
|
|
123
|
-
* @private
|
|
124
|
-
*/
|
|
125
|
-
assignNode (pNode, pParserState)
|
|
126
|
-
{
|
|
127
|
-
pParserState.PatternMatch = pNode;
|
|
268
|
+
class WordTree {
|
|
269
|
+
/**
|
|
270
|
+
* WordTree Constructor
|
|
271
|
+
*/
|
|
272
|
+
constructor() {
|
|
273
|
+
this.ParseTree = {};
|
|
274
|
+
}
|
|
128
275
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
* @private
|
|
144
|
-
*/
|
|
145
|
-
appendOutputBuffer (pCharacter, pParserState)
|
|
146
|
-
{
|
|
147
|
-
pParserState.OutputBuffer += pCharacter;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Flush the output buffer to the output and clear it.
|
|
152
|
-
* @method flushOutputBuffer
|
|
153
|
-
* @param {Object} pParserState - The state object for the current parsing task
|
|
154
|
-
* @private
|
|
155
|
-
*/
|
|
156
|
-
flushOutputBuffer (pParserState)
|
|
157
|
-
{
|
|
158
|
-
pParserState.Output += pParserState.OutputBuffer;
|
|
159
|
-
pParserState.OutputBuffer = '';
|
|
160
|
-
}
|
|
276
|
+
/**
|
|
277
|
+
* Add a child character to a Parse Tree node
|
|
278
|
+
* @method addChild
|
|
279
|
+
* @param {Object} pTree - A parse tree to push the characters into
|
|
280
|
+
* @param {string} pPattern - The string to add to the tree
|
|
281
|
+
* @param {number} pIndex - callback function
|
|
282
|
+
* @returns {Object} The resulting leaf node that was added (or found)
|
|
283
|
+
* @private
|
|
284
|
+
*/
|
|
285
|
+
addChild(pTree, pPattern, pIndex) {
|
|
286
|
+
if (pIndex > pPattern.length) return pTree;
|
|
287
|
+
if (!pTree.hasOwnProperty(pPattern[pIndex])) pTree[pPattern[pIndex]] = {};
|
|
288
|
+
return pTree[pPattern[pIndex]];
|
|
289
|
+
}
|
|
161
290
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
(pParserState.OutputBuffer.substr(-pParserState.Pattern.PatternEnd.length) === pParserState.Pattern.PatternEnd))
|
|
173
|
-
{
|
|
174
|
-
// ... this is the end of a pattern, cut off the end tag and parse it.
|
|
175
|
-
// Trim the start and end tags off the output buffer now
|
|
176
|
-
pParserState.OutputBuffer = pParserState.Pattern.Parse(pParserState.OutputBuffer.substr(pParserState.Pattern.PatternStart.length, pParserState.OutputBuffer.length - (pParserState.Pattern.PatternStart.length+pParserState.Pattern.PatternEnd.length)));
|
|
177
|
-
// Flush the output buffer.
|
|
178
|
-
this.flushOutputBuffer(pParserState);
|
|
179
|
-
// End pattern mode
|
|
180
|
-
pParserState.Pattern = false;
|
|
181
|
-
pParserState.PatternMatch = false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Parse a character in the buffer.
|
|
187
|
-
* @method parseCharacter
|
|
188
|
-
* @param {string} pCharacter - The character to append
|
|
189
|
-
* @param {Object} pParserState - The state object for the current parsing task
|
|
190
|
-
* @private
|
|
191
|
-
*/
|
|
192
|
-
parseCharacter (pCharacter, pParserState)
|
|
193
|
-
{
|
|
194
|
-
// (1) If we aren't in a pattern match, and we aren't potentially matching, and this may be the start of a new pattern....
|
|
195
|
-
if (!pParserState.PatternMatch && pParserState.ParseTree.hasOwnProperty(pCharacter))
|
|
196
|
-
{
|
|
197
|
-
// ... assign the node as the matched node.
|
|
198
|
-
this.assignNode(pParserState.ParseTree[pCharacter], pParserState);
|
|
199
|
-
this.appendOutputBuffer(pCharacter, pParserState);
|
|
200
|
-
}
|
|
201
|
-
// (2) If we are in a pattern match (actively seeing if this is part of a new pattern token)
|
|
202
|
-
else if (pParserState.PatternMatch)
|
|
203
|
-
{
|
|
204
|
-
// If the pattern has a subpattern with this key
|
|
205
|
-
if (pParserState.PatternMatch.hasOwnProperty(pCharacter))
|
|
206
|
-
{
|
|
207
|
-
// Continue matching patterns.
|
|
208
|
-
this.assignNode(pParserState.PatternMatch[pCharacter], pParserState);
|
|
209
|
-
}
|
|
210
|
-
this.appendOutputBuffer(pCharacter, pParserState);
|
|
211
|
-
if (pParserState.Pattern)
|
|
212
|
-
{
|
|
213
|
-
// ... Check if this is the end of the pattern (if we are matching a valid pattern)...
|
|
214
|
-
this.checkPatternEnd(pParserState);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
// (3) If we aren't in a pattern match or pattern, and this isn't the start of a new pattern (RAW mode)....
|
|
218
|
-
else
|
|
219
|
-
{
|
|
220
|
-
pParserState.Output += pCharacter;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Parse a string for matches, and process any template segments that occur.
|
|
226
|
-
* @method parseString
|
|
227
|
-
* @param {string} pString - The string to parse.
|
|
228
|
-
* @param {Object} pParseTree - The parse tree to begin parsing from (usually root)
|
|
229
|
-
*/
|
|
230
|
-
parseString (pString, pParseTree)
|
|
231
|
-
{
|
|
232
|
-
let tmpParserState = this.newParserState(pParseTree);
|
|
291
|
+
/** Add a Pattern to the Parse Tree
|
|
292
|
+
* @method addPattern
|
|
293
|
+
* @param {Object} pTree - A node on the parse tree to push the characters into
|
|
294
|
+
* @param {string} pPattern - The string to add to the tree
|
|
295
|
+
* @param {number} pIndex - callback function
|
|
296
|
+
* @return {bool} True if adding the pattern was successful
|
|
297
|
+
*/
|
|
298
|
+
addPattern(pPatternStart, pPatternEnd, pParser) {
|
|
299
|
+
if (pPatternStart.length < 1) return false;
|
|
300
|
+
let tmpLeaf = this.ParseTree;
|
|
233
301
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
module.exports =
|
|
247
|
-
|
|
248
|
-
},{}
|
|
249
|
-
|
|
250
|
-
* Word Tree
|
|
251
|
-
*
|
|
252
|
-
* @license MIT
|
|
253
|
-
*
|
|
254
|
-
* @author Steven Velozo <steven@velozo.com>
|
|
255
|
-
*
|
|
256
|
-
* @description Create a tree (directed graph) of Javascript objects, one character per object.
|
|
257
|
-
*/
|
|
258
|
-
|
|
259
|
-
class WordTree
|
|
260
|
-
{
|
|
261
|
-
/**
|
|
262
|
-
* WordTree Constructor
|
|
263
|
-
*/
|
|
264
|
-
constructor()
|
|
265
|
-
{
|
|
266
|
-
this.ParseTree = {};
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Add a child character to a Parse Tree node
|
|
271
|
-
* @method addChild
|
|
272
|
-
* @param {Object} pTree - A parse tree to push the characters into
|
|
273
|
-
* @param {string} pPattern - The string to add to the tree
|
|
274
|
-
* @param {number} pIndex - callback function
|
|
275
|
-
* @returns {Object} The resulting leaf node that was added (or found)
|
|
276
|
-
* @private
|
|
277
|
-
*/
|
|
278
|
-
addChild (pTree, pPattern, pIndex)
|
|
279
|
-
{
|
|
280
|
-
if (pIndex > pPattern.length)
|
|
281
|
-
return pTree;
|
|
282
|
-
|
|
283
|
-
if (!pTree.hasOwnProperty(pPattern[pIndex]))
|
|
284
|
-
pTree[pPattern[pIndex]] = {};
|
|
285
|
-
|
|
286
|
-
return pTree[pPattern[pIndex]];
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/** Add a Pattern to the Parse Tree
|
|
290
|
-
* @method addPattern
|
|
291
|
-
* @param {Object} pTree - A node on the parse tree to push the characters into
|
|
292
|
-
* @param {string} pPattern - The string to add to the tree
|
|
293
|
-
* @param {number} pIndex - callback function
|
|
294
|
-
* @return {bool} True if adding the pattern was successful
|
|
295
|
-
*/
|
|
296
|
-
addPattern (pPatternStart, pPatternEnd, pParser)
|
|
297
|
-
{
|
|
298
|
-
if (pPatternStart.length < 1)
|
|
299
|
-
return false;
|
|
300
|
-
|
|
301
|
-
let tmpLeaf = this.ParseTree;
|
|
302
|
-
|
|
303
|
-
// Add the tree of leaves iteratively
|
|
304
|
-
for (var i = 0; i < pPatternStart.length; i++)
|
|
305
|
-
tmpLeaf = this.addChild(tmpLeaf, pPatternStart, i);
|
|
306
|
-
|
|
307
|
-
tmpLeaf.PatternStart = pPatternStart;
|
|
308
|
-
tmpLeaf.PatternEnd = ((typeof(pPatternEnd) === 'string') && (pPatternEnd.length > 0)) ? pPatternEnd : pPatternStart;
|
|
309
|
-
tmpLeaf.Parse = (typeof(pParser) === 'function') ? pParser :
|
|
310
|
-
(typeof(pParser) === 'string') ? () => { return pParser; } :
|
|
311
|
-
(pData) => { return pData; };
|
|
312
|
-
|
|
313
|
-
return true;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
module.exports = WordTree;
|
|
318
|
-
|
|
319
|
-
},{}]},{},[1])(1)
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzb3VyY2UvUHJlY2VkZW50LUJyb3dzZXItU2hpbS5qcyIsInNvdXJjZS9QcmVjZWRlbnQuanMiLCJzb3VyY2UvU3RyaW5nUGFyc2VyLmpzIiwic291cmNlL1dvcmRUcmVlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuKiBAbGljZW5zZSBNSVRcbiogQGF1dGhvciA8c3RldmVuQHZlbG96by5jb20+XG4qL1xuXG4vKipcbiogUHJlY2VkZW50IGJyb3dzZXIgc2hpbSBsb2FkZXJcbiovXG5cbi8vIExvYWQgdGhlIHByZWNlZGVudCBtb2R1bGUgaW50byB0aGUgYnJvd3NlciBnbG9iYWwgYXV0b21hdGljYWxseS5cbnZhciBsaWJQcmVjZWRlbnQgPSByZXF1aXJlKCcuL1ByZWNlZGVudC5qcycpO1xuXG5pZiAoKHR5cGVvZih3aW5kb3cpID09ICdvYmplY3QnKSAmJiAoIXdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnUHJlY2VkZW50JykpKVxue1xuXHR3aW5kb3cuUHJlY2VkZW50ID0gbGliUHJlY2VkZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpYlByZWNlZGVudDsiLCIvKipcbiogUHJlY2VkZW50IE1ldGEtVGVtcGxhdGluZ1xuKlxuKiBAbGljZW5zZSAgICAgTUlUXG4qXG4qIEBhdXRob3IgICAgICBTdGV2ZW4gVmVsb3pvIDxzdGV2ZW5AdmVsb3pvLmNvbT5cbipcbiogQGRlc2NyaXB0aW9uIFByb2Nlc3MgdGV4dCBzdHJlYW1zLCBwYXJzaW5nIG91dCBtZXRhLXRlbXBsYXRlIGV4cHJlc3Npb25zLlxuKi9cbnZhciBsaWJXb3JkVHJlZSA9IHJlcXVpcmUoYC4vV29yZFRyZWUuanNgKTtcbnZhciBsaWJTdHJpbmdQYXJzZXIgPSByZXF1aXJlKGAuL1N0cmluZ1BhcnNlci5qc2ApO1xuXG5jbGFzcyBQcmVjZWRlbnRcbntcblx0LyoqXG5cdCAqIFByZWNlZGVudCBDb25zdHJ1Y3RvclxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5Xb3JkVHJlZSA9IG5ldyBsaWJXb3JkVHJlZSgpO1xuXHRcdFxuXHRcdHRoaXMuU3RyaW5nUGFyc2VyID0gbmV3IGxpYlN0cmluZ1BhcnNlcigpO1xuXG5cdFx0dGhpcy5QYXJzZVRyZWUgPSB0aGlzLldvcmRUcmVlLlBhcnNlVHJlZTtcblx0fVxuXHRcblx0LyoqXG5cdCAqIEFkZCBhIFBhdHRlcm4gdG8gdGhlIFBhcnNlIFRyZWVcblx0ICogQG1ldGhvZCBhZGRQYXR0ZXJuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwVHJlZSAtIEEgbm9kZSBvbiB0aGUgcGFyc2UgdHJlZSB0byBwdXNoIHRoZSBjaGFyYWN0ZXJzIGludG9cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBQYXR0ZXJuIC0gVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHRyZWVcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBJbmRleCAtIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm4ge2Jvb2x9IFRydWUgaWYgYWRkaW5nIHRoZSBwYXR0ZXJuIHdhcyBzdWNjZXNzZnVsXG5cdCAqL1xuXHRhZGRQYXR0ZXJuKHBQYXR0ZXJuU3RhcnQsIHBQYXR0ZXJuRW5kLCBwUGFyc2VyKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuV29yZFRyZWUuYWRkUGF0dGVybihwUGF0dGVyblN0YXJ0LCBwUGF0dGVybkVuZCwgcFBhcnNlcik7XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBQYXJzZSBhIHN0cmluZyB3aXRoIHRoZSBleGlzdGluZyBwYXJzZSB0cmVlXG5cdCAqIEBtZXRob2QgcGFyc2VTdHJpbmdcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBTdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc3VsdCBmcm9tIHRoZSBwYXJzZXJcblx0ICovXG5cdHBhcnNlU3RyaW5nKHBTdHJpbmcpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5TdHJpbmdQYXJzZXIucGFyc2VTdHJpbmcocFN0cmluZywgdGhpcy5QYXJzZVRyZWUpO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJlY2VkZW50O1xuIiwiLyoqXG4qIFN0cmluZyBQYXJzZXJcbipcbiogQGxpY2Vuc2UgICAgIE1JVFxuKlxuKiBAYXV0aG9yICAgICAgU3RldmVuIFZlbG96byA8c3RldmVuQHZlbG96by5jb20+XG4qXG4qIEBkZXNjcmlwdGlvbiBQYXJzZSBhIHN0cmluZywgcHJvcGVybHkgcHJvY2Vzc2luZyBlYWNoIG1hdGNoZWQgdG9rZW4gaW4gdGhlIHdvcmQgdHJlZS5cbiovXG5cbmNsYXNzIFN0cmluZ1BhcnNlclxue1xuXHQvKipcblx0ICogU3RyaW5nUGFyc2VyIENvbnN0cnVjdG9yXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0fVxuXHRcblx0LyoqXG5cdCAqIENyZWF0ZSBhIGZyZXNoIHBhcnNpbmcgc3RhdGUgb2JqZWN0IHRvIHdvcmsgd2l0aC5cblx0ICogQG1ldGhvZCBuZXdQYXJzZXJTdGF0ZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gcFBhcnNlVHJlZSAtIEEgbm9kZSBvbiB0aGUgcGFyc2UgdHJlZSB0byBiZWdpbiBwYXJzaW5nIGZyb20gKHVzdWFsbHkgcm9vdClcblx0ICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBwYXJzZXIgc3RhdGUgb2JqZWN0IGZvciBydW5uaW5nIGEgY2hhcmFjdGVyIHBhcnNlciBvblxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0bmV3UGFyc2VyU3RhdGUgKHBQYXJzZVRyZWUpXG5cdHtcblx0XHRyZXR1cm4gKFxuXHRcdHtcblx0XHQgICAgUGFyc2VUcmVlOiBwUGFyc2VUcmVlLFxuXG5cdFx0XHRPdXRwdXQ6ICcnLFxuXHRcdFx0T3V0cHV0QnVmZmVyOiAnJyxcblxuXHRcdFx0UGF0dGVybjogZmFsc2UsXG5cblx0XHRcdFBhdHRlcm5NYXRjaDogZmFsc2UsXG5cdFx0XHRQYXR0ZXJuTWF0Y2hPdXRwdXRCdWZmZXI6ICcnXG5cdFx0fSk7XG5cdH1cblx0XHRcblx0LyoqXG5cdCAqIEFzc2lnbiBhIG5vZGUgb2YgdGhlIHBhcnNlciB0cmVlIHRvIGJlIHRoZSBuZXh0IHBvdGVudGlhbCBtYXRjaC5cblx0ICogSWYgdGhlIG5vZGUgaGFzIGEgUGF0dGVybkVuZCBwcm9wZXJ0eSwgaXQgaXMgYSB2YWxpZCBtYXRjaCBhbmQgc3VwZXJjZWRlcyB0aGUgbGFzdCB2YWxpZCBtYXRjaCAob3IgYmVjb21lcyB0aGUgaW5pdGlhbCBtYXRjaCkuXG5cdCAqIEBtZXRob2QgYXNzaWduTm9kZVxuXHQgKiBAcGFyYW0ge09iamVjdH0gcE5vZGUgLSBBIG5vZGUgb24gdGhlIHBhcnNlIHRyZWUgdG8gYXNzaWduXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwUGFyc2VyU3RhdGUgLSBUaGUgc3RhdGUgb2JqZWN0IGZvciB0aGUgY3VycmVudCBwYXJzaW5nIHRhc2tcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFzc2lnbk5vZGUgKHBOb2RlLCBwUGFyc2VyU3RhdGUpXG5cdHtcblx0XHRwUGFyc2VyU3RhdGUuUGF0dGVybk1hdGNoID0gcE5vZGU7XG5cblx0XHQvLyBJZiB0aGUgcGF0dGVybiBoYXMgYSBFTkQgd2UgY2FuIGFzc3VtZSBpdCBoYXMgYSBwYXJzZSBmdW5jdGlvbi4uLlxuXHRcdGlmIChwUGFyc2VyU3RhdGUuUGF0dGVybk1hdGNoLmhhc093blByb3BlcnR5KCdQYXR0ZXJuRW5kJykpXG5cdFx0e1xuXHRcdFx0Ly8gLi4uIHRoaXMgaXMgdGhlIGxlZ2l0aW1hdGUgc3RhcnQgb2YgYSBwYXR0ZXJuLlxuXHRcdFx0cFBhcnNlclN0YXRlLlBhdHRlcm4gPSBwUGFyc2VyU3RhdGUuUGF0dGVybk1hdGNoO1xuXHRcdH1cblx0fVxuXHRcblx0LyoqXG5cdCAqIEFwcGVuZCBhIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciBpbiB0aGUgcGFyc2VyIHN0YXRlLlxuXHQgKiBUaGlzIG91dHB1dCBidWZmZXIgaXMgdXNlZCB3aGVuIGEgcG90ZW50aWFsIG1hdGNoIGlzIGJlaW5nIGV4cGxvcmVkLCBvciBhIG1hdGNoIGlzIGJlaW5nIGV4cGxvcmVkLlxuXHQgKiBAbWV0aG9kIGFwcGVuZE91dHB1dEJ1ZmZlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcENoYXJhY3RlciAtIFRoZSBjaGFyYWN0ZXIgdG8gYXBwZW5kXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwUGFyc2VyU3RhdGUgLSBUaGUgc3RhdGUgb2JqZWN0IGZvciB0aGUgY3VycmVudCBwYXJzaW5nIHRhc2tcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFwcGVuZE91dHB1dEJ1ZmZlciAocENoYXJhY3RlciwgcFBhcnNlclN0YXRlKVxuXHR7XG5cdFx0cFBhcnNlclN0YXRlLk91dHB1dEJ1ZmZlciArPSBwQ2hhcmFjdGVyO1xuXHR9XG5cdFxuXHQvKipcblx0ICogRmx1c2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIG91dHB1dCBhbmQgY2xlYXIgaXQuXG5cdCAqIEBtZXRob2QgZmx1c2hPdXRwdXRCdWZmZXJcblx0ICogQHBhcmFtIHtPYmplY3R9IHBQYXJzZXJTdGF0ZSAtIFRoZSBzdGF0ZSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHBhcnNpbmcgdGFza1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Zmx1c2hPdXRwdXRCdWZmZXIgKHBQYXJzZXJTdGF0ZSlcblx0e1xuXHRcdHBQYXJzZXJTdGF0ZS5PdXRwdXQgKz0gcFBhcnNlclN0YXRlLk91dHB1dEJ1ZmZlcjtcblx0XHRwUGFyc2VyU3RhdGUuT3V0cHV0QnVmZmVyID0gJyc7XG5cdH1cblxuXHRcblx0LyoqXG5cdCAqIENoZWNrIGlmIHRoZSBwYXR0ZXJuIGhhcyBlbmRlZC4gIElmIGl0IGhhcywgcHJvcGVybHkgZmx1c2ggdGhlIGJ1ZmZlciBhbmQgc3RhcnQgbG9va2luZyBmb3IgbmV3IHBhdHRlcm5zLlxuXHQgKiBAbWV0aG9kIGNoZWNrUGF0dGVybkVuZFxuXHQgKiBAcGFyYW0ge09iamVjdH0gcFBhcnNlclN0YXRlIC0gVGhlIHN0YXRlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgcGFyc2luZyB0YXNrXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRjaGVja1BhdHRlcm5FbmQgKHBQYXJzZXJTdGF0ZSlcblx0e1xuXHRcdGlmICgocFBhcnNlclN0YXRlLk91dHB1dEJ1ZmZlci5sZW5ndGggPj0gcFBhcnNlclN0YXRlLlBhdHRlcm4uUGF0dGVybkVuZC5sZW5ndGgrcFBhcnNlclN0YXRlLlBhdHRlcm4uUGF0dGVyblN0YXJ0Lmxlbmd0aCkgJiYgXG5cdFx0XHQocFBhcnNlclN0YXRlLk91dHB1dEJ1ZmZlci5zdWJzdHIoLXBQYXJzZXJTdGF0ZS5QYXR0ZXJuLlBhdHRlcm5FbmQubGVuZ3RoKSA9PT0gcFBhcnNlclN0YXRlLlBhdHRlcm4uUGF0dGVybkVuZCkpXG5cdFx0e1xuXHRcdFx0Ly8gLi4uIHRoaXMgaXMgdGhlIGVuZCBvZiBhIHBhdHRlcm4sIGN1dCBvZmYgdGhlIGVuZCB0YWcgYW5kIHBhcnNlIGl0LlxuXHRcdFx0Ly8gVHJpbSB0aGUgc3RhcnQgYW5kIGVuZCB0YWdzIG9mZiB0aGUgb3V0cHV0IGJ1ZmZlciBub3dcblx0XHRcdHBQYXJzZXJTdGF0ZS5PdXRwdXRCdWZmZXIgPSBwUGFyc2VyU3RhdGUuUGF0dGVybi5QYXJzZShwUGFyc2VyU3RhdGUuT3V0cHV0QnVmZmVyLnN1YnN0cihwUGFyc2VyU3RhdGUuUGF0dGVybi5QYXR0ZXJuU3RhcnQubGVuZ3RoLCBwUGFyc2VyU3RhdGUuT3V0cHV0QnVmZmVyLmxlbmd0aCAtIChwUGFyc2VyU3RhdGUuUGF0dGVybi5QYXR0ZXJuU3RhcnQubGVuZ3RoK3BQYXJzZXJTdGF0ZS5QYXR0ZXJuLlBhdHRlcm5FbmQubGVuZ3RoKSkpO1xuXHRcdFx0Ly8gRmx1c2ggdGhlIG91dHB1dCBidWZmZXIuXG5cdFx0XHR0aGlzLmZsdXNoT3V0cHV0QnVmZmVyKHBQYXJzZXJTdGF0ZSk7XG5cdFx0XHQvLyBFbmQgcGF0dGVybiBtb2RlXG5cdFx0XHRwUGFyc2VyU3RhdGUuUGF0dGVybiA9IGZhbHNlO1xuXHRcdFx0cFBhcnNlclN0YXRlLlBhdHRlcm5NYXRjaCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXHRcblx0LyoqXG5cdCAqIFBhcnNlIGEgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIuXG5cdCAqIEBtZXRob2QgcGFyc2VDaGFyYWN0ZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBDaGFyYWN0ZXIgLSBUaGUgY2hhcmFjdGVyIHRvIGFwcGVuZFxuXHQgKiBAcGFyYW0ge09iamVjdH0gcFBhcnNlclN0YXRlIC0gVGhlIHN0YXRlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgcGFyc2luZyB0YXNrXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwYXJzZUNoYXJhY3RlciAocENoYXJhY3RlciwgcFBhcnNlclN0YXRlKVxuXHR7XG5cdFx0Ly8gKDEpIElmIHdlIGFyZW4ndCBpbiBhIHBhdHRlcm4gbWF0Y2gsIGFuZCB3ZSBhcmVuJ3QgcG90ZW50aWFsbHkgbWF0Y2hpbmcsIGFuZCB0aGlzIG1heSBiZSB0aGUgc3RhcnQgb2YgYSBuZXcgcGF0dGVybi4uLi5cblx0XHRpZiAoIXBQYXJzZXJTdGF0ZS5QYXR0ZXJuTWF0Y2ggJiYgcFBhcnNlclN0YXRlLlBhcnNlVHJlZS5oYXNPd25Qcm9wZXJ0eShwQ2hhcmFjdGVyKSlcblx0XHR7XG5cdFx0XHQvLyAuLi4gYXNzaWduIHRoZSBub2RlIGFzIHRoZSBtYXRjaGVkIG5vZGUuXG5cdFx0XHR0aGlzLmFzc2lnbk5vZGUocFBhcnNlclN0YXRlLlBhcnNlVHJlZVtwQ2hhcmFjdGVyXSwgcFBhcnNlclN0YXRlKTtcblx0XHRcdHRoaXMuYXBwZW5kT3V0cHV0QnVmZmVyKHBDaGFyYWN0ZXIsIHBQYXJzZXJTdGF0ZSk7XG5cdFx0fVxuXHRcdC8vICgyKSBJZiB3ZSBhcmUgaW4gYSBwYXR0ZXJuIG1hdGNoIChhY3RpdmVseSBzZWVpbmcgaWYgdGhpcyBpcyBwYXJ0IG9mIGEgbmV3IHBhdHRlcm4gdG9rZW4pXG5cdFx0ZWxzZSBpZiAocFBhcnNlclN0YXRlLlBhdHRlcm5NYXRjaClcblx0XHR7XG5cdFx0XHQvLyBJZiB0aGUgcGF0dGVybiBoYXMgYSBzdWJwYXR0ZXJuIHdpdGggdGhpcyBrZXlcblx0XHRcdGlmIChwUGFyc2VyU3RhdGUuUGF0dGVybk1hdGNoLmhhc093blByb3BlcnR5KHBDaGFyYWN0ZXIpKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDb250aW51ZSBtYXRjaGluZyBwYXR0ZXJucy5cblx0XHRcdFx0dGhpcy5hc3NpZ25Ob2RlKHBQYXJzZXJTdGF0ZS5QYXR0ZXJuTWF0Y2hbcENoYXJhY3Rlcl0sIHBQYXJzZXJTdGF0ZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFwcGVuZE91dHB1dEJ1ZmZlcihwQ2hhcmFjdGVyLCBwUGFyc2VyU3RhdGUpO1xuXHRcdFx0aWYgKHBQYXJzZXJTdGF0ZS5QYXR0ZXJuKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyAuLi4gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuIChpZiB3ZSBhcmUgbWF0Y2hpbmcgYSB2YWxpZCBwYXR0ZXJuKS4uLlxuXHRcdFx0XHR0aGlzLmNoZWNrUGF0dGVybkVuZChwUGFyc2VyU3RhdGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyAoMykgSWYgd2UgYXJlbid0IGluIGEgcGF0dGVybiBtYXRjaCBvciBwYXR0ZXJuLCBhbmQgdGhpcyBpc24ndCB0aGUgc3RhcnQgb2YgYSBuZXcgcGF0dGVybiAoUkFXIG1vZGUpLi4uLlxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRwUGFyc2VyU3RhdGUuT3V0cHV0ICs9IHBDaGFyYWN0ZXI7XG5cdFx0fVxuXHR9XG5cdFxuXHQvKipcblx0ICogUGFyc2UgYSBzdHJpbmcgZm9yIG1hdGNoZXMsIGFuZCBwcm9jZXNzIGFueSB0ZW1wbGF0ZSBzZWdtZW50cyB0aGF0IG9jY3VyLlxuXHQgKiBAbWV0aG9kIHBhcnNlU3RyaW5nXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwU3RyaW5nIC0gVGhlIHN0cmluZyB0byBwYXJzZS5cblx0ICogQHBhcmFtIHtPYmplY3R9IHBQYXJzZVRyZWUgLSBUaGUgcGFyc2UgdHJlZSB0byBiZWdpbiBwYXJzaW5nIGZyb20gKHVzdWFsbHkgcm9vdClcblx0ICovXG5cdHBhcnNlU3RyaW5nIChwU3RyaW5nLCBwUGFyc2VUcmVlKVxuXHR7XG5cdFx0bGV0IHRtcFBhcnNlclN0YXRlID0gdGhpcy5uZXdQYXJzZXJTdGF0ZShwUGFyc2VUcmVlKTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcFN0cmluZy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHQvLyBUT0RPOiBUaGlzIGlzIG5vdCBmYXN0LlxuXHRcdFx0dGhpcy5wYXJzZUNoYXJhY3RlcihwU3RyaW5nW2ldLCB0bXBQYXJzZXJTdGF0ZSk7XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMuZmx1c2hPdXRwdXRCdWZmZXIodG1wUGFyc2VyU3RhdGUpO1xuXHRcdFxuXHRcdHJldHVybiB0bXBQYXJzZXJTdGF0ZS5PdXRwdXQ7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdQYXJzZXI7XG4iLCIvKipcbiogV29yZCBUcmVlXG4qXG4qIEBsaWNlbnNlICAgICBNSVRcbipcbiogQGF1dGhvciAgICAgIFN0ZXZlbiBWZWxvem8gPHN0ZXZlbkB2ZWxvem8uY29tPlxuKlxuKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGEgdHJlZSAoZGlyZWN0ZWQgZ3JhcGgpIG9mIEphdmFzY3JpcHQgb2JqZWN0cywgb25lIGNoYXJhY3RlciBwZXIgb2JqZWN0LlxuKi9cblxuY2xhc3MgV29yZFRyZWVcbntcblx0LyoqXG5cdCAqIFdvcmRUcmVlIENvbnN0cnVjdG9yXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHR0aGlzLlBhcnNlVHJlZSA9IHt9O1xuXHR9XG5cdFxuXHQvKiogXG5cdCAqIEFkZCBhIGNoaWxkIGNoYXJhY3RlciB0byBhIFBhcnNlIFRyZWUgbm9kZVxuXHQgKiBAbWV0aG9kIGFkZENoaWxkXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBwVHJlZSAtIEEgcGFyc2UgdHJlZSB0byBwdXNoIHRoZSBjaGFyYWN0ZXJzIGludG9cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBQYXR0ZXJuIC0gVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHRyZWVcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBJbmRleCAtIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgbGVhZiBub2RlIHRoYXQgd2FzIGFkZGVkIChvciBmb3VuZClcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGFkZENoaWxkIChwVHJlZSwgcFBhdHRlcm4sIHBJbmRleClcblx0e1xuXHRcdGlmIChwSW5kZXggPiBwUGF0dGVybi5sZW5ndGgpXG5cdFx0XHRyZXR1cm4gcFRyZWU7XG5cdFx0XG5cdFx0aWYgKCFwVHJlZS5oYXNPd25Qcm9wZXJ0eShwUGF0dGVybltwSW5kZXhdKSlcblx0XHRcdHBUcmVlW3BQYXR0ZXJuW3BJbmRleF1dID0ge307XG5cdFx0XG5cdFx0cmV0dXJuIHBUcmVlW3BQYXR0ZXJuW3BJbmRleF1dO1xuXHR9XG5cdFxuXHQvKiogQWRkIGEgUGF0dGVybiB0byB0aGUgUGFyc2UgVHJlZVxuXHQgKiBAbWV0aG9kIGFkZFBhdHRlcm5cblx0ICogQHBhcmFtIHtPYmplY3R9IHBUcmVlIC0gQSBub2RlIG9uIHRoZSBwYXJzZSB0cmVlIHRvIHB1c2ggdGhlIGNoYXJhY3RlcnMgaW50b1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gcFBhdHRlcm4gLSBUaGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgdHJlZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gcEluZGV4IC0gY2FsbGJhY2sgZnVuY3Rpb25cblx0ICogQHJldHVybiB7Ym9vbH0gVHJ1ZSBpZiBhZGRpbmcgdGhlIHBhdHRlcm4gd2FzIHN1Y2Nlc3NmdWxcblx0ICovXG5cdGFkZFBhdHRlcm4gKHBQYXR0ZXJuU3RhcnQsIHBQYXR0ZXJuRW5kLCBwUGFyc2VyKVxuXHR7XG5cdFx0aWYgKHBQYXR0ZXJuU3RhcnQubGVuZ3RoIDwgMSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdGxldCB0bXBMZWFmID0gdGhpcy5QYXJzZVRyZWU7XG5cblx0XHQvLyBBZGQgdGhlIHRyZWUgb2YgbGVhdmVzIGl0ZXJhdGl2ZWx5XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwUGF0dGVyblN0YXJ0Lmxlbmd0aDsgaSsrKVxuXHRcdFx0dG1wTGVhZiA9IHRoaXMuYWRkQ2hpbGQodG1wTGVhZiwgcFBhdHRlcm5TdGFydCwgaSk7XG5cblx0XHR0bXBMZWFmLlBhdHRlcm5TdGFydCA9IHBQYXR0ZXJuU3RhcnQ7XG5cdFx0dG1wTGVhZi5QYXR0ZXJuRW5kID0gKCh0eXBlb2YocFBhdHRlcm5FbmQpID09PSAnc3RyaW5nJykgJiYgKHBQYXR0ZXJuRW5kLmxlbmd0aCA+IDApKSA/IHBQYXR0ZXJuRW5kIDogcFBhdHRlcm5TdGFydDtcblx0XHR0bXBMZWFmLlBhcnNlID0gKHR5cGVvZihwUGFyc2VyKSA9PT0gJ2Z1bmN0aW9uJykgPyBwUGFyc2VyIDogXG5cdFx0XHRcdFx0XHQodHlwZW9mKHBQYXJzZXIpID09PSAnc3RyaW5nJykgPyAoKSA9PiB7IHJldHVybiBwUGFyc2VyOyB9IDpcblx0XHRcdFx0XHRcdChwRGF0YSkgPT4geyByZXR1cm4gcERhdGE7IH07XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFdvcmRUcmVlO1xuIl19
|
|
302
|
+
// Add the tree of leaves iteratively
|
|
303
|
+
for (var i = 0; i < pPatternStart.length; i++) tmpLeaf = this.addChild(tmpLeaf, pPatternStart, i);
|
|
304
|
+
tmpLeaf.PatternStart = pPatternStart;
|
|
305
|
+
tmpLeaf.PatternEnd = typeof pPatternEnd === 'string' && pPatternEnd.length > 0 ? pPatternEnd : pPatternStart;
|
|
306
|
+
tmpLeaf.Parse = typeof pParser === 'function' ? pParser : typeof pParser === 'string' ? () => {
|
|
307
|
+
return pParser;
|
|
308
|
+
} : pData => {
|
|
309
|
+
return pData;
|
|
310
|
+
};
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
module.exports = WordTree;
|
|
315
|
+
}, {}]
|
|
316
|
+
}, {}, [1])(1);
|
|
317
|
+
});
|