0
|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
3
|
|
4 // mode(s) for the sequence chart dsl's mscgen, xù and msgenny
|
|
5 // For more information on mscgen, see the site of the original author:
|
|
6 // http://www.mcternan.me.uk/mscgen
|
|
7 //
|
|
8 // This mode for mscgen and the two derivative languages were
|
|
9 // originally made for use in the mscgen_js interpreter
|
|
10 // (https://sverweij.github.io/mscgen_js)
|
|
11
|
|
12 (function(mod) {
|
|
13 if ( typeof exports == "object" && typeof module == "object")// CommonJS
|
|
14 mod(require("../../lib/codemirror"));
|
|
15 else if ( typeof define == "function" && define.amd)// AMD
|
|
16 define(["../../lib/codemirror"], mod);
|
|
17 else// Plain browser env
|
|
18 mod(CodeMirror);
|
|
19 })(function(CodeMirror) {
|
|
20 "use strict";
|
|
21
|
|
22 var languages = {
|
|
23 mscgen: {
|
|
24 "keywords" : ["msc"],
|
|
25 "options" : ["hscale", "width", "arcgradient", "wordwraparcs"],
|
|
26 "constants" : ["true", "false", "on", "off"],
|
|
27 "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"],
|
|
28 "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists
|
|
29 "arcsWords" : ["note", "abox", "rbox", "box"],
|
|
30 "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
|
|
31 "singlecomment" : ["//", "#"],
|
|
32 "operators" : ["="]
|
|
33 },
|
|
34 xu: {
|
|
35 "keywords" : ["msc", "xu"],
|
|
36 "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"],
|
|
37 "constants" : ["true", "false", "on", "off", "auto"],
|
|
38 "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip", "title", "deactivate", "activate", "activation"],
|
|
39 "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists
|
|
40 "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
|
|
41 "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
|
|
42 "singlecomment" : ["//", "#"],
|
|
43 "operators" : ["="]
|
|
44 },
|
|
45 msgenny: {
|
|
46 "keywords" : null,
|
|
47 "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "wordwrapentities", "watermark"],
|
|
48 "constants" : ["true", "false", "on", "off", "auto"],
|
|
49 "attributes" : null,
|
|
50 "brackets" : ["\\{", "\\}"],
|
|
51 "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"],
|
|
52 "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"],
|
|
53 "singlecomment" : ["//", "#"],
|
|
54 "operators" : ["="]
|
|
55 }
|
|
56 }
|
|
57
|
|
58 CodeMirror.defineMode("mscgen", function(_, modeConfig) {
|
|
59 var language = languages[modeConfig && modeConfig.language || "mscgen"]
|
|
60 return {
|
|
61 startState: startStateFn,
|
|
62 copyState: copyStateFn,
|
|
63 token: produceTokenFunction(language),
|
|
64 lineComment : "#",
|
|
65 blockCommentStart : "/*",
|
|
66 blockCommentEnd : "*/"
|
|
67 };
|
|
68 });
|
|
69
|
|
70 CodeMirror.defineMIME("text/x-mscgen", "mscgen");
|
|
71 CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"});
|
|
72 CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"});
|
|
73
|
|
74 function wordRegexpBoundary(pWords) {
|
|
75 return new RegExp("^\\b(?:" + pWords.join("|") + ")\\b", "i");
|
|
76 }
|
|
77
|
|
78 function wordRegexp(pWords) {
|
|
79 return new RegExp("^(?:" + pWords.join("|") + ")", "i");
|
|
80 }
|
|
81
|
|
82 function startStateFn() {
|
|
83 return {
|
|
84 inComment : false,
|
|
85 inString : false,
|
|
86 inAttributeList : false,
|
|
87 inScript : false
|
|
88 };
|
|
89 }
|
|
90
|
|
91 function copyStateFn(pState) {
|
|
92 return {
|
|
93 inComment : pState.inComment,
|
|
94 inString : pState.inString,
|
|
95 inAttributeList : pState.inAttributeList,
|
|
96 inScript : pState.inScript
|
|
97 };
|
|
98 }
|
|
99
|
|
100 function produceTokenFunction(pConfig) {
|
|
101
|
|
102 return function(pStream, pState) {
|
|
103 if (pStream.match(wordRegexp(pConfig.brackets), true, true)) {
|
|
104 return "bracket";
|
|
105 }
|
|
106 /* comments */
|
|
107 if (!pState.inComment) {
|
|
108 if (pStream.match(/\/\*[^\*\/]*/, true, true)) {
|
|
109 pState.inComment = true;
|
|
110 return "comment";
|
|
111 }
|
|
112 if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) {
|
|
113 pStream.skipToEnd();
|
|
114 return "comment";
|
|
115 }
|
|
116 }
|
|
117 if (pState.inComment) {
|
|
118 if (pStream.match(/[^\*\/]*\*\//, true, true))
|
|
119 pState.inComment = false;
|
|
120 else
|
|
121 pStream.skipToEnd();
|
|
122 return "comment";
|
|
123 }
|
|
124 /* strings */
|
|
125 if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) {
|
|
126 pState.inString = true;
|
|
127 return "string";
|
|
128 }
|
|
129 if (pState.inString) {
|
|
130 if (pStream.match(/[^\"]*\"/, true, true))
|
|
131 pState.inString = false;
|
|
132 else
|
|
133 pStream.skipToEnd();
|
|
134 return "string";
|
|
135 }
|
|
136 /* keywords & operators */
|
|
137 if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true))
|
|
138 return "keyword";
|
|
139
|
|
140 if (pStream.match(wordRegexpBoundary(pConfig.options), true, true))
|
|
141 return "keyword";
|
|
142
|
|
143 if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true))
|
|
144 return "keyword";
|
|
145
|
|
146 if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true))
|
|
147 return "keyword";
|
|
148
|
|
149 if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true))
|
|
150 return "operator";
|
|
151
|
|
152 if (!!pConfig.constants && pStream.match(wordRegexp(pConfig.constants), true, true))
|
|
153 return "variable";
|
|
154
|
|
155 /* attribute lists */
|
|
156 if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match('[', true, true)) {
|
|
157 pConfig.inAttributeList = true;
|
|
158 return "bracket";
|
|
159 }
|
|
160 if (pConfig.inAttributeList) {
|
|
161 if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) {
|
|
162 return "attribute";
|
|
163 }
|
|
164 if (pStream.match(']', true, true)) {
|
|
165 pConfig.inAttributeList = false;
|
|
166 return "bracket";
|
|
167 }
|
|
168 }
|
|
169
|
|
170 pStream.next();
|
|
171 return "base";
|
|
172 };
|
|
173 }
|
|
174
|
|
175 });
|