annotate .cms/lib/codemirror/mode/mscgen/mscgen.js @ 1:1d486627aa1e draft default tip

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