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