UNPKG

@prantlf/railroad-diagrams

Version:

JavaScript library and command-line tools for drawing railroad syntax diagrams to SVG.

3 lines (2 loc) 28.4 kB
!function(t,h){"object"==typeof exports&&"undefined"!=typeof module?h(exports):"function"==typeof define&&define.amd?define(["exports"],h):h((t=t||self).railroadDiagrams={})}(this,(function(t){"use strict";const h={},i={DEBUG:!1,VS:8,AR:10,DIAGRAM_CLASS:"railroad-diagram",STROKE_ODD_PIXEL_LENGTH:!0,INTERNAL_ALIGNMENT:"center",CHAR_WIDTH:8.5,COMMENT_CHAR_WIDTH:7},e="\n\tsvg {\n\t\tbackground-color: hsl(30,20%,95%);\n\t}\n\tpath {\n\t\tstroke-width: 3;\n\t\tstroke: black;\n\t\tfill: rgba(0,0,0,0);\n\t}\n\ttext {\n\t\tfont: bold 14px monospace;\n\t\ttext-anchor: middle;\n\t\twhite-space: pre;\n\t}\n\ttext.diagram-text {\n\t\tfont-size: 12px;\n\t}\n\ttext.diagram-arrow {\n\t\tfont-size: 16px;\n\t}\n\ttext.label {\n\t\ttext-anchor: start;\n\t}\n\ttext.comment {\n\t\tfont: italic 12px monospace;\n\t}\n\tg.non-terminal text {\n\t\t/*font-style: italic;*/\n\t}\n\trect {\n\t\tstroke-width: 3;\n\t\tstroke: black;\n\t\tfill: hsl(120,100%,90%);\n\t}\n\trect.group-box {\n\t\tstroke: gray;\n\t\tstroke-dasharray: 10 5;\n\t\tfill: none;\n\t}\n\tpath.diagram-text {\n\t\tstroke-width: 3;\n\t\tstroke: black;\n\t\tfill: white;\n\t\tcursor: help;\n\t}\n\tg.diagram-text:hover path.diagram-text {\n\t\tfill: #eee;\n\t}";class s{constructor(t,h,i){this.children=i||[],this.tagName=t,this.attrs=E(h,{})}format(){}addTo(t){if(t instanceof s)return t.children.push(this),this;var h=this.toSVG();return t.appendChild(h),h}toSVG(){var t=function(t,h,i){h=h||{},i=i||"";var e=document.createElementNS("http://www.w3.org/2000/svg",t);for(var s in h)"xlink:href"===s?e.setAttributeNS("http://www.w3.org/1999/xlink","href",h[s]):e.setAttribute(s,h[s]);return e.textContent=i,e}(this.tagName,this.attrs);return"string"==typeof this.children?t.textContent=this.children:this.children.forEach((function(h){t.appendChild(h.toSVG())})),t}toString(){var t="<"+this.tagName,h="g"==this.tagName||"svg"==this.tagName;for(var i in this.attrs)t+=" "+i+'="'+(this.attrs[i]+"").replace(/&/g,"&amp;").replace(/"/g,"&quot;")+'"';return t+=">",h&&(t+="\n"),"string"==typeof this.children?t+=this.children.replace(/[*_`[\]<&]/g,(function(t){return"&#"+t.charCodeAt(0)+";"})):this.children.forEach((function(h){t+=h})),t+="</"+this.tagName+">\n"}walk(t){t(this)}}class a extends s{constructor(t,h){super("path"),this.attrs.d="M"+t+" "+h}m(t,h){return this.attrs.d+="m"+t+" "+h,this}h(t){return this.attrs.d+="h"+t,this}right(t){return this.h(Math.max(0,t))}left(t){return this.h(-Math.max(0,t))}v(t){return this.attrs.d+="v"+t,this}down(t){return this.v(Math.max(0,t))}up(t){return this.v(-Math.max(0,t))}arc(t){var h,e=i.AR,s=i.AR;return"e"!=t[0]&&"w"!=t[1]||(e*=-1),"s"!=t[0]&&"n"!=t[1]||(s*=-1),h="ne"==t||"es"==t||"sw"==t||"wn"==t?1:0,this.attrs.d+="a"+i.AR+" "+i.AR+" 0 0 "+h+" "+e+" "+s,this}arc_8(t,h){const e=i.AR,s=1/Math.sqrt(2)*e,a=e-s;let n="a "+e+" "+e+" 0 0 "+("cw"==h?"1":"0")+" ";const r=t+h;return n+=("ncw"==r?[s,a]:"necw"==r?[a,s]:"ecw"==r?[-a,s]:"secw"==r?[-s,a]:"scw"==r?[-s,-a]:"swcw"==r?[-a,-s]:"wcw"==r?[a,-s]:"nwcw"==r?[s,-a]:"nccw"==r?[-s,a]:"nwccw"==r?[-a,s]:"wccw"==r?[a,s]:"swccw"==r?[s,a]:"sccw"==r?[s,-a]:"seccw"==r?[a,-s]:"eccw"==r?[-a,-s]:"neccw"==r?[-s,-a]:null).join(" "),this.attrs.d+=n,this}l(t,h){return this.attrs.d+="l"+t+" "+h,this}format(){return this.attrs.d+="h.5",this}}class n extends s{constructor(t,h,i,e){super(t,i,e),this.items=h.map(_)}walk(t){t(this),this.items.forEach(h=>h.walk(t))}}class r extends n{constructor(...t){super("svg",t,{class:i.DIAGRAM_CLASS}),this.items[0]instanceof R||this.items.unshift(new R),this.items[this.items.length-1]instanceof S||this.items.push(new S),this.up=this.down=this.height=this.width=0;for(const t of this.items)this.width+=t.width+(t.needsSpace?20:0),this.up=Math.max(this.up,t.up-this.height),this.height+=t.height,this.down=Math.max(this.down-t.height,t.down);this.formatted=!1}format(t,h,e,n){t=E(t,20),h=E(h,t,20),e=E(e,t,20);var r=n=E(n,h,20),d=t;d+=this.up;for(var o=new s("g",i.STROKE_ODD_PIXEL_LENGTH?{transform:"translate(.5 .5)"}:{}),w=0;w<this.items.length;w++){var c=this.items[w];c.needsSpace&&(new a(r,d).h(10).addTo(o),r+=10),c.format(r,d,c.width).addTo(o),r+=c.width,d+=c.height,c.needsSpace&&(new a(r,d).h(10).addTo(o),r+=10)}return this.attrs.width=this.width+n+h,this.attrs.height=this.up+this.height+this.down+t+e,this.attrs.viewBox="0 0 "+this.attrs.width+" "+this.attrs.height,o.addTo(this),this.formatted=!0,this}addTo(t){if(!t){var h=document.getElementsByTagName("script");t=(h=h[h.length-1]).parentNode}return super.addTo.call(this,t)}toSVG(){return this.formatted||this.format(),super.toSVG.call(this)}toString(){return this.formatted||this.format(),super.toString.call(this)}toStandalone(t){this.formatted||this.format();const h=new s("style",{},t||e);this.children.push(h),this.attrs.xmlns="http://www.w3.org/2000/svg",this.attrs["xmlns:xlink"]="http://www.w3.org/1999/xlink";const i=super.toString.call(this);return this.children.pop(),delete this.attrs.xmlns,i}static fromJSON(t=[]){return G(r,t)}}h.Diagram=(...t)=>new r(...t),h.Diagram.fromJSON=r.fromJSON;class d extends s{constructor(...t){var h=new r(...t);return h.items[0]=new R({type:"complex"}),h.items[h.items.length-1]=new S({type:"complex"}),h}static fromJSON(t=[]){return G(d,t)}}h.ComplexDiagram=(...t)=>new d(...t),h.ComplexDiagram.fromJSON=d.fromJSON;class o extends n{constructor(...t){super("g",t);var h=this.items.length;this.needsSpace=!0,this.up=this.down=this.height=this.width=0;for(var e=0;e<h;e++){var s=this.items[e];this.width+=s.width+(s.needsSpace?20:0),this.up=Math.max(this.up,s.up-this.height),this.height+=s.height,this.down=Math.max(this.down-s.height,s.down)}this.items[0].needsSpace&&(this.width-=10),this.items[h-1].needsSpace&&(this.width-=10),i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="sequence")}format(t,h,i){var e=b(i,this.width);new a(t,h).h(e[0]).addTo(this),new a(t+e[0]+this.width,h+this.height).h(e[1]).addTo(this),t+=e[0];for(var s=0;s<this.items.length;s++){var n=this.items[s];n.needsSpace&&s>0&&(new a(t,h).h(10).addTo(this),t+=10),n.format(t,h,n.width).addTo(this),t+=n.width,h+=n.height,n.needsSpace&&s<this.items.length-1&&(new a(t,h).h(10).addTo(this),t+=10)}return this}}h.Sequence=(...t)=>new o(...t);class w extends n{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("Stack() must have at least one child.");this.width=Math.max.apply(null,this.items.map((function(t){return t.width+(t.needsSpace?20:0)}))),this.items.length>1&&(this.width+=2*i.AR),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var h=this.items.length-1,e=0;e<this.items.length;e++){var s=this.items[e];this.height+=s.height,e>0&&(this.height+=Math.max(2*i.AR,s.up+i.VS)),e<h&&(this.height+=Math.max(2*i.AR,s.down+i.VS))}i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="stack")}format(t,h,e){var s=b(e,this.width);new a(t,h).h(s[0]).addTo(this);var n=t+=s[0];this.items.length>1&&(new a(t,h).h(i.AR).addTo(this),t+=i.AR);for(var r=0;r<this.items.length;r++){var d=this.items[r],o=this.width-(this.items.length>1?2*i.AR:0);d.format(t,h,o).addTo(this),t+=o,h+=d.height,r!==this.items.length-1&&(new a(t,h).arc("ne").down(Math.max(0,d.down+i.VS-2*i.AR)).arc("es").left(o).arc("nw").down(Math.max(0,this.items[r+1].up+i.VS-2*i.AR)).arc("ws").addTo(this),h+=Math.max(d.down+i.VS,2*i.AR)+Math.max(this.items[r+1].up+i.VS,2*i.AR),t=n+i.AR)}return this.items.length>1&&(new a(t,h).h(i.AR).addTo(this),t+=i.AR),new a(t,h).h(s[1]).addTo(this),this}}h.Stack=(...t)=>new w(...t);class c extends n{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("VerticalSequence() must have at least one child.");this.items=t.map(_),this.width=Math.max.apply(null,this.items.map((function(t){return t.width+(t.needsSpace?20:0)}))),this.items.length>1&&(this.width+=2*i.AR),this.needsSpace=!0,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=0;for(var h=this.items.length-1,e=0;e<this.items.length;e++)e!==h&&(this.height+=this.items[e].height+this.items[e].down+this.items[e+1].up+2*i.VS);i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="verticalsequence")}format(t,h,e){var s=b(e,this.width);new a(t,h).h(s[0]).addTo(this);var n=t+=s[0],r=1e3;for(let t in this.items){let h=this.items[t];r=h.width<r?h.width:r}for(var d=0;d<this.items.length;d++){var o=this.items[d];o.format(t,h,o.width).addTo(this),h+=o.height,d!==this.items.length-1?(t+=r/2,h+=o.down,new a(t,h).v(2*i.VS).addTo(this),h+=this.items[d+1].up+2*i.VS,t=n):(t+=o.width,h+=o.height)}return this.items.length>1&&(new a(t,h).h(this.width-this.items[this.items.length-1].width).addTo(this),t+=i.AR),new a(t,h).h(s[1]).addTo(this),this}}h.VerticalSequence=(...t)=>new c(...t);class m extends n{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("OptionalSequence() must have at least one child.");if(1===t.length)return new o(t);var h=i.AR;this.needsSpace=!1,this.width=0,this.up=0,this.height=D(this.items,(function(t){return t.height})),this.down=this.items[0].down;for(var e=0,s=0;s<this.items.length;s++){var a=this.items[s];this.up=Math.max(this.up,Math.max(2*h,a.up+i.VS)-e),e+=a.height,s>0&&(this.down=Math.max(this.height+this.down,e+Math.max(2*h,a.down+i.VS))-this.height);var n=(a.needsSpace?10:0)+a.width;this.width+=0===s?h+Math.max(n,h):2*h+Math.max(n,h)+h}i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="optseq")}format(t,h,e){var s=i.AR,n=b(e,this.width);new a(t,h).right(n[0]).addTo(this),new a(t+n[0]+this.width,h+this.height).right(n[1]).addTo(this),t+=n[0];for(var r=h-this.up,d=this.items.length-1,o=0;o<this.items.length;o++){var w=this.items[o],c=w.needsSpace?10:0,m=w.width+c;0===o?(new a(t,h).arc("se").up(h-r-2*s).arc("wn").right(m-s).arc("ne").down(h+w.height-r-2*s).arc("ws").addTo(this),new a(t,h).right(c+s).addTo(this),w.format(t+c+s,h,w.width).addTo(this),t+=m+s,h+=w.height):o<d?(new a(t,r).right(2*s+Math.max(m,s)+s).arc("ne").down(h-r+w.height-2*s).arc("ws").addTo(this),new a(t,h).right(2*s).addTo(this),w.format(t+2*s,h,w.width).addTo(this),new a(t+w.width+2*s,h+w.height).right(c+s).addTo(this),new a(t,h).arc("ne").down(w.height+Math.max(w.down+i.VS,2*s)-2*s).arc("ws").right(m-s).arc("se").up(w.down+i.VS-2*s).arc("wn").addTo(this),t+=2*s+Math.max(m,s)+s,h+=w.height):(new a(t,h).right(2*s).addTo(this),w.format(t+2*s,h,w.width).addTo(this),new a(t+2*s+w.width,h+w.height).right(c+s).addTo(this),new a(t,h).arc("ne").down(w.height+Math.max(w.down+i.VS,2*s)-2*s).arc("ws").right(m-s).arc("se").up(w.down+i.VS-2*s).arc("wn").addTo(this))}return this}}h.OptionalSequence=(...t)=>new m(...t);class l extends n{constructor(...t){if(super("g",t),1===t.length)return new o(t);if(2!==t.length)throw new RangeError("AlternatingSequence() must have one or two children.");this.needsSpace=!1;const h=i.AR,e=i.VS,s=Math.max,a=this.items[0],n=this.items[1],r=1/Math.sqrt(2)*h*2,d=(1-1/Math.sqrt(2))*h*2,w=Math.max(h,i.VS),c=w-d+r,m=s(h+h,w/2+h+h,w/2+e+a.down);this.up=m+a.height+a.up;const l=s(h+h,w/2+h+h,w/2+e+n.up);this.down=l+n.height+n.down,this.height=0;const u=2*(a.needsSpace?10:0)+a.width,p=2*(n.needsSpace?10:0)+n.width;this.width=2*h+s(u,c,p)+2*h,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="altseq")}format(t,h,e){const s=i.AR,n=b(e,this.width);new a(t,h).right(n[0]).addTo(this),t+=n[0],new a(t+this.width,h).right(n[1]).addTo(this);const r=this.items[0],d=this.items[1],o=this.up-r.up,w=this.up-r.up-r.height;new a(t,h).arc("se").up(o-2*s).arc("wn").addTo(this),r.format(t+2*s,h-o,this.width-4*s).addTo(this),new a(t+this.width-2*s,h-w).arc("ne").down(w-2*s).arc("ws").addTo(this);const c=this.down-d.down-d.height,m=this.down-d.down;new a(t,h).arc("ne").down(c-2*s).arc("ws").addTo(this),d.format(t+2*s,h+c,this.width-4*s).addTo(this),new a(t+this.width-2*s,h+m).arc("se").up(m-2*s).arc("wn").addTo(this);const l=1/Math.sqrt(2)*s*2,u=(1-1/Math.sqrt(2))*s*2,p=Math.max(s,i.VS),g=p-u+l,f=(this.width-4*s-g)/2;return new a(t+s,h-p/2-s).arc("ws").right(f).arc_8("n","cw").l(g-l,p-u).arc_8("sw","ccw").right(f).arc("ne").addTo(this),new a(t+s,h+p/2+s).arc("wn").right(f).arc_8("s","ccw").l(g-l,-(p-u)).arc_8("nw","cw").right(f).arc("se").addTo(this),this}}h.AlternatingSequence=(...t)=>new l(...t);class u extends n{constructor(t,...h){if(super("g",h),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of Choice() must be an integer.");if(t<0||t>=h.length)throw new RangeError("The first argument of Choice() must be an index for one of the items.");this.normal=t;var e,s=h.length-1;this.width=Math.max.apply(null,this.items.map((function(t){return t.width})))+4*i.AR,this.height=this.items[t].height,this.up=this.items[0].up;for(var a=0;a<t;a++)e=a==t-1?2*i.AR:i.AR,this.up+=Math.max(e,this.items[a].height+this.items[a].down+i.VS+this.items[a+1].up);for(this.down=this.items[s].down,a=t+1;a<=s;a++)e=a==t+1?2*i.AR:i.AR,this.down+=Math.max(e,this.items[a-1].height+this.items[a-1].down+i.VS+this.items[a].up);this.down-=this.items[t].height,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="choice")}format(t,h,e){var s=b(e,this.width);new a(t,h).h(s[0]).addTo(this),new a(t+s[0]+this.width,h+this.height).h(s[1]).addTo(this),t+=s[0];for(var n,r=this.items.length-1,d=this.width-4*i.AR,o=this.normal-1;o>=0;o--){let e=this.items[o];o==this.normal-1&&(n=Math.max(2*i.AR,this.items[this.normal].up+i.VS+e.down+e.height)),new a(t,h).arc("se").up(n-2*i.AR).arc("wn").addTo(this),e.format(t+2*i.AR,h-n,d).addTo(this),new a(t+2*i.AR+d,h-n+e.height).arc("ne").down(n-e.height+this.height-2*i.AR).arc("ws").addTo(this),n+=Math.max(i.AR,e.up+i.VS+(0===o?0:this.items[o-1].down+this.items[o-1].height))}for(new a(t,h).right(2*i.AR).addTo(this),this.items[this.normal].format(t+2*i.AR,h,d).addTo(this),new a(t+2*i.AR+d,h+this.height).right(2*i.AR).addTo(this),o=this.normal+1;o<=r;o++){let e=this.items[o];o==this.normal+1&&(n=Math.max(2*i.AR,this.height+this.items[this.normal].down+i.VS+e.up)),new a(t,h).arc("ne").down(n-2*i.AR).arc("ws").addTo(this),e.format(t+2*i.AR,h+n,d).addTo(this),new a(t+2*i.AR+d,h+n+e.height).arc("se").up(n-2*i.AR+e.height-this.height).arc("wn").addTo(this),n+=Math.max(i.AR,e.height+e.down+i.VS+(o==r?0:this.items[o+1].up))}return this}}h.Choice=(...t)=>new u(...t);class p extends n{constructor(...t){if(super("g",t),0===t.length)throw new RangeError("HorizontalChoice() must have at least one child.");if(1===t.length)return new o(t);const h=this.items.slice(0,-1),e=this.items.slice(1,-1),s=this.items[0],a=this.items[this.items.length-1];this.needsSpace=!1,this.width=i.AR,this.width+=2*i.AR*(this.items.length-1),this.width+=D(this.items,t=>t.width+(t.needsSpace?20:0)),this.width+=a.height>0?i.AR:0,this.width+=i.AR,this.height=0,this._upperTrack=Math.max(2*i.AR,i.VS,C(h,t=>t.up)+i.VS),this.up=Math.max(this._upperTrack,a.up),this._lowerTrack=Math.max(i.VS,C(e,t=>t.height+Math.max(t.down+i.VS,2*i.AR)),a.height+a.down+i.VS),s.height<this._lowerTrack&&(this._lowerTrack=Math.max(this._lowerTrack,s.height+2*i.AR)),this.down=Math.max(this._lowerTrack,s.height+s.down),i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="horizontalchoice")}format(t,h,e){var s=b(e,this.width);new a(t,h).h(s[0]).addTo(this),new a(t+s[0]+this.width,h+this.height).h(s[1]).addTo(this),t+=s[0];const n=this.items[0],r=this.items[this.items.length-1],d=this.items.slice(1);var o=D(this.items.slice(0,-1),t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*i.AR*2-i.AR;new a(t,h).arc("se").v(-(this._upperTrack-2*i.AR)).arc("wn").h(o).addTo(this);var w=D(d,t=>t.width+(t.needsSpace?20:0))+(this.items.length-2)*i.AR*2+(r.height>0?i.AR:0)-i.AR,c=t+i.AR+n.width+(n.needsSpace?20:0)+2*i.AR;new a(c,h+this._lowerTrack).h(w).arc("se").v(-(this._lowerTrack-2*i.AR)).arc("wn").addTo(this);for(const[e,s]of function*(t){var h=0;for(const i of t)yield[h,i],h++}(this.items)){0===e?(new a(t,h).h(i.AR).addTo(this),t+=i.AR):(new a(t,h-this._upperTrack).arc("ne").v(this._upperTrack-2*i.AR).arc("ws").addTo(this),t+=2*i.AR);var m=s.width+(s.needsSpace?20:0);s.format(t,h,m).addTo(this),t+=m,e===this.items.length-1?0===s.height?new a(t,h).h(i.AR).addTo(this):new a(t,h+s.height).arc("se").addTo(this):0===e&&s.height>this._lowerTrack?s.height-this._lowerTrack>=2*i.AR?new a(t,h+s.height).arc("se").v(this._lowerTrack-s.height+2*i.AR).arc("wn").addTo(this):new a(t,h+s.height).l(2*i.AR,this._lowerTrack-s.height).addTo(this):new a(t,h+s.height).arc("ne").v(this._lowerTrack-s.height-2*i.AR).arc("ws").addTo(this)}return this}}h.HorizontalChoice=(...t)=>new p(...t);class g extends n{constructor(t,h,...e){if(super("g",e),"number"!=typeof t||t!==Math.floor(t))throw new TypeError("The first argument of MultipleChoice() must be an integer.");if(t<0||t>=e.length)throw new RangeError("The first argument of MultipleChoice() must be an index for one of the items.");if(this.normal=t,"any"!=h&&"all"!=h)throw new SyntaxError("The second argument of MultipleChoice must be 'any' or 'all'.");this.type=h,this.needsSpace=!0,this.innerWidth=C(this.items,(function(t){return t.width})),this.width=30+i.AR+this.innerWidth+i.AR+20,this.up=this.items[0].up,this.down=this.items[this.items.length-1].down,this.height=this.items[t].height;for(var s=0;s<this.items.length;s++){let h,e=this.items[s];h=s==t-1||s==t+1?10+i.AR:i.AR,s<t?this.up+=Math.max(h,e.height+e.down+i.VS+this.items[s+1].up):s>t&&(this.down+=Math.max(h,e.up+i.VS+this.items[s-1].down+this.items[s-1].height))}this.down-=this.items[t].height,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="multiplechoice")}format(t,h,e){var n=b(e,this.width);new a(t,h).right(n[0]).addTo(this),new a(t+n[0]+this.width,h+this.height).right(n[1]).addTo(this),t+=n[0];for(var r,d=this.items[this.normal],o=this.normal-1;o>=0;o--){var w=this.items[o];o==this.normal-1&&(r=Math.max(10+i.AR,d.up+i.VS+w.down+w.height)),new a(t+30,h).up(r-i.AR).arc("wn").addTo(this),w.format(t+30+i.AR,h-r,this.innerWidth).addTo(this),new a(t+30+i.AR+this.innerWidth,h-r+w.height).arc("ne").down(r-w.height+this.height-i.AR-10).addTo(this),0!==o&&(r+=Math.max(i.AR,w.up+i.VS+this.items[o-1].down+this.items[o-1].height))}for(new a(t+30,h).right(i.AR).addTo(this),d.format(t+30+i.AR,h,this.innerWidth).addTo(this),new a(t+30+i.AR+this.innerWidth,h+this.height).right(i.AR).addTo(this),o=this.normal+1;o<this.items.length;o++){let e=this.items[o];o==this.normal+1&&(r=Math.max(10+i.AR,d.height+d.down+i.VS+e.up)),new a(t+30,h).down(r-i.AR).arc("ws").addTo(this),e.format(t+30+i.AR,h+r,this.innerWidth).addTo(this),new a(t+30+i.AR+this.innerWidth,h+r+e.height).arc("se").up(r-i.AR+e.height-d.height).addTo(this),o!=this.items.length-1&&(r+=Math.max(i.AR,e.height+e.down+i.VS+this.items[o+1].up))}var c=new s("g",{class:"diagram-text"}).addTo(this);return new s("title",{},"any"==this.type?"take one or more branches, once each, in any order":"take all branches, once each, in any order").addTo(c),new s("path",{d:"M "+(t+30)+" "+(h-10)+" h -26 a 4 4 0 0 0 -4 4 v 12 a 4 4 0 0 0 4 4 h 26 z",class:"diagram-text"}).addTo(c),new s("text",{x:t+15,y:h+4,class:"diagram-text"},"any"==this.type?"1+":"all").addTo(c),new s("path",{d:"M "+(t+this.width-20)+" "+(h-10)+" h 16 a 4 4 0 0 1 4 4 v 12 a 4 4 0 0 1 -4 4 h -16 z",class:"diagram-text"}).addTo(c),new s("path",{d:"M "+(t+this.width-13)+" "+(h-2)+" a 4 4 0 1 0 6 -1 m 2.75 -1 h -4 v 4 m 0 -3 h 2",style:"stroke-width: 1.75"}).addTo(c),this}}h.MultipleChoice=(...t)=>new g(...t);class f extends s{constructor(t,h){if(void 0===h)return new u(1,new k,t);if("skip"===h)return new u(0,new k,t);throw"Unknown value for Optional()'s 'skip' argument."}}h.Optional=(...t)=>new f(...t);class T extends s{constructor(t,h){super("g"),h=h||new k,this.item=_(t),this.rep=_(h),this.width=Math.max(this.item.width,this.rep.width)+2*i.AR,this.height=this.item.height,this.up=this.item.up,this.down=Math.max(2*i.AR,this.item.down+i.VS+this.rep.up+this.rep.height+this.rep.down),this.needsSpace=!0,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="oneormore")}format(t,h,e){var s=b(e,this.width);new a(t,h).h(s[0]).addTo(this),new a(t+s[0]+this.width,h+this.height).h(s[1]).addTo(this),t+=s[0],new a(t,h).right(i.AR).addTo(this),this.item.format(t+i.AR,h,this.width-2*i.AR).addTo(this),new a(t+this.width-i.AR,h+this.height).right(i.AR).addTo(this);var n=Math.max(2*i.AR,this.item.height+this.item.down+i.VS+this.rep.up);return new a(t+i.AR,h).arc("nw").down(n-2*i.AR).arc("ws").addTo(this),this.rep.format(t+i.AR,h+n,this.width-2*i.AR).addTo(this),new a(t+this.width-i.AR,h+n+this.rep.height).arc("se").up(n-2*i.AR+this.rep.height-this.item.height).arc("en").addTo(this),this}walk(t){t(this),this.item.walk(t),this.rep.walk(t)}}h.OneOrMore=(...t)=>new T(...t);class x extends s{constructor(t,h,i){return new f(new T(t,h),i)}}h.ZeroOrMore=(...t)=>new x(...t);class A extends s{constructor(t,h){super("g"),this.item=_(t),this.label=h instanceof s?h:h?new y(h):void 0,this.width=Math.max(this.item.width+(this.item.needsSpace?20:0),this.label?this.label.width:0,2*i.AR),this.height=this.item.height,this.boxUp=this.up=Math.max(this.item.up+i.VS,i.AR),this.label&&(this.up+=this.label.up+this.label.height+this.label.down),this.down=Math.max(this.item.down+i.VS,i.AR),this.needsSpace=!0,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="group")}format(t,h,e){var n=b(e,this.width);return new a(t,h).h(n[0]).addTo(this),new a(t+n[0]+this.width,h+this.height).h(n[1]).addTo(this),t+=n[0],new s("rect",{x:t,y:h-this.boxUp,width:this.width,height:this.boxUp+this.height+this.down,rx:i.AR,ry:i.AR,class:"group-box"}).addTo(this),this.item.format(t,h,this.width).addTo(this),this.label&&this.label.format(t,h-(this.boxUp+this.label.down+this.label.height),this.label.width).addTo(this),this}walk(t){t(this),this.item.walk(t),this.label.walk(t)}}h.Group=(...t)=>new A(...t);class R extends s{constructor({type:t="simple",label:h}={}){super("g"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,h&&(this.label=""+h,this.width=Math.max(20,this.label.length*i.CHAR_WIDTH+10)),i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="start")}format(t,h){let i=new a(t,h-10);return"complex"===this.type?i.down(20).m(0,-10).right(this.width).addTo(this):i.down(20).m(10,-20).down(20).m(-10,-10).right(this.width).addTo(this),this.label&&new s("text",{x:t,y:h-15,style:"text-anchor:start"},this.label).addTo(this),this}}h.Start=(...t)=>new R(...t);class S extends s{constructor({type:t="simple"}={}){super("path"),this.width=20,this.height=0,this.up=10,this.down=10,this.type=t,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="end")}format(t,h){return"complex"===this.type?this.attrs.d="M "+t+" "+h+" h 20 m 0 -10 v 20":this.attrs.d="M "+t+" "+h+" h 20 m -10 -10 v 20 m 10 -20 v 20",this}}h.End=(...t)=>new S(...t);class v extends s{constructor(t,{href:h,title:e}={}){super("g",{class:"terminal"}),this.text=""+t,this.href=h,this.title=e,this.width=this.text.length*i.CHAR_WIDTH+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="terminal")}format(t,h,i){var e=b(i,this.width);new a(t,h).h(e[0]).addTo(this),new a(t+e[0]+this.width,h).h(e[1]).addTo(this),t+=e[0],new s("rect",{x:t,y:h-11,width:this.width,height:this.up+this.down,rx:10,ry:10}).addTo(this);var n=new s("text",{x:t+this.width/2,y:h+4},this.text);return this.href?new s("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new s("title",{},[this.title]).addTo(this),this}}h.Terminal=(...t)=>new v(...t);class M extends s{constructor(t,{href:h,title:e}={}){super("g",{class:"non-terminal"}),this.text=""+t,this.href=h,this.title=e,this.width=this.text.length*i.CHAR_WIDTH+20,this.height=0,this.up=11,this.down=11,this.needsSpace=!0,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="nonterminal")}format(t,h,i){var e=b(i,this.width);new a(t,h).h(e[0]).addTo(this),new a(t+e[0]+this.width,h).h(e[1]).addTo(this),t+=e[0],new s("rect",{x:t,y:h-11,width:this.width,height:this.up+this.down}).addTo(this);var n=new s("text",{x:t+this.width/2,y:h+4},this.text);return this.href?new s("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new s("title",{},[this.title]).addTo(this),this}}h.NonTerminal=(...t)=>new M(...t);class y extends s{constructor(t,{href:h,title:e}={}){super("g"),this.text=""+t,this.href=h,this.title=e,this.width=this.text.length*i.COMMENT_CHAR_WIDTH+10,this.height=0,this.up=8,this.down=8,this.needsSpace=!0,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="comment")}format(t,h,i){var e=b(i,this.width);new a(t,h).h(e[0]).addTo(this),new a(t+e[0]+this.width,h+this.height).h(e[1]).addTo(this),t+=e[0];var n=new s("text",{x:t+this.width/2,y:h+5,class:"comment"},this.text);return this.href?new s("a",{"xlink:href":this.href},[n]).addTo(this):n.addTo(this),this.title&&new s("title",{},this.title).addTo(this),this}}h.Comment=(...t)=>new y(...t);class k extends s{constructor(){super("g"),this.width=0,this.height=0,this.up=0,this.down=0,this.needsSpace=!1,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="skip")}format(t,h,i){return new a(t,h).right(i).addTo(this),this}}h.Skip=(...t)=>new k(...t);class V extends s{constructor({width:t=50,up:h=15,height:e=25,down:s=15,needsSpace:a=!0}={}){super("g"),this.width=t,this.height=e,this.up=h,this.down=s,this.needsSpace=a,i.DEBUG&&(this.attrs["data-updown"]=this.up+" "+this.height+" "+this.down,this.attrs["data-type"]="block")}format(t,h,i){var e=b(i,this.width);return new a(t,h).h(e[0]).addTo(this),new a(t+e[0]+this.width,h).h(e[1]).addTo(this),t+=e[0],new s("rect",{x:t,y:h-this.up,width:this.width,height:this.up+this.height+this.down}).addTo(this),this}}function E(...t){return t.reduce((function(t,h){return void 0!==t?t:h}))}function b(t,h){var e=t-h;switch(i.INTERNAL_ALIGNMENT){case"left":return[0,e];case"right":return[e,0];default:return[e/2,e/2]}}function _(t){return t instanceof s?t:new v(""+t)}function D(t,h){return h||(h=function(t){return t}),t.map(h).reduce((function(t,h){return t+h}),0)}function C(t,h){return h||(h=function(t){return t}),Math.max.apply(null,t.map(h))}function G(t,h){if(!h)return new t;if(Array.isArray(h))return new t(...h.map(O));switch(h.type){case"Diagram":case"ComplexDiagram":return O(h)}return new t(O(h))}h.Block=(...t)=>new V(...t);const N={Diagram:r,ComplexDiagram:d,Sequence:o,Stack:w,VerticalSequence:c,OptionalSequence:m,HorizontalChoice:p,AlternatingSequence:l,Choice:u,MultipleChoice:g,Optional:f,OneOrMore:T,ZeroOrMore:x,Group:A,Start:R,End:S,Terminal:v,NonTerminal:M,Comment:y,Skip:k};function O(t){if(!t)return;const h=N[t.type];switch(h){case r:case d:case o:case w:case c:case m:case p:return new h(...q(t.items));case l:return new h(O(t.option1),O(t.option2));case u:return new h(t.normalIndex||0,...q(t.options));case g:return new h(t.normalIndex||0,t.choiceType,...q(t.options));case f:return new h(O(t.item),t.skip&&"skip");case T:return new h(O(t.item),O(t.repeat));case x:return new h(O(t.item),O(t.repeat),t.skip&&"skip");case A:return new h(O(t.item),t.label);case R:return new h(t.startType,t.label);case S:return new h(t.endType);case v:case M:case y:return new h(t.text,{href:t.href,title:t.title});case k:return new h}throw new Error(`Unknown node type: "${t.type}".`)}function q(t){return t?t.map(O):[]}t.AlternatingSequence=l,t.Block=V,t.Choice=u,t.Comment=y,t.ComplexDiagram=d,t.Diagram=r,t.DiagramMultiContainer=n,t.End=S,t.FakeSVG=s,t.Group=A,t.HorizontalChoice=p,t.MultipleChoice=g,t.NonTerminal=M,t.OneOrMore=T,t.Optional=f,t.OptionalSequence=m,t.Options=i,t.Path=a,t.Sequence=o,t.Skip=k,t.Stack=w,t.Start=R,t.Terminal=v,t.VerticalSequence=c,t.ZeroOrMore=x,t.default=h,t.defaultCSS=e,Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=index.umd.min.js.map