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