File size: 3,034 Bytes
af6912c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
var Classes = function Classes(options) {
	this.shouldAddClasses = options.shouldAddClasses;
	this.reset();
}

Classes.prototype.reset = function () {
	this.lineNumber = null;
	this.voiceNumber = null;
	this.measureNumber = null;
	this.measureTotalPerLine = [];
	this.noteNumber = null;
}

Classes.prototype.incrLine = function () {
	if (this.lineNumber === null)
		this.lineNumber = 0;
	else
		this.lineNumber++;
	this.voiceNumber = null;
	this.measureNumber = null;
	this.noteNumber = null;
};

Classes.prototype.incrVoice = function () {
	if (this.voiceNumber === null)
		this.voiceNumber = 0;
	else
		this.voiceNumber++;
	this.measureNumber = null;
	this.noteNumber = null;
};

Classes.prototype.isInMeasure = function () {
	return this.measureNumber !== null;
};

Classes.prototype.newMeasure = function () {
	if (this.measureNumber)
		this.measureTotalPerLine[this.lineNumber] = this.measureNumber;
	this.measureNumber = null;
	this.noteNumber = null;
};

Classes.prototype.startMeasure = function () {
	this.measureNumber = 0;
	this.noteNumber = 0;
};

Classes.prototype.incrMeasure = function () {
	this.measureNumber++;
	this.noteNumber = 0;
};

Classes.prototype.incrNote = function () {
	this.noteNumber++;
};

Classes.prototype.measureTotal = function () {
	var total = 0;
	for (var i = 0; i < this.lineNumber; i++)
		total += this.measureTotalPerLine[i] ? this.measureTotalPerLine[i] : 0; // This can be null when non-music things are present.
	if (this.measureNumber)
		total += this.measureNumber;
	return total;
};

Classes.prototype.getCurrent = function (c) {
	return {
		line: this.lineNumber,
		measure: this.measureNumber,
		measureTotal: this.measureTotal(),
		voice: this.voiceNumber,
		note: this.noteNumber
	};
};

Classes.prototype.generate = function (c) {
	if (!this.shouldAddClasses)
		return "";
	var ret = [];
	if (c && c.length > 0) ret.push(c);
	if (c === "abcjs-tab-number") // TODO-PER-HACK! straighten out the tablature
		return ret.join(' ')
	if (c === "text instrument-name")
		return "abcjs-text abcjs-instrument-name"
	if (this.lineNumber !== null) ret.push("l" + this.lineNumber);
	if (this.measureNumber !== null) ret.push("m" + this.measureNumber);
	if (this.measureNumber !== null) ret.push("mm" + this.measureTotal()); // measureNumber is null between measures so this is still the test for measureTotal
	if (this.voiceNumber !== null) ret.push("v" + this.voiceNumber);
	if (c && (c.indexOf('note') >= 0 || c.indexOf('rest') >= 0 || c.indexOf('lyric') >= 0) && this.noteNumber !== null) ret.push("n" + this.noteNumber);
	// add a prefix to all classes that abcjs adds.
	if (ret.length > 0) {
		ret = ret.join(' '); // Some strings are compound classes - that is, specify more than one class in a string.
		ret = ret.split(' ');
		for (var i = 0; i < ret.length; i++) {
			if (ret[i].indexOf('abcjs-') !== 0 && ret[i].length > 0) // if the prefix doesn't already exist and the class is not blank.
				ret[i] = 'abcjs-' + ret[i];
		}
	}
	return ret.join(' ');
};


module.exports = Classes;