Mercurial
comparison .cms/lib/codemirror/mode/mscgen/mscgen.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
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 }); |