notations 0.0.69 → 0.0.70

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.
Files changed (63) hide show
  1. package/dist/notations.umd.js +17409 -23615
  2. package/dist/notations.umd.min.js +8 -3
  3. package/dist/notations.umd.min.js.LICENSE.txt +0 -14
  4. package/dist/notations.umd.min.js.map +1 -1
  5. package/lib/cjs/beats.d.ts +4 -0
  6. package/lib/cjs/beats.js +19 -2
  7. package/lib/cjs/beats.js.map +1 -1
  8. package/lib/cjs/block.d.ts +73 -0
  9. package/lib/cjs/block.js +247 -0
  10. package/lib/cjs/block.js.map +1 -0
  11. package/lib/cjs/carnatic/NotationView.d.ts +11 -4
  12. package/lib/cjs/carnatic/NotationView.js +26 -11
  13. package/lib/cjs/carnatic/NotationView.js.map +1 -1
  14. package/lib/cjs/commands.d.ts +25 -11
  15. package/lib/cjs/commands.js +87 -34
  16. package/lib/cjs/commands.js.map +1 -1
  17. package/lib/cjs/entity.d.ts +3 -7
  18. package/lib/cjs/entity.js +7 -37
  19. package/lib/cjs/entity.js.map +1 -1
  20. package/lib/cjs/grids.d.ts +32 -3
  21. package/lib/cjs/grids.js +96 -9
  22. package/lib/cjs/grids.js.map +1 -1
  23. package/lib/cjs/index.d.ts +1 -0
  24. package/lib/cjs/index.js +1 -0
  25. package/lib/cjs/index.js.map +1 -1
  26. package/lib/cjs/loader.js +1 -41
  27. package/lib/cjs/loader.js.map +1 -1
  28. package/lib/cjs/notation.d.ts +28 -33
  29. package/lib/cjs/notation.js +144 -122
  30. package/lib/cjs/notation.js.map +1 -1
  31. package/lib/cjs/parser.d.ts +21 -6
  32. package/lib/cjs/parser.js +122 -23
  33. package/lib/cjs/parser.js.map +1 -1
  34. package/lib/esm/beats.d.ts +4 -0
  35. package/lib/esm/beats.js +19 -2
  36. package/lib/esm/beats.js.map +1 -1
  37. package/lib/esm/block.d.ts +73 -0
  38. package/lib/esm/block.js +230 -0
  39. package/lib/esm/block.js.map +1 -0
  40. package/lib/esm/carnatic/NotationView.d.ts +11 -4
  41. package/lib/esm/carnatic/NotationView.js +26 -11
  42. package/lib/esm/carnatic/NotationView.js.map +1 -1
  43. package/lib/esm/commands.d.ts +25 -11
  44. package/lib/esm/commands.js +84 -34
  45. package/lib/esm/commands.js.map +1 -1
  46. package/lib/esm/entity.d.ts +3 -7
  47. package/lib/esm/entity.js +7 -37
  48. package/lib/esm/entity.js.map +1 -1
  49. package/lib/esm/grids.d.ts +32 -3
  50. package/lib/esm/grids.js +96 -9
  51. package/lib/esm/grids.js.map +1 -1
  52. package/lib/esm/index.d.ts +1 -0
  53. package/lib/esm/index.js +1 -0
  54. package/lib/esm/index.js.map +1 -1
  55. package/lib/esm/loader.js +1 -8
  56. package/lib/esm/loader.js.map +1 -1
  57. package/lib/esm/notation.d.ts +28 -33
  58. package/lib/esm/notation.js +129 -118
  59. package/lib/esm/notation.js.map +1 -1
  60. package/lib/esm/parser.d.ts +21 -6
  61. package/lib/esm/parser.js +122 -24
  62. package/lib/esm/parser.js.map +1 -1
  63. package/package.json +3 -2
package/lib/cjs/parser.js CHANGED
@@ -36,11 +36,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.Parser = void 0;
39
+ exports.Parser = exports.BlockCommand = void 0;
40
40
  const TSU = __importStar(require("@panyam/tsutils"));
41
41
  const G = __importStar(require("galore"));
42
42
  const TLEX = __importStar(require("tlex"));
43
- const gray_matter_1 = __importDefault(require("gray-matter"));
43
+ const yaml_1 = __importDefault(require("yaml"));
44
44
  const core_1 = require("./core");
45
45
  const notation_1 = require("./notation");
46
46
  const commands_1 = require("./commands");
@@ -102,8 +102,13 @@ const [parser] = G.newParser(String.raw `
102
102
 
103
103
  Embedding -> SINGLE_LINE_RAW_STRING | MULTI_LINE_RAW_STRING ;
104
104
 
105
- Command -> BSLASH_IDENT CommandParams ? { newCommand } ;
105
+ Command -> BSLASH_IDENT CommandParams ? OptBlock { newCommandWithBlock } ;
106
106
  CommandParams -> OPEN_PAREN ParamList ? CLOSE_PAREN { $2 } ;
107
+ OptBlock -> Block
108
+ | { nullBlock }
109
+ ;
110
+ Block -> BlockStart Elements CLOSE_BRACE { endBlock } ;
111
+ BlockStart -> OPEN_BRACE { beginBlock } ;
107
112
 
108
113
  ParamList -> ParamList COMMA Param { concatParamList } ;
109
114
  ParamList -> Param { newParamList };
@@ -172,23 +177,23 @@ const [parser] = G.newParser(String.raw `
172
177
  token.tag = pre ? "PRE_EMB" : "POST_EMB";
173
178
  return token;
174
179
  },
175
- toCommandName: (token, tape, owner) => {
180
+ toCommandName: (token, _tape, _owner) => {
176
181
  token.value = token.value.substring(1);
177
182
  return token;
178
183
  },
179
- toBoolean: (token, tape, owner) => {
184
+ toBoolean: (token, _tape, _owner) => {
180
185
  token.value = token.value == "true";
181
186
  return token;
182
187
  },
183
- toNumber: (token, tape, owner) => {
188
+ toNumber: (token, _tape, _owner) => {
184
189
  token.value = parseInt(token.value);
185
190
  return token;
186
191
  },
187
- toString: (token, tape, owner) => {
192
+ toString: (token, _tape, _owner) => {
188
193
  token.value = token.value.substring(1, token.value.length - 1);
189
194
  return token;
190
195
  },
191
- toMarker: (token, tape, owner) => {
196
+ toMarker: (token, _tape, _owner) => {
192
197
  if (token.tag != "PRE_MARKER" && token.tag != "POST_MARKER") {
193
198
  throw new Error("Invalid token for converting to note: " + token.tag);
194
199
  }
@@ -199,7 +204,7 @@ const [parser] = G.newParser(String.raw `
199
204
  token.value = new core_1.Marker(markerText, isBefore);
200
205
  return token;
201
206
  },
202
- toOctavedNote: (token, tape, owner) => {
207
+ toOctavedNote: (token, _tape, _owner) => {
203
208
  if (token.tag == "DOTS_IDENT") {
204
209
  const octave = token.positions[1][1] - token.positions[1][0];
205
210
  const note = token.value.substring(octave);
@@ -215,19 +220,19 @@ const [parser] = G.newParser(String.raw `
215
220
  }
216
221
  return token;
217
222
  },
218
- toRoleSelector: (token, tape, owner) => {
223
+ toRoleSelector: (token, _tape, _owner) => {
219
224
  token.value = token.value.substring(0, token.value.length - 1);
220
225
  return token;
221
226
  },
222
- toLineAnnotation: (token, tape, owner) => {
227
+ toLineAnnotation: (token, _tape, _owner) => {
223
228
  token.value = token.value.substring(1);
224
229
  return token;
225
230
  },
226
- toSingleLineRawString: (token, tape, owner) => {
231
+ toSingleLineRawString: (token, _tape, _owner) => {
227
232
  token.value = token.value.substring(1);
228
233
  return token;
229
234
  },
230
- toMultiLineRawString: (token, tape, owner) => {
235
+ toMultiLineRawString: (token, tape, _owner) => {
231
236
  const hashes = tape.substring(token.positions[1][0], token.positions[1][1]);
232
237
  const endPat = '"' + hashes;
233
238
  const startPos = tape.index;
@@ -238,7 +243,7 @@ const [parser] = G.newParser(String.raw `
238
243
  token.value = tape.substring(startPos, endPos);
239
244
  return token;
240
245
  },
241
- toFrontMatter: (token, tape, owner) => {
246
+ toFrontMatter: (token, tape, _owner) => {
242
247
  const endPat = "\n---";
243
248
  const startPos = tape.index;
244
249
  const endPos = TLEX.TapeHelper.advanceAfter(tape, endPat) - endPat.length;
@@ -250,11 +255,76 @@ const [parser] = G.newParser(String.raw `
250
255
  },
251
256
  },
252
257
  });
258
+ const block_1 = require("./block");
259
+ const utils_1 = require("./utils");
260
+ class BlockCommand extends notation_1.Command {
261
+ constructor(innerCommand, blockCommands) {
262
+ super(innerCommand.params);
263
+ this.innerCommand = innerCommand;
264
+ this.blockCommands = blockCommands;
265
+ }
266
+ get name() {
267
+ return `Block(${this.innerCommand.name})`;
268
+ }
269
+ createBlock(parent) {
270
+ const cmd = this.innerCommand;
271
+ if (cmd instanceof commands_1.Section) {
272
+ return new block_1.SectionBlock(cmd.sectionName, parent);
273
+ }
274
+ else if (cmd instanceof commands_1.Repeat) {
275
+ return new block_1.RepeatBlock(cmd.count, parent);
276
+ }
277
+ else if (cmd instanceof commands_1.SetCycle) {
278
+ const cycle = (0, utils_1.parseCycle)(cmd.getParamAt(0));
279
+ return new block_1.CycleBlock(cycle, parent);
280
+ }
281
+ else if (cmd instanceof commands_1.SetBeatDuration) {
282
+ return new block_1.BeatDurationBlock(cmd.beatDuration, parent);
283
+ }
284
+ else if (cmd instanceof commands_1.SetBreaks) {
285
+ return new block_1.BreaksBlock(cmd.pattern, parent);
286
+ }
287
+ else if (cmd instanceof commands_1.CreateRole) {
288
+ const roleName = cmd.getParamAt(0);
289
+ return new block_1.RoleBlock(roleName, cmd.notesOnly, parent);
290
+ }
291
+ else if (cmd instanceof commands_1.ScopedGroup) {
292
+ return new block_1.GroupBlock(cmd.groupName || null, parent);
293
+ }
294
+ else {
295
+ return new block_1.Block(cmd.name.toLowerCase(), parent);
296
+ }
297
+ }
298
+ debugValue() {
299
+ return {
300
+ name: this.name,
301
+ index: this.index,
302
+ innerCommand: this.innerCommand.debugValue(),
303
+ blockCommands: this.blockCommands.map((cmd) => cmd.debugValue()),
304
+ };
305
+ }
306
+ applyToNotation(notation) {
307
+ const block = this.createBlock(notation);
308
+ for (const cmd of this.blockCommands) {
309
+ cmd.applyToBlock(block);
310
+ }
311
+ notation.addBlockItem(block);
312
+ }
313
+ applyToBlock(container) {
314
+ const block = this.createBlock(container);
315
+ for (const cmd of this.blockCommands) {
316
+ cmd.applyToBlock(block);
317
+ }
318
+ container.addBlockItem(block);
319
+ }
320
+ }
321
+ exports.BlockCommand = BlockCommand;
253
322
  class Parser {
254
- constructor(config) {
323
+ constructor(_config) {
255
324
  this.errors = [];
256
325
  this.metadata = {};
257
326
  this.commands = [];
327
+ this.blockStartStack = [];
258
328
  this.ruleHandlers = {
259
329
  newFraction: (rule, parent, ...children) => {
260
330
  if (children.length == 1) {
@@ -302,16 +372,16 @@ class Parser {
302
372
  throw new Error("Invalid lit: " + lit);
303
373
  }
304
374
  },
305
- newSpace: (rule, parent, ...children) => {
375
+ newSpace: (_rule, _parent, ..._children) => {
306
376
  return new core_1.Space();
307
377
  },
308
- newRest: (rule, parent, ...children) => {
378
+ newRest: (_rule, _parent, ..._children) => {
309
379
  return new core_1.Rest();
310
380
  },
311
- newDoubleSpace: (rule, parent, ...children) => {
381
+ newDoubleSpace: (_rule, _parent, ..._children) => {
312
382
  return new core_1.Space(ONE.timesNum(2));
313
383
  },
314
- newSilentSpace: (rule, parent, ...children) => {
384
+ newSilentSpace: (_rule, _parent, ..._children) => {
315
385
  return new core_1.Space(ONE, true);
316
386
  },
317
387
  applyPreMarker: (rule, parent, ...children) => {
@@ -372,8 +442,29 @@ class Parser {
372
442
  params.push(newParam);
373
443
  return params;
374
444
  },
375
- newCommand: (rule, parent, ...children) => {
376
- return this.createCommand(children[0].value, children[1].value);
445
+ beginBlock: (_rule, _parent, ..._children) => {
446
+ this.blockStartStack.push(this.commands.length);
447
+ return null;
448
+ },
449
+ endBlock: (_rule, _parent, ..._children) => {
450
+ const startIndex = this.blockStartStack.pop();
451
+ const blockCommands = this.commands.splice(startIndex);
452
+ return blockCommands;
453
+ },
454
+ nullBlock: (_rule, _parent, ..._children) => {
455
+ return null;
456
+ },
457
+ newCommandWithBlock: (rule, parent, ...children) => {
458
+ const name = children[0].value;
459
+ const params = children[1].value;
460
+ const blockCommands = children[2].value;
461
+ const innerCommand = this.createCommand(name, params);
462
+ if (blockCommands !== null) {
463
+ return new BlockCommand(innerCommand, blockCommands);
464
+ }
465
+ else {
466
+ return innerCommand;
467
+ }
377
468
  },
378
469
  appendAtoms: (rule, parent, ...children) => {
379
470
  const atoms = children[0].value;
@@ -384,7 +475,7 @@ class Parser {
384
475
  },
385
476
  prependFrontMatter: (rule, parent, ...children) => {
386
477
  const fm = children[0].value;
387
- const { data } = (0, gray_matter_1.default)("---\n" + fm + "\n---");
478
+ const data = yaml_1.default.parse(fm);
388
479
  console.log("Parsed FM: ", data);
389
480
  this.metadata = data;
390
481
  return children[1].value;
@@ -418,7 +509,6 @@ class Parser {
418
509
  return null;
419
510
  },
420
511
  };
421
- config = config || {};
422
512
  }
423
513
  createCommand(name, params) {
424
514
  const lName = name.trim().toLowerCase();
@@ -441,6 +531,15 @@ class Parser {
441
531
  else if (lName == "cycle") {
442
532
  return new commands_1.SetCycle(params);
443
533
  }
534
+ else if (lName == "section") {
535
+ return new commands_1.Section(params);
536
+ }
537
+ else if (lName == "group") {
538
+ return new commands_1.ScopedGroup(params);
539
+ }
540
+ else if (lName == "repeat") {
541
+ return new commands_1.Repeat(params);
542
+ }
444
543
  else {
445
544
  throw new Error("Invalid command: " + lName);
446
545
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as TSU from \"@panyam/tsutils\";\nimport * as G from \"galore\";\nimport * as TLEX from \"tlex\";\nimport matter from \"gray-matter\";\nimport { Literal, AtomType, Note, Atom, Rest, Space, Syllable, Group, Marker } from \"./core\";\nimport { Notation, MetaData as Meta, Command, CmdParam } from \"./notation\";\nimport {\n RawEmbedding,\n ApplyLayout,\n AddAtoms,\n SetCycle,\n SetBeatDuration,\n SetBreaks,\n ActivateRole,\n CreateRole,\n CreateLine,\n MetaData,\n} from \"./commands\";\n\n// TODO - Make this plugable from the client instead of hard coded\nimport * as carnatic from \"./carnatic\";\n\nconst ONE = TSU.Num.Fraction.ONE;\nconst TWO = ONE.timesNum(2);\n\n/**\n * V4 of our parser builds on V3 and has the following improvements:\n *\n * 1. Embedding Headings to demarcate sections so users dont have to use\n * explicit MD for headings.\n * 2. Unlike V3 here users break out *of* song instead instead break out \"into\"\n * song. So users spend more time writing notation and less worrying about\n * other things like headings etc.\n */\nconst [parser /*itemGraph*/] = G.newParser(\n String.raw`\n %define IdentChar /[^%!@$#&\\^|\\[\\]={}()<>+\\-,;~: \\t\\f\\r\\n\\v\\\\\\.\\'\\\"]/\n\n %token BSLASH \"\\\\\"\n %token OPEN_SQ \"[\"\n %token CLOSE_SQ \"]\"\n %token EQUALS \"=\"\n %token OPEN_PAREN \"(\"\n %token CLOSE_PAREN \")\"\n %token OPEN_BRACE \"{\"\n %token CLOSE_BRACE \"}\"\n %token SLASH \"/\"\n %token STAR \"*\"\n %token CARET \"^\"\n // %skip \"-\"\n %token COMMA \",\"\n %token SEMI_COLON \";\"\n %token COLON \":\"\n\n %token FRONT_MATTER /^---$/m { toFrontMatter }\n %token SINGLE_LINE_RAW_STRING />(.*)$/m { toSingleLineRawString }\n %token MULTI_LINE_RAW_STRING /r(#{0,})\"/ { toMultiLineRawString }\n\n %token EMBELISHMENT /~[^\\s]*/ { toEmbelishment }\n %token NUMBER /-?\\d+/ { toNumber }\n %token BOOLEAN /true|false/ { toBoolean }\n %token POST_MARKER /<<\"(([^\"\\\\\\n]|\\\\.|\\\\\\n)*)\"/ { toMarker }\n %token POST_MARKER /<<'(([^'\\\\\\n]|\\\\.|\\\\\\n)*)'/ { toMarker }\n %token PRE_MARKER /\"(([^\"\\\\\\n]|\\\\.|\\\\\\n)*)\">>/ { toMarker }\n %token PRE_MARKER /'(([^'\\\\\\n]|\\\\.|\\\\\\n)*)'>>/ { toMarker }\n %token STRING /\"([^\"\\\\\\n]|\\\\.|\\\\\\n)*\"/ { toString }\n %token STRING /'([^'\\\\\\n]|\\\\.|\\\\\\n)*'/ { toString }\n %token DOTS_IDENT /(\\.+)({IdentChar}+)/ { toOctavedNote }\n %token IDENT_DOTS /({IdentChar}+)(\\.+)/ { toOctavedNote }\n %token IDENT_COLON /{IdentChar}+:/ { toRoleSelector }\n %token IDENT /{IdentChar}+/\n %token BSLASH_IDENT /\\\\{IDENT}/ { toCommandName }\n %token BSLASH_NUMBER /\\\\{NUMBER}/\n %token HYPHEN /-/\n %skip /[ \\t\\n\\f\\r]+/\n %skip_flex \"//.*$\"\n %skip /\\/\\*.*?\\*\\//\n\n Document -> Elements\n | FRONT_MATTER Elements { prependFrontMatter }\n ;\n\n Elements -> Elements Command Atoms { appendCommand } \n | Elements RoleSelector Atoms { appendRoleSelector } \n | Elements Embedding Atoms { insertEmbedding }\n | Atoms { appendAtoms }\n ;\n\n Embedding -> SINGLE_LINE_RAW_STRING | MULTI_LINE_RAW_STRING ;\n\n Command -> BSLASH_IDENT CommandParams ? { newCommand } ;\n CommandParams -> OPEN_PAREN ParamList ? CLOSE_PAREN { $2 } ;\n\n ParamList -> ParamList COMMA Param { concatParamList } ;\n ParamList -> Param { newParamList };\n Param -> ParamValue { newParam } ;\n Param -> ParamKey EQUALS ParamValue { newParam } ;\n ParamKey -> IDENT ;\n ParamValue -> ( STRING | Fraction | NUMBER | BOOLEAN ) ;\n\n RoleSelector -> IDENT_COLON ;\n\n Atoms -> Atoms Atom { concatAtoms } ;\n Atoms -> { newArray } ;\n\n Atom -> Atom POST_MARKER { applyPostMarker }\n | PreMarkedAtom\n ;\n PreMarkedAtom -> Leaf\n | PRE_MARKER PreMarkedAtom { applyPreMarker }\n ;\n\n Leaf -> Space | Lit | Group | Rest ;\n Leaf -> Duration Leaf { applyDuration } ;\n Rest -> HYPHEN { newRest };\n Space -> COMMA { newSpace } \n | SEMI_COLON { newDoubleSpace } \n | UNDER_SCORE { newSilentSpace } \n ;\n\n /* - An alternative representation to support both pre and\n * post embelishment operators. Here PRE_EMBs have a higher\n * associativity over POST_EMBs\n */\n Lit -> Lit POST_EMB { litWithPostEmb }\n | PreEmbLit\n ;\n\n PreEmbLit -> LitToken \n | LitToken CARET NUMBER { litWithCaret }\n | LitToken CARET STAR { litWithCaret }\n | PRE_EMB PreEmbLit { litWithPreEmb }\n ;\n \n LitToken -> DOTS_IDENT { litToAtom }\n | IDENT { litToAtom }\n | IDENT_DOTS { litToAtom }\n | STRING { litToAtom }\n ;\n\n Group -> OPEN_SQ Atoms CLOSE_SQ { newGroup };\n\n Duration -> Fraction | NUMBER;\n Fraction -> NUMBER SLASH NUMBER { newFraction } ;\n `,\n {\n allowLeftRecursion: true,\n debug: \"\",\n type: \"lalr\",\n tokenHandlers: {\n toEmbelishment: (token: TLEX.Token, tape: TLEX.Tape, owner: Parser) => {\n const [emb, pre] = owner.parseEmbelishment(token.value);\n if (emb == null) {\n console.log(\"Skipping Embelishment: \", token.value);\n owner.errors.push(\n new TLEX.TokenizerError(\n `Invalid embelishment: ${token.value}`,\n token.start,\n 1 + token.end - token.start,\n \"InvalidEmbelishment\",\n token.value,\n ),\n );\n return null;\n }\n token.value = emb;\n token.tag = pre ? \"PRE_EMB\" : \"POST_EMB\";\n return token;\n },\n toCommandName: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n token.value = token.value.substring(1);\n return token;\n },\n toBoolean: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n token.value = token.value == \"true\";\n return token;\n },\n toNumber: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n token.value = parseInt(token.value);\n return token;\n },\n toString: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n token.value = token.value.substring(1, token.value.length - 1);\n return token;\n },\n toMarker: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n if (token.tag != \"PRE_MARKER\" && token.tag != \"POST_MARKER\") {\n throw new Error(\"Invalid token for converting to note: \" + token.tag);\n }\n const isBefore = token.tag == \"PRE_MARKER\";\n const markerText = isBefore\n ? token.value.substring(1, token.value.length - 3)\n : token.value.substring(3, token.value.length - 1);\n // console.log(\"TokVal: \", token.value, token.positions);\n // console.log(\"Marker Text: \", markerText, isBefore);\n token.value = new Marker(markerText, isBefore);\n return token;\n },\n toOctavedNote: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n if (token.tag == \"DOTS_IDENT\") {\n const octave = token.positions[1][1] - token.positions[1][0];\n const note = token.value.substring(octave);\n token.value = new Note(note, ONE, -octave);\n } else if (token.tag == \"IDENT_DOTS\") {\n const octave = token.positions[2][1] - token.positions[2][0];\n const note = token.value.substring(0, token.value.length - octave);\n token.value = new Note(note, ONE, octave);\n } else {\n throw new Error(\"Invalid token for converting to note: \" + token.tag);\n }\n return token;\n },\n toRoleSelector: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n token.value = token.value.substring(0, token.value.length - 1);\n return token;\n },\n toLineAnnotation: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n // skip the initial \"!\"\n token.value = token.value.substring(1);\n return token;\n },\n toSingleLineRawString: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n // skip the initial \">\"\n token.value = token.value.substring(1);\n return token;\n },\n toMultiLineRawString: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n // consume everything until \"#<N times> as start\n const hashes = tape.substring(token.positions[1][0], token.positions[1][1]);\n const endPat = '\"' + hashes;\n const startPos = tape.index;\n const endPos = TLEX.TapeHelper.advanceAfter(tape, endPat) - endPat.length;\n if (endPos < 0) {\n throw new Error(\"EOF expected while finding end of Raw String Literal: '\" + endPat + \"'\");\n }\n token.value = tape.substring(startPos, endPos);\n return token;\n },\n toFrontMatter: (token: TLEX.Token, tape: TLEX.Tape, owner: any) => {\n // skip the initial \">\"\n const endPat = \"\\n---\";\n const startPos = tape.index;\n const endPos = TLEX.TapeHelper.advanceAfter(tape, endPat) - endPat.length;\n if (endPos < 0) {\n throw new Error(\"EOF expected while finding end of front matter\");\n }\n token.value = tape.substring(startPos, endPos);\n // console.log(\"Found FM: \", token.value);\n return token;\n },\n },\n },\n);\n\n/**\n * A notation doc is a list of lines that are found in a single document.\n *\n * Since our document (md or html etc) can contain multiple snippets\n * all these snippets are related\n */\nexport class Parser {\n errors: (TLEX.TokenizerError | G.ParseError)[] = [];\n metadata: any = {};\n readonly commands: Command[] = [];\n // readonly notation: Notation = new Notation();\n // private runCommandFound = false;\n // readonly parseTree = new PTNodeList(\"Snippet\", null);\n\n protected ruleHandlers = {\n newFraction: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n if (children.length == 1) {\n return new TSU.Num.Fraction(children[0].value);\n } else {\n return new TSU.Num.Fraction(children[0].value, children[2].value);\n }\n },\n newGroup: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const out = new Group(...children[1].value).setDuration(TWO, true);\n return out;\n },\n litWithCaret: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = Note.fromLit(children[0].value as Literal);\n const opnode = children[2];\n const shiftValue = opnode.sym.label == \"STAR\" ? true : opnode.value;\n lit.shift = shiftValue;\n return lit;\n },\n litWithPreEmb: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const emb = children[0];\n const lit = children[1].value as Literal;\n lit.embelishments.splice(0, 0, emb.value);\n return lit;\n },\n litWithPostEmb: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = children[0].value as Literal;\n const emb = children[1];\n lit.embelishments.push(emb);\n return lit;\n },\n litToAtom: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = children[0];\n if (lit.sym.label == \"DOTS_IDENT\" || lit.sym.label == \"IDENT_DOTS\") {\n return lit.value;\n } else if (lit.sym.label == \"IDENT\") {\n // Mark this as a Literal to be processed later\n return new Literal(lit.value);\n // return role.notesOnly ? new Note(lit.value) : new Syllable(lit.value);\n } else if (lit.sym.label == \"STRING\") {\n // const role = this.snippet.currRole;\n // if (role.notesOnly) throw new Error(\"Strings cannot appear in notes only mode\");\n return new Syllable(lit.value);\n } else {\n throw new Error(\"Invalid lit: \" + lit);\n }\n },\n newSpace: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return new Space();\n },\n newRest: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return new Rest();\n },\n newDoubleSpace: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return new Space(ONE.timesNum(2));\n },\n newSilentSpace: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return new Space(ONE, true);\n },\n applyPreMarker: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const marker = children[0].value as Marker;\n const leaf = children[1].value as Atom;\n // console.log(\"marker, leaf: \", marker, leaf);\n if (!leaf.markersBefore) {\n leaf.markersBefore = [];\n }\n leaf.markersBefore.splice(0, 0, marker);\n return leaf;\n },\n applyPostMarker: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const leaf = children[0].value as Atom;\n const marker = children[1].value as Marker;\n if (!leaf.markersAfter) {\n leaf.markersAfter = [];\n }\n leaf.markersAfter.push(marker);\n return leaf;\n },\n applyDuration: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n let dur = children[0].value as TSU.Num.Fraction | number;\n const leaf = children[1].value as Atom;\n if (typeof dur === \"number\") {\n dur = ONE.timesNum(dur);\n }\n if (leaf.TYPE == AtomType.GROUP) {\n (leaf as Group).setDuration(dur, true);\n } else {\n leaf.duration = dur;\n }\n return leaf;\n },\n newArray: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n // create an array of values from all the values of child nodes\n return children.map((c) => c.value);\n },\n concatAtoms: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const atoms = children[0].value;\n const atom = children[1].value;\n atoms.push(atom);\n return atoms;\n },\n newParam: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n if (children.length == 1) {\n return { key: null, value: children[0].value };\n } else {\n return { key: children[0].value, value: children[2].value };\n }\n },\n newParamList: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return [children[0].value];\n },\n concatParamList: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const params = children[0].value;\n const newParam = children[2].value;\n params.push(newParam);\n return params;\n },\n newCommand: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return this.createCommand(children[0].value, children[1].value);\n },\n appendAtoms: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const atoms = children[0].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n prependFrontMatter: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const fm = children[0].value;\n // console.log(\"Child 0: \", fm);\n // console.log(\"Child 1: \", children[1].value);\n const { data } = matter(\"---\\n\" + fm + \"\\n---\");\n console.log(\"Parsed FM: \", data);\n this.metadata = data;\n return children[1].value;\n },\n appendCommand: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const command = children[1].value as Command;\n this.addCommand(command);\n\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n appendRoleSelector: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const roleName = children[1].value;\n const lName = roleName.toLowerCase().trim();\n this.addCommand(new ActivateRole([{ key: null, value: lName }]));\n\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n insertEmbedding: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n // How to handle embeddings - these are just blocks\n // to escape out of song (most likely for some rendering of html/md etc)\n const rawVal = children[1].value;\n this.addCommand(new RawEmbedding([{ key: null, value: rawVal }]));\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n };\n\n constructor(config?: any) {\n config = config || {};\n }\n\n createCommand(name: string, params: CmdParam[]): Command {\n const lName = name.trim().toLowerCase();\n params = params || [];\n if (lName == \"line\") {\n return new CreateLine(params);\n // } else if (lName == \"meta\") { return new MetaData(params);\n } else if (lName == \"role\") {\n return new CreateRole(params);\n } else if (lName == \"layout\") {\n return new ApplyLayout(params);\n } else if (lName == \"beatduration\") {\n return new SetBeatDuration(params);\n } else if (lName == \"breaks\") {\n return new SetBreaks(params);\n } else if (lName == \"cycle\") {\n return new SetCycle(params);\n } else {\n // Try to set this as the current role\n throw new Error(\"Invalid command: \" + lName);\n }\n }\n\n addCommand(cmd: Command): void {\n cmd.index = this.commands.length;\n this.commands.push(cmd);\n }\n\n parse(input: string): any {\n this.errors = [];\n try {\n const ptree = parser.parse(input, {\n tokenizerContext: this,\n ruleHandlers: this.ruleHandlers,\n onTokenError: (err: TLEX.TokenizerError) => {\n this.errors.push(err);\n return true;\n },\n });\n return ptree;\n } catch (err) {\n if (err instanceof G.ParseError) {\n this.errors.push(err);\n } else {\n throw err;\n }\n }\n return null;\n }\n\n parseAndBuild(input: string): [Notation, G.ParseError[]] {\n this.parse(input);\n const notation = new Notation();\n const errors: G.ParseError[] = [];\n errors.push(...this.errors);\n\n // First add the metadata then we can set it\n for (const key in this.metadata) notation.addMetaData(new Meta(key, this.metadata[key]));\n for (const cmd of this.commands) cmd.applyToNotation(notation);\n return [notation, errors];\n }\n\n parseEmbelishment(value: string): [any, boolean] {\n return carnatic.parseEmbelishment(value);\n }\n}\n"]}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as TSU from \"@panyam/tsutils\";\nimport * as G from \"galore\";\nimport * as TLEX from \"tlex\";\nimport YAML from \"yaml\";\nimport { Literal, AtomType, Note, Atom, Rest, Space, Syllable, Group, Marker } from \"./core\";\nimport { Notation, MetaData as Meta, Command, CmdParam } from \"./notation\";\nimport {\n RawEmbedding,\n ApplyLayout,\n AddAtoms,\n SetCycle,\n SetBeatDuration,\n SetBreaks,\n ActivateRole,\n CreateRole,\n CreateLine,\n Section,\n ScopedGroup,\n Repeat,\n} from \"./commands\";\n\n// TODO - Make this plugable from the client instead of hard coded\nimport * as carnatic from \"./carnatic\";\n\nconst ONE = TSU.Num.Fraction.ONE;\nconst TWO = ONE.timesNum(2);\n\n/**\n * V4 of our parser builds on V3 and has the following improvements:\n *\n * 1. Embedding Headings to demarcate sections so users dont have to use\n * explicit MD for headings.\n * 2. Unlike V3 here users break out *of* song instead instead break out \"into\"\n * song. So users spend more time writing notation and less worrying about\n * other things like headings etc.\n */\nconst [parser /*itemGraph*/] = G.newParser(\n String.raw`\n %define IdentChar /[^%!@$#&\\^|\\[\\]={}()<>+\\-,;~: \\t\\f\\r\\n\\v\\\\\\.\\'\\\"]/\n\n %token BSLASH \"\\\\\"\n %token OPEN_SQ \"[\"\n %token CLOSE_SQ \"]\"\n %token EQUALS \"=\"\n %token OPEN_PAREN \"(\"\n %token CLOSE_PAREN \")\"\n %token OPEN_BRACE \"{\"\n %token CLOSE_BRACE \"}\"\n %token SLASH \"/\"\n %token STAR \"*\"\n %token CARET \"^\"\n // %skip \"-\"\n %token COMMA \",\"\n %token SEMI_COLON \";\"\n %token COLON \":\"\n\n %token FRONT_MATTER /^---$/m { toFrontMatter }\n %token SINGLE_LINE_RAW_STRING />(.*)$/m { toSingleLineRawString }\n %token MULTI_LINE_RAW_STRING /r(#{0,})\"/ { toMultiLineRawString }\n\n %token EMBELISHMENT /~[^\\s]*/ { toEmbelishment }\n %token NUMBER /-?\\d+/ { toNumber }\n %token BOOLEAN /true|false/ { toBoolean }\n %token POST_MARKER /<<\"(([^\"\\\\\\n]|\\\\.|\\\\\\n)*)\"/ { toMarker }\n %token POST_MARKER /<<'(([^'\\\\\\n]|\\\\.|\\\\\\n)*)'/ { toMarker }\n %token PRE_MARKER /\"(([^\"\\\\\\n]|\\\\.|\\\\\\n)*)\">>/ { toMarker }\n %token PRE_MARKER /'(([^'\\\\\\n]|\\\\.|\\\\\\n)*)'>>/ { toMarker }\n %token STRING /\"([^\"\\\\\\n]|\\\\.|\\\\\\n)*\"/ { toString }\n %token STRING /'([^'\\\\\\n]|\\\\.|\\\\\\n)*'/ { toString }\n %token DOTS_IDENT /(\\.+)({IdentChar}+)/ { toOctavedNote }\n %token IDENT_DOTS /({IdentChar}+)(\\.+)/ { toOctavedNote }\n %token IDENT_COLON /{IdentChar}+:/ { toRoleSelector }\n %token IDENT /{IdentChar}+/\n %token BSLASH_IDENT /\\\\{IDENT}/ { toCommandName }\n %token BSLASH_NUMBER /\\\\{NUMBER}/\n %token HYPHEN /-/\n %skip /[ \\t\\n\\f\\r]+/\n %skip_flex \"//.*$\"\n %skip /\\/\\*.*?\\*\\//\n\n Document -> Elements\n | FRONT_MATTER Elements { prependFrontMatter }\n ;\n\n Elements -> Elements Command Atoms { appendCommand } \n | Elements RoleSelector Atoms { appendRoleSelector } \n | Elements Embedding Atoms { insertEmbedding }\n | Atoms { appendAtoms }\n ;\n\n Embedding -> SINGLE_LINE_RAW_STRING | MULTI_LINE_RAW_STRING ;\n\n Command -> BSLASH_IDENT CommandParams ? OptBlock { newCommandWithBlock } ;\n CommandParams -> OPEN_PAREN ParamList ? CLOSE_PAREN { $2 } ;\n OptBlock -> Block\n | { nullBlock }\n ;\n Block -> BlockStart Elements CLOSE_BRACE { endBlock } ;\n BlockStart -> OPEN_BRACE { beginBlock } ;\n\n ParamList -> ParamList COMMA Param { concatParamList } ;\n ParamList -> Param { newParamList };\n Param -> ParamValue { newParam } ;\n Param -> ParamKey EQUALS ParamValue { newParam } ;\n ParamKey -> IDENT ;\n ParamValue -> ( STRING | Fraction | NUMBER | BOOLEAN ) ;\n\n RoleSelector -> IDENT_COLON ;\n\n Atoms -> Atoms Atom { concatAtoms } ;\n Atoms -> { newArray } ;\n\n Atom -> Atom POST_MARKER { applyPostMarker }\n | PreMarkedAtom\n ;\n PreMarkedAtom -> Leaf\n | PRE_MARKER PreMarkedAtom { applyPreMarker }\n ;\n\n Leaf -> Space | Lit | Group | Rest ;\n Leaf -> Duration Leaf { applyDuration } ;\n Rest -> HYPHEN { newRest };\n Space -> COMMA { newSpace } \n | SEMI_COLON { newDoubleSpace } \n | UNDER_SCORE { newSilentSpace } \n ;\n\n /* - An alternative representation to support both pre and\n * post embelishment operators. Here PRE_EMBs have a higher\n * associativity over POST_EMBs\n */\n Lit -> Lit POST_EMB { litWithPostEmb }\n | PreEmbLit\n ;\n\n PreEmbLit -> LitToken \n | LitToken CARET NUMBER { litWithCaret }\n | LitToken CARET STAR { litWithCaret }\n | PRE_EMB PreEmbLit { litWithPreEmb }\n ;\n \n LitToken -> DOTS_IDENT { litToAtom }\n | IDENT { litToAtom }\n | IDENT_DOTS { litToAtom }\n | STRING { litToAtom }\n ;\n\n Group -> OPEN_SQ Atoms CLOSE_SQ { newGroup };\n\n Duration -> Fraction | NUMBER;\n Fraction -> NUMBER SLASH NUMBER { newFraction } ;\n `,\n {\n allowLeftRecursion: true,\n debug: \"\",\n type: \"lalr\",\n tokenHandlers: {\n toEmbelishment: (token: TLEX.Token, tape: TLEX.Tape, owner: Parser) => {\n const [emb, pre] = owner.parseEmbelishment(token.value);\n if (emb == null) {\n console.log(\"Skipping Embelishment: \", token.value);\n owner.errors.push(\n new TLEX.TokenizerError(\n `Invalid embelishment: ${token.value}`,\n token.start,\n 1 + token.end - token.start,\n \"InvalidEmbelishment\",\n token.value,\n ),\n );\n return null;\n }\n token.value = emb;\n token.tag = pre ? \"PRE_EMB\" : \"POST_EMB\";\n return token;\n },\n toCommandName: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n token.value = token.value.substring(1);\n return token;\n },\n toBoolean: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n token.value = token.value == \"true\";\n return token;\n },\n toNumber: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n token.value = parseInt(token.value);\n return token;\n },\n toString: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n token.value = token.value.substring(1, token.value.length - 1);\n return token;\n },\n toMarker: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n if (token.tag != \"PRE_MARKER\" && token.tag != \"POST_MARKER\") {\n throw new Error(\"Invalid token for converting to note: \" + token.tag);\n }\n const isBefore = token.tag == \"PRE_MARKER\";\n const markerText = isBefore\n ? token.value.substring(1, token.value.length - 3)\n : token.value.substring(3, token.value.length - 1);\n // console.log(\"TokVal: \", token.value, token.positions);\n // console.log(\"Marker Text: \", markerText, isBefore);\n token.value = new Marker(markerText, isBefore);\n return token;\n },\n toOctavedNote: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n if (token.tag == \"DOTS_IDENT\") {\n const octave = token.positions[1][1] - token.positions[1][0];\n const note = token.value.substring(octave);\n token.value = new Note(note, ONE, -octave);\n } else if (token.tag == \"IDENT_DOTS\") {\n const octave = token.positions[2][1] - token.positions[2][0];\n const note = token.value.substring(0, token.value.length - octave);\n token.value = new Note(note, ONE, octave);\n } else {\n throw new Error(\"Invalid token for converting to note: \" + token.tag);\n }\n return token;\n },\n toRoleSelector: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n token.value = token.value.substring(0, token.value.length - 1);\n return token;\n },\n toLineAnnotation: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n // skip the initial \"!\"\n token.value = token.value.substring(1);\n return token;\n },\n toSingleLineRawString: (token: TLEX.Token, _tape: TLEX.Tape, _owner: any) => {\n // skip the initial \">\"\n token.value = token.value.substring(1);\n return token;\n },\n toMultiLineRawString: (token: TLEX.Token, tape: TLEX.Tape, _owner: any) => {\n // consume everything until \"#<N times> as start\n const hashes = tape.substring(token.positions[1][0], token.positions[1][1]);\n const endPat = '\"' + hashes;\n const startPos = tape.index;\n const endPos = TLEX.TapeHelper.advanceAfter(tape, endPat) - endPat.length;\n if (endPos < 0) {\n throw new Error(\"EOF expected while finding end of Raw String Literal: '\" + endPat + \"'\");\n }\n token.value = tape.substring(startPos, endPos);\n return token;\n },\n toFrontMatter: (token: TLEX.Token, tape: TLEX.Tape, _owner: any) => {\n // skip the initial \">\"\n const endPat = \"\\n---\";\n const startPos = tape.index;\n const endPos = TLEX.TapeHelper.advanceAfter(tape, endPat) - endPat.length;\n if (endPos < 0) {\n throw new Error(\"EOF expected while finding end of front matter\");\n }\n token.value = tape.substring(startPos, endPos);\n // console.log(\"Found FM: \", token.value);\n return token;\n },\n },\n },\n);\n\n/**\n * A notation doc is a list of lines that are found in a single document.\n *\n * Since our document (md or html etc) can contain multiple snippets\n * all these snippets are related\n */\nimport {\n Block,\n SectionBlock,\n RepeatBlock,\n CycleBlock,\n BeatDurationBlock,\n BreaksBlock,\n RoleBlock,\n GroupBlock,\n} from \"./block\";\nimport { parseCycle } from \"./utils\";\n\n/**\n * Wrapper for a command that has a block of child commands.\n * When applied, it creates the appropriate Block subclass and applies child commands to it.\n */\nexport class BlockCommand extends Command {\n readonly innerCommand: Command;\n readonly blockCommands: Command[];\n\n constructor(innerCommand: Command, blockCommands: Command[]) {\n super(innerCommand.params);\n this.innerCommand = innerCommand;\n this.blockCommands = blockCommands;\n }\n\n get name(): string {\n return `Block(${this.innerCommand.name})`;\n }\n\n /**\n * Creates the appropriate Block subclass based on the inner command type.\n */\n private createBlock(parent: Block): Block {\n const cmd = this.innerCommand;\n\n if (cmd instanceof Section) {\n return new SectionBlock(cmd.sectionName, parent);\n } else if (cmd instanceof Repeat) {\n return new RepeatBlock(cmd.count, parent);\n } else if (cmd instanceof SetCycle) {\n const cycle = parseCycle(cmd.getParamAt(0));\n return new CycleBlock(cycle, parent);\n } else if (cmd instanceof SetBeatDuration) {\n return new BeatDurationBlock(cmd.beatDuration, parent);\n } else if (cmd instanceof SetBreaks) {\n return new BreaksBlock(cmd.pattern, parent);\n } else if (cmd instanceof CreateRole) {\n const roleName = cmd.getParamAt(0);\n return new RoleBlock(roleName, cmd.notesOnly, parent);\n } else if (cmd instanceof ScopedGroup) {\n return new GroupBlock(cmd.groupName || null, parent);\n } else {\n // Generic block for other commands\n return new Block(cmd.name.toLowerCase(), parent);\n }\n }\n\n debugValue(): any {\n return {\n name: this.name,\n index: this.index,\n innerCommand: this.innerCommand.debugValue(),\n blockCommands: this.blockCommands.map((cmd) => cmd.debugValue()),\n };\n }\n\n applyToNotation(notation: Notation): void {\n // Create the appropriate Block subclass\n // Cast notation as Block since Notation will extend Block\n const block = this.createBlock(notation as unknown as Block);\n\n // Apply all child commands to the block\n for (const cmd of this.blockCommands) {\n cmd.applyToBlock(block);\n }\n\n // Add the block to the notation\n notation.addBlockItem(block);\n }\n\n applyToBlock(container: Block): void {\n // Create the appropriate Block subclass\n const block = this.createBlock(container);\n\n // Apply all child commands to the block\n for (const cmd of this.blockCommands) {\n cmd.applyToBlock(block);\n }\n\n // Add the block to the container\n container.addBlockItem(block);\n }\n}\n\nexport class Parser {\n errors: (TLEX.TokenizerError | G.ParseError)[] = [];\n metadata: any = {};\n readonly commands: Command[] = [];\n // Stack to track command indices when entering blocks\n private blockStartStack: number[] = [];\n\n protected ruleHandlers = {\n newFraction: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n if (children.length == 1) {\n return new TSU.Num.Fraction(children[0].value);\n } else {\n return new TSU.Num.Fraction(children[0].value, children[2].value);\n }\n },\n newGroup: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const out = new Group(...children[1].value).setDuration(TWO, true);\n return out;\n },\n litWithCaret: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = Note.fromLit(children[0].value as Literal);\n const opnode = children[2];\n const shiftValue = opnode.sym.label == \"STAR\" ? true : opnode.value;\n lit.shift = shiftValue;\n return lit;\n },\n litWithPreEmb: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const emb = children[0];\n const lit = children[1].value as Literal;\n lit.embelishments.splice(0, 0, emb.value);\n return lit;\n },\n litWithPostEmb: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = children[0].value as Literal;\n const emb = children[1];\n lit.embelishments.push(emb);\n return lit;\n },\n litToAtom: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const lit = children[0];\n if (lit.sym.label == \"DOTS_IDENT\" || lit.sym.label == \"IDENT_DOTS\") {\n return lit.value;\n } else if (lit.sym.label == \"IDENT\") {\n // Mark this as a Literal to be processed later\n return new Literal(lit.value);\n // return role.notesOnly ? new Note(lit.value) : new Syllable(lit.value);\n } else if (lit.sym.label == \"STRING\") {\n // const role = this.snippet.currRole;\n // if (role.notesOnly) throw new Error(\"Strings cannot appear in notes only mode\");\n return new Syllable(lit.value);\n } else {\n throw new Error(\"Invalid lit: \" + lit);\n }\n },\n newSpace: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n return new Space();\n },\n newRest: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n return new Rest();\n },\n newDoubleSpace: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n return new Space(ONE.timesNum(2));\n },\n newSilentSpace: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n return new Space(ONE, true);\n },\n applyPreMarker: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const marker = children[0].value as Marker;\n const leaf = children[1].value as Atom;\n // console.log(\"marker, leaf: \", marker, leaf);\n if (!leaf.markersBefore) {\n leaf.markersBefore = [];\n }\n leaf.markersBefore.splice(0, 0, marker);\n return leaf;\n },\n applyPostMarker: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const leaf = children[0].value as Atom;\n const marker = children[1].value as Marker;\n if (!leaf.markersAfter) {\n leaf.markersAfter = [];\n }\n leaf.markersAfter.push(marker);\n return leaf;\n },\n applyDuration: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n let dur = children[0].value as TSU.Num.Fraction | number;\n const leaf = children[1].value as Atom;\n if (typeof dur === \"number\") {\n dur = ONE.timesNum(dur);\n }\n if (leaf.TYPE == AtomType.GROUP) {\n (leaf as Group).setDuration(dur, true);\n } else {\n leaf.duration = dur;\n }\n return leaf;\n },\n newArray: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n // create an array of values from all the values of child nodes\n return children.map((c) => c.value);\n },\n concatAtoms: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const atoms = children[0].value;\n const atom = children[1].value;\n atoms.push(atom);\n return atoms;\n },\n newParam: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n if (children.length == 1) {\n return { key: null, value: children[0].value };\n } else {\n return { key: children[0].value, value: children[2].value };\n }\n },\n newParamList: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n return [children[0].value];\n },\n concatParamList: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const params = children[0].value;\n const newParam = children[2].value;\n params.push(newParam);\n return params;\n },\n // Block handling semantic actions\n beginBlock: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n // Push current command count to track where this block's commands start\n this.blockStartStack.push(this.commands.length);\n return null;\n },\n endBlock: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n // Pop the start index and extract commands added since then\n const startIndex = this.blockStartStack.pop()!;\n const blockCommands = this.commands.splice(startIndex);\n return blockCommands;\n },\n nullBlock: (_rule: G.Rule, _parent: G.PTNode, ..._children: G.PTNode[]) => {\n // No block present\n return null;\n },\n newCommandWithBlock: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const name = children[0].value;\n const params = children[1].value;\n const blockCommands = children[2].value as Command[] | null;\n\n const innerCommand = this.createCommand(name, params);\n\n if (blockCommands !== null) {\n // Wrap in BlockCommand\n return new BlockCommand(innerCommand, blockCommands);\n } else {\n // No block, return regular command\n return innerCommand;\n }\n },\n appendAtoms: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const atoms = children[0].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n prependFrontMatter: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const fm = children[0].value;\n // console.log(\"Child 0: \", fm);\n // console.log(\"Child 1: \", children[1].value);\n const data = YAML.parse(fm);\n console.log(\"Parsed FM: \", data);\n this.metadata = data;\n return children[1].value;\n },\n appendCommand: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const command = children[1].value as Command;\n this.addCommand(command);\n\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n appendRoleSelector: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n const roleName = children[1].value;\n const lName = roleName.toLowerCase().trim();\n this.addCommand(new ActivateRole([{ key: null, value: lName }]));\n\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n insertEmbedding: (rule: G.Rule, parent: G.PTNode, ...children: G.PTNode[]) => {\n // How to handle embeddings - these are just blocks\n // to escape out of song (most likely for some rendering of html/md etc)\n const rawVal = children[1].value;\n this.addCommand(new RawEmbedding([{ key: null, value: rawVal }]));\n const atoms = children[2].value as Atom[];\n if (atoms.length > 0) {\n this.addCommand(new AddAtoms(...atoms));\n }\n return null;\n },\n };\n\n constructor(_config?: any) {\n // config = config || {};\n }\n\n createCommand(name: string, params: CmdParam[]): Command {\n const lName = name.trim().toLowerCase();\n params = params || [];\n if (lName == \"line\") {\n return new CreateLine(params);\n // } else if (lName == \"meta\") { return new MetaData(params);\n } else if (lName == \"role\") {\n return new CreateRole(params);\n } else if (lName == \"layout\") {\n return new ApplyLayout(params);\n } else if (lName == \"beatduration\") {\n return new SetBeatDuration(params);\n } else if (lName == \"breaks\") {\n return new SetBreaks(params);\n } else if (lName == \"cycle\") {\n return new SetCycle(params);\n } else if (lName == \"section\") {\n return new Section(params);\n } else if (lName == \"group\") {\n return new ScopedGroup(params);\n } else if (lName == \"repeat\") {\n return new Repeat(params);\n } else {\n // Try to set this as the current role\n throw new Error(\"Invalid command: \" + lName);\n }\n }\n\n addCommand(cmd: Command): void {\n cmd.index = this.commands.length;\n this.commands.push(cmd);\n }\n\n parse(input: string): any {\n this.errors = [];\n try {\n const ptree = parser.parse(input, {\n tokenizerContext: this,\n ruleHandlers: this.ruleHandlers,\n onTokenError: (err: TLEX.TokenizerError) => {\n this.errors.push(err);\n return true;\n },\n });\n return ptree;\n } catch (err) {\n if (err instanceof G.ParseError) {\n this.errors.push(err);\n } else {\n throw err;\n }\n }\n return null;\n }\n\n parseAndBuild(input: string): [Notation, G.ParseError[]] {\n this.parse(input);\n const notation = new Notation();\n const errors: G.ParseError[] = [];\n errors.push(...this.errors);\n\n // First add the metadata then we can set it\n for (const key in this.metadata) notation.addMetaData(new Meta(key, this.metadata[key]));\n for (const cmd of this.commands) cmd.applyToNotation(notation);\n return [notation, errors];\n }\n\n parseEmbelishment(value: string): [any, boolean] {\n return carnatic.parseEmbelishment(value);\n }\n}\n"]}
@@ -4,6 +4,7 @@ import { CycleIterator } from "./cycle";
4
4
  import { WindowIterator } from "./iterators";
5
5
  import { LayoutParams } from "./layouts";
6
6
  import { GridModel, GridCell, ColAlign, GridLayoutGroup } from "./grids";
7
+ import { Block, BlockItem } from "./notation";
7
8
  type Fraction = TSU.Num.Fraction;
8
9
  export declare class Beat {
9
10
  readonly index: number;
@@ -67,9 +68,12 @@ export declare class GlobalBeatLayout {
67
68
  roleBeatsForLine: Map<number, Beat[][]>;
68
69
  beatColDAGsByLP: Map<number, BeatColDAG>;
69
70
  readonly gridLayoutGroup: GridLayoutGroup;
71
+ constructor(sharedGridLayoutGroup?: GridLayoutGroup);
70
72
  getGridModelForLine(lineid: LineId): GridModel;
71
73
  protected beatColDAGForLP(lpid: LPID): BeatColDAG;
72
74
  addLine(line: Line): void;
75
+ processBlock(block: Block): void;
76
+ protected processBlockItem(item: BlockItem): void;
73
77
  protected lineToRoleBeats(line: Line, gridModel: GridModel): Beat[][];
74
78
  protected addBeat(beat: Beat, gridModel: GridModel): GridCell;
75
79
  }
package/lib/esm/beats.js CHANGED
@@ -2,6 +2,7 @@ import * as TSU from "@panyam/tsutils";
2
2
  import { AtomType, Group, Space } from "./";
3
3
  import { WindowIterator } from "./iterators";
4
4
  import { GridModel, GridCell, ColAlign, GridLayoutGroup } from "./grids";
5
+ import { isLine, isBlock } from "./notation";
5
6
  const ZERO = TSU.Num.Fraction.ZERO;
6
7
  const ONE = TSU.Num.Fraction.ONE;
7
8
  export class Beat {
@@ -199,11 +200,11 @@ export class BeatColDAG {
199
200
  }
200
201
  }
201
202
  export class GlobalBeatLayout {
202
- constructor() {
203
+ constructor(sharedGridLayoutGroup) {
203
204
  this.gridModelsForLine = new Map();
204
205
  this.roleBeatsForLine = new Map();
205
206
  this.beatColDAGsByLP = new Map();
206
- this.gridLayoutGroup = new GridLayoutGroup();
207
+ this.gridLayoutGroup = sharedGridLayoutGroup !== null && sharedGridLayoutGroup !== void 0 ? sharedGridLayoutGroup : new GridLayoutGroup();
207
208
  }
208
209
  getGridModelForLine(lineid) {
209
210
  let out = this.gridModelsForLine.get(lineid) || null;
@@ -229,6 +230,22 @@ export class GlobalBeatLayout {
229
230
  this.lineToRoleBeats(line, gridModel);
230
231
  (_b = gridModel.eventHub) === null || _b === void 0 ? void 0 : _b.commitBatch();
231
232
  }
233
+ processBlock(block) {
234
+ for (const child of block.children()) {
235
+ this.processBlockItem(child);
236
+ }
237
+ }
238
+ processBlockItem(item) {
239
+ if (isLine(item)) {
240
+ const line = item;
241
+ if (!line.isEmpty && line.layoutParams != null) {
242
+ this.addLine(line);
243
+ }
244
+ }
245
+ else if (isBlock(item)) {
246
+ this.processBlock(item);
247
+ }
248
+ }
232
249
  lineToRoleBeats(line, gridModel) {
233
250
  const lp = line.layoutParams;
234
251
  const roleBeats = [];