1- //==============================================================================
1+ //====================================================================
22// mercury.js
33// by Timo Hoogland (@t.mo / @tmhglnd), www.timohoogland.com
44// GNU GPL-3.0 License
55//
66// The Mercury Parser and Ring Methods
77// Using the total-serialism node package
8- //==============================================================================
8+ //====================================================================
99
1010const max = require ( 'max-api' ) ;
11+ // const moo = require('moo');
12+
1113const Gen = require ( 'total-serialism' ) . Generative ;
1214const Algo = require ( 'total-serialism' ) . Algorithmic ;
1315const Mod = require ( 'total-serialism' ) . Transform ;
@@ -18,6 +20,11 @@ const Dict = require('./dictionary.js');
1820
1921var dict = new Dict ( ) ;
2022
23+ // let lexer = moo.compile({
24+ // string: /["|'|\`](?:\\["\\]|[^\n"\\])*["|'|\`]/,
25+ // rest: moo.error
26+ // })
27+
2128const handlers = {
2229 // parse the input strings from code editor
2330 // seperate lines are input as a string of characters
@@ -37,17 +44,18 @@ const handlers = {
3744 // input the ring, get the varname
3845 // and join the expression to string to be parsed
3946 'ring' : ( name , ...args ) => {
40- // console.log('ring', '@name', name, '@args', args);
4147 if ( args < 1 ) {
4248 // do nothing if not enough arguments
43- console . error ( "not enough arguments for method ring" ) ;
49+ max . post ( "not enough arguments for method ring" ) ;
4450 return ;
4551 }
46- console . log ( " ring", "@ name" , name , "@ args" , ...args ) ;
52+ // max.post("@ ring", "name: ", name, "args: ", ...args);
4753 if ( isNaN ( name ) ) {
4854 let expr = args . join ( ' ' ) ;
4955 let parsed = parseString ( expr ) ;
56+ // max.post('@parseString', parsed);
5057 let eval = evaluateParse ( parsed ) ;
58+ // max.post('@eval', eval);
5159
5260 let arr = [ ] ;
5361 for ( i in eval ) {
@@ -56,7 +64,7 @@ const handlers = {
5664 dict . set ( name , arr ) ;
5765 } else {
5866 // numbers are not allowed as ring name
59- console . error ( "Ring :", name , "is not a valid name" ) ;
67+ max . post ( "ring :", name , "is not a valid name" ) ;
6068 }
6169 } ,
6270 // All the Array transformation/generation methods
@@ -366,28 +374,28 @@ max.addHandlers(handlers);
366374function mainParse ( lines ) {
367375 // remove double whitespaces
368376 lines = lines . slice ( ) . map ( x => x . replace ( / \s { 2 , } / g, ' ' ) ) ;
369- // max.post("@mainParse", lines);
377+ max . post ( "@mainParse" , lines ) ;
370378
371379 let rings = [ ] ;
372380 let other = [ ] ;
373381 // regular expression to match rings
374- let r = / r i n g \ .+ / ;
382+ let ring = / r i n g \ .+ / ;
375383 let seed = / s e t \ r a n d o m S e e d \ .+ / ;
376384 let scale = / s e t \ s c a l e \ .+ / ;
377385 let tempo = / s e t \ t e m p o \ .+ / ;
378386 let mute = / ( s i l e n c e | m u t e | k i l l A l l ) / ;
379387
380388 for ( let i in lines ) {
381389 l = lines [ i ] ;
382- if ( r . test ( l ) ) {
390+ if ( ring . test ( l ) ) {
383391 rings . push ( l ) ;
384392 } else if ( seed . test ( l ) || scale . test ( l ) || tempo . test ( l ) ) {
385393 other . push ( l ) ;
386394 let expr = l . split ( ' ' ) ;
387395 expr . shift ( ) ;
388396 mainFunc . call ( handlers , ...expr ) ;
389397 } else if ( mute . test ( l ) ) {
390- max . post ( "silence detected " ) ;
398+ max . post ( "@ silence" ) ;
391399 other . push ( "silence" ) ;
392400 } else {
393401 other . push ( l ) ;
@@ -397,14 +405,38 @@ function mainParse(lines){
397405 mainFunc . call ( handlers , 'clear' ) ;
398406
399407 for ( let r in rings ) {
408+ // max.post('@ring', rings[r]);
400409 let params = rings [ r ] . split ( ' ' ) ;
401410 mainFunc . call ( handlers , ...params ) ;
402411 }
403412 // output the new variables dictionary
404413 max . outlet ( dict . items ) ;
405414
406415 for ( let o in other ) {
407- let expr = other [ o ] . split ( ' ' ) . map ( x => parseNumber ( x ) ) ;
416+ // let string = /["|'|\`](?:\\["\\]|[^\n"\\])*["|'|\`]/g;
417+ // max.post('@string', string.exec(other[o]));
418+ let expr = [ ] ;
419+ let s = '' ;
420+ let isString = false ;
421+ for ( let char in other [ o ] ) {
422+ let c = other [ o ] . charAt ( char ) ;
423+ if ( c === '"' || c === "'" || c === "`" ) {
424+ if ( isString ) {
425+ expr . push ( s ) ;
426+ } else {
427+ expr = expr . concat ( s . split ( ' ' ) . filter ( i => i ) . map ( x => parseNumber ( x ) ) ) ;
428+ }
429+ isString = ! isString ;
430+ s = '' ;
431+ } else {
432+ s += c ;
433+ }
434+ }
435+ expr = expr . concat ( s . split ( ' ' ) . filter ( i => i ) . map ( x => parseNumber ( x ) ) ) ;
436+ // expr.push(s);
437+
438+ // expr = other[o].split(' ').map(x => parseNumber(x));
439+ max . post ( '@parsed' , expr ) ;
408440 max . outlet ( 'parsed' , ...expr ) ;
409441 }
410442 max . outlet ( 'done' ) ;
@@ -468,7 +500,7 @@ function parseParam(v){
468500}
469501
470502// parse the input string to an array of values and
471- // possible function name. excepts multi-dimensional arrays
503+ // possible function name. accepts multi-dimensional arrays
472504// arrays of 3 dimension or higher will be stripped down to 2d
473505//
474506function parseString ( str ) {
0 commit comments