1// abc2svg - ABC to SVG translator 2// @source: https://chiselapp.com/user/moinejf/repository/abc2svg 3// Copyright (C) 2014-2020 Jean-Francois Moine - LGPL3+ 4//break.js-module to handle the%%break command 5abc2svg.break={get_break:function(parm){var C=abc2svg.C,b,c,d,sq,a=parm.split(/[ ,]/),cfmt=this.cfmt() 6if(!cfmt.break) 7cfmt.break=[] 8for(n=1;n<a.length;n++){b=a[n];c=b.match(/(\d+)([a-z]?)(:\d+\/\d+)?/) 9if(!c){this.syntax(1,this.errs.bad_val,"%%break") 10continue} 11if(c[2]) 12sq=c[2].charCodeAt(0)-0x61 13if(!c[3]){cfmt.break.push({m:c[1],t:0,sq:sq}) 14continue} 15d=c[3].match(/:(\d+)\/(\d+)/) 16if(!d||d[2]<1){this.syntax(1,"Bad denominator in %%break") 17continue} 18cfmt.break.push({m:c[1],t:d[1]*C.BLEN/d[2],sq:sq})}},do_break:function(){var i,m,t,brk,seq,voice_tb=this.get_voice_tb() 19v=this.get_cur_sy().top_voice,s1=voice_tb[v].sym,cfmt=this.cfmt() 20for(i=0;i<cfmt.break.length;i++){brk=cfmt.break[i];m=brk.m 21for(s=s1;s;s=s.next){if(s.bar_num==m) 22break} 23if(!s) 24continue 25if(brk.sq){seq=brk.sq 26for(s=s.ts_next;s;s=s.ts_next){if(s.bar_num==m){if(--seq==0) 27break}} 28if(!s) 29continue} 30t=brk.t 31if(t){t=s.time+t 32for(;s;s=s.next){if(s.time>=t) 33break}}else{s=s.next} 34if(s) 35s.soln=true}},do_pscom:function(of,text){if(text.slice(0,6)=="break ") 36abc2svg.break.get_break.call(this,text) 37else 38of(text)},set_bar_num:function(of){of() 39if(this.cfmt().break) 40abc2svg.break.do_break.call(this)},set_hooks:function(abc){abc.do_pscom=abc2svg.break.do_pscom.bind(abc,abc.do_pscom);abc.set_bar_num=abc2svg.break.set_bar_num.bind(abc,abc.set_bar_num)}} 41abc2svg.modules.hooks.push(abc2svg.break.set_hooks);abc2svg.modules.break.loaded=true 42