From 85e157f0d346b2bedb17f0f0ebb535717f640501 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Sat, 30 Apr 2022 11:36:00 +0200 Subject: [PATCH 01/13] Updated flowcharts with the new syntax --- flow.js | 1051 ++++++++++++++++++++ src/commonDb.js | 34 + src/diagrams/flowchart/flowDb.js | 25 +- src/diagrams/flowchart/parser/flow.jison | 37 +- src/diagrams/flowchart/parser/flow.spec.js | 29 +- 5 files changed, 1137 insertions(+), 39 deletions(-) create mode 100644 flow.js create mode 100644 src/commonDb.js diff --git a/flow.js b/flow.js new file mode 100644 index 0000000000..b5201052fa --- /dev/null +++ b/flow.js @@ -0,0 +1,1051 @@ +/* parser generated by jison 0.4.18 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var flow = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,9],$V1=[1,7],$V2=[1,6],$V3=[1,8],$V4=[1,20,21,22,23,38,44,46,48,54,68,69,88,89,90,91,92,93,97,107,108,111,113,114,120,121,122,123,124,125,126,127,128,129],$V5=[2,10],$V6=[1,20],$V7=[1,21],$V8=[1,22],$V9=[1,23],$Va=[1,30],$Vb=[1,32],$Vc=[1,33],$Vd=[1,34],$Ve=[1,62],$Vf=[1,48],$Vg=[1,52],$Vh=[1,36],$Vi=[1,37],$Vj=[1,38],$Vk=[1,39],$Vl=[1,40],$Vm=[1,56],$Vn=[1,63],$Vo=[1,51],$Vp=[1,53],$Vq=[1,55],$Vr=[1,59],$Vs=[1,60],$Vt=[1,41],$Vu=[1,42],$Vv=[1,43],$Vw=[1,44],$Vx=[1,61],$Vy=[1,50],$Vz=[1,54],$VA=[1,57],$VB=[1,58],$VC=[1,49],$VD=[1,66],$VE=[1,71],$VF=[1,20,21,22,23,38,42,44,46,48,54,68,69,88,89,90,91,92,93,97,107,108,111,113,114,120,121,122,123,124,125,126,127,128,129],$VG=[1,75],$VH=[1,74],$VI=[1,76],$VJ=[20,21,23,83,84],$VK=[1,101],$VL=[1,106],$VM=[1,109],$VN=[1,110],$VO=[1,103],$VP=[1,108],$VQ=[1,111],$VR=[1,104],$VS=[1,116],$VT=[1,115],$VU=[1,105],$VV=[1,107],$VW=[1,112],$VX=[1,113],$VY=[1,114],$VZ=[1,117],$V_=[20,21,22,23,83,84],$V$=[20,21,22,23,55,83,84],$V01=[20,21,22,23,40,54,55,57,59,61,63,65,67,68,69,71,73,75,76,78,83,84,93,97,107,108,111,113,114,124,125,126,127,128,129],$V11=[20,21,23],$V21=[20,21,23,54,68,69,83,84,93,97,107,108,111,113,114,124,125,126,127,128,129],$V31=[1,12,20,21,22,23,24,38,42,44,46,48,54,68,69,88,89,90,91,92,93,97,107,108,111,113,114,120,121,122,123,124,125,126,127,128,129],$V41=[54,68,69,93,97,107,108,111,113,114,124,125,126,127,128,129],$V51=[1,151],$V61=[1,159],$V71=[1,160],$V81=[1,161],$V91=[1,162],$Va1=[1,146],$Vb1=[1,147],$Vc1=[1,143],$Vd1=[1,154],$Ve1=[1,155],$Vf1=[1,156],$Vg1=[1,157],$Vh1=[1,158],$Vi1=[1,163],$Vj1=[1,164],$Vk1=[1,149],$Vl1=[1,152],$Vm1=[1,148],$Vn1=[1,145],$Vo1=[20,21,22,23,38,42,44,46,48,54,68,69,88,89,90,91,92,93,97,107,108,111,113,114,120,121,122,123,124,125,126,127,128,129],$Vp1=[1,20,21,22,23,38,42,44,46,48,50,54,68,69,88,89,90,91,92,93,97,107,108,111,113,114,120,121,122,123,124,125,126,127,128,129],$Vq1=[1,168],$Vr1=[20,21,22,23,26,54,68,69,93,107,108,111,113,114,124,125,126,127,128,129],$Vs1=[20,21,22,23,24,26,38,40,41,42,54,58,60,62,64,66,68,69,70,72,74,75,77,79,83,84,88,89,90,91,92,93,94,97,107,108,111,113,114,115,116,124,125,126,127,128,129],$Vt1=[12,21,22,24],$Vu1=[22,108],$Vv1=[1,253],$Vw1=[1,248],$Vx1=[1,249],$Vy1=[1,257],$Vz1=[1,254],$VA1=[1,251],$VB1=[1,250],$VC1=[1,252],$VD1=[1,255],$VE1=[1,256],$VF1=[1,258],$VG1=[1,276],$VH1=[20,21,23,108],$VI1=[20,21,22,23,68,69,88,104,107,108,111,112,113,114,115]; +var parser = {trace: function trace () { }, +yy: {}, +symbols_: {"error":2,"start":3,"mermaidDoc":4,"directive":5,"openDirective":6,"typeDirective":7,"closeDirective":8,"separator":9,":":10,"argDirective":11,"open_directive":12,"type_directive":13,"arg_directive":14,"close_directive":15,"graphConfig":16,"document":17,"line":18,"statement":19,"SEMI":20,"NEWLINE":21,"SPACE":22,"EOF":23,"GRAPH":24,"NODIR":25,"DIR":26,"FirstStmtSeperator":27,"ending":28,"endToken":29,"spaceList":30,"spaceListNewline":31,"verticeStatement":32,"styleStatement":33,"linkStyleStatement":34,"classDefStatement":35,"classStatement":36,"clickStatement":37,"subgraph":38,"text":39,"SQS":40,"SQE":41,"end":42,"direction":43,"acc_title":44,"acc_title_value":45,"acc_descr":46,"acc_descr_value":47,"acc_descr_multiline":48,"acc_descr_multiline_value":49,"acc_descr_line":50,"link":51,"node":52,"vertex":53,"AMP":54,"STYLE_SEPARATOR":55,"idString":56,"DOUBLECIRCLESTART":57,"DOUBLECIRCLEEND":58,"PS":59,"PE":60,"(-":61,"-)":62,"STADIUMSTART":63,"STADIUMEND":64,"SUBROUTINESTART":65,"SUBROUTINEEND":66,"VERTEX_WITH_PROPS_START":67,"ALPHA":68,"COLON":69,"PIPE":70,"CYLINDERSTART":71,"CYLINDEREND":72,"DIAMOND_START":73,"DIAMOND_STOP":74,"TAGEND":75,"TRAPSTART":76,"TRAPEND":77,"INVTRAPSTART":78,"INVTRAPEND":79,"linkStatement":80,"arrowText":81,"TESTSTR":82,"START_LINK":83,"LINK":84,"textToken":85,"STR":86,"keywords":87,"STYLE":88,"LINKSTYLE":89,"CLASSDEF":90,"CLASS":91,"CLICK":92,"DOWN":93,"UP":94,"textNoTags":95,"textNoTagsToken":96,"DEFAULT":97,"stylesOpt":98,"alphaNum":99,"CALLBACKNAME":100,"CALLBACKARGS":101,"HREF":102,"LINK_TARGET":103,"HEX":104,"numList":105,"INTERPOLATE":106,"NUM":107,"COMMA":108,"style":109,"styleComponent":110,"MINUS":111,"UNIT":112,"BRKT":113,"DOT":114,"PCT":115,"TAGSTART":116,"alphaNumToken":117,"idStringToken":118,"alphaNumStatement":119,"direction_tb":120,"direction_bt":121,"direction_rl":122,"direction_lr":123,"PUNCTUATION":124,"UNICODE_TEXT":125,"PLUS":126,"EQUALS":127,"MULT":128,"UNDERSCORE":129,"graphCodeTokens":130,"ARROW_CROSS":131,"ARROW_POINT":132,"ARROW_CIRCLE":133,"ARROW_OPEN":134,"QUOTE":135,"$accept":0,"$end":1}, +terminals_: {2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",44:"acc_title",45:"acc_title_value",46:"acc_descr",47:"acc_descr_value",48:"acc_descr_multiline",50:"acc_descr_line",54:"AMP",55:"STYLE_SEPARATOR",57:"DOUBLECIRCLESTART",58:"DOUBLECIRCLEEND",59:"PS",60:"PE",61:"(-",62:"-)",63:"STADIUMSTART",64:"STADIUMEND",65:"SUBROUTINESTART",66:"SUBROUTINEEND",67:"VERTEX_WITH_PROPS_START",68:"ALPHA",69:"COLON",70:"PIPE",71:"CYLINDERSTART",72:"CYLINDEREND",73:"DIAMOND_START",74:"DIAMOND_STOP",75:"TAGEND",76:"TRAPSTART",77:"TRAPEND",78:"INVTRAPSTART",79:"INVTRAPEND",82:"TESTSTR",83:"START_LINK",84:"LINK",86:"STR",88:"STYLE",89:"LINKSTYLE",90:"CLASSDEF",91:"CLASS",92:"CLICK",93:"DOWN",94:"UP",97:"DEFAULT",100:"CALLBACKNAME",101:"CALLBACKARGS",102:"HREF",103:"LINK_TARGET",104:"HEX",106:"INTERPOLATE",107:"NUM",108:"COMMA",111:"MINUS",112:"UNIT",113:"BRKT",114:"DOT",115:"PCT",116:"TAGSTART",120:"direction_tb",121:"direction_bt",122:"direction_rl",123:"direction_lr",124:"PUNCTUATION",125:"UNICODE_TEXT",126:"PLUS",127:"EQUALS",128:"MULT",129:"UNDERSCORE",131:"ARROW_CROSS",132:"ARROW_POINT",133:"ARROW_CIRCLE",134:"ARROW_OPEN",135:"QUOTE"}, +productions_: [0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[19,1],[19,2],[19,2],[19,2],[49,2],[49,1],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[52,1],[52,5],[52,3],[53,4],[53,4],[53,6],[53,4],[53,4],[53,4],[53,8],[53,4],[53,4],[53,4],[53,6],[53,4],[53,4],[53,4],[53,4],[53,4],[53,1],[51,2],[51,3],[51,3],[51,1],[51,3],[80,1],[81,3],[39,1],[39,2],[39,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[95,1],[95,2],[35,5],[35,5],[36,5],[37,2],[37,4],[37,3],[37,5],[37,2],[37,4],[37,4],[37,6],[37,2],[37,4],[37,2],[37,4],[37,4],[37,6],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[105,1],[105,3],[98,1],[98,3],[109,1],[109,2],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[96,1],[96,1],[96,1],[96,1],[56,1],[56,2],[99,1],[99,2],[119,1],[119,1],[119,1],[119,1],[43,1],[43,1],[43,1],[43,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[118,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1],[130,1]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 5: + yy.parseDirective('%%{', 'open_directive'); +break; +case 6: + yy.parseDirective($$[$0], 'type_directive'); +break; +case 7: + $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); +break; +case 8: + yy.parseDirective('}%%', 'close_directive', 'flowchart'); +break; +case 10: + this.$ = []; +break; +case 11: + + if($$[$0] !== []){ + $$[$0-1].push($$[$0]); + } + this.$=$$[$0-1]; +break; +case 12: case 84: case 86: case 98: case 154: case 156: case 157: +this.$=$$[$0]; +break; +case 19: + yy.setDirection('TB');this.$ = 'TB'; +break; +case 20: + yy.setDirection($$[$0-1]);this.$ = $$[$0-1]; +break; +case 35: + /* console.warn('finat vs', $$[$0-1].nodes); */ this.$=$$[$0-1].nodes +break; +case 36: case 37: case 38: case 39: case 40: +this.$=[]; +break; +case 41: +this.$=yy.addSubGraph($$[$0-6],$$[$0-1],$$[$0-4]); +break; +case 42: +this.$=yy.addSubGraph($$[$0-3],$$[$0-1],$$[$0-3]); +break; +case 43: +this.$=yy.addSubGraph(undefined,$$[$0-1],undefined); +break; +case 45: + this.$=$$[$0].trim();yy.setTitle(this.$); +break; +case 46: case 47: + this.$=$$[$0].trim();yy.setAccDescription(this.$); +break; +case 53: + /* console.warn('vs',$$[$0-2].stmt,$$[$0]); */ yy.addLink($$[$0-2].stmt,$$[$0],$$[$0-1]); this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0-2].nodes) } +break; +case 54: + /* console.warn('vs',$$[$0-3].stmt,$$[$0-1]); */ yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) } +break; +case 55: +/*console.warn('noda', $$[$0-1]);*/ this.$ = {stmt: $$[$0-1], nodes:$$[$0-1] } +break; +case 56: + /*console.warn('noda', $$[$0]);*/ this.$ = {stmt: $$[$0], nodes:$$[$0] } +break; +case 57: + /* console.warn('nod', $$[$0]); */ this.$ = [$$[$0]]; +break; +case 58: + this.$ = $$[$0-4].concat($$[$0]); /* console.warn('pip', $$[$0-4][0], $$[$0], this.$); */ +break; +case 59: +this.$ = [$$[$0-2]];yy.setClass($$[$0-2],$$[$0]) +break; +case 60: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square'); +break; +case 61: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'doublecircle'); +break; +case 62: +this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle'); +break; +case 63: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse'); +break; +case 64: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'stadium'); +break; +case 65: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'subroutine'); +break; +case 66: +this.$ = $$[$0-7];yy.addVertex($$[$0-7],$$[$0-1],'rect',undefined,undefined,undefined, Object.fromEntries([[$$[$0-5], $$[$0-3]]])); +break; +case 67: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'cylinder'); +break; +case 68: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round'); +break; +case 69: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond'); +break; +case 70: +this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'hexagon'); +break; +case 71: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd'); +break; +case 72: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'trapezoid'); +break; +case 73: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'inv_trapezoid'); +break; +case 74: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_right'); +break; +case 75: +this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_left'); +break; +case 76: + /*console.warn('h: ', $$[$0]);*/this.$ = $$[$0];yy.addVertex($$[$0]); +break; +case 77: +$$[$0-1].text = $$[$0];this.$ = $$[$0-1]; +break; +case 78: case 79: +$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2]; +break; +case 80: +this.$ = $$[$0]; +break; +case 81: +var inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {"type":inf.type,"stroke":inf.stroke,"length":inf.length,"text":$$[$0-1]}; +break; +case 82: +var inf = yy.destructLink($$[$0]);this.$ = {"type":inf.type,"stroke":inf.stroke,"length":inf.length}; +break; +case 83: +this.$ = $$[$0-1]; +break; +case 85: case 99: case 155: +this.$=$$[$0-1]+''+$$[$0]; +break; +case 100: case 101: +this.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]); +break; +case 102: +this.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]); +break; +case 103: case 111: +this.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0]); +break; +case 104: case 112: +this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]); +break; +case 105: +this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]); +break; +case 106: +this.$ = $$[$0-4];yy.setClickEvent($$[$0-4], $$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-4], $$[$0]); +break; +case 107: case 113: +this.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]); +break; +case 108: case 114: +this.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2]);yy.setTooltip($$[$0-3], $$[$0]); +break; +case 109: case 115: +this.$ = $$[$0-3];yy.setLink($$[$0-3], $$[$0-2], $$[$0]); +break; +case 110: case 116: +this.$ = $$[$0-5];yy.setLink($$[$0-5], $$[$0-4], $$[$0]);yy.setTooltip($$[$0-5], $$[$0-2]); +break; +case 117: +this.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]); +break; +case 118: case 120: +this.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]); +break; +case 119: +this.$ = $$[$0-4];yy.updateLink([$$[$0-2]],$$[$0]); +break; +case 121: +this.$ = $$[$0-8];yy.updateLinkInterpolate([$$[$0-6]],$$[$0-2]);yy.updateLink([$$[$0-6]],$$[$0]); +break; +case 122: +this.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]); +break; +case 123: +this.$ = $$[$0-6];yy.updateLinkInterpolate([$$[$0-4]],$$[$0]); +break; +case 124: +this.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]); +break; +case 125: case 127: +this.$ = [$$[$0]] +break; +case 126: case 128: +$$[$0-2].push($$[$0]);this.$ = $$[$0-2]; +break; +case 130: +this.$ = $$[$0-1] + $$[$0]; +break; +case 152: +this.$=$$[$0] +break; +case 153: +this.$=$$[$0-1]+''+$$[$0] +break; +case 158: +this.$='v'; +break; +case 159: +this.$='-'; +break; +case 160: + this.$={stmt:'dir', value:'TB'}; +break; +case 161: + this.$={stmt:'dir', value:'BT'}; +break; +case 162: + this.$={stmt:'dir', value:'RL'}; +break; +case 163: + this.$={stmt:'dir', value:'LR'}; +break; +} +}, +table: [{3:1,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},o($V4,$V5,{17:11}),{7:12,13:[1,13]},{16:14,21:$V1,22:$V2,24:$V3},{16:15,21:$V1,22:$V2,24:$V3},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,43:31,44:$Vb,46:$Vc,48:$Vd,52:35,53:45,54:$Ve,56:46,68:$Vf,69:$Vg,88:$Vh,89:$Vi,90:$Vj,91:$Vk,92:$Vl,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,120:$Vt,121:$Vu,122:$Vv,123:$Vw,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},{8:64,10:[1,65],15:$VD},o([10,15],[2,6]),o($V4,[2,17]),o($V4,[2,18]),o($V4,[2,19]),{20:[1,68],21:[1,69],22:$VE,27:67,30:70},o($VF,[2,11]),o($VF,[2,12]),o($VF,[2,13]),o($VF,[2,14]),o($VF,[2,15]),o($VF,[2,16]),{9:72,20:$VG,21:$VH,23:$VI,51:73,80:77,83:[1,78],84:[1,79]},{9:80,20:$VG,21:$VH,23:$VI},{9:81,20:$VG,21:$VH,23:$VI},{9:82,20:$VG,21:$VH,23:$VI},{9:83,20:$VG,21:$VH,23:$VI},{9:84,20:$VG,21:$VH,23:$VI},{9:86,20:$VG,21:$VH,22:[1,85],23:$VI},o($VF,[2,44]),{45:[1,87]},{47:[1,88]},{49:89,50:[1,90]},o($VJ,[2,56],{30:91,22:$VE}),{22:[1,92]},{22:[1,93]},{22:[1,94]},{22:[1,95]},{26:$VK,54:$VL,68:$VM,69:$VN,86:[1,99],93:$VO,99:98,100:[1,96],102:[1,97],107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($VF,[2,160]),o($VF,[2,161]),o($VF,[2,162]),o($VF,[2,163]),o($V_,[2,57],{55:[1,118]}),o($V$,[2,76],{118:131,40:[1,119],54:$Ve,57:[1,120],59:[1,121],61:[1,122],63:[1,123],65:[1,124],67:[1,125],68:$Vf,69:$Vg,71:[1,126],73:[1,127],75:[1,128],76:[1,129],78:[1,130],93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC}),o($V01,[2,152]),o($V01,[2,177]),o($V01,[2,178]),o($V01,[2,179]),o($V01,[2,180]),o($V01,[2,181]),o($V01,[2,182]),o($V01,[2,183]),o($V01,[2,184]),o($V01,[2,185]),o($V01,[2,186]),o($V01,[2,187]),o($V01,[2,188]),o($V01,[2,189]),o($V01,[2,190]),o($V01,[2,191]),o($V01,[2,192]),{9:132,20:$VG,21:$VH,23:$VI},{11:133,14:[1,134]},o($V11,[2,8]),o($V4,[2,20]),o($V4,[2,26]),o($V4,[2,27]),{21:[1,135]},o($V21,[2,34],{30:136,22:$VE}),o($VF,[2,35]),{52:137,53:45,54:$Ve,56:46,68:$Vf,69:$Vg,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},o($V31,[2,50]),o($V31,[2,51]),o($V31,[2,52]),o($V41,[2,80],{81:138,70:[1,140],82:[1,139]}),{22:$V51,24:$V61,26:$V71,38:$V81,39:141,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o([54,68,69,70,82,93,97,107,108,111,113,114,124,125,126,127,128,129],[2,82]),o($VF,[2,36]),o($VF,[2,37]),o($VF,[2,38]),o($VF,[2,39]),o($VF,[2,40]),{22:$V51,24:$V61,26:$V71,38:$V81,39:165,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($Vo1,$V5,{17:166}),o($VF,[2,45]),o($VF,[2,46]),o($VF,[2,47],{50:[1,167]}),o($Vp1,[2,49]),o($VJ,[2,55],{54:$Vq1}),{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,99:169,104:[1,170],107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{97:[1,171],105:172,107:[1,173]},{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,97:[1,174],99:175,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,99:176,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V11,[2,103],{22:[1,177],101:[1,178]}),o($V11,[2,107],{22:[1,179]}),o($V11,[2,111],{117:102,119:181,22:[1,180],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ}),o($V11,[2,113],{22:[1,182]}),o($Vr1,[2,154]),o($Vr1,[2,156]),o($Vr1,[2,157]),o($Vr1,[2,158]),o($Vr1,[2,159]),o($Vs1,[2,164]),o($Vs1,[2,165]),o($Vs1,[2,166]),o($Vs1,[2,167]),o($Vs1,[2,168]),o($Vs1,[2,169]),o($Vs1,[2,170]),o($Vs1,[2,171]),o($Vs1,[2,172]),o($Vs1,[2,173]),o($Vs1,[2,174]),o($Vs1,[2,175]),o($Vs1,[2,176]),{54:$Ve,56:183,68:$Vf,69:$Vg,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},{22:$V51,24:$V61,26:$V71,38:$V81,39:184,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:185,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:187,42:$V91,54:$VL,59:[1,186],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:188,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:189,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:190,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{68:[1,191]},{22:$V51,24:$V61,26:$V71,38:$V81,39:192,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:193,42:$V91,54:$VL,68:$VM,69:$VN,73:[1,194],75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:195,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:196,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:197,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V01,[2,153]),o($Vt1,[2,3]),{8:198,15:$VD},{15:[2,7]},o($V4,[2,28]),o($V21,[2,33]),o($VJ,[2,53],{30:199,22:$VE}),o($V41,[2,77],{22:[1,200]}),{22:[1,201]},{22:$V51,24:$V61,26:$V71,38:$V81,39:202,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,84:[1,203],85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($Vs1,[2,84]),o($Vs1,[2,86]),o($Vs1,[2,142]),o($Vs1,[2,143]),o($Vs1,[2,144]),o($Vs1,[2,145]),o($Vs1,[2,146]),o($Vs1,[2,147]),o($Vs1,[2,148]),o($Vs1,[2,149]),o($Vs1,[2,150]),o($Vs1,[2,151]),o($Vs1,[2,87]),o($Vs1,[2,88]),o($Vs1,[2,89]),o($Vs1,[2,90]),o($Vs1,[2,91]),o($Vs1,[2,92]),o($Vs1,[2,93]),o($Vs1,[2,94]),o($Vs1,[2,95]),o($Vs1,[2,96]),o($Vs1,[2,97]),{9:206,20:$VG,21:$VH,22:$V51,23:$VI,24:$V61,26:$V71,38:$V81,40:[1,205],42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,207],43:31,44:$Vb,46:$Vc,48:$Vd,52:35,53:45,54:$Ve,56:46,68:$Vf,69:$Vg,88:$Vh,89:$Vi,90:$Vj,91:$Vk,92:$Vl,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,120:$Vt,121:$Vu,122:$Vv,123:$Vw,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},o($Vp1,[2,48]),{22:$VE,30:208},{22:[1,209],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:181,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:[1,210]},{22:[1,211]},{22:[1,212],108:[1,213]},o($Vu1,[2,125]),{22:[1,214]},{22:[1,215],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:181,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:[1,216],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:181,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{86:[1,217]},o($V11,[2,105],{22:[1,218]}),{86:[1,219],103:[1,220]},{86:[1,221]},o($Vr1,[2,155]),{86:[1,222],103:[1,223]},o($V_,[2,59],{118:131,54:$Ve,68:$Vf,69:$Vg,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC}),{22:$V51,24:$V61,26:$V71,38:$V81,41:[1,224],42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,58:[1,225],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:226,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,60:[1,227],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,62:[1,228],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,64:[1,229],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,66:[1,230],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{69:[1,231]},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,72:[1,232],75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,74:[1,233],75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,39:234,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,41:[1,235],42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,77:[1,236],79:[1,237],83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,77:[1,239],79:[1,238],83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{9:240,20:$VG,21:$VH,23:$VI},o($VJ,[2,54],{54:$Vq1}),o($V41,[2,79]),o($V41,[2,78]),{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,70:[1,241],75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V41,[2,81]),o($Vs1,[2,85]),{22:$V51,24:$V61,26:$V71,38:$V81,39:242,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($Vo1,$V5,{17:243}),o($VF,[2,43]),{53:244,54:$Ve,56:46,68:$Vf,69:$Vg,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:245,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:259,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:260,104:$Vz1,106:[1,261],107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:262,104:$Vz1,106:[1,263],107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{107:[1,264]},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:265,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:266,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,99:267,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V11,[2,104]),{86:[1,268]},o($V11,[2,108],{22:[1,269]}),o($V11,[2,109]),o($V11,[2,112]),o($V11,[2,114],{22:[1,270]}),o($V11,[2,115]),o($V$,[2,60]),o($V$,[2,61]),{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,60:[1,271],68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V$,[2,68]),o($V$,[2,63]),o($V$,[2,64]),o($V$,[2,65]),{68:[1,272]},o($V$,[2,67]),o($V$,[2,69]),{22:$V51,24:$V61,26:$V71,38:$V81,42:$V91,54:$VL,68:$VM,69:$VN,74:[1,273],75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V$,[2,71]),o($V$,[2,72]),o($V$,[2,74]),o($V$,[2,73]),o($V$,[2,75]),o($Vt1,[2,4]),o([22,54,68,69,93,97,107,108,111,113,114,124,125,126,127,128,129],[2,83]),{22:$V51,24:$V61,26:$V71,38:$V81,41:[1,274],42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,275],43:31,44:$Vb,46:$Vc,48:$Vd,52:35,53:45,54:$Ve,56:46,68:$Vf,69:$Vg,88:$Vh,89:$Vi,90:$Vj,91:$Vk,92:$Vl,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,120:$Vt,121:$Vu,122:$Vv,123:$Vw,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},o($V_,[2,58]),o($V11,[2,117],{108:$VG1}),o($VH1,[2,127],{110:277,22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,104:$Vz1,107:$VA1,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1}),o($VI1,[2,129]),o($VI1,[2,131]),o($VI1,[2,132]),o($VI1,[2,133]),o($VI1,[2,134]),o($VI1,[2,135]),o($VI1,[2,136]),o($VI1,[2,137]),o($VI1,[2,138]),o($VI1,[2,139]),o($VI1,[2,140]),o($VI1,[2,141]),o($V11,[2,118],{108:$VG1}),o($V11,[2,119],{108:$VG1}),{22:[1,278]},o($V11,[2,120],{108:$VG1}),{22:[1,279]},o($Vu1,[2,126]),o($V11,[2,100],{108:$VG1}),o($V11,[2,101],{108:$VG1}),o($V11,[2,102],{117:102,119:181,26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ}),o($V11,[2,106]),{103:[1,280]},{103:[1,281]},{60:[1,282]},{70:[1,283]},{74:[1,284]},{9:285,20:$VG,21:$VH,23:$VI},o($VF,[2,42]),{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,104:$Vz1,107:$VA1,109:286,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},o($VI1,[2,130]),{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,99:287,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,99:288,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,117:102,119:100,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V11,[2,110]),o($V11,[2,116]),o($V$,[2,62]),{22:$V51,24:$V61,26:$V71,38:$V81,39:289,42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:142,86:$Vc1,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},o($V$,[2,70]),o($Vo1,$V5,{17:290}),o($VH1,[2,128],{110:277,22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,104:$Vz1,107:$VA1,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1}),o($V11,[2,123],{117:102,119:181,22:[1,291],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ}),o($V11,[2,124],{117:102,119:181,22:[1,292],26:$VK,54:$VL,68:$VM,69:$VN,93:$VO,107:$VP,108:$VQ,111:$VR,113:$VS,114:$VT,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ}),{22:$V51,24:$V61,26:$V71,38:$V81,41:[1,293],42:$V91,54:$VL,68:$VM,69:$VN,75:$Va1,83:$Vb1,85:204,87:153,88:$Vd1,89:$Ve1,90:$Vf1,91:$Vg1,92:$Vh1,93:$Vi1,94:$Vj1,96:144,97:$Vk1,107:$VP,108:$VQ,111:$Vl1,113:$VS,114:$VT,115:$Vm1,116:$Vn1,117:150,124:$VU,125:$VV,126:$VW,127:$VX,128:$VY,129:$VZ},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,294],43:31,44:$Vb,46:$Vc,48:$Vd,52:35,53:45,54:$Ve,56:46,68:$Vf,69:$Vg,88:$Vh,89:$Vi,90:$Vj,91:$Vk,92:$Vl,93:$Vm,97:$Vn,107:$Vo,108:$Vp,111:$Vq,113:$Vr,114:$Vs,118:47,120:$Vt,121:$Vu,122:$Vv,123:$Vw,124:$Vx,125:$Vy,126:$Vz,127:$VA,128:$VB,129:$VC},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:295,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},{22:$Vv1,68:$Vw1,69:$Vx1,88:$Vy1,98:296,104:$Vz1,107:$VA1,109:246,110:247,111:$VB1,112:$VC1,113:$VD1,114:$VE1,115:$VF1},o($V$,[2,66]),o($VF,[2,41]),o($V11,[2,121],{108:$VG1}),o($V11,[2,122],{108:$VG1})], +defaultActions: {2:[2,1],9:[2,5],10:[2,2],134:[2,7]}, +parseError: function parseError (str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; + +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, + +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + + this._input = this._input.slice(1); + return ch; + }, + +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, + +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function(match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, + +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + +// return next match that has a token +lex:function lex () { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin (condition) { + this.conditionStack.push(condition); + }, + +// pop the previously active lexer condition state off the condition stack +popState:function popState () { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules () { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState (n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + +// alias for begin(condition) +pushState:function pushState (condition) { + this.begin(condition); + }, + +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0: this.begin('open_directive'); return 12; +break; +case 1: this.begin('type_directive'); return 13; +break; +case 2: this.popState(); this.begin('arg_directive'); return 10; +break; +case 3: this.popState(); this.popState(); return 15; +break; +case 4:return 14; +break; +case 5:/* skip comments */ +break; +case 6:/* skip comments */ +break; +case 7: this.begin("acc_title");return 44; +break; +case 8: this.popState(); return "acc_title_value"; +break; +case 9: this.begin("acc_descr");return 46; +break; +case 10: this.popState(); return "acc_descr_value"; +break; +case 11: this.begin("acc_descr_multiline");return 48; +break; +case 12: return "acc_descr_line"; +break; +case 13: this.popState(); return "acc_descr_value"; +break; +case 14:this.begin("string"); +break; +case 15:this.popState(); +break; +case 16:return "STR"; +break; +case 17:return 88; +break; +case 18:return 97; +break; +case 19:return 89; +break; +case 20:return 106; +break; +case 21:return 90; +break; +case 22:return 91; +break; +case 23:this.begin("href"); +break; +case 24:this.popState(); +break; +case 25:return 102; +break; +case 26:this.begin("callbackname"); +break; +case 27:this.popState(); +break; +case 28:this.popState(); this.begin("callbackargs"); +break; +case 29:return 100; +break; +case 30:this.popState(); +break; +case 31:return 101; +break; +case 32:this.begin("click"); +break; +case 33:this.popState(); +break; +case 34:return 92; +break; +case 35:if(yy.lex.firstGraph()){this.begin("dir");} return 24; +break; +case 36:if(yy.lex.firstGraph()){this.begin("dir");} return 24; +break; +case 37:return 38; +break; +case 38:return 42; +break; +case 39:return 103; +break; +case 40:return 103; +break; +case 41:return 103; +break; +case 42:return 103; +break; +case 43: this.popState(); return 25; +break; +case 44: this.popState(); return 26; +break; +case 45: this.popState(); return 26; +break; +case 46: this.popState(); return 26; +break; +case 47: this.popState(); return 26; +break; +case 48: this.popState(); return 26; +break; +case 49: this.popState(); return 26; +break; +case 50: this.popState(); return 26; +break; +case 51: this.popState(); return 26; +break; +case 52: this.popState(); return 26; +break; +case 53: this.popState(); return 26; +break; +case 54:return 120; +break; +case 55:return 121; +break; +case 56:return 122; +break; +case 57:return 123; +break; +case 58: return 107; +break; +case 59:return 113; +break; +case 60:return 55; +break; +case 61:return 69; +break; +case 62:return 54; +break; +case 63:return 20; +break; +case 64:return 108; +break; +case 65:return 128; +break; +case 66:return 84; +break; +case 67:return 84; +break; +case 68:return 84; +break; +case 69:return 83; +break; +case 70:return 83; +break; +case 71:return 83; +break; +case 72:return 61; +break; +case 73:return 62; +break; +case 74:return 63; +break; +case 75:return 64; +break; +case 76:return 65; +break; +case 77:return 66; +break; +case 78:return 67; +break; +case 79:return 71; +break; +case 80:return 72; +break; +case 81:return 57; +break; +case 82:return 58; +break; +case 83:return 111; +break; +case 84:return 114; +break; +case 85:return 129; +break; +case 86:return 126; +break; +case 87:return 115; +break; +case 88:return 127; +break; +case 89:return 127; +break; +case 90:return 116; +break; +case 91:return 75; +break; +case 92:return 94; +break; +case 93:return 'SEP'; +break; +case 94:return 93; +break; +case 95:return 68; +break; +case 96:return 77; +break; +case 97:return 76; +break; +case 98:return 79; +break; +case 99:return 78; +break; +case 100:return 124; +break; +case 101:return 125; +break; +case 102:return 70; +break; +case 103:return 59; +break; +case 104:return 60; +break; +case 105:return 40; +break; +case 106:return 41; +break; +case 107:return 73 +break; +case 108:return 74 +break; +case 109:return 135; +break; +case 110:return 21; +break; +case 111:return 22; +break; +case 112:return 23; +break; +} +}, +rules: [/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:.*[^\n]*)/,/^(?:[}])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\])/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/], +conditions: {"close_directive":{"rules":[],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"callbackargs":{"rules":[30,31],"inclusive":false},"callbackname":{"rules":[27,28,29],"inclusive":false},"href":{"rules":[24,25],"inclusive":false},"click":{"rules":[33,34],"inclusive":false},"vertex":{"rules":[],"inclusive":false},"dir":{"rules":[43,44,45,46,47,48,49,50,51,52,53],"inclusive":false},"acc_descr_multiline":{"rules":[12,13],"inclusive":false},"acc_descr":{"rules":[10],"inclusive":false},"acc_title":{"rules":[8],"inclusive":false},"string":{"rules":[15,16],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,9,11,14,17,18,19,20,21,22,23,26,32,35,36,37,38,39,40,41,42,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = flow; +exports.Parser = flow.Parser; +exports.parse = function () { return flow.parse.apply(flow, arguments); }; +exports.main = function commonjsMain (args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if (typeof module !== 'undefined' && require.main === module) { + exports.main(process.argv.slice(1)); +} +} \ No newline at end of file diff --git a/src/commonDb.js b/src/commonDb.js new file mode 100644 index 0000000000..99bb710e83 --- /dev/null +++ b/src/commonDb.js @@ -0,0 +1,34 @@ +import { sanitizeText as _sanitizeText } from './diagrams/common/common'; +import { getConfig } from './config'; +let title = ''; +let description = ''; +const sanitizeText = (txt) => _sanitizeText(txt, getConfig()); + +export const clear = function () { + title = ''; + description = ''; +}; + +export const setTitle = function (txt) { + title = sanitizeText(txt).replace(/^\s+/g, ''); +}; + +export const getTitle = function () { + return title; +}; + +export const setAccDescription = function (txt) { + description = sanitizeText(txt).replace(/\n\s+/g, '\n'); +}; + +export const getAccDescription = function () { + return description; +}; + +export default { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear, +}; diff --git a/src/diagrams/flowchart/flowDb.js b/src/diagrams/flowchart/flowDb.js index 630c412cbc..057b4fa450 100644 --- a/src/diagrams/flowchart/flowDb.js +++ b/src/diagrams/flowchart/flowDb.js @@ -4,6 +4,7 @@ import * as configApi from '../../config'; import common from '../common/common'; import mermaidAPI from '../../mermaidAPI'; import { log } from '../../logger'; +import { setTitle, getTitle, getAccDescription, setAccDescription } from '../../commonDb'; const MERMAID_DOM_ID_PREFIX = 'flowchart-'; let vertexCounter = 0; @@ -31,21 +32,17 @@ export const parseDirective = function (statement, context, type) { mermaidAPI.parseDirective(this, statement, context, type); }; -const setTitle = function (txt) { - title = sanitizeText(txt); -}; +// const getTitle = function () { +// return title; +// }; -const getTitle = function () { - return title; -}; +// const setAccDescription = function (txt) { +// description = sanitizeText(txt).replace(/\n\s+/g, '\n'); +// }; -const setAccDescription = function (txt) { - description = sanitizeText(txt); -}; - -const getAccDescription = function () { - return description; -}; +// const getAccDescription = function () { +// return description; +// }; /** * Function to lookup domId from id in the graph definition. @@ -447,6 +444,8 @@ export const clear = function (ver) { tooltips = []; firstGraphFlag = true; version = ver || 'gen-1'; + title = ''; + description = ''; }; export const setGen = (ver) => { version = ver || 'gen-1'; diff --git a/src/diagrams/flowchart/parser/flow.jison b/src/diagrams/flowchart/parser/flow.jison index 60ed4fc466..68dc48fa80 100644 --- a/src/diagrams/flowchart/parser/flow.jison +++ b/src/diagrams/flowchart/parser/flow.jison @@ -7,8 +7,9 @@ /* lexical grammar */ %lex %x string -%x title -%x accDescription +%x acc_title +%x acc_descr +%x acc_descr_multiline %x dir %x vertex %x click @@ -28,10 +29,14 @@ ((?:(?!\}\%\%).|\n)*) return 'arg_directive'; \%\%(?!\{)[^\n]* /* skip comments */ [^\}]\%\%[^\n]* /* skip comments */ -title { this.begin("title");return 'title'; } -(?!\n|;|#)*[^\n]* { this.popState(); return "title_value"; } -accDescription { this.begin("accDescription");return 'accDescription'; } -<accDescription>(?!\n|;|#)*[^\n]* { this.popState(); return "description_value"; } +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; +// <acc_descr_multiline>.*[^\n]* { return "acc_descr_line"} ["] this.begin("string"); <string>["] this.popState(); <string>[^"]* return "STR"; @@ -343,27 +348,13 @@ statement | subgraph separator document end {$$=yy.addSubGraph(undefined,$3,undefined);} | direction - | title title_value { $$=$2.trim();yy.setTitle($$); } - | accDescription description_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } ; separator: NEWLINE | SEMI | EOF ; -// verticeStatement: -// vertex link vertex -// { yy.addLink($1,$3,$2);$$ = [$1,$3];} -// | vertex link vertex STYLE_SEPARATOR idString -// { yy.addLink($1,$3,$2);$$ = [$1,$3];yy.setClass($3,$5);} -// | vertex STYLE_SEPARATOR idString link vertex -// { yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($1,$3);} -// | vertex STYLE_SEPARATOR idString link vertex STYLE_SEPARATOR idString -// { yy.addLink($1,$5,$4);$$ = [$1,$5];yy.setClass($5,$7);yy.setClass($1,$3);} -// |vertex -// {$$ = [$1];} -// |vertex STYLE_SEPARATOR idString -// {$$ = [$1];yy.setClass($1,$3)} -// ; - verticeStatement: verticeStatement link node { /* console.warn('vs',$1.stmt,$3); */ yy.addLink($1.stmt,$3,$2); $$ = { stmt: $3, nodes: $3.concat($1.nodes) } } diff --git a/src/diagrams/flowchart/parser/flow.spec.js b/src/diagrams/flowchart/parser/flow.spec.js index 3340e2531d..c10cf701bb 100644 --- a/src/diagrams/flowchart/parser/flow.spec.js +++ b/src/diagrams/flowchart/parser/flow.spec.js @@ -157,10 +157,10 @@ describe('parsing a flow chart', function () { expect(vertices['1'].id).toBe('1'); }); - it('should add title and description to flow chart', function () { + it('should add accTitle and accDescr to flow chart', function () { const flowChart = `graph LR - title Big decisions - accDescription Flow chart of the decision making process + accTitle: Big decisions + accDescr: Flow chart of the decision making process A[Hard] -->|Text| B(Round) B --> C{Decision} C -->|One| D[Result 1] @@ -171,4 +171,27 @@ describe('parsing a flow chart', function () { expect(flow.parser.yy.getTitle()).toBe('Big decisions'); expect(flow.parser.yy.getAccDescription()).toBe('Flow chart of the decision making process'); }); + it('should add accTitle and a multi line accDescr to flow chart', function () { + const flowChart = `graph LR + accTitle: Big decisions + + accDescr { + Flow chart of the decision making process + with a second line + } + + A[Hard] -->|Text| B(Round) + B --> C{Decision} + C -->|One| D[Result 1] + C -->|Two| E[Result 2] +`; + + flow.parser.parse(flowChart); + expect(flow.parser.yy.getTitle()).toBe('Big decisions'); + console.log(flow.parser.yy.getAccDescription()); + expect(flow.parser.yy.getAccDescription()).toBe( + `Flow chart of the decision making process +with a second line` + ); + }); }); From 5e6b4d73e193437ee9552388999df0644b508338 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 14:54:24 +0200 Subject: [PATCH 02/13] Updated classdiagrams with the new syntax --- src/diagrams/class/classDb.js | 31 ++++++-------------- src/diagrams/class/classDiagram.spec.js | 31 ++++++++++++++------ src/diagrams/class/parser/classDiagram.jison | 19 ++++++++---- 3 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/diagrams/class/classDb.js b/src/diagrams/class/classDb.js index 3c0097aed7..6576f5a507 100644 --- a/src/diagrams/class/classDb.js +++ b/src/diagrams/class/classDb.js @@ -4,6 +4,13 @@ import * as configApi from '../../config'; import common from '../common/common'; import utils from '../../utils'; import mermaidAPI from '../../mermaidAPI'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; const MERMAID_DOM_ID_PREFIX = 'classid-'; @@ -77,6 +84,7 @@ export const clear = function () { classes = {}; funs = []; funs.push(setupToolTips); + commonClear(); }; export const getClass = function (id) { @@ -134,6 +142,7 @@ export const addAnnotation = function (className, annotation) { * @public */ export const addMember = function (className, member) { + console.log(className, member); const validatedClassName = splitClassNameAndType(className).className; const theClass = classes[validatedClassName]; @@ -345,28 +354,6 @@ const setDirection = (dir) => { direction = dir; }; -let title = ''; - -export const setTitle = function (txt) { - let sanitizedText = sanitizeText(txt, configApi.getConfig()); - title = sanitizedText; -}; - -export const getTitle = function () { - return title; -}; - -let accDescription = ''; - -export const setAccDescription = function (txt) { - let sanitizedText = sanitizeText(txt, configApi.getConfig()); - accDescription = sanitizedText; -}; - -export const getAccDescription = function () { - return accDescription; -}; - export default { parseDirective, setTitle, diff --git a/src/diagrams/class/classDiagram.spec.js b/src/diagrams/class/classDiagram.spec.js index fdf347b678..b9ccfe991d 100644 --- a/src/diagrams/class/classDiagram.spec.js +++ b/src/diagrams/class/classDiagram.spec.js @@ -543,20 +543,33 @@ foo() expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE); }); - it('should have a title and accDescription', function () { - const str = - 'classDiagram\n' + - 'class Car~T~\n' + - 'title My Title\n' + - 'accDescription My Description\n'; - 'Car : -List~Wheel~ wheels\n' + - 'Car : +setWheels(List~Wheel~ wheels)\n' + - 'Car : +getWheels() List~Wheel~'; + it('should handle accTitle and accDescr', function () { + const str = `classDiagram + accTitle: My Title + accDescr: My Description + + Class01 <|-- Class02 + `; parser.parse(str); expect(parser.yy.getTitle()).toBe('My Title'); expect(parser.yy.getAccDescription()).toBe('My Description'); }); + it('should handle accTitle and multiline accDescr', function () { + const str = `classDiagram + accTitle: My Title + accDescr { + This is mu multi + line description + } + + Class01 <|-- Class02 + `; + + parser.parse(str); + expect(parser.yy.getTitle()).toBe('My Title'); + expect(parser.yy.getAccDescription()).toBe('This is mu multi\nline description'); + }); it('should handle relation definitions AGGREGATION and dotted line', function () { const str = 'classDiagram\n' + 'Class01 o.. Class02'; diff --git a/src/diagrams/class/parser/classDiagram.jison b/src/diagrams/class/parser/classDiagram.jison index 8c59adcceb..e298dd2f0c 100644 --- a/src/diagrams/class/parser/classDiagram.jison +++ b/src/diagrams/class/parser/classDiagram.jison @@ -16,7 +16,9 @@ %x open_directive %x type_directive %x arg_directive - +%x acc_title +%x acc_descr +%x acc_descr_multiline %% \%\%\{ { this.begin('open_directive'); return 'open_directive'; } .*direction\s+TB[^\n]* return 'direction_tb'; @@ -29,8 +31,13 @@ <arg_directive>((?:(?!\}\%\%).|\n)*) return 'arg_directive'; \%\%(?!\{)*[^\n]*(\r?\n?)+ /* skip comments */ \%\%[^\n]*(\r?\n)* /* skip comments */ -"title"\s[^#\n;]+ return 'title'; -"accDescription"\s[^#\n;]+ return 'accDescription'; +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; \s*(\r?\n)+ return 'NEWLINE'; \s+ /* skip whitespace */ @@ -256,9 +263,9 @@ statement | cssClassStatement | directive | direction - | title {yy.setTitle($1.substring(6));$$=$1.substring(6);} - | accDescription {yy.setAccDescription($1.substring(15));$$=$1.substring(15);} - + | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } ; classStatement From 5f4b7ae36909fbd4d59afde8a86940069f775dfb Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:00:50 +0200 Subject: [PATCH 03/13] Updated er diagrams with the new syntax --- src/diagrams/er/parser/erDiagram.jison | 20 +++++++++++++------- src/diagrams/er/parser/erDiagram.spec.js | 23 +++++++++++++++++++++-- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/diagrams/er/parser/erDiagram.jison b/src/diagrams/er/parser/erDiagram.jison index 7461cb0646..2c65073ff3 100644 --- a/src/diagrams/er/parser/erDiagram.jison +++ b/src/diagrams/er/parser/erDiagram.jison @@ -2,14 +2,18 @@ %options case-insensitive %x open_directive type_directive arg_directive block -%x title -%x accDescription +%x acc_title +%x acc_descr +%x acc_descr_multiline %% -title { this.begin("title");return 'title'; } -<title>(?!\n|;|#)*[^\n]* { this.popState(); return "title_value"; } -accDescription { this.begin("accDescription");return 'accDescription'; } -<accDescription>(?!\n|;|#)*[^\n]* { this.popState(); return "description_value"; } +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; \%\%\{ { this.begin('open_directive'); return 'open_directive'; } <open_directive>((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; } <type_directive>":" { this.popState(); this.begin('arg_directive'); return ':'; } @@ -91,7 +95,9 @@ statement | entityName BLOCK_START BLOCK_STOP { yy.addEntity($1); } | entityName { yy.addEntity($1); } | title title_value { $$=$2.trim();yy.setTitle($$); } - | accDescription description_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } ; entityName diff --git a/src/diagrams/er/parser/erDiagram.spec.js b/src/diagrams/er/parser/erDiagram.spec.js index edfec58d6e..84c64d1ce1 100644 --- a/src/diagrams/er/parser/erDiagram.spec.js +++ b/src/diagrams/er/parser/erDiagram.spec.js @@ -181,12 +181,31 @@ describe('when parsing ER diagram it...', function () { expect(Object.keys(erDb.getEntities()).length).toBe(1); }); - it('should allow for a title and acc description', function () { + it('should allow for a accessibility title and description (accDescr)', function () { const teacherRole = 'is teacher of'; const line1 = `TEACHER }o--o{ STUDENT : "${teacherRole}"`; erDiagram.parser.parse( - `erDiagram\ntitle graph title\n accDescription this graph is about stuff\n${line1}` + `erDiagram + accTitle: graph title + accDescr: this graph is about stuff + ${line1}` + ); + expect(erDb.getTitle()).toBe('graph title'); + expect(erDb.getAccDescription()).toBe('this graph is about stuff'); + }); + + it('should allow for a accessibility title and multi line description (accDescr)', function () { + const teacherRole = 'is teacher of'; + const line1 = `TEACHER }o--o{ STUDENT : "${teacherRole}"`; + + erDiagram.parser.parse( + `erDiagram + accTitle: graph title + accDescr { + this graph is about stuff + }\n + ${line1}` ); expect(erDb.getTitle()).toBe('graph title'); expect(erDb.getAccDescription()).toBe('this graph is about stuff'); From 8372d4952e3809cb19cf09401e25caa6dca74d75 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:07:13 +0200 Subject: [PATCH 04/13] Updated gantt parsing with the new syntax --- src/diagrams/gantt/parser/gantt.jison | 17 ++++++++++-- src/diagrams/gantt/parser/gantt.spec.js | 35 ++++++++++++++++++------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/diagrams/gantt/parser/gantt.jison b/src/diagrams/gantt/parser/gantt.jison index e6390c2502..bf9bf21f6c 100644 --- a/src/diagrams/gantt/parser/gantt.jison +++ b/src/diagrams/gantt/parser/gantt.jison @@ -15,12 +15,24 @@ %x type_directive %x arg_directive %x close_directive +%x acc_title +%x acc_descr +%x acc_descr_multiline %% \%\%\{ { this.begin('open_directive'); return 'open_directive'; } <open_directive>((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; } <type_directive>":" { this.popState(); this.begin('arg_directive'); return ':'; } <type_directive,arg_directive>\}\%\% { this.popState(); this.popState(); return 'close_directive'; } <arg_directive>((?:(?!\}\%\%).|\n)*) return 'arg_directive'; + +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; + \%\%(?!\{)*[^\n]* /* skip comments */ [^\}]\%\%*[^\n]* /* skip comments */ \%\%*[^\n]*[\n]* /* do nothing */ @@ -117,8 +129,9 @@ statement | includes {yy.setIncludes($1.substr(9));$$=$1.substr(9);} | todayMarker {yy.setTodayMarker($1.substr(12));$$=$1.substr(12);} | title {yy.setTitle($1.substr(6));$$=$1.substr(6);} - | accDescription {yy.setAccDescription($1.substr(15));$$=$1.substr(15);} - | section {yy.addSection($1.substr(8));$$=$1.substr(8);} + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | section {yy.addSection($1.substr(8));$$=$1.substr(8);} | clickStatement | taskTxt taskData {yy.addTask($1,$2);$$='task';} | directive diff --git a/src/diagrams/gantt/parser/gantt.spec.js b/src/diagrams/gantt/parser/gantt.spec.js index ca535ebb8d..0ed3d170c0 100644 --- a/src/diagrams/gantt/parser/gantt.spec.js +++ b/src/diagrams/gantt/parser/gantt.spec.js @@ -157,18 +157,35 @@ describe('when parsing a gantt diagram it', function () { ); }); - it('should allow for a title and accDescription', function () { + it('should allow for a accessibility title and description (accDescr)', function () { const expectedTitle = 'Gantt Diagram'; const expectedAccDescription = 'Tasks for Q4'; - const ganttString = - 'gantt\n' + - `title ${expectedTitle}\n` + - `accDescription ${expectedAccDescription}\n` + - 'dateFormat YYYY-MM-DD\n' + - 'section Section\n' + - 'A task :a1, 2014-01-01, 30d\n'; + const ganttString = `gantt + accTitle: ${expectedTitle} + accDescr: ${expectedAccDescription} + dateFormat YYYY-MM-DD + section Section + A task :a1, 2014-01-01, 30d\n`; - const output = parser.parse(ganttString); + parser.parse(ganttString); + + expect(ganttDb.getTitle()).toBe(expectedTitle); + expect(ganttDb.getAccDescription()).toBe(expectedAccDescription); + }); + it('should allow for a accessibility title and multiline description (accDescr)', function () { + const expectedTitle = 'Gantt Diagram'; + const expectedAccDescription = `Tasks for Q4 row1 + row2`; + const ganttString = `gantt + accTitle: ${expectedTitle} + accDescr { + ${expectedAccDescription} + } + dateFormat YYYY-MM-DD + section Section + A task :a1, 2014-01-01, 30d\n`; + + parser.parse(ganttString); expect(ganttDb.getTitle()).toBe(expectedTitle); expect(ganttDb.getAccDescription()).toBe(expectedAccDescription); From a401e44180e0da9a15783702495c1a9b06484ace Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:13:28 +0200 Subject: [PATCH 05/13] Updated pie parsing with the new syntax + fix for flowDb --- src/diagrams/flowchart/flowDb.js | 25 ++++++++----------------- src/diagrams/pie/parser/pie.jison | 19 ++++++++++++++----- src/diagrams/pie/parser/pie.spec.js | 24 +++++++++++++++++++++--- src/diagrams/pie/pieDb.js | 28 ++++++++-------------------- 4 files changed, 51 insertions(+), 45 deletions(-) diff --git a/src/diagrams/flowchart/flowDb.js b/src/diagrams/flowchart/flowDb.js index 057b4fa450..f318dd61e3 100644 --- a/src/diagrams/flowchart/flowDb.js +++ b/src/diagrams/flowchart/flowDb.js @@ -4,7 +4,13 @@ import * as configApi from '../../config'; import common from '../common/common'; import mermaidAPI from '../../mermaidAPI'; import { log } from '../../logger'; -import { setTitle, getTitle, getAccDescription, setAccDescription } from '../../commonDb'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; const MERMAID_DOM_ID_PREFIX = 'flowchart-'; let vertexCounter = 0; @@ -18,8 +24,6 @@ let tooltips = {}; let subCount = 0; let firstGraphFlag = true; let direction; -let title = 'Flow chart'; -let description = ''; let version; // As in graph @@ -32,18 +36,6 @@ export const parseDirective = function (statement, context, type) { mermaidAPI.parseDirective(this, statement, context, type); }; -// const getTitle = function () { -// return title; -// }; - -// const setAccDescription = function (txt) { -// description = sanitizeText(txt).replace(/\n\s+/g, '\n'); -// }; - -// const getAccDescription = function () { -// return description; -// }; - /** * Function to lookup domId from id in the graph definition. * @@ -444,8 +436,7 @@ export const clear = function (ver) { tooltips = []; firstGraphFlag = true; version = ver || 'gen-1'; - title = ''; - description = ''; + commonClear(); }; export const setGen = (ver) => { version = ver || 'gen-1'; diff --git a/src/diagrams/pie/parser/pie.jison b/src/diagrams/pie/parser/pie.jison index 74711ae55a..690d2d7084 100644 --- a/src/diagrams/pie/parser/pie.jison +++ b/src/diagrams/pie/parser/pie.jison @@ -8,12 +8,13 @@ %x string %x title -%x accDescription %x open_directive %x type_directive %x arg_directive %x close_directive - +%x acc_title +%x acc_descr +%x acc_descr_multiline %% \%\%\{ { this.begin('open_directive'); return 'open_directive'; } <open_directive>((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; } @@ -27,8 +28,14 @@ [\s]+ /* ignore */ title { this.begin("title");return 'title'; } <title>(?!\n|;|#)*[^\n]* { this.popState(); return "title_value"; } -accDescription { this.begin("accDescription");return 'accDescription'; } -<accDescription>(?!\n|;|#)*[^\n]* { this.popState(); return "description_value"; } + +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; ["] { this.begin("string"); } <string>["] { this.popState(); } <string>[^"]* { return "txt"; } @@ -63,7 +70,9 @@ statement : | txt value { yy.addSection($1,yy.cleanupValue($2)); } | title title_value { $$=$2.trim();yy.setTitle($$); } - | accDescription description_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | section {yy.addSection($1.substr(8));$$=$1.substr(8);} | directive ; diff --git a/src/diagrams/pie/parser/pie.spec.js b/src/diagrams/pie/parser/pie.spec.js index dbd62cead9..ceb92f9e74 100644 --- a/src/diagrams/pie/parser/pie.spec.js +++ b/src/diagrams/pie/parser/pie.spec.js @@ -62,7 +62,7 @@ pie expect(title).toBe('a 60/40 pie'); }); - it('should handle simple pie without an acc description', function () { + it('should handle simple pie without an acc description (accDescr)', function () { const res = pie.parser.parse(`pie title a neat chart "ash" : 60 "bat" : 40 @@ -77,9 +77,9 @@ pie expect(description).toBe(''); }); - it('should handle simple pie with an acc description', function () { + it('should handle simple pie with an acc description (accDescr)', function () { const res = pie.parser.parse(`pie title a neat chart - accDescription a neat description + accDescr: a neat description "ash" : 60 "bat" : 40 `); @@ -92,6 +92,24 @@ pie expect(title).toBe('a neat chart'); expect(description).toBe('a neat description'); }); + it('should handle simple pie with a multiline acc description (accDescr)', function () { + const res = pie.parser.parse(`pie title a neat chart + accDescr { + a neat description + on multiple lines + } +"ash" : 60 +"bat" : 40 +`); + + const sections = pieDb.getSections(); + const title = pieDb.getTitle(); + const description = pieDb.getAccDescription(); + const section1 = sections['ash']; + expect(section1).toBe(60); + expect(title).toBe('a neat chart'); + expect(description).toBe('a neat description\non multiple lines'); + }); it('should handle simple pie with positive decimal', function () { const res = pie.parser.parse(`pie diff --git a/src/diagrams/pie/pieDb.js b/src/diagrams/pie/pieDb.js index 0ed02a4a9b..a1941a9c2a 100644 --- a/src/diagrams/pie/pieDb.js +++ b/src/diagrams/pie/pieDb.js @@ -2,6 +2,13 @@ import { log } from '../../logger'; import mermaidAPI from '../../mermaidAPI'; import * as configApi from '../../config'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let sections = {}; let title = ''; @@ -21,10 +28,6 @@ const addSection = function (id, value) { }; const getSections = () => sections; -const setTitle = function (txt) { - title = common.sanitizeText(txt, configApi.getConfig()); -}; - const setShowData = function (toggle) { showData = toggle; }; @@ -33,18 +36,6 @@ const getShowData = function () { return showData; }; -const getTitle = function () { - return title; -}; - -const setAccDescription = function (txt) { - description = common.sanitizeText(txt, configApi.getConfig()); -}; - -const getAccDescription = function () { - return description; -}; - const cleanupValue = function (value) { if (value.substring(0, 1) === ':') { value = value.substring(1).trim(); @@ -58,10 +49,8 @@ const clear = function () { sections = {}; title = ''; showData = false; + commonClear(); }; -// export const parseError = (err, hash) => { -// global.mermaidAPI.parseError(err, hash) -// } export default { parseDirective, @@ -76,5 +65,4 @@ export default { getShowData, getAccDescription, setAccDescription, - // parseError }; From a642ae356c533c38781da61d5a67c844f8a84690 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:22:51 +0200 Subject: [PATCH 06/13] Updated requirement diagram parsing with the new syntax --- .../parser/requirementDiagram.jison | 20 ++++++--- .../parser/requirementDiagram.spec.js | 42 +++++++++++++------ src/diagrams/requirement/requirementDb.js | 26 ++++-------- 3 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/diagrams/requirement/parser/requirementDiagram.jison b/src/diagrams/requirement/parser/requirementDiagram.jison index b7d3089e17..8f85e30cd4 100644 --- a/src/diagrams/requirement/parser/requirementDiagram.jison +++ b/src/diagrams/requirement/parser/requirementDiagram.jison @@ -13,7 +13,9 @@ %x type_directive %x arg_directive %x close_directive - +%x acc_title +%x acc_descr +%x acc_descr_multiline %% \%\%\{ { this.begin('open_directive'); return 'open_directive'; } <open_directive>((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; } @@ -22,8 +24,13 @@ <arg_directive>((?:(?!\}\%\%).|\n)*) return 'arg_directive'; "title"\s[^#\n;]+ return 'title'; -"accDescription"\s[^#\n;]+ return 'accDescription'; - +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; (\r?\n)+ return 'NEWLINE'; \s+ /* skip all whitespace */ \#[^\n]* /* skip comments */ @@ -94,9 +101,10 @@ start directive : openDirective typeDirective closeDirective | openDirective typeDirective ':' argDirective closeDirective - | title {yy.setTitle($1.substring(6));$$=$1.substring(6);} - | accDescription {yy.setAccDescription($1.substring(15));$$=$1.substring(15);}; - + | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } + ; openDirective : open_directive { yy.parseDirective('%%{', 'open_directive'); }; diff --git a/src/diagrams/requirement/parser/requirementDiagram.spec.js b/src/diagrams/requirement/parser/requirementDiagram.spec.js index 9b651b6903..850d76b586 100644 --- a/src/diagrams/requirement/parser/requirementDiagram.spec.js +++ b/src/diagrams/requirement/parser/requirementDiagram.spec.js @@ -72,22 +72,38 @@ describe('when parsing requirement diagram it...', function () { expect(Object.keys(requirementDb.getRelationships()).length).toBe(0); }); - it('will use a title and accDescription', function () { + it('will use a accessibility title and description (accDescr)', function () { const expectedTitle = 'test title'; const expectedAccDescription = 'my chart description'; - const expectedDocRef = 'test_ref'; - let lines = [ - `requirementDiagram`, - ``, - `title ${expectedTitle}`, - `accDescription ${expectedAccDescription}`, - `element test_name {`, - `type: test_type`, - `docref: test_ref`, - `}`, - ]; - let doc = lines.join('\n'); + const doc = `requirementDiagram + accTitle: ${expectedTitle} + accDescr: ${expectedAccDescription} + element test_name { + type: test_type + docref: test_ref + }`; + + reqDiagram.parser.parse(doc); + + expect(requirementDb.getTitle()).toBe(expectedTitle); + expect(requirementDb.getAccDescription()).toBe(expectedAccDescription); + }); + + it('will use a accessibility title and multiline description (accDescr)', function () { + const expectedTitle = 'test title'; + const expectedAccDescription = `my chart description +line 2`; + + const doc = `requirementDiagram + accTitle: ${expectedTitle} + accDescr { + ${expectedAccDescription} + } + element test_name { + type: test_type + docref: test_ref + }`; reqDiagram.parser.parse(doc); diff --git a/src/diagrams/requirement/requirementDb.js b/src/diagrams/requirement/requirementDb.js index 2141c24007..fd6340c476 100644 --- a/src/diagrams/requirement/requirementDb.js +++ b/src/diagrams/requirement/requirementDb.js @@ -2,6 +2,13 @@ import * as configApi from '../../config'; import { log } from '../../logger'; import mermaidAPI from '../../mermaidAPI'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let relations = []; let latestRequirement = {}; @@ -137,24 +144,7 @@ const clear = () => { requirements = {}; latestElement = {}; elements = {}; -}; - -export const setTitle = function (txt) { - let sanitizedText = sanitizeText(txt, configApi.getConfig()); - title = sanitizedText; -}; - -export const getTitle = function () { - return title; -}; - -export const setAccDescription = function (txt) { - let sanitizedText = sanitizeText(txt, configApi.getConfig()); - accDescription = sanitizedText; -}; - -export const getAccDescription = function () { - return accDescription; + commonClear(); }; export default { From 34ffe2790b3b71977e643ad0025302ff2c50a523 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:35:34 +0200 Subject: [PATCH 07/13] Updated sequence diagram parsing with the new syntax --- .../sequence/parser/sequenceDiagram.jison | 16 ++++++++-- src/diagrams/sequence/sequenceDb.js | 25 +++++---------- src/diagrams/sequence/sequenceDiagram.spec.js | 32 ++++++++++++------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/diagrams/sequence/parser/sequenceDiagram.jison b/src/diagrams/sequence/parser/sequenceDiagram.jison index a30a731762..0356cf4919 100644 --- a/src/diagrams/sequence/parser/sequenceDiagram.jison +++ b/src/diagrams/sequence/parser/sequenceDiagram.jison @@ -18,7 +18,9 @@ // Directive states %x open_directive type_directive arg_directive - +%x acc_title +%x acc_descr +%x acc_descr_multiline %% \%\%\{ { this.begin('open_directive'); return 'open_directive'; } @@ -59,7 +61,13 @@ "deactivate" { this.begin('ID'); return 'deactivate'; } "title"\s[^#\n;]+ return 'title'; "title:"\s[^#\n;]+ return 'legacy_title'; -"accDescription"\s[^#\n;]+ return 'accDescription'; +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; "sequenceDiagram" return 'SD'; "autonumber" return 'autonumber'; "off" return 'off'; @@ -130,7 +138,9 @@ statement | details_statement 'NEWLINE' | title {yy.setTitle($1.substring(6));$$=$1.substring(6);} | legacy_title {yy.setTitle($1.substring(7));$$=$1.substring(7);} - | accDescription {yy.setAccDescription($1.substring(15));$$=$1.substring(15);} + | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } | 'loop' restOfLine document end { $3.unshift({type: 'loopStart', loopText:yy.parseMessage($2), signalType: yy.LINETYPE.LOOP_START}); diff --git a/src/diagrams/sequence/sequenceDb.js b/src/diagrams/sequence/sequenceDb.js index 3b52516c2a..10569ba382 100644 --- a/src/diagrams/sequence/sequenceDb.js +++ b/src/diagrams/sequence/sequenceDb.js @@ -2,6 +2,13 @@ import mermaidAPI from '../../mermaidAPI'; import * as configApi from '../../config'; import { log } from '../../logger'; import { sanitizeText } from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let prevActor = undefined; let actors = {}; @@ -119,9 +126,6 @@ export const getActor = function (id) { export const getActorKeys = function () { return Object.keys(actors); }; -export const getTitle = function () { - return title; -}; export const enableSequenceNumbers = function () { sequenceNumbersEnabled = true; }; @@ -140,6 +144,7 @@ export const clear = function () { actors = {}; messages = []; sequenceNumbersEnabled = false; + commonClear(); }; export const parseMessage = function (str) { @@ -325,11 +330,6 @@ export const getActorProperty = function (actor, key) { return undefined; }; -export const setTitle = function (txt) { - let sanitizedText = sanitizeText(txt, configApi.getConfig()); - title = sanitizedText; -}; - export const apply = function (param) { if (param instanceof Array) { param.forEach(function (item) { @@ -423,15 +423,6 @@ export const apply = function (param) { } }; -const setAccDescription = function (description_lex) { - let sanitizedText = sanitizeText(description_lex, configApi.getConfig()); - description = sanitizedText; -}; - -const getAccDescription = function () { - return description; -}; - export default { addActor, addMessage, diff --git a/src/diagrams/sequence/sequenceDiagram.spec.js b/src/diagrams/sequence/sequenceDiagram.spec.js index 0ad9d1ed02..26c8b5adb9 100644 --- a/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/src/diagrams/sequence/sequenceDiagram.spec.js @@ -108,26 +108,34 @@ Bob-->Alice: I am good thanks!`; expect(title).toBe('Diagram Title'); }); - it('it should handle a sequenceDiagram definition with a accDescription', function () { + it('it should handle a sequenceDiagram definition with a accessibility title and description (accDescr)', function () { const str = ` sequenceDiagram -accDescription Accessibility Description +accTitle: This is the title +accDescr: Accessibility Description Alice->Bob:Hello Bob, how are you? -Note right of Bob: Bob thinks -Bob-->Alice: I am good thanks!`; +`; mermaidAPI.parse(str); - const actors = parser.yy.getActors(); - expect(actors.Alice.description).toBe('Alice'); - actors.Bob.description = 'Bob'; - + expect(parser.yy.getTitle()).toBe('This is the title'); expect(parser.yy.getAccDescription()).toBe('Accessibility Description'); const messages = parser.yy.getMessages(); - const title = parser.yy.getTitle(); + }); + it('it should handle a sequenceDiagram definition with a accessibility title and multiline description (accDescr)', function () { + const str = ` +sequenceDiagram +accTitle: This is the title +accDescr { +Accessibility +Description +} +Alice->Bob:Hello Bob, how are you? +`; - expect(messages.length).toBe(3); - expect(messages[0].from).toBe('Alice'); - expect(messages[2].from).toBe('Bob'); + mermaidAPI.parse(str); + expect(parser.yy.getTitle()).toBe('This is the title'); + expect(parser.yy.getAccDescription()).toBe('Accessibility\nDescription'); + const messages = parser.yy.getMessages(); }); it('it should space in actor names', function () { From ae91f794d6a4abc646bd6e6cc70457e96baf777a Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:44:03 +0200 Subject: [PATCH 08/13] Updated user journey diagram parsing with the new syntax --- src/diagrams/user-journey/journeyDb.js | 24 ++++++----------- .../user-journey/parser/journey.jison | 15 +++++++++-- .../user-journey/parser/journey.spec.js | 27 +++++++++++++++++-- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/diagrams/user-journey/journeyDb.js b/src/diagrams/user-journey/journeyDb.js index 55ea6ec3b6..7b50b6ac48 100644 --- a/src/diagrams/user-journey/journeyDb.js +++ b/src/diagrams/user-journey/journeyDb.js @@ -1,6 +1,13 @@ import mermaidAPI from '../../mermaidAPI'; import * as configApi from '../../config'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; const sanitizeText = (txt) => common.sanitizeText(txt, configApi.getConfig()); @@ -23,22 +30,7 @@ export const clear = function () { title = ''; description = ''; rawTasks.length = 0; -}; - -const setTitle = function (txt) { - title = sanitizeText(txt); -}; - -const getTitle = function () { - return title; -}; - -const setAccDescription = function (txt) { - description = sanitizeText(txt); -}; - -const getAccDescription = function () { - return description; + commonClear(); }; export const addSection = function (txt) { diff --git a/src/diagrams/user-journey/parser/journey.jison b/src/diagrams/user-journey/parser/journey.jison index 37d493d3ef..a60ae2ef85 100644 --- a/src/diagrams/user-journey/parser/journey.jison +++ b/src/diagrams/user-journey/parser/journey.jison @@ -5,6 +5,9 @@ */ %lex %options case-insensitive +%x acc_title +%x acc_descr +%x acc_descr_multiline // Directive states %x open_directive type_directive arg_directive @@ -25,7 +28,13 @@ "journey" return 'journey'; "title"\s[^#\n;]+ return 'title'; -"accDescription"\s[^#\n;]+ return 'accDescription'; +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; "section"\s[^#:\n;]+ return 'section'; [^#:\n;]+ return 'taskName'; ":"[^#\n;]+ return 'taskData'; @@ -65,7 +74,9 @@ directive statement : title {yy.setTitle($1.substr(6));$$=$1.substr(6);} - | accDescription {yy.setAccDescription($1.substring(15));$$=$1.substring(15);} + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | section {yy.addSection($1.substr(8));$$=$1.substr(8);} | taskName taskData {yy.addTask($1, $2);$$='task';} | directive diff --git a/src/diagrams/user-journey/parser/journey.spec.js b/src/diagrams/user-journey/parser/journey.spec.js index 6cf604caf0..3cd68acc7b 100644 --- a/src/diagrams/user-journey/parser/journey.spec.js +++ b/src/diagrams/user-journey/parser/journey.spec.js @@ -19,15 +19,38 @@ describe('when parsing a journey diagram it', function () { expect(parserFnConstructor(str)).not.toThrow(); }); - it('it should handle an accDescription', function () { + it('it should handle an accessibility description (accDescr)', function () { const str = 'journey\n' + - 'accDescription A user journey for family shopping\n' + + 'accDescr: A user journey for family shopping\n' + 'title Adding journey diagram functionality to mermaid\n' + 'section Order from website'; expect(parserFnConstructor(str)).not.toThrow(); }); + it('it should handle an accessibility multiline description (accDescr)', function () { + const str = + 'journey\n' + + `accDescr { + A user journey for + family shopping + }` + + 'title Adding journey diagram functionality to mermaid\n' + + 'section Order from website'; + + expect(parserFnConstructor(str)).not.toThrow(); + expect(journeyDb.getAccDescription()).toBe('A user journey for\nfamily shopping'); + expect(journeyDb.getTitle()).toBe('Adding journey diagram functionality to mermaid'); + }); + it('it should handle an accessibility title (accDescr)', function () { + const str = `journey + accTitle: The title + section Order from website`; + + expect(parserFnConstructor(str)).not.toThrow(); + expect(journeyDb.getAccDescription()).toBe(''); + expect(journeyDb.getTitle()).toBe('The title'); + }); it('should handle a section definition', function () { const str = From 3baf31695ed75da00aa2ea20ba88d95becaa42f8 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:50:02 +0200 Subject: [PATCH 09/13] Updated user state diagram parsing with the new syntax --- src/diagrams/state/parser/stateDiagram.jison | 22 ++++++++++-------- src/diagrams/state/stateDb.js | 24 +++++++------------- src/diagrams/state/stateDiagram.spec.js | 23 +++++++++++++++---- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/diagrams/state/parser/stateDiagram.jison b/src/diagrams/state/parser/stateDiagram.jison index b3c47adda1..2b8b88a3e3 100644 --- a/src/diagrams/state/parser/stateDiagram.jison +++ b/src/diagrams/state/parser/stateDiagram.jison @@ -20,8 +20,9 @@ %x STATE_ID %x ALIAS %x SCALE -%x title -%x accDescription +%x acc_title +%x acc_descr +%x acc_descr_multiline %x NOTE %x NOTE_ID %x NOTE_TEXT @@ -60,10 +61,13 @@ <SCALE>\d+ return 'WIDTH'; <SCALE>\s+"width" {this.popState();} -title { this.begin("title");return 'title'; } -<title>(?!\n|;|#)*[^\n]* { this.popState(); return "title_value"; } -accDescription { this.begin("accDescription");return 'accDescription'; } -<accDescription>(?!\n|;|#)*[^\n]* { this.popState(); return "description_value"; } +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; <INITIAL,struct>"state"\s+ { /*console.log('Starting STATE zxzx'+yy.getDirection());*/this.pushState('STATE'); } <STATE>.*"<<fork>>" {this.popState();yytext=yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yytext);*/return 'FORK';} @@ -200,9 +204,9 @@ statement | note NOTE_TEXT AS ID | directive | direction - | title title_value { $$=$2.trim();yy.setTitle($$); } - | accDescription description_value { $$=$2.trim();yy.setAccDescription($$); } - ; + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } ; directive : openDirective typeDirective closeDirective diff --git a/src/diagrams/state/stateDb.js b/src/diagrams/state/stateDb.js index 14eea78965..eee495d170 100644 --- a/src/diagrams/state/stateDb.js +++ b/src/diagrams/state/stateDb.js @@ -3,6 +3,13 @@ import { generateId } from '../../utils'; import mermaidAPI from '../../mermaidAPI'; import common from '../common/common'; import * as configApi from '../../config'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; const sanitizeText = (txt) => common.sanitizeText(txt, configApi.getConfig()); @@ -120,22 +127,6 @@ let endCnt = 0; // eslint-disable-line let title = 'State diagram'; let description = ''; -const setTitle = function (txt) { - title = sanitizeText(txt); -}; - -const getTitle = function () { - return title; -}; - -const setAccDescription = function (txt) { - description = sanitizeText(txt); -}; - -const getAccDescription = function () { - return description; -}; - /** * Function called by parser when a node definition has been found. * @@ -191,6 +182,7 @@ export const clear = function () { startCnt = 0; endCnt = 0; // eslint-disable-line classes = []; + commonClear(); }; export const getState = function (id) { diff --git a/src/diagrams/state/stateDiagram.spec.js b/src/diagrams/state/stateDiagram.spec.js index 0d7add467e..762a694ca1 100644 --- a/src/diagrams/state/stateDiagram.spec.js +++ b/src/diagrams/state/stateDiagram.spec.js @@ -27,9 +27,9 @@ describe('state diagram, ', function () { const description = stateDb.getAccDescription(); expect(description).toBe(''); }); - it('simple with accDescription', function () { + it('simple with accDescription (accDescr)', function () { const str = `stateDiagram\n - accDescription a simple description of the diagram + accDescr: a simple description of the diagram State1 : this is another string [*] --> State1 State1 --> [*] @@ -39,9 +39,24 @@ describe('state diagram, ', function () { const description = stateDb.getAccDescription(); expect(description).toBe('a simple description of the diagram'); }); - it('simple with title', function () { + it('simple with multiline accDescription (accDescr)', function () { const str = `stateDiagram\n - title a simple title of the diagram + accDescr { + a simple description of the diagram + using multiple lines + } + State1 : this is another string + [*] --> State1 + State1 --> [*] + `; + + parser.parse(str); + const description = stateDb.getAccDescription(); + expect(description).toBe('a simple description of the diagram\nusing multiple lines'); + }); + it('simple with title (accDescr)', function () { + const str = `stateDiagram\n + accTitle: a simple title of the diagram State1 : this is another string [*] --> State1 State1 --> [*] From e917347b81e818739405bcf402e93bb40bb6e9b0 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 15:54:03 +0200 Subject: [PATCH 10/13] Removing logging, cleanup --- classDiagram.js | 904 ++++++++++++++++++ cypress/platform/knsv.html | 19 +- pie.js | 675 +++++++++++++ src/diagrams/class/parser/classDiagram.jison | 6 +- .../parser/requirementDiagram.jison | 6 +- .../sequence/parser/sequenceDiagram.jison | 6 +- 6 files changed, 1604 insertions(+), 12 deletions(-) create mode 100644 classDiagram.js create mode 100644 pie.js diff --git a/classDiagram.js b/classDiagram.js new file mode 100644 index 0000000000..2d48929b57 --- /dev/null +++ b/classDiagram.js @@ -0,0 +1,904 @@ +/* parser generated by jison 0.4.18 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var classDiagram = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,3],$V1=[1,7],$V2=[1,8],$V3=[1,9],$V4=[1,10],$V5=[1,13],$V6=[1,12],$V7=[1,16,25],$V8=[1,20],$V9=[1,31],$Va=[1,32],$Vb=[1,33],$Vc=[1,35],$Vd=[1,38],$Ve=[1,36],$Vf=[1,37],$Vg=[1,39],$Vh=[1,40],$Vi=[1,41],$Vj=[1,42],$Vk=[1,45],$Vl=[1,46],$Vm=[1,47],$Vn=[1,48],$Vo=[16,25],$Vp=[1,62],$Vq=[1,63],$Vr=[1,64],$Vs=[1,65],$Vt=[1,66],$Vu=[1,67],$Vv=[16,25,32,44,45,53,56,57,58,59,60,61,66,68],$Vw=[16,25,30,32,44,45,49,53,56,57,58,59,60,61,66,68,83,84,85,86],$Vx=[5,8,9,10,11,16,19,23,25],$Vy=[53,83,84,85,86],$Vz=[53,60,61,83,84,85,86],$VA=[53,56,57,58,59,83,84,85,86],$VB=[16,25,32],$VC=[1,99]; +var parser = {trace: function trace () { }, +yy: {}, +symbols_: {"error":2,"start":3,"mermaidDoc":4,"statments":5,"direction":6,"directive":7,"direction_tb":8,"direction_bt":9,"direction_rl":10,"direction_lr":11,"graphConfig":12,"openDirective":13,"typeDirective":14,"closeDirective":15,"NEWLINE":16,":":17,"argDirective":18,"open_directive":19,"type_directive":20,"arg_directive":21,"close_directive":22,"CLASS_DIAGRAM":23,"statements":24,"EOF":25,"statement":26,"className":27,"alphaNumToken":28,"classLiteralName":29,"GENERICTYPE":30,"relationStatement":31,"LABEL":32,"classStatement":33,"methodStatement":34,"annotationStatement":35,"clickStatement":36,"cssClassStatement":37,"acc_title":38,"acc_title_value":39,"acc_descr":40,"acc_descr_value":41,"acc_descr_multiline_value":42,"CLASS":43,"STYLE_SEPARATOR":44,"STRUCT_START":45,"members":46,"STRUCT_STOP":47,"ANNOTATION_START":48,"ANNOTATION_END":49,"MEMBER":50,"SEPARATOR":51,"relation":52,"STR":53,"relationType":54,"lineType":55,"AGGREGATION":56,"EXTENSION":57,"COMPOSITION":58,"DEPENDENCY":59,"LINE":60,"DOTTED_LINE":61,"CALLBACK":62,"LINK":63,"LINK_TARGET":64,"CLICK":65,"CALLBACK_NAME":66,"CALLBACK_ARGS":67,"HREF":68,"CSSCLASS":69,"commentToken":70,"textToken":71,"graphCodeTokens":72,"textNoTagsToken":73,"TAGSTART":74,"TAGEND":75,"==":76,"--":77,"PCT":78,"DEFAULT":79,"SPACE":80,"MINUS":81,"keywords":82,"UNICODE_TEXT":83,"NUM":84,"ALPHA":85,"BQUOTE_STR":86,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"statments",8:"direction_tb",9:"direction_bt",10:"direction_rl",11:"direction_lr",16:"NEWLINE",17:":",19:"open_directive",20:"type_directive",21:"arg_directive",22:"close_directive",23:"CLASS_DIAGRAM",25:"EOF",30:"GENERICTYPE",32:"LABEL",38:"acc_title",39:"acc_title_value",40:"acc_descr",41:"acc_descr_value",42:"acc_descr_multiline_value",43:"CLASS",44:"STYLE_SEPARATOR",45:"STRUCT_START",47:"STRUCT_STOP",48:"ANNOTATION_START",49:"ANNOTATION_END",50:"MEMBER",51:"SEPARATOR",53:"STR",56:"AGGREGATION",57:"EXTENSION",58:"COMPOSITION",59:"DEPENDENCY",60:"LINE",61:"DOTTED_LINE",62:"CALLBACK",63:"LINK",64:"LINK_TARGET",65:"CLICK",66:"CALLBACK_NAME",67:"CALLBACK_ARGS",68:"HREF",69:"CSSCLASS",72:"graphCodeTokens",74:"TAGSTART",75:"TAGEND",76:"==",77:"--",78:"PCT",79:"DEFAULT",80:"SPACE",81:"MINUS",82:"keywords",83:"UNICODE_TEXT",84:"NUM",85:"ALPHA",86:"BQUOTE_STR"}, +productions_: [0,[3,1],[3,1],[3,1],[3,2],[6,1],[6,1],[6,1],[6,1],[4,1],[7,4],[7,6],[13,1],[14,1],[18,1],[15,1],[12,4],[24,1],[24,2],[24,3],[27,1],[27,1],[27,2],[27,2],[27,2],[26,1],[26,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,2],[26,2],[26,1],[33,2],[33,4],[33,5],[33,7],[35,4],[46,1],[46,2],[34,1],[34,2],[34,1],[34,1],[31,3],[31,4],[31,4],[31,5],[52,3],[52,2],[52,2],[52,1],[54,1],[54,1],[54,1],[54,1],[55,1],[55,1],[36,3],[36,4],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[36,3],[36,4],[36,4],[36,5],[37,3],[70,1],[70,1],[71,1],[71,1],[71,1],[71,1],[71,1],[71,1],[71,1],[73,1],[73,1],[73,1],[73,1],[28,1],[28,1],[28,1],[29,1]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 5: + yy.setDirection('TB'); +break; +case 6: + yy.setDirection('BT'); +break; +case 7: + yy.setDirection('RL'); +break; +case 8: + yy.setDirection('LR'); +break; +case 12: + yy.parseDirective('%%{', 'open_directive'); +break; +case 13: + yy.parseDirective($$[$0], 'type_directive'); +break; +case 14: + $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); +break; +case 15: + yy.parseDirective('}%%', 'close_directive', 'class'); +break; +case 20: case 21: + this.$=$$[$0]; +break; +case 22: + this.$=$$[$0-1]+$$[$0]; +break; +case 23: case 24: + this.$=$$[$0-1]+'~'+$$[$0]; +break; +case 25: + yy.addRelation($$[$0]); +break; +case 26: + $$[$0-1].title = yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]); +break; +case 34: + this.$=$$[$0].trim();yy.setTitle(this.$); +break; +case 35: case 36: + this.$=$$[$0].trim();yy.setAccDescription(this.$); +break; +case 37: +yy.addClass($$[$0]); +break; +case 38: +yy.addClass($$[$0-2]);yy.setCssClass($$[$0-2], $$[$0]); +break; +case 39: +/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addClass($$[$0-3]);yy.addMembers($$[$0-3],$$[$0-1]); +break; +case 40: +yy.addClass($$[$0-5]);yy.setCssClass($$[$0-5], $$[$0-3]);yy.addMembers($$[$0-5],$$[$0-1]); +break; +case 41: + yy.addAnnotation($$[$0],$$[$0-2]); +break; +case 42: + this.$ = [$$[$0]]; +break; +case 43: + $$[$0].push($$[$0-1]);this.$=$$[$0]; +break; +case 44: +/*console.log('Rel found',$$[$0]);*/ +break; +case 45: +yy.addMember($$[$0-1],yy.cleanupLabel($$[$0])); +break; +case 46: +/*console.warn('Member',$$[$0]);*/ +break; +case 47: +/*console.log('sep found',$$[$0]);*/ +break; +case 48: + this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; +break; +case 49: + this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'} +break; +case 50: + this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; +break; +case 51: + this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} +break; +case 52: + this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; +break; +case 53: + this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; +break; +case 54: + this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; +break; +case 55: + this.$={type1:'none',type2:'none',lineType:$$[$0]}; +break; +case 56: + this.$=yy.relationType.AGGREGATION; +break; +case 57: + this.$=yy.relationType.EXTENSION; +break; +case 58: + this.$=yy.relationType.COMPOSITION; +break; +case 59: + this.$=yy.relationType.DEPENDENCY; +break; +case 60: +this.$=yy.lineType.LINE; +break; +case 61: +this.$=yy.lineType.DOTTED_LINE; +break; +case 62: case 68: +this.$ = $$[$0-2];yy.setClickEvent($$[$0-1], $$[$0]); +break; +case 63: case 69: +this.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]); +break; +case 64: case 72: +this.$ = $$[$0-2];yy.setLink($$[$0-1], $$[$0]); +break; +case 65: +this.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1],$$[$0]); +break; +case 66: case 74: +this.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-2], $$[$0]); +break; +case 67: case 75: +this.$ = $$[$0-4];yy.setLink($$[$0-3], $$[$0-2], $$[$0]);yy.setTooltip($$[$0-3], $$[$0-1]); +break; +case 70: +this.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]); +break; +case 71: +this.$ = $$[$0-4];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setTooltip($$[$0-3], $$[$0]); +break; +case 73: +this.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1], $$[$0]); +break; +case 76: +yy.setCssClass($$[$0-1], $$[$0]); +break; +} +}, +table: [{3:1,4:2,5:$V0,6:4,7:5,8:$V1,9:$V2,10:$V3,11:$V4,12:6,13:11,19:$V5,23:$V6},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{3:14,4:2,5:$V0,6:4,7:5,8:$V1,9:$V2,10:$V3,11:$V4,12:6,13:11,19:$V5,23:$V6},{1:[2,9]},o($V7,[2,5]),o($V7,[2,6]),o($V7,[2,7]),o($V7,[2,8]),{14:15,20:[1,16]},{16:[1,17]},{20:[2,12]},{1:[2,4]},{15:18,17:[1,19],22:$V8},o([17,22],[2,13]),{6:30,7:29,8:$V1,9:$V2,10:$V3,11:$V4,13:11,19:$V5,24:21,26:22,27:34,28:43,29:44,31:23,33:24,34:25,35:26,36:27,37:28,38:$V9,40:$Va,42:$Vb,43:$Vc,48:$Vd,50:$Ve,51:$Vf,62:$Vg,63:$Vh,65:$Vi,69:$Vj,83:$Vk,84:$Vl,85:$Vm,86:$Vn},{16:[1,49]},{18:50,21:[1,51]},{16:[2,15]},{25:[1,52]},{16:[1,53],25:[2,17]},o($Vo,[2,25],{32:[1,54]}),o($Vo,[2,27]),o($Vo,[2,28]),o($Vo,[2,29]),o($Vo,[2,30]),o($Vo,[2,31]),o($Vo,[2,32]),o($Vo,[2,33]),{39:[1,55]},{41:[1,56]},o($Vo,[2,36]),o($Vo,[2,44],{52:57,54:60,55:61,32:[1,59],53:[1,58],56:$Vp,57:$Vq,58:$Vr,59:$Vs,60:$Vt,61:$Vu}),{27:68,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},o($Vo,[2,46]),o($Vo,[2,47]),{28:69,83:$Vk,84:$Vl,85:$Vm},{27:70,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},{27:71,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},{27:72,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},{53:[1,73]},o($Vv,[2,20],{28:43,29:44,27:74,30:[1,75],83:$Vk,84:$Vl,85:$Vm,86:$Vn}),o($Vv,[2,21],{30:[1,76]}),o($Vw,[2,90]),o($Vw,[2,91]),o($Vw,[2,92]),o([16,25,30,32,44,45,53,56,57,58,59,60,61,66,68],[2,93]),o($Vx,[2,10]),{15:77,22:$V8},{22:[2,14]},{1:[2,16]},{6:30,7:29,8:$V1,9:$V2,10:$V3,11:$V4,13:11,19:$V5,24:78,25:[2,18],26:22,27:34,28:43,29:44,31:23,33:24,34:25,35:26,36:27,37:28,38:$V9,40:$Va,42:$Vb,43:$Vc,48:$Vd,50:$Ve,51:$Vf,62:$Vg,63:$Vh,65:$Vi,69:$Vj,83:$Vk,84:$Vl,85:$Vm,86:$Vn},o($Vo,[2,26]),o($Vo,[2,34]),o($Vo,[2,35]),{27:79,28:43,29:44,53:[1,80],83:$Vk,84:$Vl,85:$Vm,86:$Vn},{52:81,54:60,55:61,56:$Vp,57:$Vq,58:$Vr,59:$Vs,60:$Vt,61:$Vu},o($Vo,[2,45]),{55:82,60:$Vt,61:$Vu},o($Vy,[2,55],{54:83,56:$Vp,57:$Vq,58:$Vr,59:$Vs}),o($Vz,[2,56]),o($Vz,[2,57]),o($Vz,[2,58]),o($Vz,[2,59]),o($VA,[2,60]),o($VA,[2,61]),o($Vo,[2,37],{44:[1,84],45:[1,85]}),{49:[1,86]},{53:[1,87]},{53:[1,88]},{66:[1,89],68:[1,90]},{28:91,83:$Vk,84:$Vl,85:$Vm},o($Vv,[2,22]),o($Vv,[2,23]),o($Vv,[2,24]),{16:[1,92]},{25:[2,19]},o($VB,[2,48]),{27:93,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},{27:94,28:43,29:44,53:[1,95],83:$Vk,84:$Vl,85:$Vm,86:$Vn},o($Vy,[2,54],{54:96,56:$Vp,57:$Vq,58:$Vr,59:$Vs}),o($Vy,[2,53]),{28:97,83:$Vk,84:$Vl,85:$Vm},{46:98,50:$VC},{27:100,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},o($Vo,[2,62],{53:[1,101]}),o($Vo,[2,64],{53:[1,103],64:[1,102]}),o($Vo,[2,68],{53:[1,104],67:[1,105]}),o($Vo,[2,72],{53:[1,107],64:[1,106]}),o($Vo,[2,76]),o($Vx,[2,11]),o($VB,[2,50]),o($VB,[2,49]),{27:108,28:43,29:44,83:$Vk,84:$Vl,85:$Vm,86:$Vn},o($Vy,[2,52]),o($Vo,[2,38],{45:[1,109]}),{47:[1,110]},{46:111,47:[2,42],50:$VC},o($Vo,[2,41]),o($Vo,[2,63]),o($Vo,[2,65]),o($Vo,[2,66],{64:[1,112]}),o($Vo,[2,69]),o($Vo,[2,70],{53:[1,113]}),o($Vo,[2,73]),o($Vo,[2,74],{64:[1,114]}),o($VB,[2,51]),{46:115,50:$VC},o($Vo,[2,39]),{47:[2,43]},o($Vo,[2,67]),o($Vo,[2,71]),o($Vo,[2,75]),{47:[1,116]},o($Vo,[2,40])], +defaultActions: {2:[2,1],3:[2,2],4:[2,3],6:[2,9],13:[2,12],14:[2,4],20:[2,15],51:[2,14],52:[2,16],78:[2,19],111:[2,43]}, +parseError: function parseError (str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; + +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, + +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + + this._input = this._input.slice(1); + return ch; + }, + +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, + +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function(match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, + +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + +// return next match that has a token +lex:function lex () { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin (condition) { + this.conditionStack.push(condition); + }, + +// pop the previously active lexer condition state off the condition stack +popState:function popState () { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules () { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState (n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + +// alias for begin(condition) +pushState:function pushState (condition) { + this.begin(condition); + }, + +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0: this.begin('open_directive'); return 19; +break; +case 1:return 8; +break; +case 2:return 9; +break; +case 3:return 10; +break; +case 4:return 11; +break; +case 5: this.begin('type_directive'); return 20; +break; +case 6: this.popState(); this.begin('arg_directive'); return 17; +break; +case 7: this.popState(); this.popState(); return 22; +break; +case 8:return 21; +break; +case 9:/* skip comments */ +break; +case 10:/* skip comments */ +break; +case 11: this.begin("acc_title");return 38; +break; +case 12: this.popState(); return "acc_title_value"; +break; +case 13: this.begin("acc_descr");return 40; +break; +case 14: this.popState(); return "acc_descr_value"; +break; +case 15: this.begin("acc_descr_multiline"); +break; +case 16: this.popState(); +break; +case 17:return "acc_descr_multiline_value"; +break; +case 18:return 16; +break; +case 19:/* skip whitespace */ +break; +case 20:return 23; +break; +case 21:return 23; +break; +case 22: this.begin("struct"); /*console.log('Starting struct');*/ return 45; +break; +case 23:return "EOF_IN_STRUCT"; +break; +case 24:return "OPEN_IN_STRUCT"; +break; +case 25: /*console.log('Ending struct');*/this.popState(); return 47; +break; +case 26:/* nothing */ +break; +case 27: /*console.log('lex-member: ' + yy_.yytext);*/ return "MEMBER"; +break; +case 28:return 43; +break; +case 29:return 69; +break; +case 30:return 62; +break; +case 31:return 63; +break; +case 32:return 65; +break; +case 33:return 48; +break; +case 34:return 49; +break; +case 35:this.begin("generic"); +break; +case 36:this.popState(); +break; +case 37:return "GENERICTYPE"; +break; +case 38:this.begin("string"); +break; +case 39:this.popState(); +break; +case 40:return "STR"; +break; +case 41:this.begin("bqstring"); +break; +case 42:this.popState(); +break; +case 43:return "BQUOTE_STR"; +break; +case 44:this.begin("href"); +break; +case 45:this.popState(); +break; +case 46:return 68; +break; +case 47:this.begin("callback_name"); +break; +case 48:this.popState(); +break; +case 49:this.popState(); this.begin("callback_args"); +break; +case 50:return 66; +break; +case 51:this.popState(); +break; +case 52:return 67; +break; +case 53:return 64; +break; +case 54:return 64; +break; +case 55:return 64; +break; +case 56:return 64; +break; +case 57:return 57; +break; +case 58:return 57; +break; +case 59:return 59; +break; +case 60:return 59; +break; +case 61:return 58; +break; +case 62:return 56; +break; +case 63:return 60; +break; +case 64:return 61; +break; +case 65:return 32; +break; +case 66:return 44; +break; +case 67:return 81; +break; +case 68:return 'DOT'; +break; +case 69:return 'PLUS'; +break; +case 70:return 78; +break; +case 71:return 'EQUALS'; +break; +case 72:return 'EQUALS'; +break; +case 73:return 85; +break; +case 74:return 'PUNCTUATION'; +break; +case 75:return 84; +break; +case 76:return 83; +break; +case 77:return 80; +break; +case 78:return 25; +break; +} +}, +rules: [/^(?:%%\{)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[`])/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:href[\s]+["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/], +conditions: {"acc_descr_multiline":{"rules":[16,17],"inclusive":false},"acc_descr":{"rules":[14],"inclusive":false},"acc_title":{"rules":[12],"inclusive":false},"arg_directive":{"rules":[7,8],"inclusive":false},"type_directive":{"rules":[6,7],"inclusive":false},"open_directive":{"rules":[5],"inclusive":false},"callback_args":{"rules":[51,52],"inclusive":false},"callback_name":{"rules":[48,49,50],"inclusive":false},"href":{"rules":[45,46],"inclusive":false},"struct":{"rules":[23,24,25,26,27],"inclusive":false},"generic":{"rules":[36,37],"inclusive":false},"bqstring":{"rules":[42,43],"inclusive":false},"string":{"rules":[39,40],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,9,10,11,13,15,18,19,20,21,22,28,29,30,31,32,33,34,35,38,41,44,47,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = classDiagram; +exports.Parser = classDiagram.Parser; +exports.parse = function () { return classDiagram.parse.apply(classDiagram, arguments); }; +exports.main = function commonjsMain (args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if (typeof module !== 'undefined' && require.main === module) { + exports.main(process.argv.slice(1)); +} +} \ No newline at end of file diff --git a/cypress/platform/knsv.html b/cypress/platform/knsv.html index fb9efffbc7..3961533857 100644 --- a/cypress/platform/knsv.html +++ b/cypress/platform/knsv.html @@ -31,10 +31,23 @@ <div class="mermaid" style="width: 50%;"> - %%{init: { 'logLevel': 'debug', 'theme': 'base', 'sequence': {'hideUnusedParticipants': true, 'showCommitLabel':true,'mainBranchName': 'MetroLine1'}} }%% +graph LR + subgraph id1 [title is set] + A-->B + end + subgraph id2 [title] + E + end - sequenceDiagram - participant a + B-->C + + subgraph id3 + C-->D + end + class id3,id2,A redBg; + class id3,A whiteTxt; + classDef redBg fill:#622; + classDef whiteTxt color: white; </div> <div class="mermaid2" style="width: 100%;"> journey diff --git a/pie.js b/pie.js new file mode 100644 index 0000000000..58af4fe33e --- /dev/null +++ b/pie.js @@ -0,0 +1,675 @@ +/* parser generated by jison 0.4.18 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var pie = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,5],$V2=[1,6],$V3=[1,7],$V4=[1,9],$V5=[1,11,13,15,22,23,24,25],$V6=[2,5],$V7=[1,6,11,13,15,22,23,24,25],$V8=[22,23,24],$V9=[2,8],$Va=[1,18],$Vb=[1,19],$Vc=[1,20],$Vd=[1,25],$Ve=[6,22,23,24,25]; +var parser = {trace: function trace () { }, +yy: {}, +symbols_: {"error":2,"start":3,"eol":4,"directive":5,"PIE":6,"document":7,"showData":8,"line":9,"statement":10,"txt":11,"value":12,"title":13,"title_value":14,"accDescription":15,"description_value":16,"openDirective":17,"typeDirective":18,"closeDirective":19,":":20,"argDirective":21,"NEWLINE":22,";":23,"EOF":24,"open_directive":25,"type_directive":26,"arg_directive":27,"close_directive":28,"$accept":0,"$end":1}, +terminals_: {2:"error",6:"PIE",8:"showData",11:"txt",12:"value",13:"title",14:"title_value",15:"accDescription",16:"description_value",20:":",22:"NEWLINE",23:";",24:"EOF",25:"open_directive",26:"type_directive",27:"arg_directive",28:"close_directive"}, +productions_: [0,[3,2],[3,2],[3,2],[3,3],[7,0],[7,2],[9,2],[10,0],[10,2],[10,2],[10,2],[10,1],[5,3],[5,5],[4,1],[4,1],[4,1],[17,1],[18,1],[21,1],[19,1]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 4: +yy.setShowData(true); +break; +case 7: + this.$ = $$[$0-1] +break; +case 9: + yy.addSection($$[$0-1],yy.cleanupValue($$[$0])); +break; +case 10: + this.$=$$[$0].trim();yy.setTitle(this.$); +break; +case 11: + this.$=$$[$0].trim();yy.setAccDescription(this.$); +break; +case 18: + yy.parseDirective('%%{', 'open_directive'); +break; +case 19: + yy.parseDirective($$[$0], 'type_directive'); +break; +case 20: + $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); +break; +case 21: + yy.parseDirective('}%%', 'close_directive', 'pie'); +break; +} +}, +table: [{3:1,4:2,5:3,6:$V0,17:8,22:$V1,23:$V2,24:$V3,25:$V4},{1:[3]},{3:10,4:2,5:3,6:$V0,17:8,22:$V1,23:$V2,24:$V3,25:$V4},{3:11,4:2,5:3,6:$V0,17:8,22:$V1,23:$V2,24:$V3,25:$V4},o($V5,$V6,{7:12,8:[1,13]}),o($V7,[2,15]),o($V7,[2,16]),o($V7,[2,17]),{18:14,26:[1,15]},{26:[2,18]},{1:[2,1]},{1:[2,2]},o($V8,$V9,{17:8,9:16,10:17,5:21,1:[2,3],11:$Va,13:$Vb,15:$Vc,25:$V4}),o($V5,$V6,{7:22}),{19:23,20:[1,24],28:$Vd},o([20,28],[2,19]),o($V5,[2,6]),{4:26,22:$V1,23:$V2,24:$V3},{12:[1,27]},{14:[1,28]},{16:[1,29]},o($V8,[2,12]),o($V8,$V9,{17:8,9:16,10:17,5:21,1:[2,4],11:$Va,13:$Vb,15:$Vc,25:$V4}),o($Ve,[2,13]),{21:30,27:[1,31]},o($Ve,[2,21]),o($V5,[2,7]),o($V8,[2,9]),o($V8,[2,10]),o($V8,[2,11]),{19:32,28:$Vd},{28:[2,20]},o($Ve,[2,14])], +defaultActions: {9:[2,18],10:[2,1],11:[2,2],31:[2,20]}, +parseError: function parseError (str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + var error = new Error(str); + error.hash = hash; + throw error; + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; + +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, + +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + + this._input = this._input.slice(1); + return ch; + }, + +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, + +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function(match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, + +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + +// return next match that has a token +lex:function lex () { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin (condition) { + this.conditionStack.push(condition); + }, + +// pop the previously active lexer condition state off the condition stack +popState:function popState () { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules () { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState (n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + +// alias for begin(condition) +pushState:function pushState (condition) { + this.begin(condition); + }, + +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {"case-insensitive":true}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0: this.begin('open_directive'); return 25; +break; +case 1: this.begin('type_directive'); return 26; +break; +case 2: this.popState(); this.begin('arg_directive'); return 20; +break; +case 3: this.popState(); this.popState(); return 28; +break; +case 4:return 27; +break; +case 5:/* skip comments */ +break; +case 6:/* skip comments */{ /*console.log('');*/ } +break; +case 7:return 22; +break; +case 8:/* do nothing */ +break; +case 9:/* ignore */ +break; +case 10: this.begin("title");return 13; +break; +case 11: this.popState(); return "title_value"; +break; +case 12: this.begin("acc_title");return 'acc_title'; +break; +case 13: this.popState(); return "acc_title_value"; +break; +case 14: this.begin("acc_descr");return 'acc_descr'; +break; +case 15: this.popState(); return "acc_descr_value"; +break; +case 16: this.begin("acc_descr_multiline"); +break; +case 17: this.popState(); +break; +case 18:return "acc_descr_multiline_value"; +break; +case 19: this.begin("string"); +break; +case 20: this.popState(); +break; +case 21: return "txt"; +break; +case 22:return 6; +break; +case 23:return 8; +break; +case 24:return "value"; +break; +case 25:return 24; +break; +} +}, +rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i], +conditions: {"acc_descr_multiline":{"rules":[17,18],"inclusive":false},"acc_descr":{"rules":[15],"inclusive":false},"acc_title":{"rules":[13],"inclusive":false},"close_directive":{"rules":[],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"title":{"rules":[11],"inclusive":false},"string":{"rules":[20,21],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,12,14,16,19,22,23,24,25],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (typeof require !== 'undefined' && typeof exports !== 'undefined') { +exports.parser = pie; +exports.Parser = pie.Parser; +exports.parse = function () { return pie.parse.apply(pie, arguments); }; +exports.main = function commonjsMain (args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if (typeof module !== 'undefined' && require.main === module) { + exports.main(process.argv.slice(1)); +} +} \ No newline at end of file diff --git a/src/diagrams/class/parser/classDiagram.jison b/src/diagrams/class/parser/classDiagram.jison index e298dd2f0c..e8694c9b0d 100644 --- a/src/diagrams/class/parser/classDiagram.jison +++ b/src/diagrams/class/parser/classDiagram.jison @@ -263,9 +263,9 @@ statement | cssClassStatement | directive | direction - | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } - | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } - | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } ; classStatement diff --git a/src/diagrams/requirement/parser/requirementDiagram.jison b/src/diagrams/requirement/parser/requirementDiagram.jison index 8f85e30cd4..49e3fd4e6c 100644 --- a/src/diagrams/requirement/parser/requirementDiagram.jison +++ b/src/diagrams/requirement/parser/requirementDiagram.jison @@ -101,9 +101,9 @@ start directive : openDirective typeDirective closeDirective | openDirective typeDirective ':' argDirective closeDirective - | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } - | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } - | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } ; openDirective : open_directive { yy.parseDirective('%%{', 'open_directive'); }; diff --git a/src/diagrams/sequence/parser/sequenceDiagram.jison b/src/diagrams/sequence/parser/sequenceDiagram.jison index 0356cf4919..a04f356f36 100644 --- a/src/diagrams/sequence/parser/sequenceDiagram.jison +++ b/src/diagrams/sequence/parser/sequenceDiagram.jison @@ -138,9 +138,9 @@ statement | details_statement 'NEWLINE' | title {yy.setTitle($1.substring(6));$$=$1.substring(6);} | legacy_title {yy.setTitle($1.substring(7));$$=$1.substring(7);} - | acc_title acc_title_value { console.log('acc_title');$$=$2.trim();yy.setTitle($$); } - | acc_descr acc_descr_value { console.log('acc_descr');$$=$2.trim();yy.setAccDescription($$); } - | acc_descr_multiline_value { console.log('acc_descr_multiline_value');$$=$1.trim();yy.setAccDescription($$); } + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | 'loop' restOfLine document end { $3.unshift({type: 'loopStart', loopText:yy.parseMessage($2), signalType: yy.LINETYPE.LOOP_START}); From fdd7af90892cd5b969942f9a3c2f18f962e899f4 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 16:06:53 +0200 Subject: [PATCH 11/13] Adding acc to gitGrapg parser --- src/diagrams/git/gitGraphAst.js | 15 ++++++++++++++ src/diagrams/git/gitGraphParserV2.spec.js | 25 +++++++++++++++++++++++ src/diagrams/git/parser/gitGraph.jison | 13 ++++++++++++ 3 files changed, 53 insertions(+) diff --git a/src/diagrams/git/gitGraphAst.js b/src/diagrams/git/gitGraphAst.js index 1beb1a89e7..b41da81348 100644 --- a/src/diagrams/git/gitGraphAst.js +++ b/src/diagrams/git/gitGraphAst.js @@ -4,6 +4,13 @@ import mermaidAPI from '../../mermaidAPI'; import * as configApi from '../../config'; import { getConfig } from '../../config'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let mainBranchName = getConfig().gitGraph.mainBranchName; let commits = {}; @@ -14,6 +21,9 @@ let curBranch = mainBranchName; let direction = 'LR'; let seq = 0; +/** + * + */ function getId() { return random({ length: 7 }); } @@ -326,6 +336,7 @@ export const clear = function () { branches[mainBranch] = null; curBranch = mainBranch; seq = 0; + commonClear(); }; export const getBranchesAsObjArray = function () { @@ -390,5 +401,9 @@ export default { getCurrentBranch, getDirection, getHead, + setTitle, + getTitle, + getAccDescription, + setAccDescription, commitType, }; diff --git a/src/diagrams/git/gitGraphParserV2.spec.js b/src/diagrams/git/gitGraphParserV2.spec.js index 670c3a371d..9d740d5aeb 100644 --- a/src/diagrams/git/gitGraphParserV2.spec.js +++ b/src/diagrams/git/gitGraphParserV2.spec.js @@ -616,4 +616,29 @@ describe('when parsing a gitGraph', function () { ); } }); + describe('accessibility', () => { + it('should handle a title and a description (accDescr)', () => { + const str = `gitGraph: + accTitle: This is a title + accDescr: This is a description + commit + `; + parser.parse(str); + expect(parser.yy.getTitle()).toBe('This is a title'); + expect(parser.yy.getAccDescription()).toBe('This is a description'); + }); + it('should handle a title and a multiline description (accDescr)', () => { + const str = `gitGraph: + accTitle: This is a title + accDescr { + This is a description + using multiple lines + } + commit + `; + parser.parse(str); + expect(parser.yy.getTitle()).toBe('This is a title'); + expect(parser.yy.getAccDescription()).toBe('This is a description\nusing multiple lines'); + }); + }); }); diff --git a/src/diagrams/git/parser/gitGraph.jison b/src/diagrams/git/parser/gitGraph.jison index 7c11051443..bb2ff9ae67 100644 --- a/src/diagrams/git/parser/gitGraph.jison +++ b/src/diagrams/git/parser/gitGraph.jison @@ -13,6 +13,9 @@ %x type_directive %x arg_directive %x close_directive +%x acc_title +%x acc_descr +%x acc_descr_multiline %options case-insensitive @@ -22,6 +25,13 @@ <type_directive>":" { this.popState(); this.begin('arg_directive'); return ':'; } <type_directive,arg_directive>\}\%\% { this.popState(); this.popState(); return 'close_directive'; } <arg_directive>((?:(?!\}\%\%).|\n)*) return 'arg_directive'; +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +<acc_title>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +<acc_descr>(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +<acc_descr_multiline>[\}] { this.popState(); } +<acc_descr_multiline>[^\}]* return "acc_descr_multiline_value"; (\r?\n)+ /*{console.log('New line');return 'NL';}*/ return 'NL'; \s+ /* skip all whitespace */ \#[^\n]* /* skip comments */ @@ -90,6 +100,9 @@ line statement : commitStatement | mergeStatement + | acc_title acc_title_value { $$=$2.trim();yy.setTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } | section {yy.addSection($1.substr(8));$$=$1.substr(8);} | BRANCH ID {yy.branch($2)} | CHECKOUT ID {yy.checkout($2)} // | RESET reset_arg {yy.reset($2)} From ed56e4858ade74ece5023fd5c0c7020d1336f91a Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Sat, 30 Apr 2022 16:14:43 +0200 Subject: [PATCH 12/13] Cleanup --- src/diagrams/er/erDb.js | 27 +++++++--------------- src/diagrams/gantt/ganttDb.js | 24 +++++++------------ src/diagrams/gantt/parser/gantt.spec.js | 2 +- src/diagrams/state/stateDiagram-v2.spec.js | 4 ++-- 4 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/diagrams/er/erDb.js b/src/diagrams/er/erDb.js index 6f537f27f4..7cac00f499 100644 --- a/src/diagrams/er/erDb.js +++ b/src/diagrams/er/erDb.js @@ -2,6 +2,13 @@ import { log } from '../../logger'; import mermaidAPI from '../../mermaidAPI'; import * as configApi from '../../config'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let entities = {}; let relationships = []; @@ -68,29 +75,11 @@ const addRelationship = function (entA, rolA, entB, rSpec) { const getRelationships = () => relationships; -// Keep this - TODO: revisit...allow the diagram to have a title -const setTitle = function (txt) { - let sanitizedText = common.sanitizeText(txt, configApi.getConfig()); - title = sanitizedText; -}; - -const getTitle = function () { - return title; -}; - -const setAccDescription = function (txt) { - let sanitizedText = common.sanitizeText(txt, configApi.getConfig()); - description = sanitizedText; -}; - -const getAccDescription = function () { - return description; -}; - const clear = function () { entities = {}; relationships = []; title = ''; + commonClear(); }; export default { diff --git a/src/diagrams/gantt/ganttDb.js b/src/diagrams/gantt/ganttDb.js index 0123c565a3..a3fc7058cd 100644 --- a/src/diagrams/gantt/ganttDb.js +++ b/src/diagrams/gantt/ganttDb.js @@ -5,6 +5,13 @@ import * as configApi from '../../config'; import utils from '../../utils'; import mermaidAPI from '../../mermaidAPI'; import common from '../common/common'; +import { + setTitle, + getTitle, + getAccDescription, + setAccDescription, + clear as commonClear, +} from '../../commonDb'; let dateFormat = ''; let axisFormat = ''; @@ -52,6 +59,7 @@ export const clear = function () { topAxis = false; lastOrder = 0; links = {}; + commonClear(); }; export const setAxisFormat = function (txt) { @@ -113,22 +121,6 @@ export const getLinks = function () { return links; }; -export const setTitle = function (txt) { - title = sanitizeText(txt); -}; - -export const getTitle = function () { - return title; -}; - -export const setAccDescription = function (txt) { - accDescription = sanitizeText(txt); -}; - -export const getAccDescription = function () { - return accDescription; -}; - export const addSection = function (txt) { currentSection = txt; sections.push(txt); diff --git a/src/diagrams/gantt/parser/gantt.spec.js b/src/diagrams/gantt/parser/gantt.spec.js index 0ed3d170c0..39da0f6902 100644 --- a/src/diagrams/gantt/parser/gantt.spec.js +++ b/src/diagrams/gantt/parser/gantt.spec.js @@ -175,7 +175,7 @@ describe('when parsing a gantt diagram it', function () { it('should allow for a accessibility title and multiline description (accDescr)', function () { const expectedTitle = 'Gantt Diagram'; const expectedAccDescription = `Tasks for Q4 row1 - row2`; +row2`; const ganttString = `gantt accTitle: ${expectedTitle} accDescr { diff --git a/src/diagrams/state/stateDiagram-v2.spec.js b/src/diagrams/state/stateDiagram-v2.spec.js index 27fce654c9..a5aaf83727 100644 --- a/src/diagrams/state/stateDiagram-v2.spec.js +++ b/src/diagrams/state/stateDiagram-v2.spec.js @@ -29,7 +29,7 @@ describe('state diagram, ', function () { }); it('simple with accDescription', function () { const str = `stateDiagram-v2\n - accDescription a simple description of the diagram + accDescr: a simple description of the diagram State1 : this is another string [*] --> State1 State1 --> [*] @@ -41,7 +41,7 @@ describe('state diagram, ', function () { }); it('simple with title', function () { const str = `stateDiagram-v2\n - title a simple title of the diagram + accTitle: a simple title of the diagram State1 : this is another string [*] --> State1 State1 --> [*] From d8682cfb5f3ed5608043318fe5103215f364774e Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist <knut.sveidqvist@ipiccolo.com> Date: Fri, 6 May 2022 17:40:40 +0200 Subject: [PATCH 13/13] #2732 rendering the title and descr fields for the gitGraph --- cypress/platform/gitgraph.html | 7 ++++++- src/diagrams/git/gitGraphRenderer.js | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cypress/platform/gitgraph.html b/cypress/platform/gitgraph.html index 4bcd10f5d0..13a7da8132 100644 --- a/cypress/platform/gitgraph.html +++ b/cypress/platform/gitgraph.html @@ -9,7 +9,7 @@ <style> body { /* background: rgb(221, 208, 208); */ - background:#111; + /* background:#111; */ /* background:#333; */ font-family: 'Arial'; } @@ -34,6 +34,11 @@ <h1>info below</h1> "git0": "#550055" } } }%% gitGraph + accTitle: "Git Graph" + accDescr { + Git Graph description. + Multiline description + } commit branch develop commit tag:"v1.0.0" diff --git a/src/diagrams/git/gitGraphRenderer.js b/src/diagrams/git/gitGraphRenderer.js index ad8ad57edc..aa424bd7fc 100644 --- a/src/diagrams/git/gitGraphRenderer.js +++ b/src/diagrams/git/gitGraphRenderer.js @@ -4,6 +4,8 @@ import db from './gitGraphAst'; import gitGraphParser from './parser/gitGraph'; import { log } from '../../logger'; import { getConfig } from '../../config'; +import addSVGAccessibilityFields from '../../accessibility'; + let allCommitsDict = {}; let branchNum; @@ -480,6 +482,9 @@ export const draw = function (txt, id, ver) { const diagram = select(`[id="${id}"]`); + // Adds title and description to the flow chart + addSVGAccessibilityFields(parser.yy, diagram, id); + drawCommits(diagram, allCommitsDict, false); if (gitGraphConfig.showBranches) { drawBranches(diagram, branches);