abcjs 6.4.1 → 6.4.3
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/LICENSE.md +1 -1
- package/RELEASE.md +46 -0
- package/dist/abcjs-basic-min.js +2 -2
- package/dist/abcjs-basic-min.js.LICENSE +1 -1
- package/dist/abcjs-basic.js +1271 -1179
- package/dist/abcjs-basic.js.map +1 -1
- package/dist/abcjs-plugin-min.js +2 -2
- package/dist/abcjs-plugin-min.js.LICENSE +1 -1
- package/index.js +1 -1
- package/license.js +1 -1
- package/package.json +1 -1
- package/plugin.js +1 -1
- package/src/api/abc_tunebook.js +1 -2
- package/src/api/abc_tunebook_svg.js +0 -1
- package/src/data/abc_tune.js +2 -0
- package/src/midi/abc_midi_create.js +22 -7
- package/src/parse/abc_common.js +3 -11
- package/src/parse/abc_parse.js +1 -1
- package/src/parse/abc_parse_directive.js +44 -3
- package/src/parse/abc_parse_header.js +6 -4
- package/src/parse/abc_parse_key_voice.js +10 -6
- package/src/parse/abc_parse_music.js +54 -22
- package/src/parse/tune-builder.js +675 -643
- package/src/synth/abc_midi_flattener.js +3 -1
- package/src/synth/abc_midi_sequencer.js +18 -3
- package/src/synth/chord-track.js +90 -18
- package/src/synth/create-synth-control.js +1 -2
- package/src/tablatures/abc_tablatures.js +184 -0
- package/src/tablatures/instruments/string-patterns.js +266 -268
- package/src/tablatures/instruments/string-tablature.js +38 -35
- package/src/tablatures/instruments/tab-note.js +186 -181
- package/src/tablatures/instruments/tab-notes.js +30 -35
- package/src/tablatures/instruments/tab-string.js +43 -25
- package/src/tablatures/render/tab-absolute-elements.js +303 -0
- package/src/tablatures/render/tab-renderer.js +244 -0
- package/src/test/abc_parser_lint.js +2 -3
- package/src/write/creation/abstract-engraver.js +1 -1
- package/src/write/creation/elements/tie-element.js +26 -0
- package/src/write/engraver-controller.js +1 -1
- package/src/write/layout/set-upper-and-lower-elements.js +8 -0
- package/test.js +1 -1
- package/types/index.d.ts +2 -2
- package/version.js +1 -1
- package/src/api/abc_tablatures.js +0 -184
- package/src/tablatures/instruments/tab-string-patterns.js +0 -23
- package/src/tablatures/tab-absolute-elements.js +0 -301
- package/src/tablatures/tab-common.js +0 -29
- package/src/tablatures/tab-renderer.js +0 -259
|
@@ -1,278 +1,275 @@
|
|
|
1
|
-
const {noteToMidi} = require('../../synth/note-to-midi');
|
|
1
|
+
const { noteToMidi } = require('../../synth/note-to-midi');
|
|
2
2
|
var TabNote = require('./tab-note');
|
|
3
|
-
var
|
|
3
|
+
var tabNotes = require('./tab-notes');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
function buildCapo(self) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
var capoTuning = null;
|
|
8
|
+
var tuning = self.tuning;
|
|
9
|
+
if (self.capo > 0) {
|
|
10
|
+
capoTuning = [];
|
|
11
|
+
for (var iii = 0; iii < tuning.length; iii++) {
|
|
12
|
+
var curNote = new TabNote(tuning[iii]);
|
|
13
|
+
for (var jjj = 0; jjj < self.capo; jjj++) {
|
|
14
|
+
curNote = curNote.nextNote();
|
|
15
|
+
}
|
|
16
|
+
capoTuning[iii] = curNote.emit();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return capoTuning;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
function buildPatterns(self) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return strings;
|
|
23
|
+
var strings = [];
|
|
24
|
+
var tuning = self.tuning;
|
|
25
|
+
if (self.capo > 0) {
|
|
26
|
+
tuning = self.capoTuning;
|
|
27
|
+
}
|
|
28
|
+
var pos = tuning.length - 1;
|
|
29
|
+
for (var iii = 0; iii < tuning.length; iii++) {
|
|
30
|
+
var nextNote = self.highestNote; // highest handled note
|
|
31
|
+
if (iii != tuning.length - 1) {
|
|
32
|
+
nextNote = tuning[iii + 1];
|
|
33
|
+
}
|
|
34
|
+
var stringNotes = tabNotes(tuning[iii], nextNote);
|
|
35
|
+
if (stringNotes.error) {
|
|
36
|
+
return stringNotes;
|
|
37
|
+
}
|
|
38
|
+
strings[pos--] = stringNotes;
|
|
39
|
+
}
|
|
40
|
+
return strings;
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
|
|
45
44
|
function buildSecond(first) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
var seconds = [];
|
|
46
|
+
seconds[0] = [];
|
|
47
|
+
var strings = first.strings;
|
|
48
|
+
for (var iii = 1; iii < strings.length; iii++) {
|
|
49
|
+
seconds[iii] = strings[iii - 1];
|
|
50
|
+
}
|
|
51
|
+
return seconds;
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
function sameString(self, chord) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
55
|
+
for (var jjjj = 0; jjjj < chord.length - 1; jjjj++) {
|
|
56
|
+
var curPos = chord[jjjj];
|
|
57
|
+
var nextPos = chord[jjjj + 1];
|
|
58
|
+
if (curPos.str == nextPos.str) {
|
|
59
|
+
// same String
|
|
60
|
+
// => change lower pos
|
|
61
|
+
if (curPos.str == self.strings.length - 1) {
|
|
62
|
+
// Invalid tab Chord position for instrument
|
|
63
|
+
curPos.num = "?";
|
|
64
|
+
nextPos.num = "?";
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// change lower pitch on lowest string
|
|
68
|
+
if (nextPos.num < curPos.num) {
|
|
69
|
+
nextPos.str++;
|
|
70
|
+
nextPos = noteToNumber(self,
|
|
71
|
+
nextPos.note,
|
|
72
|
+
nextPos.str,
|
|
73
|
+
self.secondPos,
|
|
74
|
+
self.strings[nextPos.str].length
|
|
75
|
+
);
|
|
76
|
+
} else {
|
|
77
|
+
curPos.str++;
|
|
78
|
+
curPos = noteToNumber(self,
|
|
79
|
+
curPos.note,
|
|
80
|
+
curPos.str,
|
|
81
|
+
self.secondPos,
|
|
82
|
+
self.strings[curPos.str].length
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
// update table
|
|
86
|
+
chord[jjjj] = curPos;
|
|
87
|
+
chord[jjjj + 1] = nextPos;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
function handleChordNotes(self, notes) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
94
|
+
var retNotes = [];
|
|
95
|
+
for (var iiii = 0; iiii < notes.length; iiii++) {
|
|
96
|
+
if (notes[iiii].endTie)
|
|
97
|
+
continue;
|
|
98
|
+
var note = new TabNote(notes[iiii].name, self.clefTranspose);
|
|
99
|
+
note.checkKeyAccidentals(self.accidentals, self.measureAccidentals)
|
|
100
|
+
var curPos = toNumber(self, note);
|
|
101
|
+
retNotes.push(curPos);
|
|
102
|
+
}
|
|
103
|
+
sameString(self, retNotes);
|
|
104
|
+
return retNotes;
|
|
106
105
|
}
|
|
107
106
|
|
|
108
|
-
function noteToNumber(self, note, stringNumber, secondPosition
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
107
|
+
function noteToNumber(self, note, stringNumber, secondPosition, firstSize) {
|
|
108
|
+
var strings = self.strings;
|
|
109
|
+
note.checkKeyAccidentals(self.accidentals, self.measureAccidentals);
|
|
110
|
+
if (secondPosition) {
|
|
111
|
+
strings = secondPosition;
|
|
112
|
+
}
|
|
113
|
+
var noteName = note.emitNoAccidentals();
|
|
114
|
+
var num = strings[stringNumber].indexOf(noteName);
|
|
115
|
+
var acc = note.acc;
|
|
116
|
+
if (num != -1) {
|
|
117
|
+
if (secondPosition) {
|
|
118
|
+
num += firstSize;
|
|
119
|
+
}
|
|
120
|
+
if ((note.isFlat || note.acc == -1) && (num == 0)) {
|
|
121
|
+
// flat on 0 pos => previous string 7th position
|
|
122
|
+
var noteEquiv = note.getAccidentalEquiv();
|
|
123
|
+
stringNumber++;
|
|
124
|
+
num = strings[stringNumber].indexOf(noteEquiv.emit());
|
|
125
|
+
acc = 0;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
num: (num + acc),
|
|
129
|
+
str: stringNumber,
|
|
130
|
+
note: note
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
function toNumber(self, note) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
137
|
+
if (note.isAltered || note.natural) {
|
|
138
|
+
var acc;
|
|
139
|
+
if (note.isFlat) {
|
|
140
|
+
if (note.isDouble)
|
|
141
|
+
acc = "__"
|
|
142
|
+
else
|
|
143
|
+
acc = "_"
|
|
144
|
+
} else if (note.isSharp) {
|
|
145
|
+
if (note.isDouble)
|
|
146
|
+
acc = "^^"
|
|
147
|
+
else
|
|
148
|
+
acc = "^"
|
|
149
|
+
} else if (note.natural)
|
|
150
|
+
acc = "="
|
|
151
|
+
self.measureAccidentals[note.name.toUpperCase()] = acc
|
|
152
|
+
}
|
|
153
|
+
for (var i = self.stringPitches.length - 1; i >= 0; i--) {
|
|
154
|
+
if (note.pitch + note.pitchAltered >= self.stringPitches[i]) {
|
|
155
|
+
var num = note.pitch + note.pitchAltered - self.stringPitches[i]
|
|
156
|
+
if (note.quarter === '^') num -= 0.5
|
|
157
|
+
else if (note.quarter === "v") num += 0.5
|
|
158
|
+
return {
|
|
159
|
+
num: Math.round(num),
|
|
160
|
+
str: self.stringPitches.length - 1 - i, // reverse the strings because string 0 is on the bottom
|
|
161
|
+
note: note
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
num: "?",
|
|
167
|
+
str: self.stringPitches.length - 1,
|
|
168
|
+
note: note,
|
|
169
|
+
};
|
|
171
170
|
}
|
|
172
171
|
|
|
173
172
|
StringPatterns.prototype.stringToPitch = function (stringNumber) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
173
|
+
var startingPitch = 5.3;
|
|
174
|
+
var bottom = this.strings.length - 1;
|
|
175
|
+
return startingPitch + ((bottom - stringNumber) * this.linePitch);
|
|
177
176
|
};
|
|
178
177
|
|
|
179
|
-
function invalidNumber(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
178
|
+
function invalidNumber(retNotes, note) {
|
|
179
|
+
var number = {
|
|
180
|
+
num: "?",
|
|
181
|
+
str: 0,
|
|
182
|
+
note: note
|
|
183
|
+
};
|
|
184
|
+
retNotes.push(number);
|
|
185
|
+
retNotes.error = note.emit() + ': unexpected note for instrument';
|
|
186
|
+
}
|
|
188
187
|
|
|
189
188
|
StringPatterns.prototype.notesToNumber = function (notes, graces) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
189
|
+
var note;
|
|
190
|
+
var number;
|
|
191
|
+
var error = null;
|
|
192
|
+
var retNotes = null;
|
|
193
|
+
if (notes) {
|
|
194
|
+
retNotes = [];
|
|
195
|
+
if (notes.length > 1) {
|
|
196
|
+
retNotes = handleChordNotes(this, notes);
|
|
197
|
+
if (retNotes.error) {
|
|
198
|
+
error = retNotes.error;
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
if (!notes[0].endTie) {
|
|
202
|
+
note = new TabNote(notes[0].name, this.clefTranspose);
|
|
203
|
+
note.checkKeyAccidentals(this.accidentals, this.measureAccidentals)
|
|
204
|
+
number = toNumber(this, note);
|
|
205
|
+
if (number) {
|
|
206
|
+
retNotes.push(number);
|
|
207
|
+
} else {
|
|
208
|
+
invalidNumber(retNotes, note);
|
|
209
|
+
error = retNotes.error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (error) return retNotes;
|
|
215
|
+
var retGraces = null;
|
|
216
|
+
if (graces) {
|
|
217
|
+
retGraces = [];
|
|
218
|
+
for (var iiii = 0; iiii < graces.length; iiii++) {
|
|
219
|
+
note = new TabNote(graces[iiii].name, this.clefTranspose);
|
|
220
|
+
note.checkKeyAccidentals(this.accidentals, this.measureAccidentals)
|
|
221
|
+
number = toNumber(this, note);
|
|
222
|
+
if (number) {
|
|
223
|
+
retGraces.push(number);
|
|
224
|
+
} else {
|
|
225
|
+
invalidNumber(retGraces, note);
|
|
226
|
+
error = retNotes.error;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return {
|
|
232
|
+
notes: retNotes,
|
|
233
|
+
graces: retGraces,
|
|
234
|
+
error: error
|
|
235
|
+
};
|
|
237
236
|
};
|
|
238
237
|
|
|
239
238
|
StringPatterns.prototype.toString = function () {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
239
|
+
var arr = []
|
|
240
|
+
for (var i = 0; i < this.tuning.length; i++) {
|
|
241
|
+
var str = this.tuning[i].replaceAll(',', '').replaceAll("'", '').toUpperCase();
|
|
242
|
+
if (str[0] === '_') str = str[1] + 'b '
|
|
243
|
+
else if (str[0] === '^') str = str[1] + "# "
|
|
244
|
+
arr.push(str)
|
|
245
|
+
}
|
|
246
|
+
return arr.join('');
|
|
248
247
|
};
|
|
249
248
|
|
|
250
249
|
StringPatterns.prototype.tabInfos = function (plugin) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
return '';
|
|
250
|
+
var name = plugin.params.label;
|
|
251
|
+
if (name) {
|
|
252
|
+
var tunePos = name.indexOf('%T');
|
|
253
|
+
var tuning = "";
|
|
254
|
+
if (tunePos != -1) {
|
|
255
|
+
tuning = this.toString();
|
|
256
|
+
if (plugin.capo > 0) {
|
|
257
|
+
tuning += ' capo:' + plugin.capo;
|
|
258
|
+
}
|
|
259
|
+
name = name.replace('%T', tuning);
|
|
260
|
+
}
|
|
261
|
+
return name;
|
|
262
|
+
}
|
|
263
|
+
return '';
|
|
266
264
|
};
|
|
267
265
|
|
|
268
266
|
// MAE 27 Nov 2023
|
|
269
267
|
StringPatterns.prototype.suppress = function (plugin) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
return false;
|
|
268
|
+
var suppress = plugin.params.suppress;
|
|
269
|
+
if (suppress) {
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
276
273
|
};
|
|
277
274
|
// MAE 27 Nov 2023 End
|
|
278
275
|
|
|
@@ -284,38 +281,39 @@ StringPatterns.prototype.suppress = function (plugin) {
|
|
|
284
281
|
* @param {*} highestNote
|
|
285
282
|
*/
|
|
286
283
|
function StringPatterns(plugin) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
284
|
+
//console.log("INIT StringPatterns constructor")
|
|
285
|
+
var tuning = plugin.tuning;
|
|
286
|
+
var capo = plugin.capo;
|
|
287
|
+
var highestNote = plugin.params.highestNote;
|
|
288
|
+
this.linePitch = plugin.linePitch;
|
|
289
|
+
this.highestNote = "a'";
|
|
290
|
+
if (highestNote) {
|
|
291
|
+
// override default
|
|
292
|
+
this.highestNote = highestNote;
|
|
293
|
+
}
|
|
294
|
+
this.measureAccidentals = {}
|
|
295
|
+
this.capo = 0;
|
|
296
|
+
if (capo) {
|
|
297
|
+
this.capo = parseInt(capo, 10);
|
|
298
|
+
}
|
|
299
|
+
this.transpose = plugin.transpose ? plugin.transpose : 0
|
|
300
|
+
this.tuning = tuning;
|
|
301
|
+
this.stringPitches = []
|
|
302
|
+
for (var i = 0; i < this.tuning.length; i++) {
|
|
303
|
+
var pitch = noteToMidi(this.tuning[i]) + this.capo
|
|
304
|
+
this.stringPitches.push(pitch)
|
|
305
|
+
}
|
|
306
|
+
if (this.capo > 0) {
|
|
307
|
+
this.capoTuning = buildCapo(this);
|
|
308
|
+
}
|
|
309
|
+
this.strings = buildPatterns(this);
|
|
310
|
+
if (this.strings.error) {
|
|
311
|
+
plugin.setError(this.strings.error);
|
|
312
|
+
plugin.inError = true;
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// second position pattern per string
|
|
316
|
+
this.secondPos = buildSecond(this);
|
|
319
317
|
}
|
|
320
318
|
|
|
321
319
|
|