notations 0.0.48 → 0.0.51
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/lib/cjs/beats.d.ts +36 -71
- package/lib/cjs/beats.js +225 -432
- package/lib/cjs/beats.js.map +1 -1
- package/lib/cjs/beatutils.d.ts +3 -0
- package/lib/cjs/beatutils.js +64 -0
- package/lib/cjs/beatutils.js.map +1 -0
- package/lib/cjs/beatview.d.ts +18 -0
- package/lib/cjs/beatview.js +62 -0
- package/lib/cjs/beatview.js.map +1 -0
- package/lib/cjs/carnatic/LineView.d.ts +2 -7
- package/lib/cjs/carnatic/LineView.js +13 -31
- package/lib/cjs/carnatic/LineView.js.map +1 -1
- package/lib/cjs/carnatic/NotationView.d.ts +9 -7
- package/lib/cjs/carnatic/NotationView.js +90 -153
- package/lib/cjs/carnatic/NotationView.js.map +1 -1
- package/lib/cjs/carnatic/atomviews.js +149 -287
- package/lib/cjs/carnatic/atomviews.js.map +1 -1
- package/lib/cjs/carnatic/beatviews.d.ts +18 -10
- package/lib/cjs/carnatic/beatviews.js +59 -91
- package/lib/cjs/carnatic/beatviews.js.map +1 -1
- package/lib/cjs/carnatic/embelishments.d.ts +1 -1
- package/lib/cjs/carnatic/embelishments.js +189 -283
- package/lib/cjs/carnatic/embelishments.js.map +1 -1
- package/lib/cjs/carnatic/gamakas.js +15 -47
- package/lib/cjs/carnatic/gamakas.js.map +1 -1
- package/lib/cjs/commands.js +111 -271
- package/lib/cjs/commands.js.map +1 -1
- package/lib/cjs/core.d.ts +6 -1
- package/lib/cjs/core.js +288 -493
- package/lib/cjs/core.js.map +1 -1
- package/lib/cjs/cycle.js +175 -367
- package/lib/cjs/cycle.js.map +1 -1
- package/lib/cjs/entity.js +48 -102
- package/lib/cjs/entity.js.map +1 -1
- package/lib/cjs/grids.d.ts +124 -1
- package/lib/cjs/grids.js +546 -6
- package/lib/cjs/grids.js.map +1 -1
- package/lib/cjs/iterators.js +96 -234
- package/lib/cjs/iterators.js.map +1 -1
- package/lib/cjs/layouts.d.ts +1 -1
- package/lib/cjs/layouts.js +62 -98
- package/lib/cjs/layouts.js.map +1 -1
- package/lib/cjs/loader.d.ts +2 -2
- package/lib/cjs/loader.js +23 -123
- package/lib/cjs/loader.js.map +1 -1
- package/lib/cjs/notation.d.ts +0 -3
- package/lib/cjs/notation.js +139 -241
- package/lib/cjs/notation.js.map +1 -1
- package/lib/cjs/parser.d.ts +2 -0
- package/lib/cjs/parser.js +222 -219
- package/lib/cjs/parser.js.map +1 -1
- package/lib/cjs/shapes.js +149 -283
- package/lib/cjs/shapes.js.map +1 -1
- package/lib/cjs/utils.d.ts +8 -0
- package/lib/cjs/utils.js +60 -55
- package/lib/cjs/utils.js.map +1 -1
- package/lib/esm/beats.d.ts +36 -71
- package/lib/esm/beats.js +218 -430
- package/lib/esm/beats.js.map +1 -1
- package/lib/esm/beatutils.d.ts +3 -0
- package/lib/esm/beatutils.js +37 -0
- package/lib/esm/beatutils.js.map +1 -0
- package/lib/esm/beatview.d.ts +18 -0
- package/lib/esm/beatview.js +35 -0
- package/lib/esm/beatview.js.map +1 -0
- package/lib/esm/carnatic/LineView.d.ts +2 -7
- package/lib/esm/carnatic/LineView.js +12 -31
- package/lib/esm/carnatic/LineView.js.map +1 -1
- package/lib/esm/carnatic/NotationView.d.ts +9 -7
- package/lib/esm/carnatic/NotationView.js +88 -152
- package/lib/esm/carnatic/NotationView.js.map +1 -1
- package/lib/esm/carnatic/atomviews.js +144 -284
- package/lib/esm/carnatic/atomviews.js.map +1 -1
- package/lib/esm/carnatic/beatviews.d.ts +18 -10
- package/lib/esm/carnatic/beatviews.js +53 -87
- package/lib/esm/carnatic/beatviews.js.map +1 -1
- package/lib/esm/carnatic/embelishments.d.ts +1 -1
- package/lib/esm/carnatic/embelishments.js +187 -296
- package/lib/esm/carnatic/embelishments.js.map +1 -1
- package/lib/esm/carnatic/gamakas.js +14 -48
- package/lib/esm/carnatic/gamakas.js.map +1 -1
- package/lib/esm/commands.js +100 -271
- package/lib/esm/commands.js.map +1 -1
- package/lib/esm/core.d.ts +6 -1
- package/lib/esm/core.js +286 -502
- package/lib/esm/core.js.map +1 -1
- package/lib/esm/cycle.js +172 -367
- package/lib/esm/cycle.js.map +1 -1
- package/lib/esm/entity.js +48 -104
- package/lib/esm/entity.js.map +1 -1
- package/lib/esm/grids.d.ts +124 -1
- package/lib/esm/grids.js +515 -5
- package/lib/esm/grids.js.map +1 -1
- package/lib/esm/iterators.js +93 -235
- package/lib/esm/iterators.js.map +1 -1
- package/lib/esm/layouts.d.ts +1 -1
- package/lib/esm/layouts.js +60 -97
- package/lib/esm/layouts.js.map +1 -1
- package/lib/esm/loader.d.ts +2 -2
- package/lib/esm/loader.js +20 -120
- package/lib/esm/loader.js.map +1 -1
- package/lib/esm/notation.d.ts +0 -3
- package/lib/esm/notation.js +135 -242
- package/lib/esm/notation.js.map +1 -1
- package/lib/esm/parser.d.ts +2 -0
- package/lib/esm/parser.js +216 -214
- package/lib/esm/parser.js.map +1 -1
- package/lib/esm/shapes.js +148 -288
- package/lib/esm/shapes.js.map +1 -1
- package/lib/esm/utils.d.ts +8 -0
- package/lib/esm/utils.js +55 -51
- package/lib/esm/utils.js.map +1 -1
- package/package.json +2 -1
|
@@ -22,78 +22,45 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
26
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
27
|
-
if (!m) return o;
|
|
28
|
-
var i = m.call(o), r, ar = [], e;
|
|
29
|
-
try {
|
|
30
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
31
|
-
}
|
|
32
|
-
catch (error) { e = { error: error }; }
|
|
33
|
-
finally {
|
|
34
|
-
try {
|
|
35
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
36
|
-
}
|
|
37
|
-
finally { if (e) throw e.error; }
|
|
38
|
-
}
|
|
39
|
-
return ar;
|
|
40
|
-
};
|
|
41
|
-
var __values = (this && this.__values) || function(o) {
|
|
42
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
43
|
-
if (m) return m.call(o);
|
|
44
|
-
if (o && typeof o.length === "number") return {
|
|
45
|
-
next: function () {
|
|
46
|
-
if (o && i >= o.length) o = void 0;
|
|
47
|
-
return { value: o && o[i++], done: !o };
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
51
|
-
};
|
|
52
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
26
|
exports.NotationView = void 0;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
27
|
+
const TSU = __importStar(require("@panyam/tsutils"));
|
|
28
|
+
const LineView_1 = require("./LineView");
|
|
29
|
+
const beatviews_1 = require("./beatviews");
|
|
30
|
+
class NotationView {
|
|
31
|
+
constructor(rootElement, config) {
|
|
58
32
|
this.rootElement = rootElement;
|
|
59
33
|
this.config = config;
|
|
60
34
|
this.lineViews = [];
|
|
61
|
-
this.beatsByLineRole = new Map();
|
|
62
|
-
this.beatLayouts = new Map();
|
|
63
35
|
this.currentSVGElement = null;
|
|
64
36
|
this.beatViews = new Map();
|
|
37
|
+
this.markerViews = new Map();
|
|
65
38
|
this.loadChildViews();
|
|
66
39
|
}
|
|
67
|
-
|
|
68
|
-
this.
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.beatViews.set(beat.uuid, curr);
|
|
76
|
-
}
|
|
77
|
-
return curr;
|
|
78
|
-
};
|
|
79
|
-
NotationView.prototype.loadChildViews = function () {
|
|
40
|
+
get beatLayout() {
|
|
41
|
+
return this._beatLayout;
|
|
42
|
+
}
|
|
43
|
+
set beatLayout(beatLayout) {
|
|
44
|
+
this._beatLayout = beatLayout;
|
|
45
|
+
beatLayout.gridLayoutGroup.getCellView = (cell) => this.viewForBeat(cell);
|
|
46
|
+
}
|
|
47
|
+
loadChildViews() {
|
|
80
48
|
this.tableElement = TSU.DOM.createNode("table", {
|
|
81
49
|
parent: this.rootElement,
|
|
82
50
|
attrs: {
|
|
83
51
|
class: "notationsContentRootTable",
|
|
84
52
|
},
|
|
85
53
|
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
var tr = TSU.DOM.createNode("tr", {
|
|
54
|
+
}
|
|
55
|
+
addNewRow(id, prefix, withAnnotation = true) {
|
|
56
|
+
const tr = TSU.DOM.createNode("tr", {
|
|
90
57
|
parent: this.tableElement,
|
|
91
58
|
attrs: {
|
|
92
59
|
class: prefix + "Row",
|
|
93
60
|
id: prefix + "Row" + id,
|
|
94
61
|
},
|
|
95
62
|
});
|
|
96
|
-
|
|
63
|
+
let td1 = null;
|
|
97
64
|
if (withAnnotation) {
|
|
98
65
|
td1 = TSU.DOM.createNode("td", {
|
|
99
66
|
parent: tr,
|
|
@@ -103,7 +70,7 @@ var NotationView = (function () {
|
|
|
103
70
|
},
|
|
104
71
|
});
|
|
105
72
|
}
|
|
106
|
-
|
|
73
|
+
const td2 = TSU.DOM.createNode("td", {
|
|
107
74
|
parent: tr,
|
|
108
75
|
attrs: {
|
|
109
76
|
class: prefix + "ContentCell",
|
|
@@ -112,9 +79,9 @@ var NotationView = (function () {
|
|
|
112
79
|
},
|
|
113
80
|
});
|
|
114
81
|
return [td1, td2];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
82
|
+
}
|
|
83
|
+
newLineRoot(parent, line) {
|
|
84
|
+
const [td1, td2] = this.addNewRow(line.uuid + "", "line");
|
|
118
85
|
if (line.marginText) {
|
|
119
86
|
td1.innerHTML = line.marginText;
|
|
120
87
|
}
|
|
@@ -125,133 +92,103 @@ var NotationView = (function () {
|
|
|
125
92
|
class: "lineRootSVG",
|
|
126
93
|
},
|
|
127
94
|
});
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
95
|
+
}
|
|
96
|
+
ensureLineView(line) {
|
|
97
|
+
let lineView = this.getLineView(line);
|
|
131
98
|
if (lineView == null) {
|
|
132
|
-
|
|
133
|
-
|
|
99
|
+
const layoutParams = line.layoutParams || null;
|
|
100
|
+
const svgElem = this.newLineRoot(this.tableElement, line);
|
|
134
101
|
lineView = new LineView_1.LineView(svgElem, line, {
|
|
135
102
|
layoutParams: layoutParams,
|
|
136
103
|
});
|
|
137
104
|
if (!line.isEmpty) {
|
|
138
105
|
TSU.assert(layoutParams != null, "Layout params for a non empty line *should* exist");
|
|
139
|
-
|
|
140
|
-
lineView.beatLayout = beatLayout;
|
|
106
|
+
lineView.gridModel = this.beatLayout.getGridModelForLine(line.uuid);
|
|
141
107
|
}
|
|
142
|
-
lineView.beatsByLineRole = this.beatsByLineRole.get(line.uuid);
|
|
143
108
|
this.lineViews.push(lineView);
|
|
144
109
|
}
|
|
145
110
|
return lineView;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return this.lineViews.find(
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
enumerable: false,
|
|
155
|
-
configurable: true
|
|
156
|
-
});
|
|
157
|
-
NotationView.prototype.clear = function () {
|
|
111
|
+
}
|
|
112
|
+
getLineView(line) {
|
|
113
|
+
return this.lineViews.find((l) => l.line == line) || null;
|
|
114
|
+
}
|
|
115
|
+
get currentLineView() {
|
|
116
|
+
return this.lineViews[this.lineViews.length - 1];
|
|
117
|
+
}
|
|
118
|
+
clear() {
|
|
158
119
|
this.lineViews = [];
|
|
159
|
-
this.beatsByLineRole = new Map();
|
|
160
|
-
this.beatLayouts = new Map();
|
|
161
120
|
this.currentSVGElement = null;
|
|
162
121
|
this.tableElement.innerHTML = "";
|
|
163
122
|
this.beatViews = new Map();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
var block = _f.value;
|
|
172
|
-
if (block.type == "RawBlock") {
|
|
173
|
-
this.renderBlock(block);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
lines.push(block);
|
|
177
|
-
var lineView = this.renderLine(block);
|
|
178
|
-
lineViews.push(lineView);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
183
|
-
finally {
|
|
184
|
-
try {
|
|
185
|
-
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
186
|
-
}
|
|
187
|
-
finally { if (e_1) throw e_1.error; }
|
|
188
|
-
}
|
|
189
|
-
try {
|
|
190
|
-
for (var _g = __values(this.beatLayouts.values()), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
191
|
-
var bl = _h.value;
|
|
192
|
-
bl.evalColumnSizes(this);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
196
|
-
finally {
|
|
197
|
-
try {
|
|
198
|
-
if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
|
|
199
|
-
}
|
|
200
|
-
finally { if (e_2) throw e_2.error; }
|
|
201
|
-
}
|
|
202
|
-
try {
|
|
203
|
-
for (var _j = __values(this.beatViews.values()), _k = _j.next(); !_k.done; _k = _j.next()) {
|
|
204
|
-
var beatView = _k.value;
|
|
205
|
-
beatView.refreshLayout();
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
209
|
-
finally {
|
|
210
|
-
try {
|
|
211
|
-
if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
|
|
123
|
+
}
|
|
124
|
+
refreshLayout() {
|
|
125
|
+
const lines = [];
|
|
126
|
+
const lineViews = [];
|
|
127
|
+
for (const block of this.notation.blocks) {
|
|
128
|
+
if (block.type == "RawBlock") {
|
|
129
|
+
this.renderBlock(block);
|
|
212
130
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
var lineView = lineViews_1_1.value;
|
|
218
|
-
lineView.wrapToSize();
|
|
131
|
+
else {
|
|
132
|
+
lines.push(block);
|
|
133
|
+
const lineView = this.ensureLineView(block);
|
|
134
|
+
lineViews.push(lineView);
|
|
219
135
|
}
|
|
220
136
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (lineViews_1_1 && !lineViews_1_1.done && (_d = lineViews_1.return)) _d.call(lineViews_1);
|
|
225
|
-
}
|
|
226
|
-
finally { if (e_4) throw e_4.error; }
|
|
137
|
+
const now = performance.now();
|
|
138
|
+
for (const lineView of lineViews) {
|
|
139
|
+
lineView.gridModel.lastUpdatedAt = now;
|
|
227
140
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
if (!line.isEmpty) {
|
|
232
|
-
lineView.beatLayout.layoutBeatsForLine(line, lineView.beatsByLineRole, this);
|
|
141
|
+
this.beatLayout.gridLayoutGroup.refreshLayout();
|
|
142
|
+
for (const lineView of lineViews) {
|
|
143
|
+
lineView.wrapToSize();
|
|
233
144
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
var _a = __read(this.addNewRow(raw.uuid + "", "rawBlock", false), 2), td2 = _a[1];
|
|
145
|
+
}
|
|
146
|
+
renderBlock(raw) {
|
|
147
|
+
const [, td2] = this.addNewRow(raw.uuid + "", "rawBlock", false);
|
|
238
148
|
if (raw.contentType == "metadata") {
|
|
239
|
-
|
|
149
|
+
const meta = this.notation.metadata.get(raw.content);
|
|
240
150
|
if (meta) {
|
|
241
151
|
if (meta.key.toLowerCase().indexOf(":") < 0) {
|
|
242
|
-
|
|
243
|
-
|
|
152
|
+
const div = td2.appendChild(TSU.DOM.createNode("div"));
|
|
153
|
+
const html = `<span class = "${meta.key.toLowerCase()}"><strong>${meta.key}</strong>: ${meta.value}</span>`;
|
|
244
154
|
div.innerHTML = html;
|
|
245
155
|
}
|
|
246
156
|
}
|
|
247
157
|
}
|
|
248
158
|
else {
|
|
249
|
-
|
|
159
|
+
const div = td2.appendChild(TSU.DOM.createNode("div"));
|
|
250
160
|
div.innerHTML = this.markdownParser(raw.content.trim());
|
|
251
161
|
}
|
|
252
162
|
this.currentSVGElement = null;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
|
|
163
|
+
}
|
|
164
|
+
viewForBeat(cell) {
|
|
165
|
+
if (cell.colIndex % 3 == 1) {
|
|
166
|
+
const beat = cell.value;
|
|
167
|
+
let curr = this.beatViews.get(beat.uuid) || null;
|
|
168
|
+
if (curr == null) {
|
|
169
|
+
const line = beat.role.line;
|
|
170
|
+
const lineView = this.ensureLineView(line);
|
|
171
|
+
const lp = line.layoutParams;
|
|
172
|
+
curr = new beatviews_1.BeatView(cell, beat, lineView.gElem, lp.cycle);
|
|
173
|
+
this.beatViews.set(beat.uuid, curr);
|
|
174
|
+
}
|
|
175
|
+
return curr;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const marker = cell.value;
|
|
179
|
+
const beat = marker.beat;
|
|
180
|
+
let curr = this.markerViews.get("pre:" + beat.uuid) || null;
|
|
181
|
+
if (curr == null) {
|
|
182
|
+
const line = beat.role.line;
|
|
183
|
+
const lineView = this.ensureLineView(line);
|
|
184
|
+
const lp = line.layoutParams;
|
|
185
|
+
const isPreMarker = cell.colIndex % 3 == 0;
|
|
186
|
+
curr = new beatviews_1.MarkerView(cell, beat, marker.markers, isPreMarker, lineView.gElem);
|
|
187
|
+
this.markerViews.set("pre:" + beat.uuid, curr);
|
|
188
|
+
}
|
|
189
|
+
return curr;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
256
193
|
exports.NotationView = NotationView;
|
|
257
194
|
//# sourceMappingURL=NotationView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotationView.js","sourceRoot":"","sources":["../../../src/carnatic/NotationView.ts"],"names":[],"mappings":"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","sourcesContent":["import * as TSU from \"@panyam/tsutils\";\nimport { LineView } from \"./LineView\";\nimport { Notation, RawBlock } from \"../notation\";\nimport { Beat, BeatLayout, BeatView } from \"../beats\";\nimport { Line } from \"../core\";\n\nexport class NotationView {\n headerElement: HTMLDivElement;\n notation: Notation;\n lineViews: LineView[] = [];\n // Mapping from line id -> list of beats in each of its roles\n beatsByLineRole = new Map<number, Beat[][]>();\n beatLayouts = new Map<number, BeatLayout>();\n currentSVGElement: SVGSVGElement | null = null;\n tableElement: HTMLTableElement;\n beatViews = new Map<number, BeatView>();\n markdownParser: (contents: string) => string;\n\n constructor(public readonly rootElement: HTMLElement, public readonly config?: any) {\n this.loadChildViews();\n }\n\n refresh(): void {\n this.beatViews = new Map<number, BeatView>();\n }\n\n viewForBeat(beat: Beat): BeatView {\n let curr = this.beatViews.get(beat.uuid) || null;\n if (curr == null) {\n // how to get the bar and beat index for a given beat in a given row?\n const lineView = this.ensureLineView(beat.role.line);\n curr = lineView.viewForBeat(beat);\n this.beatViews.set(beat.uuid, curr);\n }\n return curr;\n }\n\n loadChildViews(): void {\n this.tableElement = TSU.DOM.createNode(\"table\", {\n parent: this.rootElement,\n attrs: {\n class: \"notationsContentRootTable\",\n },\n }) as HTMLTableElement;\n }\n\n public addNewRow(id: string, prefix: string, withAnnotation = true): [HTMLElement, HTMLElement] {\n const tr = TSU.DOM.createNode(\"tr\", {\n parent: this.tableElement, // parent,\n attrs: {\n class: prefix + \"Row\",\n id: prefix + \"Row\" + id,\n },\n });\n let td1: HTMLElement | null = null;\n if (withAnnotation) {\n td1 = TSU.DOM.createNode(\"td\", {\n parent: tr,\n attrs: {\n class: prefix + \"AnnotationCell\",\n id: prefix + \"Annotation\" + id,\n },\n }) as HTMLElement;\n }\n const td2 = TSU.DOM.createNode(\"td\", {\n parent: tr,\n attrs: {\n class: prefix + \"ContentCell\",\n id: prefix + \"Content\" + id,\n colspan: withAnnotation ? 1 : 2,\n },\n }) as HTMLElement;\n return [td1!, td2];\n }\n\n public newLineRoot(parent: Element, line: Line): SVGSVGElement {\n const [td1, td2] = this.addNewRow(line.uuid + \"\", \"line\");\n // Hacky solution to \"line headings\"\n if (line.marginText) {\n td1.innerHTML = line.marginText;\n }\n return TSU.DOM.createSVGNode(\"svg\", {\n parent: td2, // parent\n attrs: {\n style: \"margin-bottom: 10px\",\n class: \"lineRootSVG\",\n },\n }) as SVGSVGElement;\n }\n\n ensureLineView(line: Line): LineView {\n let lineView = this.getLineView(line);\n if (lineView == null) {\n const layoutParams = this.notation.layoutParamsForLine(line) || null;\n const svgElem = this.newLineRoot(this.tableElement, line);\n lineView = new LineView(svgElem, line, {\n layoutParams: layoutParams,\n } as any);\n if (!line.isEmpty) {\n // Probably because this is an empty line and AddAtoms was not called\n TSU.assert(layoutParams != null, \"Layout params for a non empty line *should* exist\");\n const beatLayout = this.beatLayouts.get(layoutParams.uuid)!;\n lineView.beatLayout = beatLayout;\n }\n lineView.beatsByLineRole = this.beatsByLineRole.get(line.uuid)!;\n this.lineViews.push(lineView);\n }\n return lineView;\n }\n\n getLineView(line: Line): TSU.Nullable<LineView> {\n return this.lineViews.find((l) => l.line == line) || null;\n }\n\n get currentLineView(): LineView {\n return this.lineViews[this.lineViews.length - 1];\n }\n\n clear(): void {\n this.lineViews = [];\n // Mapping from line id -> list of beats in each of its roles\n this.beatsByLineRole = new Map<number, Beat[][]>();\n this.beatLayouts = new Map<number, BeatLayout>();\n this.currentSVGElement = null;\n this.tableElement.innerHTML = \"\";\n this.beatViews = new Map<number, BeatView>();\n }\n\n /**\n * Layout all the blocks in the Notation along with their corresponding blocks.\n * Key thing is here is an opportunity to perform any batch rendering as needed.\n */\n refreshLayout(): void {\n const lines = [] as Line[];\n const lineViews = [] as LineView[];\n for (const block of this.notation.blocks) {\n if (block.type == \"RawBlock\") {\n // Add the markdown here\n this.renderBlock(block as RawBlock);\n } else {\n lines.push(block as Line);\n const lineView = this.renderLine(block as Line);\n lineViews.push(lineView);\n }\n }\n\n // Eval column sizes all beat layouts\n for (const bl of this.beatLayouts.values()) {\n bl.evalColumnSizes(this);\n }\n\n // now that all spacing has been calculated\n // go through all\n for (const beatView of this.beatViews.values()) {\n beatView.refreshLayout();\n }\n\n // Set line view preferred sizes\n for (const lineView of lineViews) {\n lineView.wrapToSize();\n }\n }\n\n renderLine(line: Line): LineView {\n const lineView = this.ensureLineView(line);\n // Layout the \"rows\" for this line - x has already been set by the\n // previous column spacing step\n if (!line.isEmpty) {\n lineView.beatLayout.layoutBeatsForLine(line, lineView.beatsByLineRole, this);\n }\n return lineView;\n }\n\n renderBlock(raw: RawBlock): void {\n const [, td2] = this.addNewRow(raw.uuid + \"\", \"rawBlock\", false);\n if (raw.contentType == \"metadata\") {\n // we have a metadata block\n const meta = this.notation.metadata.get(raw.content);\n if (meta) {\n // For now ignore metadata with \":\" in the key\n if (meta.key.toLowerCase().indexOf(\":\") < 0) {\n const div = td2.appendChild(TSU.DOM.createNode(\"div\"));\n const html = `<span class = \"${meta.key.toLowerCase()}\"><strong>${meta.key}</strong>: ${meta.value}</span>`;\n div.innerHTML = html;\n }\n }\n } else {\n const div = td2.appendChild(TSU.DOM.createNode(\"div\"));\n div.innerHTML = this.markdownParser(raw.content.trim());\n }\n this.currentSVGElement = null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NotationView.js","sourceRoot":"","sources":["../../../src/carnatic/NotationView.ts"],"names":[],"mappings":"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","sourcesContent":["import * as TSU from \"@panyam/tsutils\";\nimport { LineView } from \"./LineView\";\nimport { Notation, RawBlock } from \"../notation\";\nimport { Beat, GlobalBeatLayout } from \"../beats\";\nimport { GridCell, GridCellView } from \"../grids\";\nimport { Line } from \"../core\";\nimport { BeatView, MarkerView } from \"./beatviews\";\n\nexport class NotationView {\n headerElement: HTMLDivElement;\n notation: Notation;\n lineViews: LineView[] = [];\n // Mapping from line id -> list of beats in each of its roles\n currentSVGElement: SVGSVGElement | null = null;\n tableElement: HTMLTableElement;\n markdownParser: (contents: string) => string;\n _beatLayout: GlobalBeatLayout;\n\n constructor(public readonly rootElement: HTMLElement, public readonly config?: any) {\n this.loadChildViews();\n }\n\n get beatLayout(): GlobalBeatLayout {\n return this._beatLayout;\n }\n\n set beatLayout(beatLayout: GlobalBeatLayout) {\n this._beatLayout = beatLayout;\n beatLayout.gridLayoutGroup.getCellView = (cell) => this.viewForBeat(cell);\n }\n\n loadChildViews(): void {\n this.tableElement = TSU.DOM.createNode(\"table\", {\n parent: this.rootElement,\n attrs: {\n class: \"notationsContentRootTable\",\n },\n }) as HTMLTableElement;\n }\n\n public addNewRow(id: string, prefix: string, withAnnotation = true): [HTMLElement, HTMLElement] {\n const tr = TSU.DOM.createNode(\"tr\", {\n parent: this.tableElement, // parent,\n attrs: {\n class: prefix + \"Row\",\n id: prefix + \"Row\" + id,\n },\n });\n let td1: HTMLElement | null = null;\n if (withAnnotation) {\n td1 = TSU.DOM.createNode(\"td\", {\n parent: tr,\n attrs: {\n class: prefix + \"AnnotationCell\",\n id: prefix + \"Annotation\" + id,\n },\n }) as HTMLElement;\n }\n const td2 = TSU.DOM.createNode(\"td\", {\n parent: tr,\n attrs: {\n class: prefix + \"ContentCell\",\n id: prefix + \"Content\" + id,\n colspan: withAnnotation ? 1 : 2,\n },\n }) as HTMLElement;\n return [td1!, td2];\n }\n\n public newLineRoot(parent: Element, line: Line): SVGSVGElement {\n const [td1, td2] = this.addNewRow(line.uuid + \"\", \"line\");\n // Hacky solution to \"line headings\"\n if (line.marginText) {\n td1.innerHTML = line.marginText;\n }\n return TSU.DOM.createSVGNode(\"svg\", {\n parent: td2, // parent\n attrs: {\n style: \"margin-bottom: 10px\",\n class: \"lineRootSVG\",\n },\n }) as SVGSVGElement;\n }\n\n ensureLineView(line: Line): LineView {\n let lineView = this.getLineView(line);\n if (lineView == null) {\n const layoutParams = line.layoutParams || null;\n const svgElem = this.newLineRoot(this.tableElement, line);\n lineView = new LineView(svgElem, line, {\n layoutParams: layoutParams,\n } as any);\n if (!line.isEmpty) {\n // Probably because this is an empty line and AddAtoms was not called\n TSU.assert(layoutParams != null, \"Layout params for a non empty line *should* exist\");\n lineView.gridModel = this.beatLayout!.getGridModelForLine(line.uuid);\n }\n this.lineViews.push(lineView);\n }\n return lineView;\n }\n\n getLineView(line: Line): TSU.Nullable<LineView> {\n return this.lineViews.find((l) => l.line == line) || null;\n }\n\n get currentLineView(): LineView {\n return this.lineViews[this.lineViews.length - 1];\n }\n\n clear(): void {\n this.lineViews = [];\n // Mapping from line id -> list of beats in each of its roles\n this.currentSVGElement = null;\n this.tableElement.innerHTML = \"\";\n this.beatViews = new Map<number, BeatView>();\n }\n\n /**\n * Layout all the blocks in the Notation along with their corresponding blocks.\n * Key thing is here is an opportunity to perform any batch rendering as needed.\n */\n refreshLayout(): void {\n const lines = [] as Line[];\n const lineViews = [] as LineView[];\n for (const block of this.notation.blocks) {\n if (block.type == \"RawBlock\") {\n // Add the markdown here\n this.renderBlock(block as RawBlock);\n } else {\n lines.push(block as Line);\n const lineView = this.ensureLineView(block as Line);\n lineViews.push(lineView);\n }\n }\n\n const now = performance.now();\n for (const lineView of lineViews) {\n lineView.gridModel.lastUpdatedAt = now;\n }\n\n this.beatLayout.gridLayoutGroup.refreshLayout();\n\n for (const lineView of lineViews) {\n lineView.wrapToSize();\n }\n\n // now that all spacing has been calculated\n // go through all\n // for (const beatView of this.beatViews.values()) { beatView.refreshLayout(); }\n }\n\n renderBlock(raw: RawBlock): void {\n const [, td2] = this.addNewRow(raw.uuid + \"\", \"rawBlock\", false);\n if (raw.contentType == \"metadata\") {\n // we have a metadata block\n const meta = this.notation.metadata.get(raw.content);\n if (meta) {\n // For now ignore metadata with \":\" in the key\n if (meta.key.toLowerCase().indexOf(\":\") < 0) {\n const div = td2.appendChild(TSU.DOM.createNode(\"div\"));\n const html = `<span class = \"${meta.key.toLowerCase()}\"><strong>${meta.key}</strong>: ${meta.value}</span>`;\n div.innerHTML = html;\n }\n }\n } else {\n const div = td2.appendChild(TSU.DOM.createNode(\"div\"));\n div.innerHTML = this.markdownParser(raw.content.trim());\n }\n this.currentSVGElement = null;\n }\n\n beatViews = new Map<number, BeatView>();\n markerViews = new Map<string, MarkerView>();\n viewForBeat(cell: GridCell): GridCellView {\n if (cell.colIndex % 3 == 1) {\n // beat view needed\n const beat = cell.value;\n let curr = this.beatViews.get(beat.uuid) || null;\n if (curr == null) {\n const line = beat.role.line;\n // how to get the bar and beat index for a given beat in a given row?\n const lineView = this.ensureLineView(line);\n const lp = line.layoutParams;\n curr = new BeatView(cell, beat, lineView.gElem, lp.cycle);\n this.beatViews.set(beat.uuid, curr);\n }\n return curr;\n } else {\n // markers view\n const marker = cell.value;\n const beat = marker.beat as Beat;\n let curr = this.markerViews.get(\"pre:\" + beat.uuid) || null;\n if (curr == null) {\n const line = beat.role.line;\n const lineView = this.ensureLineView(line);\n const lp = line.layoutParams;\n const isPreMarker = cell.colIndex % 3 == 0;\n curr = new MarkerView(cell, beat, marker.markers, isPreMarker, lineView.gElem);\n this.markerViews.set(\"pre:\" + beat.uuid, curr);\n }\n return curr;\n }\n }\n}\n"]}
|